HPlogo ALLBASE/SQL COBOL Application Programming Guide: HP 3000 MPE/iX Computer Systems > Chapter 9 Bulk Table Processing

Sample Program Using BULK Processing

» 

Technical documentation

Complete book in PDF
» Feedback

 » Table of Contents

 » Index

The flow chart in Figure 9-1 summarizes the functionality of program COBEX9. This program creates orders in the sample DBEnvironment, PARTSDBE. Each order is placed with a specific vendor, to obtain one or more parts supplied by that vendor.

The order header consists of data from a row in table PURCHDB.ORDERS:

                ORDERNUMBER (defined NOT NULL)
                VENDORNUMBER
                ORDERDATE

An order usually also consists of one or more line items, represented by one or more rows in table PURCHDB.ORDERITEMS:

             ORDERNUMBER (defined NOT NULL)
             ITEMNUMBER (defined NOT NULL)
             VENDPARTNUMBER
             PURCHASEPRICE (defined NOT NULL)
             ORDERQTY
             ITEMDUEDATE
             RECEIVEDQTY

Program COBEX9 uses a simple INSERT command to create the order header and, optionally, a BULK INSERT command to insert line items.

The runtime dialog for COBEX9 appears in Figure 9-2 “Execution of Program COBEX9”, and the source code in Figure 9-3 “Program COBEX9: Using BULK INSERT ”.

To establish a DBE session, COBEX9 performs paragraph CONNECT-DBENVIRONMENT 3 , which executes the CONNECT command 52 .

The program then executes paragraph CREATE-ORDER through CREATE-ORDER-EXIT until the DONE-FLAG contains an X 4 .

Paragraph CREATE-ORDER prompts for a vendor number or a zero 7 . When the user enters a zero, an X is moved to DONE-FLAG 8 and the program terminates. When the user enters a vendor number, COBEX9:

  • Validates the number entered.

  • Creates an order header if the vendor number is valid.

  • Optionally inserts line items if the order header has been successfully created; the part number for each line item is validated to ensure the vendor actually supplies the part.

  • Displays the order created.

To validate the vendor number, paragraph VALIDATE-VENDOR is executed 9 . Paragraph VALIDATE-VENDOR starts a transaction by performing paragraph BEGIN-TRANSACTION 38 , which executes the BEGIN WORK command 53 . Then a SELECT command 39 is processed to determine whether the vendor number exists in column VENDORNUMBER of table PURCHDB.VENDORS:

  • If the number exists in table PURCHDB.VENDORS, the vendor number is valid. A space is moved to VENDOR-FLAG, and the transaction is terminated by performing paragraph COMMIT-WORK 40 . Paragraph COMMIT-WORK executes the COMMIT WORK command 54 .

  • If the vendor number is not found, COMMIT WORK is executed and a message displayed to inform the user that the number entered is invalid 41 . Several flags are set to X so that when control returns to paragraph CREATE-ORDER, the user is again prompted for a vendor number.

  • If the SELECT command fails, paragraph SQL-STATUS-CHECK is performed 42 to display any error messages 51 before the transaction is terminated and the appropriate flags set.

If the vendor number is valid, COBEX9 performs paragraph CREATE-HEADER to create the order header 10 . The order header consists of a row containing the vendor number entered, plus two values computed by the program: ORDERNUMBER and ORDERDATE.

Paragraph CREATE-HEADER starts a transaction 13 , then obtains an exclusive lock on table PURCHDB.ORDERS 14 . Exclusive access to this table ensures that when the row is inserted, no row having the same number will have been inserted by another transaction. The unique index that exists on column ORDERNUMBER prevents duplicate order numbers in table PURCHDB.ORDERS. Therefore an INSERT operation fails if it attempts to insert a row having an order number with a value already in column ORDERNUMBER.

In this case, the exclusive lock does not threaten concurrency. No operations conducted between the time the lock is obtained and the time it is released involve operator intervention:

  • Paragraph CREATE-HEADER executes a SELECT command to retrieve the highest order number in PURCHDB.ORDERS 15 . The number retrieved is incremented by one 16 to assign a number to the order.

  • Paragraph CREATE-HEADER then moves the special register word CURRENT-DATE to variable TODAY 17 . This variable is declared as an array 2 containing elements that can be concatenated to the YYYYMMDD format 18 in which ORDERDATE values are stored.

  • Paragraph CREATE-HEADER then executes a simple INSERT command 19 to insert a row into PURCHDB.ORDERS. If the INSERT command succeeds, the transaction is terminated with a COMMIT WORK command, and a space is moved to HEADER-FLAG 20 . If the INSERT command fails, the transaction is terminated with COMMIT WORK, but an X is moved to HEADER-FLAG 21 so that the user is prompted for another vendor number when control returns to paragraph CREATE-ORDER.

To create line items, paragraph CREATE-ORDER performs paragraph CREATE-ORDER-ITEMS until the DONE-ITEMS-FLAG contains an X 11 . CREATE-ORDER-ITEMS asks the user whether she wants to specify line items 22 .

If the user wants to create line items, CREATE-ORDER-ITEMS performs paragraph ITEM-ENTRY through ITEM-ENTRY-EXIT until the DONE-ITEMS-FLAG contains an X 24 , then performs paragraph BULK-INSERT 25 :

  • ITEM-ENTRY assigns values to host variable array ORDERITEMS 1 ; each row in the array corresponds to one line item, or row in table PURCHDB.ORDERITEMS. The paragraph first assigns the order number and a line number to each row 26 , beginning at one. ITEM-ENTRY then prompts for a vendor part number 27 , which is validated by performing paragraph VALIDATE-PART 28 .

    VALIDATE-PART starts a transaction 43 . Then it executes a SELECT command 44 to determine whether the part number entered matches any part number known to be supplied by the vendor. If the part number is valid, the COMMIT WORK command is executed 45 and a space moved to PART-FLAG. If the part number is invalid, COMMIT WORK is executed 46 , and the user informed that the vendor does not supply any part having the number specified; then an X is moved to PART-FLAG so that the user is prompted for another part number when control returns to paragraph ITEM-ENTRY.

    If the part number is valid, paragraph ITEM-ENTRY completes the line item. It prompts for values to assign to columns PURCHASEPRICE, ORDERQTY, and ITEMDUEDATE 29 . The paragraph then assigns a negative value to the indicator variable for column RECEIVEDQTY 30 in preparation for inserting a null value into this column.

    ITEM-ENTRY terminates when the user indicates that she does not want to specify any more line items 32 or when the host variable array is full 31 .

  • Paragraph BULK-INSERT starts a transaction 33 , then executes the BULK INSERT command 35 . The line items in array ORDERITEMS are inserted into table PURCHDB.ORDERITEMS, starting with the first row in the array and continuing for as many rows as there were line items specified 34 . If the BULK INSERT command succeeds, the COMMIT WORK command is executed 36 and a space moved to ITEMS-FLAG. If the BULK INSERT command fails, paragraph ROLLBACK-WORK is executed 37 to process the ROLLBACK WORK command 55 so that any rows inserted prior to the failure are rolled back.

If the user does not want to create line items, paragraph CREATE-ORDER-ITEMS displays the order header by performing paragraph DISPLAY-HEADER 23 . DISPLAY-HEADER displays the row inserted earlier in PURCHDB.ORDERS 49 .

If line items were inserted into PURCHDB.ORDERITEMS, paragraph DISPLAY-ORDER is performed 12 to display the order created. DISPLAY-ORDER performs paragraph DISPLAY-HEADER 47 to display the order header. Then it performs paragraph DISPLAY-ITEMS 48 to display each row inserted into PURCHDB.ORDERITEMS. DISPLAY-ITEMS displays values from array ORDERITEMS 50 .

When the program user enters a zero in response to the vendor number prompt, the program terminates by performing paragraph TERMINATE-PROGRAM 5 , which executes the RELEASE command 6 .

Figure 9-1 Flow Chart of Program COBEX9

[Flow Chart of Program COBEX9]

Figure 9-2 Execution of Program COBEX9

   :RUN COBEX9P

   Program to Create an Order - COBEX9
   Event List:
     Connect to PartsDBE
     Prompt for VendorNumber
     Validate VendorNumber
     INSERT a row into PurchDB.Orders
     Prompt for line items
     Validate VendPartNumber for each line item
     BULK INSERT rows into PurchDB.OrderItems
     Repeat the above six steps until user enters 0
     Release PartsDBE

   Connect to PartsDBE

   Enter VendorNumber or 0 to STOP> 9015

   Begin Work
   Validating VendorNumber
   Commit Work

   Begin Work
   Calculating OrderNumber
   Calculating OrderDate
   INSERT INTO PurchDB.Orders
   Commit Work

   Do you want to specify line items (Y/N)?> y

   You can specify as many as 25 line items.

   Enter data for ItemNumber      1:
    VendPartNumber> 9040

   Begin Work
   Validating VendPartNumber
   Commit Work

    PurchasePrice> 1500
    OrderQty> 5
    ItemDueDate (YYYYMMDD)> 19870630

   Do you want to specify another line item (Y/N)?> y

   You can specify as many as 25 line items.

   Enter data for ItemNumber      2:
    VendPartNumber> 9055
   Begin Work
   Validating VendPartNumber
   Commit Work

   The vendor has no part with the number you specified.

   You can specify as many as 25 line items.

   Enter data for ItemNumber      2:
    VendPartNumber> 9050

   Begin Work
   Validating VendPartNumber
   Commit Work

    PurchasePrice> 345
    OrderQty> 2
    ItemDueDate (YYYYMMDD)> 19870801

   Do you want to specify another line item (Y/N)?> n

   Begin Work
   BULK INSERT INTO PurchDB.OrderItems
   Commit Work

   The following order has been created:

    OrderNumber:    30538
    VendorNumber:    9015
    OrderDate:     19870603

    ItemNumber:           1
      VendPartNumber:  9040
      PurchasePrice:        $1,500.00
      OrderQty:             5
      ItemDueDate:     19870630
      ReceivedQty:     NULL

    ItemNumber:           2
      VendPartNumber:  9050
      PurchasePrice:          $345.00
      OrderQty:             2
      ItemDueDate:     19870801
      ReceivedQty:     NULL

   Enter VendorNumber or 0 to STOP> 0
    END OF PROGRAM

Figure 9-3 Program COBEX9: Using BULK INSERT

    
         * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
         * This program illustrates the use of BULK INSERT             *
         * to insert multiple rows at a time.                          *
         * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
          IDENTIFICATION DIVISION.
          PROGRAM-ID.             COBEX9.
          AUTHOR.                 JIM FRANCIS AND KAREN THOMAS.
          INSTALLATION.           HP.
          DATE-WRITTEN.           20 MAY 1987.
          DATE-COMPILED.          20 MAY 1987.
          REMARKS.                ILLUSTRATES BULK INSERT.
          ENVIRONMENT DIVISION.
          CONFIGURATION SECTION.
          SOURCE-COMPUTER.        HP-3000.
          OBJECT-COMPUTER.        HP-3000.
          SPECIAL-NAMES.          CONSOLE IS TERMINAL-INPUT.
          INPUT-OUTPUT SECTION.
          FILE-CONTROL.
              SELECT CRT ASSIGN TO "$STDLIST".
          DATA DIVISION.
          FILE SECTION.
          FD CRT.
          01  PROMPT                  PIC X(33).
          01  PROMPT1                 PIC X(42).
          01  PROMPT2                 PIC X(17).
          01  PROMPT3                 PIC X(16).
          01  PROMPT4                 PIC X(11).
          01  PROMPT5                 PIC X(25).
          01  PROMPT6                 PIC X(49).
          WORKING-STORAGE SECTION.

          EXEC SQL INCLUDE SQLCA END-EXEC.
         * * * * * *   BEGIN HOST VARIABLE DECLARATIONS  * * * * * * *
          EXEC SQL BEGIN DECLARE SECTION END-EXEC.
          01  ORDERNUMBER1            PIC S9(9) COMP.
          01  VENDORNUMBER            PIC S9(9) COMP.
          01  ORDERDATE               PIC X(8).
          01  PARTSPECIFIED           PIC X(16).
          01  MAXORDERNUMBER          PIC S9(9) COMP.
          01  ORDERITEMS.                                              1 
            05  EACH-ROW OCCURS 25 TIMES.
              10  ORDERNUMBER2            PIC S9(9) COMP.
              10  ITEMNUMBER              PIC S9(9) COMP.
              10  VENDPARTNUMBER          PIC X(16).
              10  PURCHASEPRICE           PIC S9(8)V99 COMP-3.
              10  ORDERQTY                PIC S9(4) COMP.
              10  ITEMDUEDATE             PIC X(8).
              10  RECEIVEDQTY             PIC S9(4) COMP.
              10  RECEIVEDQTYIND          SQLIND.
          01  STARTINDEX              PIC S9(4) COMP.
          01  NUMBEROFROWS            PIC S9(4) COMP.

          01  SQLMESSAGE              PIC X(132).
          EXEC SQL END DECLARE SECTION END-EXEC.
         * * * * * *   END OF HOST VARIABLE DECLARATIONS * * * * * * *
         $PAGE
          77   DONE-FLAG              PIC X VALUE SPACE.
            88    NOT-DONE            VALUE SPACE.
            88    DONE                VALUE "X".

          77   DONE-ITEMS-FLAG        PIC X VALUE SPACE.
            88    NOT-DONE-ITEMS      VALUE SPACE.
            88    DONE-ITEMS          VALUE "X".

          77   VENDOR-FLAG            PIC X VALUE SPACE.
            88    VENDOR-OK           VALUE SPACE.
            88    VENDOR-NOT-OK       VALUE "X".

          77   HEADER-FLAG            PIC X VALUE SPACE.
            88    HEADER-OK           VALUE SPACE.
            88    HEADER-NOT-OK       VALUE "X".

          77   PART-FLAG              PIC X VALUE SPACE.
            88    PART-OK             VALUE SPACE.
            88    PART-NOT-OK         VALUE "X".

          77   ITEMS-FLAG             PIC X VALUE SPACE.
            88    ITEMS-OK            VALUE SPACE.
            88    ITEMS-NOT-OK        VALUE "X".

          77  ABORT-FLAG              PIC X VALUE SPACE.
            88  NOT-STOP              VALUE SPACE.
            88  ABORT                 VALUE "X".

          01  I                       PIC S9(4) COMP.
          01  J                       PIC S9(4) COMP.
          01  OK                      PIC S9(9) COMP VALUE      0.
          01  NOTFOUND                PIC S9(9) COMP VALUE    100.
          01  DEADLOCK                PIC S9(9) COMP VALUE -14024.

          01  RESPONSE                PIC S9(9) COMP VALUE 0.
          01  RESPONSE1               PIC X(4)       VALUE SPACE.

          01  ORDERNUMFORMAT         PIC ZZZZZ9.
          01  VENDORNUMFORMAT        PIC ZZZZZ9.
          01  ITEMNUMFORMAT          PIC ZZZZZ9.
          01  QTYNUMFORMAT           PIC ZZZZZ9.
          01  DOLLARS                PIC $$$,$$$,$$$.99.
          01  TODAY.                                                   2 
            05  TMONTH              PIC X(2).
            05  FILLER              PIC X(1).
            05  TDAY                PIC X(2).
            05  FILLER              PIC X(1).
            05  TYEAR               PIC X(2).
         $PAGE
          PROCEDURE DIVISION.

          BEGIN.

              DISPLAY "Program to Create an Order - COBEX9".
              DISPLAY " ".
              DISPLAY "Event List:".
              DISPLAY "  Connect to PartsDBE".
              DISPLAY "  Prompt for VendorNumber".
              DISPLAY "  Validate VendorNumber".
              DISPLAY "  INSERT a row into PurchDB.Orders".
              DISPLAY "  Prompt for line items".
              DISPLAY "  Validate VendPartNumber for each line item".
              DISPLAY "  BULK INSERT rows into PurchDB.OrderItems".
              DISPLAY "  Repeat the above six steps until "
                      "user enters 0".
              DISPLAY "  Release PartsDBE".
              DISPLAY " ".


              OPEN OUTPUT CRT.

              PERFORM CONNECT-DBENVIRONMENT.                           3 

              PERFORM CREATE-ORDER THRU CREATE-ORDER-EXIT UNTIL DONE.  4 

              PERFORM TERMINATE-PROGRAM.                               5 

          TERMINATE-PROGRAM.

              EXEC SQL RELEASE END-EXEC.                               6 

              STOP RUN.

          CREATE-ORDER.

              MOVE SPACES TO DONE-ITEMS-FLAG.
              MOVE "Enter VendorNumber or 0 to STOP> " TO PROMPT.      7 
              WRITE PROMPT AFTER ADVANCING 1 LINE.
              ACCEPT RESPONSE FREE.
              IF RESPONSE IS ZERO THEN                                 8 
                 MOVE "X" TO DONE-FLAG
                 GO TO CREATE-ORDER-EXIT
              ELSE
                 MOVE RESPONSE TO VENDORNUMBER.

              PERFORM VALIDATE-VENDOR.                                 9 

              IF VENDOR-OK THEN PERFORM CREATE-HEADER.                 10 

              IF HEADER-OK THEN
                 PERFORM CREATE-ORDER-ITEMS UNTIL DONE-ITEMS.          11 

              IF ITEMS-OK THEN PERFORM DISPLAY-ORDER.                  12 

          CREATE-ORDER-EXIT.

              EXIT.

          CREATE-HEADER.

              DISPLAY " ".
              DISPLAY "Begin Work".

              PERFORM BEGIN-TRANSACTION.                               13 

              EXEC SQL LOCK TABLE PURCHDB.ORDERS                       14 
                         IN EXCLUSIVE MODE
              END-EXEC.

              IF SQLCODE NOT = OK THEN
                 PERFORM SQL-STATUS-CHECK
                 PERFORM COMMIT-WORK
                 MOVE "X" TO HEADER-FLAG
                 GO TO CREATE-HEADER-EXIT.

              EXEC SQL SELECT  MAX(ORDERNUMBER)                        15 
                         INTO :MAXORDERNUMBER
                         FROM  PURCHDB.ORDERS
              END-EXEC.

              IF SQLCODE NOT = OK THEN
                 PERFORM SQL-STATUS-CHECK
                 PERFORM COMMIT-WORK
                 MOVE "X" TO HEADER-FLAG
                 GO TO CREATE-HEADER-EXIT.
              DISPLAY "Calculating OrderNumber".

              COMPUTE ORDERNUMBER1 = MAXORDERNUMBER + 1.               16 
              DISPLAY "Calculating OrderDate".
              MOVE CURRENT-DATE TO TODAY.                              17 

              STRING "19", TYEAR, TMONTH, TDAY                         18 
                DELIMITED BY SIZE INTO ORDERDATE.

              DISPLAY "INSERT INTO PurchDB.Orders".
              EXEC SQL INSERT INTO   PURCHDB.ORDERS                    19 
                                   ( ORDERNUMBER,
                                     VENDORNUMBER,
                                     ORDERDATE )
                            VALUES (:ORDERNUMBER1,
                                    :VENDORNUMBER,
                                    :ORDERDATE )
              END-EXEC.

              IF SQLCODE = OK THEN                                     20 
                 PERFORM COMMIT-WORK
                 MOVE SPACE TO HEADER-FLAG
              ELSE
                 PERFORM SQL-STATUS-CHECK
                 PERFORM COMMIT-WORK
                 MOVE "X" TO HEADER-FLAG.                              21 

          CREATE-HEADER-EXIT.
              EXIT.

          CREATE-ORDER-ITEMS.

              MOVE "Do you want to specify line items (Y/N)?> "        22 
                   TO PROMPT1.
              MOVE SPACE TO RESPONSE1.
              WRITE PROMPT1 AFTER ADVANCING 1 LINE.
              ACCEPT RESPONSE1.

              IF RESPONSE1 = "N" OR "n" THEN
                 MOVE "X" TO DONE-ITEMS-FLAG
                 MOVE "X" TO ITEMS-FLAG
                 PERFORM DISPLAY-HEADER                                23 
              ELSE
                 MOVE 1 TO I
                 PERFORM ITEM-ENTRY THRU ITEM-ENTRY-EXIT               24 
                   UNTIL DONE-ITEMS
                 PERFORM BULK-INSERT.                                  25 

              ITEM-ENTRY.
              MOVE ORDERNUMBER1 TO ORDERNUMBER2(I).                    26 
              MOVE I TO ITEMNUMBER(I).
              MOVE I TO ITEMNUMFORMAT.
              DISPLAY " ".
              DISPLAY "You can specify as many as 25 line items.".
              DISPLAY " ".
              DISPLAY "Enter data for ItemNumber " ITEMNUMFORMAT ":".

              MOVE " VendPartNumber> " TO PROMPT2.                     27 
              WRITE PROMPT2 AFTER ADVANCING 1 LINE.
              MOVE SPACES TO VENDPARTNUMBER(I).
              ACCEPT VENDPARTNUMBER(I).

              PERFORM VALIDATE-PART.                                   28 

              IF PART-OK THEN

                 MOVE " PurchasePrice> " TO PROMPT3                    29 
                 WRITE PROMPT3 AFTER ADVANCING 1 LINE
                 ACCEPT PURCHASEPRICE(I) FREE

                 MOVE " OrderQty> " TO PROMPT4
                 WRITE PROMPT4 AFTER ADVANCING 0 LINES
                 ACCEPT ORDERQTY(I) FREE

                 MOVE " ItemDueDate (YYYYMMDD)> " TO PROMPT5
                 WRITE PROMPT5 AFTER ADVANCING 0 LINES
                 MOVE SPACES TO ITEMDUEDATE(I)
                 ACCEPT ITEMDUEDATE(I)

                 MOVE -1 TO RECEIVEDQTYIND(I)                          30 

                 IF I = 25 THEN                                        31 
                   MOVE "X" TO DONE-ITEMS-FLAG
                   GO TO ITEM-ENTRY-EXIT
                 ELSE
                   DISPLAY " "
                   MOVE "Do you want to specify another line item (Y/N)?> "
                     TO PROMPT6
                   MOVE SPACE TO RESPONSE1
                   WRITE PROMPT6 AFTER ADVANCING 1 LINE
                   ACCEPT RESPONSE1

                   IF RESPONSE1 = "N" OR "n" THEN                      32 
                      MOVE "X" TO DONE-ITEMS-FLAG
                   ELSE
                      COMPUTE I = I + 1.
              ITEM-ENTRY-EXIT.

              EXIT.

          BULK-INSERT.
              DISPLAY " ".
              DISPLAY "Begin Work".
              PERFORM BEGIN-TRANSACTION.                               33 

              MOVE I TO NUMBEROFROWS.                                  34 
              MOVE 1 TO STARTINDEX.

              DISPLAY "BULK INSERT INTO PurchDB.OrderItems".
              EXEC SQL BULK INSERT INTO   PURCHDB.ORDERITEMS           35 
                                        ( ORDERNUMBER,
                                          ITEMNUMBER,
                                          VENDPARTNUMBER,
                                          PURCHASEPRICE,
                                          ORDERQTY,
                                          ITEMDUEDATE,
                                          RECEIVEDQTY )
                                 VALUES (:ORDERITEMS,
                                         :STARTINDEX,
                                         :NUMBEROFROWS)
              END-EXEC.

              IF SQLCODE = OK THEN                                     36 
                 PERFORM COMMIT-WORK
                 MOVE SPACE TO ITEMS-FLAG
              ELSE
                 PERFORM SQL-STATUS-CHECK
                 PERFORM ROLLBACK-WORK                                 37 
                 MOVE "X" TO ITEMS-FLAG.


          VALIDATE-VENDOR.
              DISPLAY " ".
              DISPLAY "Begin Work".
              DISPLAY "Validating VendorNumber".

              PERFORM BEGIN-TRANSACTION.                               38 

              EXEC SQL SELECT  VENDORNUMBER                            39 
                         INTO :VENDORNUMBER
                         FROM  PURCHDB.VENDORS
                        WHERE  VENDORNUMBER = :VENDORNUMBER
              END-EXEC.
    
              IF SQLCODE = OK THEN                                     40 
                 PERFORM COMMIT-WORK
                 MOVE SPACE TO VENDOR-FLAG
              ELSE
              IF SQLCODE = NOTFOUND                                    41 
                 PERFORM COMMIT-WORK
                 DISPLAY " "
                 DISPLAY "No vendor has the VendorNumber you specified."
                 MOVE "X" TO VENDOR-FLAG
                 MOVE "X" TO HEADER-FLAG
                 MOVE "X" TO ITEMS-FLAG
              ELSE
                 PERFORM SQL-STATUS-CHECK                              42 
                 PERFORM COMMIT-WORK
                 MOVE "X" TO VENDOR-FLAG
                 MOVE "X" TO HEADER-FLAG
                 MOVE "X" TO ITEMS-FLAG.

          VALIDATE-PART.
              DISPLAY " ".
              DISPLAY "Begin Work".
              DISPLAY "Validating VendPartNumber".

              PERFORM BEGIN-TRANSACTION.                               43 

              MOVE VENDPARTNUMBER(I) TO PARTSPECIFIED.
              EXEC SQL SELECT  VENDPARTNUMBER                          44 
                         INTO :PARTSPECIFIED
                         FROM  PURCHDB.SUPPLYPRICE
                        WHERE  VENDORNUMBER   = :VENDORNUMBER
                          AND  VENDPARTNUMBER = :PARTSPECIFIED
              END-EXEC.

              IF SQLCODE = OK THEN                                     45 
                 PERFORM COMMIT-WORK
                 MOVE SPACE TO PART-FLAG
              ELSE
              IF SQLCODE = NOTFOUND                                    46 
                 PERFORM COMMIT-WORK
                 DISPLAY " "
                 DISPLAY "The vendor has no part "
                       "with the number you specified."
                 MOVE "X" TO PART-FLAG
              ELSE
                 PERFORM SQL-STATUS-CHECK
                 PERFORM COMMIT-WORK
                 MOVE "X" TO PART-FLAG.
    
          DISPLAY-ORDER.

              PERFORM DISPLAY-HEADER.                                  47 
              DISPLAY " ".
              PERFORM DISPLAY-ITEMS VARYING J FROM 1 BY 1 UNTIL J > I. 48 

          DISPLAY-HEADER.                                              49 

              DISPLAY " ".

              DISPLAY "The following order has been created:"
              DISPLAY " ".

              MOVE ORDERNUMBER1 TO ORDERNUMFORMAT
              DISPLAY " OrderNumber:   " ORDERNUMFORMAT.

              MOVE VENDORNUMBER TO VENDORNUMFORMAT.
              DISPLAY " VendorNumber:  " VENDORNUMFORMAT.

              DISPLAY " OrderDate:     " ORDERDATE.


          DISPLAY-ITEMS.                                               50 

              DISPLAY " ".
              MOVE ITEMNUMBER(J) TO ITEMNUMFORMAT.
              DISPLAY " ItemNumber:      " ITEMNUMFORMAT.
              DISPLAY "   VendPartNumber:  " VENDPARTNUMBER(J).
              MOVE PURCHASEPRICE(J) TO DOLLARS.
              DISPLAY "   PurchasePrice:   " DOLLARS.
              MOVE ORDERQTY(J) TO QTYNUMFORMAT.
              DISPLAY "   OrderQty:        " QTYNUMFORMAT.
              DISPLAY "   ItemDueDate:     " ITEMDUEDATE(J).
              DISPLAY "   ReceivedQty:     NULL".


          SQL-STATUS-CHECK.                                            51 

              IF SQLCODE < DEADLOCK THEN
                 MOVE "X" TO ABORT-FLAG.

              PERFORM SQLEXPLAIN UNTIL SQLCODE = 0.

              IF ABORT THEN PERFORM TERMINATE-PROGRAM.

          SQL-STATUS-CHECK-EXIT.

              EXIT.

          SQLEXPLAIN.

              EXEC SQL SQLEXPLAIN :SQLMESSAGE END-EXEC.

              DISPLAY SQLMESSAGE.
          CONNECT-DBENVIRONMENT.

              DISPLAY "Connect to PartsDBE".

              EXEC SQL CONNECT TO "PartsDBE" END-EXEC.                 52 

              IF SQLCODE NOT = OK THEN
                 PERFORM SQL-STATUS-CHECK
                 PERFORM TERMINATE-PROGRAM.

             BEGIN-TRANSACTION.

              EXEC SQL BEGIN WORK END-EXEC.                            53 

              IF SQLCODE NOT = OK THEN
                 PERFORM SQL-STATUS-CHECK
                 PERFORM TERMINATE-PROGRAM.

          COMMIT-WORK.

              DISPLAY "Commit Work".

              EXEC SQL COMMIT WORK END-EXEC.                           54 

              IF SQLCODE NOT = OK THEN
                 PERFORM SQL-STATUS-CHECK
                 PERFORM TERMINATE-PROGRAM.

          ROLLBACK-WORK.

              DISPLAY "Rollback Work".

              EXEC SQL ROLLBACK WORK END-EXEC.                         55 

              IF SQLCODE NOT = OK THEN
                 PERFORM SQL-STATUS-CHECK
                 PERFORM TERMINATE-PROGRAM.