Salesforce

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

« Go Back

Information

 
TitleHow to programmatically dump & load sequence values in batch mode.
URL NameP170593
Article Number000131425
EnvironmentProduct: OpenEdge
Version: 10.x, 11.x
OS: All Supported Operating Systems
Question/Problem Description
How to programmatically dump & load sequence values in batch mode.
How to generate 4GL/ABL code to load the sequence values of a Progress ABL database.
How to generate 4GL/ABL code to dump the sequence values of a Progress 4GL database.
Steps to Reproduce
Clarifying Information
Error Message
Defect Number
Enhancement Number
Cause
Resolution
Following outlines two example procedures:
  • One to dump the sequence current values (dump_seqval.p) and one to load them (load_seqval.p).
  • Errors are logged to the client log file.
  • The dump file name for both is passed via the -param startup parameter, example:​
_progres mydatabase -b -p batch/dump_seqval.p -param mysequences.d -clientlog dump-err.log

To 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:
       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.
END. /* DUMP-SEQVAL-BLK */
To 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.
       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 */
Workaround
Notes
References to other Documentation:

ABL Reference: ABL Syntax Reference: DYNAMIC-CURRENT-VALUE function:
https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvref/dynamic-current-value-function.html
Keyword Phrase
Last Modified Date9/10/2019 7:33 PM

Powered by