付録 C VAX–11 MACRO の例

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

            .TITLE   EXAMPLE ADABAS (OpenVMS) example program
   ;********************************************************
   ;*                                                      *
   ;*      A D A B A S / V M S   MACRO example program     *
   ;*      -------------------------------------------     *
   ;*                                                      *
   ;*      Assemble, link and run this program by typing:  *
   ;*                                                      *
   ;*         $ MACRO EXAMPLE                              *
   ;*         $ LINK EXAMPLE                               *
   ;*         $ RUN EXAMPLE                                *
   ;*                                                      *
   ;*      Function:                                       *
   ;*                                                      *
   ;*         Find in the default database all people      *
   ;*         named 'SMITH' and increase their salary      *
   ;*         by 10%                                       *
   ;*                                                      *
   ;********************************************************
           .DEFAULT        DISPLACEMENT WORD
           .EXTERNAL       ADABAS,LIB$PUT_OUTPUT
   EXAMPLE_DB      = 0                     ; Use default database
   PERSON_FILE     = 11                    ;    and example file 'EMPLOYEES'
           .PSECT   CONSTANT,NOEXE,NOWRT
   FB:             .ASCII /ASN,4,F./       ; Format Buffer :
   L_FB    = .-FB                          ;    Salary as 4 byte integer
   SB:             .ASCII /AE,5./          ; Search Buffer :
   L_SB    = .-SB                          ;    Searching via name
   VB:             .ASCII /SMITH/          ; Value Buffer :
   L_VB    = .-VB                          ;    Searching for 'SMITH'
   TXT_START:      .ASCID  /MACRO example program for calling ADABAS (OpenVMS)/
   TXT_RESP:       .ASCID  /** Response code !UW from ADABAS for command !AD/
   TXT_FOUND:      .ASCID  /Found    : !5UL records/
   TXT_SALARY:     .ASCID  / ISN !8UL old salary = !10UL new salary = !10UL/
           .PSECT  VARIABLE,PIC,NOEXE

   CB:                                     ; Control block
                   .BLKB  2
   COMMAND_CODE:   .BLKB  2
   COMMAND_ID:     .BLKB  4
   FILE_NUMBER:    .BLKB  1
   DB_ID:          .BLKB  1
   RESPONSE_CODE:  .BLKW  1
   ISN:            .BLKL  1
   ISN_LL:         .BLKL  1
   ISN_QUANTITY:   .BLKL  1
   FMT_BUF_LNG:    .BLKW  1
   REC_BUF_LNG:    .BLKW  1
   SEA_BUF_LNG:    .BLKW  1
   VAL_BUF_LNG:    .BLKW  1
   ISN_BUF_LNG:    .BLKW  1
   CMD_OPT_1:      .BLKB  1
   CMD_OPT_2:      .BLKB  1
   ADDITIONS_1:    .BLKB  8
   ADDITIONS_2:    .BLKB  4
   ADDITIONS_3:    .BLKB  8
   ADDITIONS_4:    .BLKB  8
   ADDITIONS_5:    .BLKB  8
   COMMAND_TIME:   .BLKL  1
   USER_AREA:      .BLKB  4
           
   IB:             .BLKL  1                ; ISN Buffer :
   L_IB    = .-IB                          ;    Reserves space for 1 ISN
           
           
   ADAPAR:         .BLKL   7               ; ADABAS parameter list 
   FAOPAR:         .BLKL   4               ; FAO parameter list 
   OUTDESC:        .BLKL   2               ; Descriptor of formatting buffer
   OUTBUF:         .BLKB   80              ; Formatting buffer
   L_OUTBUF= .-OUTBUF
   RB:             .ASCII /UPD=11./        ; Record Buffer :
   L_RB_OP = .-RB                          ;    Open file 11 for update
   . = RB
   SALARY:         .BLKL  1                ; Overlay SALARY
   L_RB    = .-RB
           .PSECT  CODE,EXE,NOWRT
           .ENTRY  EXAMPLE,^M<>
           MOVAB   TXT_START,FAOPAR        ; Display
           BSBW    WRITE_LINE              ;    startup message
           BSBB    OPEN_DATABASE           ; Open successful ?
           BNEQ    40$                     ; No
           
           CLRL    R3                      ; Update count
           BSBW    FIND_RECORD             ; Initial find successful ?
           BNEQ    20$                     ; No
           MOVAB   TXT_FOUND,FAOPAR        ; Display
           MOVL    ISN_QUANTITY,FAOPAR+4   ;    no. of records found
           BSBW    WRITE_LINE
           TSTL    ISN_QUANTITY            ; Any records?
           BEQL    30$                     ; No
   10$:
           MOVL    SALARY,R2               ; Save old salary
           BSBW    UPDATE_RECORD           ; Salary updated successful ?
           BNEQ    20$                     ; No
           MOVAB   TXT_SALARY,FAOPAR
           MOVL    ISN,FAOPAR+4            ; Display
           MOVL    R2,FAOPAR+8             ;    ISN, old and new salary
           MOVL    SALARY,FAOPAR+12
           BSBW    WRITE_LINE      
           INCL    R3                      ; No. of records updated        
           BSBW    FIND_RECORD             ; Subsequent find successful ?
           BEQL    10$                     ; Yes
           CMPW    RESPONSE_CODE,#3        ; End of ISN list ?
           BEQL    30$                     ; Yes
   20$:
           BSBW    RESPONSE                ; Display response
           TSTL    R3                      ; Any modifications made ?
           BEQL    30$                     ; No
           BSBB    ISSUE_BT                ; Backout transaction successful ?
           BNEQ    40$                     ; No
           CLRL    R3                      ; Nothing has changed
   30$:
           BSBB    CLOSE_DATABASE          ; Close successful ?
           BEQL    999$                    ; Yes
   40$:
           BSBW    RESPONSE                ; Display response code
   999$:
           RET
   OPEN_DATABASE:
           MOVB    #EXAMPLE_DB,DB_ID       ; Example database
           MOVW    #^A/OP/,COMMAND_CODE
           MOVW    #L_RB_OP,REC_BUF_LNG    ; 'Open' Record Buffer length
   10$:
           PUSHAB  RB                      ; Record Buffer adr.
           CLRL    -(SP)                   ; No Format Buffer
           PUSHAB  CB                      ; Control Block adr.
           CALLS   #3,G^ADABAS             ; OPEN, UPDATE=EMPLOYEES_FILE
           CMPW    RESPONSE_CODE,#9        ; Response 9 ?
           BEQL    10$                     ; Yes
           TSTW    RESPONSE_CODE           ; Set condition code
           RSB
   CLOSE_DATABASE:
           MOVW    #^A/CL/,COMMAND_CODE
           PUSHAB  CB                      ; Control Block adr.
           CALLS   #1,G^ADABAS             ; CLOSE
           TSTW    RESPONSE_CODE           ; Set condition code
           RSB
   ISSUE_BT:
           MOVW    #^A/BT/,COMMAND_CODE
           PUSHAB  CB                      ; Control Block adr.
           CALLS   #1,G^ADABAS             ; Backout transaction
           TSTW    RESPONSE_CODE           ; Set condition code
           RSB
   FIND_RECORD:
           MOVW    #^A/L4/,COMMAND_CODE
           TSTL    ISN_QUANTITY            ; Initial call ?
           BNEQ    10$                     ; No
           MOVW    #^A/S4/,COMMAND_CODE
           MOVB    #EMPLOYEES_FILE,-
                   FILE_NUMBER             ; Search in file 'EMPLOYEES'
           MOVL    #^A/FIND/,COMMAND_ID
           MOVW    #L_FB,FMT_BUF_LNG       ; Set-up
           MOVW    #L_RB,REC_BUF_LNG       ;    buffer lengths
           MOVW    #L_SB,SEA_BUF_LNG
           MOVW    #L_VB,VAL_BUF_LNG
           MOVW    #L_IB,ISN_BUF_LNG
           MOVB    #^A/N/,CMD_OPT_2
           MOVAB   CB,ADAPAR+4             ; Set-up
           MOVAB   FB,ADAPAR+8             ;    ADABAS parameter block
           MOVAB   RB,ADAPAR+12
           MOVAB   SB,ADAPAR+16
           MOVAB   VB,ADAPAR+20
           MOVAB   IB,ADAPAR+24
   10$:
           MOVL    #6,ADAPAR               ; CB, FB, RB, SB, VB, IB used
           CALLG   ADAPAR,G^ADABAS         ; Find next EMPLOYEES
                                                   with NAME = 'SMITH'
           TSTW    RESPONSE_CODE           ; Set condition code
           RSB
   UPDATE_RECORD:
           DIVL3   #10,SALARY,R0           ; Increase
           ADDL2   R0,SALARY               ;    salary by 10%
           MOVW    #^A/A1/,COMMAND_CODE
           MOVL    #3,ADAPAR               ; CB, FB, RB used
           CALLG   ADAPAR,G^ADABAS         ; Update salary
           TSTW    RESPONSE_CODE           ; Set condition code
           RSB
   RESPONSE:
           MOVAB   TXT_RESP,FAOPAR
           MOVZWL  RESPONSE_CODE,FAOPAR+4  ; Display
           MOVL    #2,FAOPAR+8             ;    ADABAS response code
           MOVAB   COMMAND_CODE,FAOPAR+12
           BSBB    WRITE_LINE      
           
           RSB
   WRITE_LINE:
           MOVL    #L_OUTBUF,OUTDESC       ; Output buffer
           MOVAB   OUTBUF,OUTDESC+4        ;    length and adr.
           $FAOL_S @FAOPAR,OUTDESC,-       ; Formatting of output successful ?
                   OUTDESC,FAOPAR+4
           BLBC    R0,10$                  ; No
           PUSHAQ  OUTDESC                 
           CALLS   #1,G^LIB$PUT_OUTPUT     ; Output written successful ?
           BLBC    R0,10$                  ; No
           RSB
   10$:
           $EXIT_S R0
           .END EXAMPLE