付録 H VAX–11 BASIC の例

Adabas ダイレクトコールを使用する VAX-11 BASIC の例です。付録 B で定義された Adabas ファイルが使用されています。

           !*********************************************************
           !*                                                       *
           !*      A D A B A S / V M S  BASIC  example program      *
           !*     ---------------------------------------------     *
           !*                                                       *
           !*      Compile, link and run this program by typing:    *
           !*                                                       *
           !*      $ BASIC EXAMPLE                                  *
           !*      $ LINK EXAMPLE,ADABAS$VERSION:ADABAS.OLB/LIB     *
           !*      $ RUN EXAMPLE                                    *
           !*                                                       *
           !*      Function:                                        *
           !*         Find in the default database all people       *
           !*         named 'SMITH' and increase their salary       *
           !*         by 10%                                        *
           !*                                                       *
           !*********************************************************
           DECLARE STRING EXAMPLE_DB \ EXAMPLE_DB = CHR$(0) 
           DECLARE STRING EMPLOYEES_FILE \ EMPLOYEES_FILE = CHR$(11) 
           !**************************
           !*  ADABAS Control Block  *
           !**************************
           MAP (CONT_BLOCK) STRING CB = 80
           MAP (CONT_BLOCK) STRING FILLER1 = 2,            &
                                   COMMAND_CODE = 2,       &
                                   COMMAND_ID = 4,         &
                                   FILE_NUMBER = 1,        &
                                   DB_ID = 1,              &
                            WORD   RESPONSE_CODE,          &
                            LONG   ISN,                    &
                                   ISN_LL,                 &
                                   ISN_QUANTITY,           &
                            WORD   FMT_BUF_LNG,            &
                                   REC_BUF_LNG,            &
                                   SEA_BUF_LNG,            &
                                   VAL_BUF_LNG,            &
                                   ISN_BUF_LNG,            &
                            STRING CMD_OPT_1 = 1,          &
                                   CMD_OPT_2 = 1,          &
                                   ADDITIONS_1 = 8,        &
                                   ADDITIONS_2 = 4,        &
                                   ADDITIONS_3 = 8,        &
                                   ADDITIONS_4 = 8,        &
                                   ADDITIONS_5 = 8,        &
                            LONG   COMMAND_TIME,           &
                            STRING USER_AREA = 4
           !*************************************
           !*  ADABAS Format and Record Buffer  *
           !*************************************
           DECLARE STRING FB \ FB = 'ASN,4,F.' 
           DECLARE STRING OPENRB \ OPENRB = 'UPD=11.'
           MAP (RECORD_BUF) STRING RB = 4
           MAP (RECORD_BUF) LONG SALARY
           DECLARE LONG OLD_SALARY
           !************************************
           !*  ADABAS Search and Value Buffer  *
           !************************************
           DECLARE STRING SB \ SB = 'AE,5.'
           DECLARE STRING VB \ VB = 'SMITH'
           !***********************
           !*  ADABAS ISN buffer  *
           !***********************
           DECLARE LONG IB
           !*************
           !*  Counter  *
           !*************
           DECLARE INTEGER UPD \ UPD = 0
           !***************************
           !*  Write startup message  *
           !***************************
       
   900     PRINT ' BASIC example program for calling ADABAS (OpenVMS)'
           !*******************
           !*  Open database  *
           !*******************
           COMMAND_CODE    = 'OP'
           DB_ID           = EXAMPLE_DB
           REC_BUF_LNG     = LEN(OPENRB)
   950     CALL ADABAS (CB BY REF,,OPENRB BY REF)
   960     IF RESPONSE_CODE = 9 THEN GOTO 950 
   970     IF RESPONSE_CODE <> 0 THEN GOTO 4000
           ELSE
           !******************
           !*  Initial  find *
           !******************
           COMMAND_CODE    = 'S4'
           COMMAND_ID      = 'FIND'
           FILE_NUMBER     = EMPLOYEES_FILE
           FMT_BUF_LNG     = LEN(FB)
           REC_BUF_LNG     = LEN(RB)
           SEA_BUF_LNG     = LEN(SB)
           VAL_BUF_LNG     = LEN(VB)
           ISN_BUF_LNG     = 4
           CMD_OPT_1       = ' '
           CMD_OPT_2       = 'N'
           CALL ADABAS (CB BY REF,READFB BY REF,RB BY REF,SB BY REF,
                        VB BY REF,IB BY REF)
           IF RESPONSE_CODE <> 0 THEN GOTO 2000
           ELSE PRINT 'Found    :   ';ISN_QUANTITY;' records'
           IF ISN_QUANTITY = 0 THEN GOTO 3000
           !************************************
           !*  Loop over all selected records  *
           !************************************
   1000    OLD_SALARY = SALARY
           SALARY = SALARY + (SALARY * 0.1)
           COMMAND_CODE = 'A1'
           CALL ADABAS (CB YB REF, FB BY REF, RB BY REF)
   1010    IF RESPONSE_CODE <> 0 THEN GOTO 2000
   1020    PRINT ' ISN=';ISN;'   old salary = ';OLD_SALARY;' new salary = ';NEW
                   SALARY
           UPD = UPD + 1
           COMMAND_CODE = 'L4'
           CALL ADABAS (CB BY REF, FB BY REF, RB BY REF)
   1030    IF RESPONSE_CODE = 0 THEN GOTO 1000
   1040    IF RESPONSE_CODE = 3 THEN GOTO 3000
           !***********************
           !* Backout transaction *
           !***********************
   2000    PRINT '**Response code ';RESPONSE_CODE;' from ADABAS for command
                  ';COMMAND_ID
   2010    IF UPD = 0 THEN GOTO 3000
   2020    COMMAND_CODE = 'BT'
           CALL ADABAS (CB BY REF)
   2030    IF RESPONSE_CODE <> 0 THEN GOTO 4000
           ELSE
           UPD = 0 
           !********************
           !*  Close database  *
           !********************
   3000    COMMAND_CODE    = 'CL'
           CALL ADABAS (CB BY REF)
   3010    IF RESPONSE_CODE <> 0 THEN GOTO 4000
           ELSE
           GOTO 5000
           !*************************
           !*  Print response code  *
           !*************************
   4000    PRINT ' ** Response code ';RESPONSE_CODE;from ADABAS for command
                   ';COMMAND_ID
           
           !***********************
           !*  Common exit point  *
           !***********************
   5000    END