Consultor Eletrônico



Kbase P68191: How to define FILL events for a ProDataSet object?
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   3/30/2005
Status: Unverified

GOAL:

How to define FILL events for a ProDataSet object?

GOAL:

How to use FILL events for a dataset object?

FIX:

The code found below shows the user how to define FILL events (callback procedures) for dataset buffers and the dataset object itself. It deals with the Order, OrderLine and Item tables from the sports2000 sample database. To find additional references on these FILL events, please refer to the "OpenEdge Development: Progress® 4GL Reference" manual.

/* OrderEvents.p -- FILL events for the dsOrder DATASET */

{dsOrderTT.i}
/*********************************************************************/
/* dsOrderTT.i -- include file for Temp-Table defintions in dsOrder. */
/* DEFINE TEMP-TABLE ttOrder LIKE Order */
/* FIELD OrderTotal AS DECIMAL */
/* FIELD CustName LIKE Customer.NAME */
/* FIELD RepName LIKE SalesRep.RepName. */
/* DEFINE TEMP-TABLE ttOline LIKE OrderLine */
/* BEFORE-TABLE ttOlineBefore. */
/* DEFINE TEMP-TABLE ttItem LIKE ITEM */
/* INDEX ItemNum IS UNIQUE ItemNum. */
/*********************************************************************/

{dsOrder.i}
/************************************************************/
/* dsOrder.i -- include file definition of DATASET dsOrder. */
/* DEFINE DATASET dsOrder FOR ttOrder, ttOline, ttItem */
/* DATA-RELATION OrderLine FOR ttOrder, ttOline */
/* RELATION-FIELDS (OrderNum, OrderNum) */
/* DATA-RELATION LineItem FOR ttOline, ttItem */
/* RELATION-FIELDS (ItemNum, ItemNum) REPOSITION. */
/************************************************************/

DEFINE INPUT PARAMETER piOrderNum AS INTEGER NO-UNDO.
DEFINE INPUT PARAMETER phDataSet AS HANDLE NO-UNDO.

DEFINE QUERY qOrder FOR Order, Customer, SalesRep.

DEFINE VARIABLE iBuff AS INTEGER NO-UNDO.
DEFINE VARIABLE hBuff AS HANDLE NO-UNDO.

DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder
Order KEYS (OrderNum), Customer KEYS (CustNum), SalesRep KEYS (SalesRep).
DEFINE DATA-SOURCE srcOline FOR OrderLine.
DEFINE DATA-SOURCE srcItem FOR ITEM KEYS (ItemNum).

phDataSet:SET-CALLBACK-PROCEDURE
("BEFORE-FILL", "preDataSetFill", THIS-PROCEDURE).
phDataSet:SET-CALLBACK-PROCEDURE
("AFTER-FILL", "postDataSetFill", THIS-PROCEDURE).
phDataSet:GET-BUFFER-HANDLE("ttOrder"):SET-CALLBACK-PROCEDURE
("BEFORE-FILL", "preOrderFill", THIS-PROCEDURE).
phDataSet:GET-BUFFER-HANDLE("ttOline"):SET-CALLBACK-PROCEDURE
("AFTER-FILL", "postOlineFill", THIS-PROCEDURE).
phDataSet:GET-BUFFER-HANDLE("ttItem"):SET-CALLBACK-PROCEDURE
("AFTER-ROW-FILL", "postItemRowFill", THIS-PROCEDURE).

PROCEDURE preDataSetFill:
DEFINE INPUT PARAMETER DATASET FOR dsOrder.

QUERY qOrder:QUERY-PREPARE("FOR EACH Order WHERE Order.OrderNum = " +
STRING(piOrderNum) +
", FIRST Customer OF Order, FIRST SalesRep OF Order").

END PROCEDURE. /* preDataSetFill */

PROCEDURE postDataSetFill:
DEFINE INPUT PARAMETER DATASET FOR dsOrder.

DO iBuff = 1 TO DATASET dsOrder:NUM-BUFFERS:
DATASET dsOrder:GET-BUFFER-HANDLE(iBuff):DETACH-DATA-SOURCE().
END.
END PROCEDURE. /* postDataSetFill */

PROCEDURE preOrderFill:
DEFINE INPUT PARAMETER DATASET FOR dsOrder.

BUFFER ttOrder:ATTACH-DATA-SOURCE(DATA-SOURCE srcOrder:HANDLE,
"Customer.Name,CustName").
BUFFER ttOline:ATTACH-DATA-SOURCE(DATA-SOURCE srcOline:HANDLE).
BUFFER ttItem:ATTACH-DATA-SOURCE(DATA-SOURCE srcItem:HANDLE).

END PROCEDURE. /* preOrderFill */

PROCEDURE postOlineFill:
DEFINE INPUT PARAMETER DATASET FOR dsOrder.

DEFINE VARIABLE dTotal AS DECIMAL NO-UNDO.

FOR EACH ttOline WHERE ttOline.OrderNum =
ttOrder.OrderNum:
dTotal = dTotal + ttOline.ExtendedPrice.
END.
ttOrder.OrderTotal = dTotal.

END PROCEDURE. /* postRecordFill */

PROCEDURE postItemRowFill:
DEFINE INPUT PARAMETER DATASET FOR dsOrder.

DEFINE VARIABLE iType AS INTEGER NO-UNDO.
DEFINE VARIABLE cItemTypes AS CHARACTER NO-UNDO
INIT "BASEBALL,CROQUET,FISHING,FOOTBALL,GOLF,SKI,SWIM,TENNIS".
DEFINE VAR.IABLE iTypeNum AS INTEGER NO-UNDO.
DEFINE VARIABLE cType AS CHARACTER NO-UNDO.

DO iType = 1 TO NUM-ENTRIES(cItemTypes):
cType = ENTRY(iType, cItemTypes).
IF INDEX(ttItem.ItemName, cType) NE 0 THEN
ttItem.ItemName = REPLACE(ttItem.ItemName, cType, cType).
END.
END PROCEDURE..