Consultor Eletrônico



Kbase P87487: How to set the records to batch for a ProDataSet temp-table
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   07/10/2004
Status: Unverified

GOAL:

How to set the records to batch for a ProDataSet temp-table

GOAL:

How to limit the number of records sent to the client for a ProDataSet temp-table

GOAL:

How to use the BATCH-SIZE attribute

FACT(s) (Environment):

OpenEdge 10.0B

FIX:

The following are two programs that show an example about the BATCH-SIZE attribute.

Batch-size is primarily intended to limit the number of rows added to a top buffer in a dataset, or to a non-top buffer whose parent table probably has only 1 record in it. However, it can be set at any level of the hierarchy.

/*---------------------------------------------------------
Program: wMain.w

note: Run this procedure first.
---------------------------------------------------------*/
DEFINE TEMP-TABLE ttOrder LIKE Order.
DEFINE TEMP-TABLE ttOrderLine LIKE OrderLine.

DEFINE DATASET dsSource FOR ttOrder, ttOrderLine
DATA-RELATION OrderOrderLine FOR ttOrder, ttOrderLine RELATION-FIELDS(ordernum, ordernum).

&Scoped-define WINDOW-NAME C-Win
&Scoped-define FRAME-NAME DEFAULT-FRAME

DEFINE VAR C-Win AS WIDGET-HANDLE NO-UNDO.

DEFINE BUTTON bnNextBatch
LABEL "Get Next Batch"
SIZE 18 BY 1.14.

DEFINE BUTTON BUTTON-1
LABEL "Get First Batch of Records"
SIZE 31 BY 1.14.

DEFINE VARIABLE fiBatchSizeOLine AS INTEGER FORMAT ">>9":U INITIAL 0
LABEL "Batch-Size for OrderLine Table"
VIEW-AS FILL-IN
SIZE 14 BY 1 NO-UNDO.

DEFINE VARIABLE fiBatchSizeOrder AS INTEGER FORMAT ">>>>9":U INITIAL 0
LABEL "Batch-size for Order table"
VIEW-AS FILL-IN
SIZE 14 BY 1 NO-UNDO.

DEFINE VARIABLE fiLastBatchOrder AS LOGICAL FORMAT "YES/NO":U INITIAL NO
LABEL "Last-batch for Order Table"
VIEW-AS FILL-IN
SIZE 14 BY 1 NO-UNDO.

DEFINE VARIABLE tgAppend AS LOGICAL INITIAL no
LABEL "Append"
VIEW-AS TOGGLE-BOX
SIZE 13 BY .81 NO-UNDO.

DEFINE QUERY brOrder FOR
ttOrder SCROLLING.

DEFINE QUERY brOrderLine FOR
ttOrderLine SCROLLING.


DEFINE BROWSE brOrder
QUERY brOrder NO-LOCK DISPLAY
ttOrder.CustNum FORMAT ">>>>9":U
ttOrder.Ordernum FORMAT "zzzzzzzzz9":U
ttOrder.OrderDate FORMAT "99/99/99":U WIDTH 24.6
WITH NO-ROW-MARKERS SEPARATORS SIZE 50 BY 9.52 FIT-LAST-COLUMN.

DEFINE BROWSE brOrderLine
QUERY brOrderLine NO-LOCK DISPLAY
ttOrderLine.Ordernum FORMAT "zzzzzzzzz9":U
ttOrderLine.Linenum FORMAT ">>9":U
ttOrderLine.Itemnum FORMAT "zzzzzzzzz9":U WIDTH 29.8
WITH NO-ROW-MARKERS SEPARATORS SIZE 55 BY 9.29 FIT-LAST-COLUMN.

DEFINE FRAME DEFAULT-FRAME
BUTTON-1 AT ROW 1.48 COL 2
bnNextBatch AT ROW 1.48 COL 35
tgAppend AT ROW 2.91 COL 35
fiBatchSizeOrder AT ROW 3.86 COL 31 COLON-ALIGNED
fiLastBatchOrder AT ROW 5.05 COL 31 COLON-ALIGNED
fiBatchSizeOLine AT ROW 5.05 COL 91 COLON-ALIGNED
brOrder AT ROW 6.24 COL 2
brOrderLine AT ROW 6.24 COL 59
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1
SIZE 114.8 BY 15.14.

IF SESSION:DISPLAY-TYPE = "GUI":U THEN
CREATE WINDOW C-Win ASSIGN
HIDDEN = YES
TITLE = "LAST-BATCH and BATCH-SIZE example"
HEIGHT = 15.19
WIDTH = 115
MAX-HEIGHT = 30.19
MAX-WIDTH = 168.6
VIRTUAL-HEIGHT = 30.19
VIRTUAL-WIDTH = 168.6
RESIZE = yes
SCROLL-BARS = no
STATUS-AREA = no
BGCOLOR = ?
FGCOLOR = ?
KEEP-FRAME-Z-ORDER = yes
THREE-D = yes
MESSAGE-AREA = no
SENSITIVE = yes.
ELSE {&WINDOW-NAME} = CURRENT-WINDOW.

ASSIGN fiLastBatchOrder:READ-ONLY IN FRAME DEFAULT-FRAME = TRUE.

IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win)
THEN C-Win:HIDDEN = no.

ON END-ERROR OF C-Win /* LAST-BATCH and BATCH-SIZE example */
OR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO:
IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY.
END.

ON WINDOW-CLOSE OF C-Win /* LAST-BATCH and BATCH-SIZE example */
DO:
/* This event will close the window and terminate the procedure. */
APPLY "CLOSE":U TO THIS-PROCEDURE.
RETURN NO-APPLY.
END.

ON CHOOSE OF bnNextBatch IN FRAME DEFAULT-FRAME /* Get Next Batch */
DO:
RUN getBatchs.
END.
.
ON CHOOSE OF BUTTON-1 IN FRAME DEFAULT-FRAME /* Get First Batch of Records */
DO:
DATASET dsSource:EMPTY-DATASET().
RUN getBatchs.
END.

ASSIGN CURRENT-WINDOW = {&WINDOW-NAME}
THIS-PROCEDURE:CURRENT-WINDOW = {&WINDOW-NAME}.

ON CLOSE OF THIS-PROCEDURE
RUN disable_UI.

PAUSE 0 BEFORE-HIDE.

MAIN-BLOCK:
DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK
ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK:
RUN enable_UI.
IF NOT THIS-PROCEDURE:PERSISTENT THEN
WAIT-FOR CLOSE OF THIS-PROCEDURE.
END.

PROCEDURE disable_UI :
DELETE WIDGET C-Win.
IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE.
END PROCEDURE.

PROCEDURE enable_UI :
DISPLAY tgAppend fiBatchSizeOrder fiLastBatchOrder fiBatchSizeOLine
WITH FRAME DEFAULT-FRAME IN WINDOW C-Win.
ENABLE BUTTON-1 bnNextBatch tgAppend fiBatchSizeOrder fiLastBatchOrder
fiBatchSizeOLine brOrder brOrderLine
WITH FRAME DEFAULT-FRAME IN WINDOW C-Win.
{&OPEN-BROWSERS-IN-QUERY-DEFAULT-FRAME}
VIEW C-Win.
END PROCEDURE.

PROCEDURE getBatchs :
DO WITH FRAME {&FRAME-NAME}:
FIND LAST ttOrder NO-LOCK NO-ERROR.

IF tgAppend:CHECKED THEN
RUN fillds.p (INPUT IF AVAILABLE(ttOrder) THEN ttOrder.ordernum ELSE 0,
INPUT INT(fiBatchSizeOrder:SCREEN-VALUE),
INPUT INT(fiBatchSizeOLine:SCREEN-VALUE),
OUTPUT DATASET dsSource APPEND).

ELSE
RUN fillds.p (INPUT IF AVAILABLE(ttOrder) THEN ttOrder.ordernum ELSE 0,
INPUT INT(fiBatchSizeOrder:SCREEN-VALUE),
INPUT INT(fiBatchSizeOLine:SCREEN-VALUE),
OUTPUT DATASET dsSource).

OPEN QUERY brOrder FOR EACH ttOrder NO-LOCK INDEXED-REPOSITION.
OPEN QUERY brOrderLine FOR EACH ttOrderLine NO-LOCK INDEXED-REPOSITION.

ASSIGN fiLastBatchOrder:SCREEN-VALUE = STRING(BUFFER ttOrder:LAST-BATCH)
bnNextBatch:SENSITIVE = NOT BUFFER ttOrder:LAST-BATCH.

END.
END PROCEDURE.
/*---------------------------------------------------------
END wMain.w
---------------------------------------------------------*/


/*---------------------------------------------------------
Program: fillds.p
---------------------------------------------------------*/

DEFINE VARIABLE retok AS LOGICAL NO-UNDO.

DEFINE TEMP-TABLE ttOrder LIKE Order.
DEFINE TEMP-TABLE ttOrderLine LIKE OrderLine.

DEFINE DATASET dsSource FOR ttOrder, ttOrderLine
DATA-RELATION OrderOrderLine FOR ttOrder, ttOrderLine RELATION-FIELDS(ordernum, ordernum).

DEFINE INPUT PARAMETER piLastOrder AS INTEGER NO-UNDO.
DEFINE INPUT PARAMETER piOrderSize AS INTEGER NO-UNDO.
DEFINE INPUT PARAMETER piLineSize AS INTEGER NO-UNDO.

DEFINE OUTPUT PARAMETER DATASET FOR dsSource.

DEFINE QUERY qOrder FOR Order.

QUERY qOrder:QUERY-PREPARE('FOR EACH order NO-LOCK WHERE order.ordernum > ' + STRING(piLastOrder)).

DEFINE DATA-SOURCE dsOrder FOR QUERY qOrder.
DEFINE DATA-SOURCE dsOrderLine FOR OrderLine.

/* attach the data-sources to the dataset buffers */
BUFFER ttOrder:handle:ATTACH-DATA-SOURCE(DATA-SOURCE dsOrder:HANDLE,?,?,?).
BUFFER ttOrderLine:handle:ATTACH-DATA-SOURCE(DATA-SOURCE dsOrderLine:HANDLE,?,?,?).

BUFFER ttOrder:HANDLE:BATCH-SIZE = piOrderSize.
BUFFER ttOrderLine:HANDLE:BATCH-SIZE = piLineSize.

DATASET dsSource:FILL()..