ZZUtils - ZZRESTRT


ZZRESTRT is a skeleton of a restartable batch Natural program.

ZZRESTRT is in the source module section of ZZUtils, a collection of Natural utilities.  Look for more information in my Natural Tips & Techniques section - Tip 6



Natural/ADABAS Restart Logic
 
************************************************************************
* Program : ZZRESTRT
* System  : ZZUTILs
* Function: Skeleton Program - Demonstrates restartability
* Author  : Ralph G. Zbrog
* Written : 01/01/90
* Maintenance log :
************************************************************************
*   Date   ||   Name             || Summary of Changes
************************************************************************
*          ||                    ||
************************************************************************
*
DEFINE DATA
LOCAL                                  /* Constants
1 #C
  2 BLANK(A1)           CONST<' '>
*
LOCAL                                  /* ET data
1 #ET(A35)                   1 REDEFINE #ET
  2 PROGRAM(A8)
  2 CONTROL(N7)                        /* Key value
  2 ISN(P8)
  2 FIELD(N7)                          /* Some identifying value
  2 FLAG(L)                            /* Some significant value
  2 SEQ(N7)                            /* Uniquely identify WORK rec
1 #RESTART
  2 CONTROL(N7)                        /* Key value
  2 ISN(P8)                            /* For non-unique key
1 #TRACE(L)             INIT<FALSE>
END-DEFINE
*/                                     /* Page eject
*
*     Restartability Code
*
IF  *DATA > 0                          /* Trigger to revoke RESTART
  THEN
    INPUT(AD=O IP=OFF)
              *PROGRAM                 /* Clear the ET data
              'REFRESHED'
          60T *DATU
              *TIME(AL=8)
    END TRANSACTION #C.BLANK
    CALLNAT 'ZZNABEND'                 /* Terminate the job
END-IF
*
GET TRANSACTION DATA #ET
*
DECIDE FOR FIRST CONDITION
  WHEN #ET.PROGRAM = #C.BLANK          /* First pass through the program
    INPUT(AD=O IP=OFF)
              *PROGRAM
              'EXECUTED'
          60T *DATU
              *TIME(AL=8)
    ASSIGN #ET.PROGRAM = *PROGRAM
    RESET  #ET.CONTROL
    ASSIGN #ET.FIELD   = value
  WHEN #ET.PROGRAM = *PROGRAM          /* This is a RESTART
    INPUT(AD=O IP=OFF)
              *PROGRAM
              'RESTARTED'
          60T *DATU
              *TIME(AL=8)
       //     'CONTROL:' #ET.CONTROL
       //     '  FIELD:' #ET.FIELD
    ASSIGN #RESTART.CONTROL = #ET.CONTROL
    ASSIGN #RESTART.ISN     = #ET.ISN
  WHEN NONE                            /* This is a problem
    INPUT(AD=O IP=OFF)
              *PROGRAM
              'TERMINATED'
          60T *DATU
              *TIME(AL=8)
       //     'INCONSISTENT RESTART DATA'
        /     'ET DATA:' #ET(EM=X(8)ªX(7)ªX(5)ªX(7)ªX)
    CALLNAT 'ZZNABEND'                 /* Terminate the job
END-DECIDE
*/                                     /* Page eject
* ...                                  /* Normal initialization
*
RBAT.
READ BATCH BY xxx FROM #RESTART.CONTROL
* AT START OF DATA                     /* Ignore last processed record
*   REJECT IF  BATCH.CONTROL =  #RESTART.CONTROL /* Assumes unique
* END-START                                      /*   key values
  REJECT IF   BATCH.CONTROL =  #RESTART.CONTROL  /* Ignore processed
          AND *ISN(RBAT.)   <= #RESTART.ISN      /*   duplicate keys
*
* ...                                  /* Normal processing
*
  ADD 1 TO #ET.SEQ
  WRITE WORK 1 data
               #ET.SEQ
  IF  *COUNTER(RBAT.) = 50             /* ET threshold
    THEN
      RESET *COUNTER(RBAT.)
      ASSIGN #ET.CONTROL = BATCH.CONTROL
      ASSIGN #ET.ISN     = *ISN(RBAT.)
      ASSIGN #ET.FIELD   = BATCH.FIELD
      ASSIGN #ET.FLAG    = BATCH.FLAG
      IF  #TRACE                       /* Optional
        THEN
          INPUT(AD=O IP=OFF)
                    *PROGRAM
                    'EXECUTING ET'
                60T *DATU
                    *TIME(AL=8)
             //     'CONTROL:' #ET.CONTROL
              /     '    ISN:' #ET.ISN
              /     '  FIELD:' #ET.FIELD
              /     '   FLAG:' #ET.FLAG(EM=TRUE)
              /     '    SEQ:' #ET.SEQ
      END-IF
      END TRANSACTION #ET
  END-IF
END-READ
*
*                                      /* End-of-job processing
WRITE WORK 1 #CTL                      /* Control record
             '9999999'
INPUT(AD=O IP=OFF)
          *PROGRAM
          'ENDED'
      60T *DATU
          *TIME(AL=8)
   //     'CONTROL:' #ET.CONTROL
    /     '  FIELD:' #ET.FIELD
    /     '   FLAG:' #ET.FLAG(EM=TRUE)
END TRANSACTION #C.BLANK
END



Return to top.

Return to Ralph G. Zbrog's home page.

Last updated July 14, 1997, by Ralph G. Zbrog.