The MAIN program block

The MAIN program block contains the menu for the orders program.

MAIN program block (orders.4gl):
01 SCHEMA custdemo
02 
03 DEFINE  order_rec RECORD
04            store_num    LIKE orders.store_num,
05            store_name   LIKE customer.store_name,
06            order_num    LIKE orders.order_num,
07            order_date   LIKE orders.order_date,
08            fac_code     LIKE orders.fac_code,
09            ship_instr   LIKE orders.ship_instr,
10            promo        LIKE orders.promo 
11         END RECORD,
12         arr_items DYNAMIC ARRAY OF RECORD
13            stock_num    LIKE items.stock_num,
14            description  LIKE stock.description,
15            quantity     LIKE items.quantity,
16            unit         LIKE stock.unit,
17            price        LIKE items.price,
18            line_total   DECIMAL(9,2)
19         END RECORD
20 
21 CONSTANT msg01 = "You must query first"
22 CONSTANT msg02 = "Enter search criteria"
23 CONSTANT msg03 = "Canceled by user"
24 CONSTANT msg04 = "No rows in table"
25 CONSTANT msg05 = "End of list"
26 CONSTANT msg06 = "Beginning of list"
27 CONSTANT msg07 = "Invalid stock number"
28 CONSTANT msg08 = "Row added"
29 CONSTANT msg09 = "Row updated"
30 CONSTANT msg10 = "Row deleted"
31 CONSTANT msg11 = "Enter order"
32 CONSTANT msg12 = "This customer does not exist"
33 CONSTANT msg13 = "Quantity must be greater than zero"
34  
35 MAIN
36   DEFINE has_order, query_ok SMALLINT
37   DEFER INTERRUPT
38 
39   CONNECT TO "custdemo"
40   CLOSE WINDOW SCREEN
41   
42   OPEN WINDOW w1 WITH FORM "orderform"
43 
44   MENU
45     BEFORE MENU
46        CALL setup_actions(DIALOG,FALSE,FALSE)
47     ON ACTION new 
48	  CLEAR FORM
49        LET query_ok = FALSE
50        CALL close_order()
51        LET has_order = order_new()
52        IF has_order THEN
53           CALL arr_items.clear()
54           CALL items_inpupd()
55        END IF
56        CALL setup_actions(DIALOG,has_order,query_ok)
57     ON ACTION find 
58        CLEAR FORM
59        LET query_ok = order_query()
60        LET has_order = query_ok 
61        CALL setup_actions(DIALOG,has_order,query_ok)
62     ON ACTION next 
63        CALL order_fetch_rel(1)
64     ON ACTION previous 
65        CALL order_fetch_rel(-1)
66     ON ACTION getitems 
67        CALL items_inpupd()
68     ON ACTION quit 
69        EXIT MENU
70   END MENU
71 
72   CLOSE WINDOW w1
73 
74 END MAIN
Note:
  • Lines 03 thru 11 define a record with fields for all the columns in the orders table, as well as store_name from the customer table.
  • Lines 12 through 19 define a dynamic array with fields for all the columns in the items table, as well as quantity and unit from the stock table, and a calculated field line_total.
  • Lines 21 thru 33 define constants to hold the program messages. This centralizes the definition of the messages, which can be used in any function in the module.
  • Lines 44 thru 65 define the main menu of the application.
  • Line 46 is executed before the menu is displayed; it calls the setup_actions function to disable navigation and item management actions by default. The DIALOG predefined object is passed as the first parameter to the function.
  • Lines 47 thru 56 perform the add action to create a new order. The order_new function is called, and if it returns TRUE, the items_inpupd function is called to allow the user to enter items for the new order. Menu actions are enabled/disabled depending on the result of the operation, using the setup_actions function.
  • Lines 57 thru 61 perform the find action to search for orders in the database. The order_query function is called and menu actions are enabled/disabled depending on the result of the operation, using the setup_actions function.
  • Lines 62 thru 65 handle navigation in the order list after a search. Function order_fetch_rel is used to fetch the previous or next record.
  • Line 67 calls the function items_inpupd to allow the user to edit the items associated with the displayed order .
  • Line 72 closes the window before leaving the program.