home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 6 / 06.iso / a / a610 / 6.ddi / DEMO / FGL / ORDMENU.4GL < prev    next >
Encoding:
Text File  |  1989-12-08  |  9.5 KB  |  596 lines

  1. DATABASE stores
  2.  
  3. GLOBALS
  4.  
  5.     DEFINE 
  6.  
  7.     p_customer     RECORD 
  8.  
  9.              customer_num LIKE customer.customer_num,
  10.              fname LIKE customer.fname,
  11.              lname LIKE customer.lname,
  12.              address1 LIKE customer.address1,
  13.              address2 LIKE customer.address2,
  14.              city LIKE customer.city,
  15.              state LIKE customer.state,
  16.              zipcode LIKE customer.zipcode,
  17.              phone LIKE customer.phone
  18.  
  19.              END RECORD,
  20.  
  21.     p_orders     RECORD 
  22.  
  23.              order_num LIKE orders.order_num,
  24.              order_date LIKE orders.order_date,
  25.              ship_date LIKE orders.ship_date
  26.  
  27.              END RECORD,
  28.  
  29.     p_items         ARRAY[10] OF RECORD
  30.     
  31.              item_num LIKE items.item_num,
  32.              stock_num LIKE items.stock_num,
  33.              manu_code LIKE items.manu_code,
  34.              description LIKE stock.description,
  35.              quantity LIKE items.quantity,
  36.              unit_price LIKE stock.unit_price,
  37.              total_price LIKE items.total_price
  38.  
  39.              END RECORD,
  40.  
  41.     chosen     SMALLINT
  42.  
  43. END GLOBALS
  44.  
  45.  
  46. MAIN
  47.  
  48.     OPEN FORM orderform FROM "order"
  49.  
  50.     DISPLAY FORM orderform
  51.  
  52.     LET chosen = 0
  53.  
  54.     CALL show_menu()
  55.  
  56.     CALL mess("End program.")
  57.  
  58.     CLEAR SCREEN
  59.  
  60. END MAIN
  61.  
  62. FUNCTION show_menu()
  63.  
  64.     DEFINE    answer     CHAR(1)
  65.  
  66.     MENU "ORDER"
  67.  
  68.         COMMAND "Add" "Add a new order."
  69.  
  70.             LET answer = "y"
  71.  
  72.             WHILE answer = "y"
  73.  
  74.                 CALL enter_order()
  75.  
  76.                 PROMPT "Do you want to ",
  77.                     "enter another order (y/n) : "
  78.                     FOR answer
  79.  
  80.             END WHILE
  81.  
  82.             LET chosen = 1
  83.  
  84.         COMMAND "Query" "Search for an order."
  85.  
  86.             CALL get_order()
  87.  
  88.         COMMAND "Modify" "Change an order."
  89.  
  90.             IF chosen = 1 THEN
  91.  
  92.                 CALL change_order()
  93.  
  94.             ELSE
  95.  
  96.                 CALL mess("No order has been chosen.")
  97.  
  98.             END IF
  99.  
  100.         COMMAND "Delete" "Delete an order."
  101.  
  102.             IF chosen = 1 THEN
  103.  
  104.                 CALL clear_menu()
  105.  
  106.                 PROMPT "Are you sure you want ",
  107.                     "to delete this order (y/n) : "
  108.                     FOR answer
  109.  
  110.                 IF answer = "y" THEN
  111.  
  112.                     CALL delete_order()
  113.  
  114.                     LET chosen = 0
  115.  
  116.                 END IF
  117.  
  118.             ELSE
  119.  
  120.                 CALL mess("No order has been chosen.")
  121.  
  122.             END IF
  123.  
  124.         COMMAND "Exit" "Exit the ORDER Menu."
  125.  
  126.             EXIT MENU
  127.  
  128.     END MENU
  129.  
  130. END FUNCTION
  131.  
  132. FUNCTION enter_order()
  133.  
  134.     DEFINE pa_curr     SMALLINT
  135.  
  136.     CALL clear_menu()
  137.  
  138.     CLEAR FORM
  139.  
  140.     CALL get_cust()
  141.  
  142.     CALL mess("Enter an order date and a ship date.")
  143.  
  144.     INPUT p_orders.order_date, p_orders.ship_date
  145.         FROM order_date, ship_date
  146.  
  147.     CALL mess("Enter up to ten items.")
  148.  
  149.  
  150.     INPUT ARRAY p_items FROM s_items.*
  151.  
  152.         BEFORE FIELD stock_num
  153.             MESSAGE "Enter a stock number."
  154.  
  155.         BEFORE FIELD manu_code
  156.             MESSAGE "Enter the code for a manufacturer."
  157.  
  158.         BEFORE FIELD quantity
  159.             MESSAGE "Enter a quantity."
  160.  
  161.         AFTER FIELD stock_num, manu_code
  162.             MESSAGE ""
  163.  
  164.             LET pa_curr = arr_curr()
  165.  
  166.             IF     p_items[pa_curr].stock_num IS NOT NULL
  167.                 AND p_items[pa_curr].manu_code IS NOT NULL 
  168.             THEN
  169.                 CALL get_item()
  170.  
  171.                 IF p_items[pa_curr].quantity IS NOT NULL THEN
  172.  
  173.                     CALL get_total()
  174.  
  175.                 END IF
  176.  
  177.             END IF
  178.  
  179.         AFTER FIELD quantity
  180.             MESSAGE ""
  181.  
  182.             LET pa_curr = arr_curr()
  183.  
  184.             IF p_items[pa_curr].stock_num IS NOT NULL
  185.                 AND p_items[pa_curr].manu_code IS NOT NULL 
  186.                 AND p_items[pa_curr].quantity IS NOT NULL
  187.             THEN
  188.                 CALL get_total()
  189.  
  190.             END IF
  191.  
  192.  
  193.         BEFORE INSERT
  194.  
  195.             CALL get_item_num()
  196.  
  197.         AFTER INSERT
  198.  
  199.             CALL renum_items()
  200.  
  201.         AFTER DELETE     
  202.  
  203.             CALL renum_items()
  204.  
  205.     END INPUT 
  206.  
  207.     INSERT INTO orders (order_num, order_date, customer_num, ship_date)
  208.         VALUES (0,
  209.             p_orders.order_date, 
  210.             p_customer.customer_num,
  211.             p_orders.ship_date)
  212.  
  213.     LET p_orders.order_num = SQLCA.SQLERRD[2]
  214.  
  215.     DISPLAY p_orders.order_num TO order_num
  216.  
  217.     CALL insert_items()
  218.  
  219.     CALL mess("Order added.")
  220.  
  221. END FUNCTION
  222.  
  223.  
  224. FUNCTION get_order()
  225.  
  226.     DEFINE
  227.         counter,exist    SMALLINT,
  228.         answer    CHAR(1)
  229.  
  230.     CALL clear_menu()
  231.  
  232.     CLEAR FORM
  233.  
  234.     CALL get_cust()
  235.  
  236.     DECLARE q_curs CURSOR FOR
  237.         SELECT order_num, order_date, ship_date
  238.             FROM orders
  239.             WHERE customer_num = p_customer.customer_num    
  240.  
  241.     LET exist = 0
  242.  
  243.     LET chosen = 0
  244.  
  245.     FOREACH q_curs INTO p_orders.*
  246.  
  247.         LET exist = 1
  248.  
  249.         CLEAR orders.*
  250.  
  251.         FOR counter = 1 TO 4
  252.  
  253.             CLEAR s_items[counter].*
  254.  
  255.         END FOR
  256.  
  257.         DISPLAY p_orders.* TO orders.*
  258.  
  259.         DECLARE my_curs CURSOR FOR
  260.             SELECT item_num, items.stock_num, 
  261.                 items.manu_code, description, 
  262.                 quantity, unit_price, total_price
  263.             FROM items, stock
  264.             WHERE order_num = p_orders.order_num
  265.                 AND items.stock_num = stock.stock_num 
  266.                 AND items.manu_code = stock.manu_code
  267.             ORDER BY item_num
  268.  
  269.         LET counter = 1
  270.  
  271.         FOREACH my_curs INTO p_items[counter].*
  272.  
  273.             LET counter = counter + 1
  274.  
  275.             IF counter > 10 THEN
  276.  
  277.                 CALL mess("Ten or more items.")
  278.  
  279.                 EXIT FOREACH
  280.             
  281.             END IF
  282.  
  283.         END FOREACH
  284.         
  285.         CALL set_count(counter - 1)
  286.  
  287.         MESSAGE "Press ESC when you finish viewing the items on order."
  288.  
  289.         DISPLAY ARRAY p_items TO s_items.*
  290.  
  291.         MESSAGE ""
  292.  
  293.         PROMPT "Enter 'y' to select this order ", 
  294.             "or ENTER to view next order: "
  295.             FOR answer
  296.  
  297.         IF answer = "y" THEN
  298.  
  299.             LET chosen = 1
  300.  
  301.             EXIT FOREACH
  302.  
  303.         END IF
  304.  
  305.     END FOREACH
  306.  
  307.     IF exist = 0 THEN
  308.  
  309.         CALL mess("No orders found for this customer.")
  310.  
  311.     ELSE
  312.  
  313.         IF chosen = 0 THEN
  314.  
  315.             CALL mess("There are no more orders for this customer.")
  316.  
  317.             CLEAR FORM
  318.  
  319.         END IF
  320.  
  321.     END IF
  322.  
  323. END FUNCTION
  324.  
  325.  
  326. FUNCTION change_order()
  327.  
  328.     DEFINE  pa_curr    SMALLINT,
  329.         answer    CHAR(1)
  330.  
  331.     CALL clear_menu()
  332.  
  333.     PROMPT "Do you want to change the order or ship date (y/n) : "
  334.         FOR answer
  335.  
  336.     IF answer = "y" THEN
  337.  
  338.         INPUT p_orders.order_date, p_orders.ship_date
  339.             WITHOUT DEFAULTS
  340.             FROM order_date, ship_date
  341.  
  342.     END IF
  343.  
  344.  
  345.     PROMPT "Do you want to change any items (y/n) : "
  346.         FOR answer
  347.  
  348.     IF answer = "y" THEN
  349.  
  350.  
  351.         INPUT ARRAY p_items WITHOUT DEFAULTS FROM s_items.* 
  352.  
  353.             BEFORE FIELD stock_num
  354.                 MESSAGE "Enter a stock number."
  355.  
  356.             BEFORE FIELD manu_code
  357.                 MESSAGE "Enter the code for a manufacturer."
  358.  
  359.             BEFORE FIELD quantity
  360.                 MESSAGE "Enter a quantity."
  361.  
  362.             AFTER FIELD stock_num, manu_code
  363.                 MESSAGE ""
  364.  
  365.                 LET pa_curr = arr_curr()
  366.  
  367.                 IF p_items[pa_curr].stock_num IS NOT NULL
  368.                 AND p_items[pa_curr].manu_code IS NOT NULL 
  369.                 
  370.                 THEN
  371.                     CALL get_item()
  372.     
  373.                     IF p_items[pa_curr].quantity IS NOT NULL
  374.                     THEN
  375.     
  376.                         CALL get_total()
  377.     
  378.                     END IF
  379.     
  380.                 END IF
  381.     
  382.             AFTER FIELD quantity
  383.                 MESSAGE ""
  384.  
  385.                 LET pa_curr = arr_curr()
  386.  
  387.                 IF p_items[pa_curr].stock_num IS NOT NULL
  388.                 AND p_items[pa_curr].manu_code IS NOT NULL 
  389.                 AND p_items[pa_curr].quantity IS NOT NULL
  390.                 THEN
  391.                     CALL get_total()
  392.     
  393.                 END IF
  394.     
  395.             BEFORE INSERT
  396.  
  397.                 CALL get_item_num()
  398.  
  399.             AFTER INSERT
  400.     
  401.                 CALL renum_items()
  402.  
  403.             AFTER DELETE
  404.  
  405.                 CALL renum_items()
  406.     
  407.         END INPUT 
  408.  
  409.     END IF
  410.  
  411.     UPDATE orders
  412.         SET order_date = p_orders.order_date,
  413.             ship_date = p_orders.ship_date
  414.         WHERE order_num = p_orders.order_num
  415.  
  416.     DELETE FROM items
  417.         WHERE order_num = p_orders.order_num
  418.  
  419.  
  420.     CALL insert_items()
  421.  
  422.     CALL mess("Order changed.")
  423.  
  424. END FUNCTION
  425.  
  426. FUNCTION delete_order()
  427.  
  428.     DEFINE counter SMALLINT
  429.  
  430.     DELETE FROM orders
  431.         WHERE order_num = p_orders.order_num
  432.  
  433.     DELETE FROM items
  434.         WHERE order_num = p_orders.order_num
  435.  
  436.     CLEAR orders.*
  437.  
  438.     FOR counter = 1 to 4
  439.  
  440.         CLEAR s_items[counter].*
  441.  
  442.     END FOR
  443.  
  444.     CALL mess("Order deleted.")
  445.  
  446. END FUNCTION
  447.  
  448. FUNCTION get_item()
  449.  
  450.     DEFINE pa_curr, sc_curr SMALLINT
  451.  
  452.     LET pa_curr = arr_curr()
  453.  
  454.     LET sc_curr = scr_line()
  455.  
  456.     SELECT description, unit_price
  457.         INTO    p_items[pa_curr].description,
  458.             p_items[pa_curr].unit_price
  459.         FROM    stock
  460.         WHERE    stock.stock_num = p_items[pa_curr].stock_num
  461.             AND stock.manu_code = p_items[pa_curr].manu_code
  462.  
  463.     DISPLAY p_items[pa_curr].description, 
  464.             p_items[pa_curr].unit_price
  465.         TO s_items[sc_curr].description,
  466.             s_items[sc_curr].unit_price
  467.  
  468. END FUNCTION
  469.  
  470. FUNCTION get_total()
  471.  
  472.     DEFINE pa_curr, sc_curr SMALLINT
  473.  
  474.     LET pa_curr = arr_curr()
  475.  
  476.     LET sc_curr = scr_line()
  477.  
  478.     LET p_items[pa_curr].total_price =
  479.         p_items[pa_curr].quantity * p_items[pa_curr].unit_price
  480.  
  481.     DISPLAY p_items[pa_curr].total_price
  482.         TO s_items[sc_curr].total_price
  483.  
  484. END FUNCTION
  485.  
  486.  
  487. FUNCTION get_item_num()
  488.  
  489.     DEFINE pa_curr, sc_curr SMALLINT
  490.  
  491.     LET pa_curr = arr_curr()
  492.  
  493.     LET sc_curr = scr_line()
  494.  
  495.     LET p_items[pa_curr].item_num = pa_curr
  496.  
  497.     DISPLAY pa_curr TO s_items[sc_curr].item_num
  498.  
  499. END FUNCTION
  500.  
  501.  
  502. FUNCTION renum_items()
  503.  
  504.     DEFINE pa_curr,
  505.         pa_total,
  506.         sc_curr,
  507.         sc_total,
  508.         k    SMALLINT
  509.  
  510.     LET pa_curr = arr_curr()
  511.  
  512.     LET pa_total = arr_count()
  513.  
  514.     LET sc_curr = scr_line()
  515.  
  516.     LET sc_total = 4
  517.  
  518.     FOR k = pa_curr TO pa_total
  519.  
  520.         LET p_items[k].item_num = k
  521.  
  522.         IF sc_curr <= sc_total THEN
  523.  
  524.             DISPLAY k TO s_items[sc_curr].item_num
  525.  
  526.             LET sc_curr = sc_curr + 1
  527.  
  528.         END IF
  529.  
  530.     END FOR
  531.  
  532. END FUNCTION
  533.  
  534. FUNCTION get_cust()
  535.  
  536.     WHILE TRUE
  537.  
  538.         PROMPT "Enter a customer number:  "
  539.             FOR p_customer.customer_num
  540.  
  541.         SELECT fname, lname, address1, address2, 
  542.                 city, state, zipcode, phone
  543.             INTO p_customer.fname THRU p_customer.phone
  544.             FROM customer 
  545.             WHERE customer_num = p_customer.customer_num
  546.  
  547.         IF status = 0 THEN
  548.  
  549.             EXIT WHILE
  550.  
  551.         END IF
  552.  
  553.     END WHILE
  554.  
  555.     DISPLAY p_customer.* TO customer.*
  556.  
  557. END FUNCTION
  558.  
  559. FUNCTION insert_items()
  560.  
  561.     DEFINE counter SMALLINT
  562.  
  563.     FOR counter = 1 TO arr_count()
  564.  
  565.         INSERT INTO items 
  566.             VALUES (p_items[counter].item_num,
  567.                 p_orders.order_num,
  568.                 p_items[counter].stock_num,
  569.                 p_items[counter].manu_code,
  570.                 p_items[counter].quantity,
  571.                 p_items[counter].total_price)
  572.  
  573.     END FOR
  574.  
  575. END FUNCTION
  576.  
  577. FUNCTION mess(str)
  578.  
  579.     DEFINE str CHAR(50)
  580.  
  581.     DISPLAY str CLIPPED AT 23,1
  582.  
  583.     SLEEP 3
  584.  
  585.     DISPLAY "" AT 23, 1
  586.  
  587. END FUNCTION
  588.  
  589. FUNCTION clear_menu()
  590.  
  591.     DISPLAY "" AT 1,1
  592.     DISPLAY "" AT 2,1
  593.  
  594. END FUNCTION
  595.  
  596.