Consultor Eletrônico



Kbase P170593: How to programmatically dump & load sequence values in batch mode.
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   23/12/2010
Status: Verified

GOAL:

How to programmatically dump & load sequence values in batch mode.

GOAL:

How to generate 4GL/ABL code to load the sequence values of a Progress 4GL database.

GOAL:

How to generate 4GL/ABL code to dump the sequence values of a Progress 4GL database.

FACT(s) (Environment):

All Supported Operating Systems
OpenEdge 10.x

FIX:

DUMP SEQUENCE VALUES
/* batch/dump_seqval.p Dump Sequence-Values */
&SCOPED-DEFINE QUERY-WHERE 'FOR EACH _Sequence NO-LOCK':U
&SCOPED-DEFINE SEQUENCE-NUM hBuffer:BUFFER-FIELD ( '_Seq-Num':U ):BUFFER-VALUE
&SCOPED-DEFINE SEQUENCE-NAME hBuffer:BUFFER-FIELD ( '_Seq-Name':U ):BUFFER-VALUE
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE cErrorMessage AS CHARACTER NO-UNDO.
DEFINE VARIABLE l_filename AS CHARACTER NO-UNDO.
DEFINE VARIABLE l_CurValue AS INT64 NO-UNDO.
DEFINE VARIABLE iFilePointer AS INT64 NO-UNDO.
DEFINE VARIABLE iCount AS INTEGER NO-UNDO.
DEFINE STREAM str_file.
DUMP-SEQVAL-BLK:
DO ON ERROR UNDO DUMP-SEQVAL-BLK, LEAVE DUMP-SEQVAL-BLK:
/* -param holds the output file name */
ASSIGN l_Filename = SESSION:PARAMETER.
IF l_Filename = '':U or l_Filename = ? THEN DO:
LOG-MANAGER:WRITE-MESSAGE ( '(E) Output file for export not specified.', 'DUMP_LOAD':U ).
UNDO DUMP-SEQVAL-BLK, LEAVE DUMP-SEQVAL-BLK.
END.
CREATE BUFFER hBuffer FOR TABLE '_Sequence':U.
CREATE QUERY hQuery.
hQuery:SET-BUFFERS ( hBuffer ).
hQuery:QUERY-PREPARE ( {&QUERY-WHERE} ).
hQuery:QUERY-OPEN ( ).
hQuery:GET-FIRST ( NO-LOCK ).
OUTPUT STREAM str_file TO VALUE ( l_Filename ).
REPEAT WHILE NOT hQuery:QUERY-OFF-END:
ASSIGN l_CurValue = DYNAMIC-CURRENT-VALUE ( {&SEQUENCE-NAME}, "DICTDB" )
iCount = iCount + 1.
EXPORT STREAM str_File {&SEQUENCE-NUM} {&SEQUENCE-NAME} l_CurValue.
hQuery:GET-NEXT ( NO-LOCK ).
END.
PUT STREAM str_File UNFORMATTED '.':U SKIP.
ASSIGN iFilePointer = SEEK ( str_File ).
PUT STREAM str_File UNFORMATTED "PSC" SKIP.
PUT STREAM str_File UNFORMATTED "cpstream=" SESSION:CPSTREAM SKIP.
PUT STREAM str_File UNFORMATTED '.':U SKIP.
IF iFilePointer > 9999999999 THEN
PUT STREAM str_File UNFORMATTED STRING( iFilePointer ) SKIP.
ELSE
PUT STREAM str_File UNFORMATTED STRING( iFilePointer, "9999999999" ) SKIP.
LOG-MANAGER:WRITE-MESSAGE ( SUBSTITUTE ( '(I) &1 sequence values dumped to &2.', iCount, l_Filename ), 'DUMP_LOAD':U ).
/* Error handling */
CATCH oAnyError AS Progress.Lang.Error:
ASSIGN cErrorMessage = '(E) Unhandled exception dumping sequence current values [' + oAnyError:GetMessage ( 1 ) + '].'.
DELETE OBJECT oAnyError.
LOG-MANAGER:WRITE-MESSAGE ( cErrorMessage, 'DUMP_LOAD':U ).
END CATCH.
FINALLY:
&nb.sp; IF VALID-HANDLE ( hQuery ) THEN DO:
IF hQuery:IS-OPEN THEN hQuery:QUERY-CLOSE ( ).
DELETE OBJECT hQuery.
ASSIGN hQuery = ?.
END.
IF VALID-HANDLE ( hBuffer ) THEN DO:
DELETE OBJECT hBuffer.
ASSIGN hBuffer = ?.
END.
OUTPUT STREAM str_File CLOSE.
LOG-MANAGER:CLOSE-LOG ( ).
END FINALLY.
LOAD SEQUENCE VALUES
/* dumpload/load_seqval.p Load Sequence-Values */
&SCOPED-DEFINE FIND-WHERE 'WHERE _Seq-Name = "&1"':U
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE cDummy AS CHARACTER NO-UNDO.
DEFINE VARIABLE cErrorMessage AS CHARACTER NO-UNDO.
DEFINE VARIABLE l_filename AS CHARACTER NO-UNDO.
DEFINE VARIABLE cSeqName AS CHARACTER NO-UNDO.
DEFINE VARIABLE iSeqNum AS INTEGER NO-UNDO.
DEFINE VARIABLE iCount AS INTEGER NO-UNDO.
DEFINE VARIABLE iSeqVal AS INT64 NO-UNDO.
DEFINE STREAM str_file.
LOAD-SEQVAL-BLK:
DO ON ERROR UNDO LOAD-SEQVAL-BLK, LEAVE LOAD-SEQVAL-BLK:
/* -param hoolds the input file name */
ASSIGN l_Filename = SESSION:PARAMETER.
IF l_Filename = '':U or l_Filename = ? THEN DO:
LOG-MANAGER:WRITE-MESSAGE ( '(E) Input file for import not specified.', 'DUMP_LOAD':U ).
UNDO LOAD-SEQVAL-BLK, LEAVE LOAD-SEQVAL-BLK.
END.
INPUT STREAM str_file FROM VALUE ( l_Filename ).
REPEAT:
IMPORT STREAM str_file UNFORMATTED cDummy.
IF NUM-ENTRIES ( cDummy, ' ':U ) = 3 THEN DO:
ASSIGN iSeqNum = INTEGER ( ENTRY ( 1, cDummy, ' ':U ) )
cSeqName = TRIM ( ENTRY ( 2, cDummy, ' ':U ), '"' )
iSeqVal = INT64 ( ENTRY ( 3, cDummy, ' ':U ) ).
DO TRANSACTION:
ASSIGN DYNAMIC-CURRENT-VALUE ( cSeqName, "DICTDB" ) = iSeqVal
iCount = iCount + 1.
END.
&n.bsp; END.
END.
LOG-MANAGER:WRITE-MESSAGE ( SUBSTITUTE ( '(I) &1 sequence values loaded from &2.', iCount, l_Filename ), 'DUMP_LOAD':U ).
/* Error handling */
CATCH oAnyError AS Progress.Lang.Error:
ASSIGN cErrorMessage = '(E) Unhandled exception loading sequence current values [' + oAnyError:GetMessage ( 1 ) + '].'.
DELETE OBJECT oAnyError.
LOG-MANAGER:WRITE-MESSAGE ( cErrorMessage, 'DUMP_LOAD':U ).
END CATCH.
FINALLY:
INPUT STREAM str_file CLOSE.
LOG-MANAGER:CLOSE-LOG ( ).
END FINALLY.
END. /* LOAD-SEQVAL-BLK */
&UNDEFINE FIND-WHERE


END. /* DUMP-SEQVAL-BLK */
.