Consultor Eletrônico



Kbase P97556: How to a access table buffer data from a ProDataSet HANDLE returned by a user defined FUNCTION of an
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   12/11/2004
Status: Unverified

GOAL:

How to a access table buffer data from a ProDataSet HANDLE returned by a user defined FUNCTION of an external PERSISTENT PROCEDURE?

FACT(s) (Environment):

OpenEdge 10.x

FIX:

The following sample code runs against the Progress Sports2000 demo database to demonstrate:
1. How to call a user defined FUNCTION of an external PERSISTENT PROCEDURE with a DATASET HANDLE OUTPUT PARAMETER.
2. How to retrieve the data of a table buffer using the returned DATASET HANDLE.
3. Sample code for the external PERSISTENT PROCEDURE that includes the invoked user defined FUNCTION:
/* pProc.p */
DEFINE TEMP-TABLE ttCustomer NO-UNDO LIKE customer.
DEFINE QUERY hQuery FOR Customer.
DEFINE DATA-SOURCE srcCustomer FOR QUERY hQuery.
DEFINE DATASET dsCustomer FOR ttCustomer.
BUFFER ttCustomer:ATTACH-DATA-SOURCE( DATA-SOURCE srcCustomer:HANDLE).
FUNCTION get-cust RETURNS LOGICAL( INPUT cName AS CHARACTER, OUTPUT dsHandle AS HANDLE):
QUERY hQuery:QUERY-PREPARE( "FOR EACH Customer WHERE Customer.Name BEGINS ~"" + cName + "~"" ).
DATASET dsCustomer:FILL().
ASSIGN
dsHandle = DATASET dsCustomer:HANDLE.
RETURN TRUE.
END FUNCTION.
4. Sample code for the calling PROCEDURE to retrieve the data of a table buffer using the returned DATASET HANDLE:
/* Caller.p */
DEFINE VARIABLE hPProce AS HANDLE NO-UNDO.
DEFINE VARIABLE cName AS CHARACTER NO-UNDO.
DEFINE VARIABLE hDataSet AS HANDLE NO-UNDO.
RUN pProc.p PERSISTENT SET hPProce.
ASSIGN
cName = "bu".
DYNAMIC-FUNCTION("get-cust" IN hPProce, INPUT cName, OUTPUT hDataSet).
/* Get the "ttCustomer" Name data from the Prodataset handle */
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE hField AS HANDLE NO-UNDO.
DEFINE VARIABLE iField AS INTEGER NO-UNDO.
CREATE QUERY hQuery.
hBuffer = hDataSet:GET-BUFFER-HANDLE("ttCustomer").
hQuery:ADD-BUFFER(hBuffer).
hQuery:QUERY-PREPARE("FOR EACH " + hBuffer:NAME).
hQuery:QUERY-OPEN().
hQuery:GET-FIRST().
DO WHILE NOT hQuery:QUERY-OFF-END:
IF hQuery:QUERY-OFF-END THEN LEAVE.
DO iField = 1 TO hBuffer:NUM-FIELDS:
ASSIGN
hField = hBuffer:BUFFER-FIELD(iField).
IF hField:NAME = "Name" THEN
DISPLAY hField:BUFFER-VALUE FORMAT "x(60)" WITH FRAME a DOWN.
DOWN WITH FRAME a.
END.
hQuery:GET-NEXT().
END.
hQuery:QUERY-CLOSE().
DELETE OBJECT hQuery.