2012年8月21日

在畫面加上資料清單,從此不必再下一筆查了

用過 TIPTOP 的剛開始最不習慣的就是查詢資料都要下一筆、下一筆的查詢,
不但查詢耗時,而且要匯出 Excel 需要跑報表才可以列出清單,
讓使用者感覺操作不是那麼的流暢和便利。

可以在程式上面加上資料清單囉~~
而且調整的程式的部份不會很多,大約半小時就可以完成一支程式。

以動態料件數量明細查詢 aimq102 為例:


當在主畫面的時候匯出 Excel 可以匯出庫存明細,
在資料清單匯出 Excel 則匯出資料清單資料,且 Double Click 就會跳到主畫面。
在資料清單選擇料件時,下面的庫存明細也會跟著更新。

這樣是不是就方便許多,也不需要另外在做報表程式做明細資料的匯出。

修改程式步驟:
1. 修改畫面檔,增加新的頁籤,並指定 action ,記得 Main 也要加上 action。

2. 再來就是修改程式了,需要增加二個 Function。
    q102_list_fill() 在顯示資料清單用的。
    q102_bp1(p_ud) 在跳到資料清單時等待操作用的,才能停留畫面在資料清單。                                           
                          如果需要能夠在資料清單做過帳、確認的動作,也是加在此 Function。

3. 最後就是一些小調整,讓功能更完整啦,
   可以在主畫面查詢到第幾筆,資料清單也可以移動到那一筆。
   還有匯出 Excel 依畫面在主畫面還是資料清單來匯出到 Excel。
   需要修改 q102_menu()、q102_bp(p_ud)、q102_cs()、全域變數。



程式碼和修改的備註說明如下:

DATABASE ds

GLOBALS "../../config/top.global"

DEFINE tm     RECORD
                 wc       STRING,
                 wc2      LIKE type_file.chr1000
              END RECORD,
       m_ima  DYNAMIC ARRAY OF RECORD
                 ima02    LIKE ima_file.ima02,
                 ima021   LIKE ima_file.ima021,
                 ima01    LIKE ima_file.ima01
              END RECORD,
       g_ima  RECORD
                 ima01    LIKE ima_file.ima01,
                 ima02    LIKE ima_file.ima02,
                 ima021   LIKE ima_file.ima02,
                 ima25    LIKE ima_file.ima25,
                 ima05    LIKE ima_file.ima05,
                 ima06    LIKE ima_file.ima06,
                 ima08    LIKE ima_file.ima08,
                 ima37    LIKE ima_file.ima37,
                 ima27    LIKE ima_file.ima27,
                 ima70    LIKE ima_file.ima70,
                 ima15    LIKE ima_file.ima15,
                 ima906   LIKE ima_file.ima906,
                 ima907   LIKE ima_file.ima907,
                 unavl_stk  LIKE type_file.num15_3,
                 avl_stk    LIKE type_file.num15_3,
                 oeb_q      LIKE type_file.num15_3,
                 sfa_q1     LIKE type_file.num15_3,
                 sfa_q2     LIKE type_file.num15_3,
                 sie_q      LIKE type_file.num15_3,
                 pml_q      LIKE type_file.num15_3,
                 pmn_q      LIKE type_file.num15_3,
                 rvb_q2     LIKE type_file.num15_3,
                 rvb_q      LIKE type_file.num15_3,
                 sfb_q1     LIKE type_file.num15_3,
                 sfb_q2     LIKE type_file.num15_3,
                 qcf_q      LIKE type_file.num15_3,
                 atp_qty    LIKE type_file.num15_3
              END RECORD,
       g_img  DYNAMIC ARRAY OF RECORD
                 img02    LIKE img_file.img02,
                 img03    LIKE img_file.img03,
                 img04    LIKE img_file.img04,
                 img23    LIKE img_file.img23,
                 img10    LIKE img_file.img10,
                 sig05    LIKE sig_file.sig05,
                 img09    LIKE img_file.img09,
                 img38    LIKE img_file.img38
              END RECORD,
       g_sw               LIKE type_file.chr1,
       g_argv1            LIKE type_file.chr20,
       g_argv2            LIKE ima_file.ima01,
       g_query_flag       LIKE type_file.num5,
       g_wc3,g_wc4        STRING,
       g_sql              STRING,
       g_line1,g_line2    LIKE type_file.num5,
       g_refresh          LIKE type_file.chr1,
       g_chr              LIKE type_file.chr1,
       g_cmd              LIKE type_file.chr1000,
       l_za05             LIKE za_file.za05,
       g_rec_b            LIKE type_file.num5,
       g_rec_b1            LIKE type_file.num5,
       l_ac               LIKE type_file.num5,
       l_ac1               LIKE type_file.num5,
       l_ac2               LIKE type_file.num5          # 新增目前頁籤的位置 flag
DEFINE p_row,p_col        LIKE type_file.num5
DEFINE g_count            LIKE type_file.num5
DEFINE g_cnt              LIKE type_file.num10
DEFINE g_unavl_stk        LIKE type_file.num15_3
DEFINE g_avl_stk          LIKE type_file.num15_3
DEFINE g_msg              LIKE type_file.chr1000
DEFINE g_row_count        LIKE type_file.num10
DEFINE g_curs_index       LIKE type_file.num10
DEFINE g_jump             LIKE type_file.num10
DEFINE g_no_ask          LIKE type_file.num5
DEFINE lc_qbe_sn          LIKE gbm_file.gbm01
DEFINE g_plant_t          LIKE type_file.chr21
DEFINE g_flag             LIKE type_file.chr1
DEFINE g_curs_index_t     LIKE type_file.num10
DEFINE w ui.Window                      匯出 Excel 的單身
DEFINE n om.DomNode                 # 匯出 Excel 的單身

DEFINE  g_bp_flag     LIKE type_file.chr10              # 新增目前頁籤的位置 flag
DEFINE  g_ima_l       DYNAMIC ARRAY OF RECORD           # 資料清單的陣列
                      ima01_l     LIKE ima_file.ima01,
                      ima02_l     LIKE ima_file.ima02,
                      ima021_l    LIKE ima_file.ima021,
                      ima08_l     LIKE ima_file.ima08,
                      ima25_l     LIKE ima_file.ima25,
                      ima27_l     LIKE ima_file.ima27,
                      avl_stk_l   LIKE ima_file.ima261,
                      unavl_stk_l LIKE ima_file.ima262
                      END RECORD

FUNCTION q102_cs()
   DEFINE l_cnt        LIKE type_file.num5

   IF NOT cl_null(g_argv1) THEN
      CASE WHEN g_argv1='1' LET tm.wc = "ima01 = '",g_argv2,"'"
           WHEN g_argv1='2' LET tm.wc = "ima01 IN",
                                       " (SELECT sfa03 FROM sfa_file WHERE ",
                                       "  sfa01='",g_argv2,"')"
           WHEN g_argv1='3' LET tm.wc = "ima01 IN",
                                       " (SELECT oeb04 FROM oeb_file WHERE ",
                                       "  oeb01='",g_argv2,"')"
      END CASE
      LET tm.wc2=' 1=1'
   ELSE
      CLEAR FORM
      CALL g_img.clear()
      CALL cl_opmsg('q')
      IF g_sw = 1 THEN
         INITIALIZE g_ima.* TO NULL
         CALL cl_set_head_visible("","YES")
         IF g_flag = 0 THEN
            CONSTRUCT BY NAME tm.wc ON ima01,ima02,ima021

               BEFORE CONSTRUCT
                  CALL cl_qbe_init()

               ON IDLE g_idle_seconds
                  CALL cl_on_idle()
                  CONTINUE CONSTRUCT

               ON ACTION about
                  CALL cl_about()

               ON ACTION HELP
                  CALL cl_show_help()

               ON ACTION controlg
                  CALL cl_cmdask()

               ON ACTION CONTROLP
                  CASE
                     WHEN INFIELD(ima01)
                        CALL cl_init_qry_var()
                        LET g_qryparam.form = "q_ima"
                        LET g_qryparam.state = 'c'
                        CALL cl_create_qry() RETURNING g_qryparam.multiret
                        DISPLAY g_qryparam.multiret TO ima01
                        NEXT FIELD ima01
                  END CASE

               ON ACTION qbe_select
                  CALL cl_qbe_list() RETURNING lc_qbe_sn
                  CALL cl_qbe_display_condition(lc_qbe_sn)

            END CONSTRUCT
         END IF

         IF INT_FLAG THEN RETURN END IF

         CALL q102_b_askkey()

         IF INT_FLAG THEN RETURN END IF
      END IF

      IF g_sw = 2 THEN
         OPEN WINDOW q102_w2 AT 6,3 WITH FORM "aim/42f/aimq841_2"
            ATTRIBUTE (STYLE = g_win_style CLIPPED)

         CALL cl_ui_locale("aimq841_2")

         WHILE TRUE
            CONSTRUCT BY NAME g_wc3 ON sfa01
              BEFORE CONSTRUCT
                 CALL cl_qbe_init()

                ON IDLE g_idle_seconds
                   CALL cl_on_idle()
                   CONTINUE CONSTRUCT

                ON ACTION about
                   CALL cl_about()

                ON ACTION help
                   CALL cl_show_help()

                ON ACTION controlg
                   CALL cl_cmdask()

                 ON ACTION qbe_select
                   CALL cl_qbe_select()

                 ON ACTION qbe_save
                   CALL cl_qbe_save()

            END CONSTRUCT
            IF INT_FLAG THEN EXIT WHILE END IF
            IF g_wc3<>' 1=1' THEN EXIT WHILE END IF
         END WHILE
         CLOSE WINDOW q102_w2
         IF INT_FLAG THEN RETURN END IF
         LET tm.wc = "ima01 IN (SELECT sfa03 FROM sfa_file WHERE ",g_wc3 CLIPPED,")"
      END IF
      IF g_sw = 3 THEN
         OPEN WINDOW q102_w3 AT 6,3 WITH FORM "aim/42f/aimq841_3"
             ATTRIBUTE (STYLE = g_win_style CLIPPED)

         CALL cl_ui_locale("aimq841_3")

         WHILE TRUE
            CONSTRUCT BY NAME g_wc3 ON oeb01
              BEFORE CONSTRUCT
                 CALL cl_qbe_init()

               ON IDLE g_idle_seconds
                  CALL cl_on_idle()
                  CONTINUE CONSTRUCT

               ON ACTION about
                  CALL cl_about()

               ON ACTION HELP
                  CALL cl_show_help()

               ON ACTION controlg
                  CALL cl_cmdask()

               ON ACTION qbe_select
                  CALL cl_qbe_select()

               ON ACTION qbe_save
                  CALL cl_qbe_save()

            END CONSTRUCT
            IF INT_FLAG THEN EXIT WHILE END IF
            IF g_wc3<>' 1=1' THEN EXIT WHILE END IF
         END WHILE
         CLOSE WINDOW q102_w3
         IF INT_FLAG THEN RETURN END IF
         LET tm.wc = "ima01 IN (SELECT oeb04 FROM oeb_file WHERE ",g_wc3 CLIPPED,")"
      END IF
      IF g_sw = 4 THEN
         OPEN WINDOW q102_w4 AT 6,3 WITH FORM "aim/42f/aimq841_4"
              ATTRIBUTE (STYLE = g_win_style CLIPPED)

         CALL cl_ui_locale("aimq841_4")

         CONSTRUCT BY NAME g_wc3 ON bmb01
              BEFORE CONSTRUCT
                 CALL cl_qbe_init()

            ON IDLE g_idle_seconds
               CALL cl_on_idle()
               CONTINUE CONSTRUCT

            ON ACTION about
               CALL cl_about()

            ON ACTION help
               CALL cl_show_help()

            ON ACTION controlg
               CALL cl_cmdask()

            ON ACTION CONTROLP
               IF INFIELD(bmb01) THEN
                  CALL cl_init_qry_var()
                  LET g_qryparam.form = "q_ima5"
                  LET g_qryparam.state = "c"
                  CALL cl_create_qry() RETURNING g_qryparam.multiret
                  DISPLAY g_qryparam.multiret TO bmb01
                  NEXT FIELD bmb01
               END IF

            ON ACTION qbe_select
                 CALL cl_qbe_select()

            ON ACTION qbe_save
               CALL cl_qbe_save()
         END CONSTRUCT
         CLOSE WINDOW q102_w4
         IF INT_FLAG THEN RETURN END IF

         LET tm.wc = "ima01 IN ",
                     " (SELECT bmb03 FROM bmb_file ",
                     "   WHERE ",g_wc3 CLIPPED,
                     "     AND bmb04 <= '",g_today,"'",
                     "     AND (bmb05 > '",g_today,"'",
                     "      OR bmb05 IS NULL ))"
      END IF
   END IF
   MESSAGE ' WAIT '
   IF tm.wc2=' 1=1' OR tm.wc2 IS NULL THEN
      LET g_sql=" SELECT UNIQUE ima02,ima021,ima01 FROM ima_file ",
                " WHERE ",tm.wc CLIPPED
    ELSE
      LET g_sql=" SELECT UNIQUE ima02,ima021,ima01 ",
                "  FROM ima_file,img_file ",
                " WHERE ima_file.ima01=img_file.img01 AND ",tm.wc CLIPPED," AND ",tm.wc2 CLIPPED,
                "   AND img10<>0"
   END IF

   LET g_sql = g_sql CLIPPED,cl_get_extra_cond('imauser', 'imagrup')

   LET g_sql = g_sql clipped," ORDER BY ima01"
   PREPARE q102_prepare FROM g_sql
   DECLARE q102_cs SCROLL CURSOR WITH HOLD FOR q102_prepare
   LET g_cnt=1
   FOREACH q102_cs INTO m_ima[g_cnt].*
     LET g_cnt=g_cnt+1 IF g_cnt>1000 THEN EXIT FOREACH END IF
   END FOREACH

   # 資料清單的 SQL ,盡可能和 q102_prepare 同一個
  DECLARE q102_list_cur CURSOR FOR q102_prepare

   IF tm.wc2=' 1=1' THEN
      LET g_sql=" SELECT COUNT(*) FROM ima_file ",
                 " WHERE ",tm.wc CLIPPED
    ELSE
      LET g_sql=" SELECT COUNT(DISTINCT ima01) FROM ima_file,OUTER img_file ",
                " WHERE ima_file.ima01=img_file.img01 AND ",tm.wc CLIPPED
      IF NOT cl_null(tm.wc2) THEN
          LET g_sql = g_sql CLIPPED,
                      " AND ",tm.wc2 CLIPPED,
                      " AND img10<>0"
      END IF
   END IF
   PREPARE q102_pp  FROM g_sql
   DECLARE q102_cnt   CURSOR FOR q102_pp
END FUNCTION

FUNCTION q102_menu()
   # 宣告匯出 Excel 的頁籤位置
   DEFINE w ui.Window
   DEFINE n om.DomNode

   WHILE TRUE
      LET INT_FLAG=0

      # 修改目前是在那一個頁籤,進行 DISPLAY 等待動作
      IF cl_null(g_bp_flag) OR g_bp_flag <> 'list' THEN
         CALL q102_bp("G")
      ELSE
         CALL q102_bp1("G")
      END IF
      #CALL q102_bp("G")

      CASE g_action_choice
         WHEN "help"
            CALL cl_show_help()
         WHEN "exit"
            EXIT WHILE
         WHEN "controlg"
            CALL cl_cmdask()
         WHEN "query"
            LET g_sw = 1
            CALL q102_q()
         WHEN "query_by_w_o"
            LET g_sw = 2
            CALL q102_q()
         WHEN "query_by_order"
            LET g_sw = 3
            CALL q102_q()
         WHEN "query_by_bom"
            LET g_sw = 4
            CALL q102_q()
         WHEN "period_tran"
            IF cl_chk_act_auth() THEN
               CALL s_aimq102_q1(g_ima.ima01,'','','1')
            END IF
         WHEN "latest_pur"
            IF cl_chk_act_auth() THEN
               CALL q102_q2()
            END IF
         WHEN "transfer_in_transit"
            CALL q102_q5()
         WHEN "approved_vender"
            LET g_msg='apmi254 "',g_ima.ima01,'"'
            CALL cl_cmdrun(g_msg)
         WHEN "rep_sub"
            LET g_msg='abmi604 "',g_ima.ima01,'"'
            CALL cl_cmdrun(g_msg)
         WHEN "bom_usage"
            IF cl_chk_act_auth() THEN
               CALL q102_q4()
            END IF
         WHEN "ecn"
            IF cl_chk_act_auth() THEN
               CALL q102_q3()
            END IF
         WHEN "bin_card"
            LET g_msg='aimq231 "',g_ima.ima01,'"'
            CALL cl_cmdrun(g_msg)
         WHEN "demand_Supply"
            LET g_msg='aimq841 "1" "',g_ima.ima01,'"'
            CALL cl_cmdrun(g_msg)
         WHEN "query_detail"
            CALL q102_d('0')
         WHEN "query_lot_data"
            IF l_ac > 0 THEN
               CALL q102_q_imgs()
            END IF
         WHEN "Stocks_detail"
            IF cl_chk_act_auth() THEN
               IF g_ima.sie_q>0 THEN
                  CALL q102_detail()
               ELSE
                  CALL cl_err('','aim-050',0)
               END IF
            END IF
         WHEN "du_detail"
            LET g_cmd = "aimq410 '",g_ima.ima01,"'"
            CALL cl_cmdrun(g_cmd CLIPPED)
         WHEN "exporttoexcel"
            IF cl_chk_act_auth() THEN
              # 要匯出 Excel 的頁籤不同,各自匯出不同的明細
              LET w = ui.Window.getCurrent()
              IF g_bp_flag = 'main' OR cl_null(g_bp_flag) THEN
                LET n = w.findNode("Table","s_img")
                CALL cl_export_to_excel(n,base.TypeInfo.create(g_img),'','')
              ELSE
                LET n = w.findNode("Table","s_ima_l")
                CALL cl_export_to_excel(n,base.TypeInfo.create(g_ima_l),'','')
              END IF
              #CALL cl_export_to_excel(ui.Interface.getRootNode(),base.TypeInfo.create(g_img),'','')
            END IF
       END CASE
    END WHILE
END FUNCTION

FUNCTION q102_q()
 DEFINE l_null   LIKE type_file.chr1
    LET g_row_count = 0
    LET g_curs_index = 0
    CALL cl_navigator_setting( g_curs_index, g_row_count )
    CALL cl_opmsg('q')
    DISPLAY '   ' TO FORMONLY.cnt
    CALL q102_cs()
    IF INT_FLAG THEN
      LET INT_FLAG = 0
      LET g_bp_flag ="main"         # 頁籤改為在主畫面
      RETURN
    END IF
    OPEN q102_cs
    IF SQLCA.sqlcode THEN
       CALL cl_err('',SQLCA.sqlcode,0)
    ELSE
       OPEN q102_cnt
       FETCH q102_cnt INTO g_row_count
       DISPLAY g_row_count TO cnt
       IF g_flag = 1 THEN
          LET g_jump = g_curs_index_t
          CALL q102_fetch('/')
       ELSE
        CALL q102_fetch('F')
        CALL q102_list_fill()   # 查詢後馬上列出資料清單
        LET g_bp_flag = NULL    # 頁籤先清為空白
      END IF
    END IF
      MESSAGE ''
END FUNCTION

FUNCTION q102_bp(p_ud)
   DEFINE   p_ud   LIKE type_file.chr1

   IF p_ud <> "G" THEN
      RETURN
   END IF

   CALL SET_COUNT(g_rec_b)
   LET g_action_choice = " "

   CALL cl_set_act_visible("accept,cancel", FALSE)

   DIALOG ATTRIBUTES(UNBUFFERED)
    DISPLAY ARRAY g_img TO s_img.* ATTRIBUTE(COUNT=g_rec_b)

      BEFORE DISPLAY
         IF g_sma.sma115 = 'N' THEN
            CALL cl_set_act_visible("du_detail",FALSE)
         ELSE
            CALL cl_set_act_visible("du_detail",TRUE)
         END IF
         CALL cl_navigator_setting( g_curs_index, g_row_count )

      BEFORE ROW
          LET l_ac = ARR_CURR()
      CALL cl_show_fld_cont()

      AFTER DISPLAY
          CONTINUE DIALOG
    END DISPLAY

    DISPLAY ARRAY g_imgs TO s_imgs.* ATTRIBUTE(COUNT=g_rec_b1)

      BEFORE DISPLAY
         IF g_sma.sma115 = 'N' THEN
            CALL cl_set_act_visible("du_detail",FALSE)
         ELSE
            CALL cl_set_act_visible("du_detail",TRUE)
         END IF
         CALL cl_navigator_setting( g_curs_index, g_row_count )

      BEFORE ROW
          LET l_ac1 = ARR_CURR()
          CALL cl_show_fld_cont()
      AFTER DISPLAY
          CONTINUE DIALOG
    END DISPLAY

      ON ACTION first
         CALL q102_fetch('F')
         CALL cl_navigator_setting(g_curs_index, g_row_count)
           IF g_rec_b != 0 THEN
         CALL fgl_set_arr_curr(1)
           END IF
           ACCEPT DIALOG

         EXIT DIALOG

      ON ACTION previous
         CALL q102_fetch('P')
         CALL cl_navigator_setting(g_curs_index, g_row_count)
           IF g_rec_b != 0 THEN
             CALL fgl_set_arr_curr(1)
           END IF
      ACCEPT DIALOG
           EXIT DIALOG

      ON ACTION jump
         CALL q102_fetch('/')
         CALL cl_navigator_setting(g_curs_index, g_row_count)
           IF g_rec_b != 0 THEN
         CALL fgl_set_arr_curr(1)
           END IF
      ACCEPT DIALOG
           EXIT DIALOG

      ON ACTION next
         CALL q102_fetch('N')
         CALL cl_navigator_setting(g_curs_index, g_row_count)
           IF g_rec_b != 0 THEN
         CALL fgl_set_arr_curr(1)
           END IF
      ACCEPT DIALOG
         EXIT DIALOG

      ON ACTION last
         CALL q102_fetch('L')
         CALL cl_navigator_setting(g_curs_index, g_row_count)
           IF g_rec_b != 0 THEN
         CALL fgl_set_arr_curr(1)
           END IF
      ACCEPT DIALOG
         EXIT DIALOG

      ON ACTION help
         LET g_action_choice="help"
         EXIT DIALOG

      ON ACTION locale
         CALL cl_dynamic_locale()
         CALL cl_show_fld_cont()
         CALL q102_mu_ui()

      ON ACTION exit
         LET g_action_choice="exit"
         EXIT DIALOG

      ON ACTION controlg
         LET g_action_choice="controlg"
         EXIT DIALOG

      ON ACTION query
         LET g_action_choice="query"
         EXIT DIALOG
      ON ACTION query_by_w_o
         LET g_action_choice="query_by_w_o"
         EXIT DIALOG
      ON ACTION query_by_order
         LET g_action_choice="query_by_order"
         EXIT DIALOG
      ON ACTION query_by_bom
         LET g_action_choice="query_by_bom"
         EXIT DIALOG
      ON ACTION period_tran
         LET g_action_choice="period_tran"
         EXIT DIALOG
      ON ACTION latest_pur
         LET g_action_choice="latest_pur"
         EXIT DIALOG
      ON ACTION transfer_in_transit
         LET g_action_choice="transfer_in_transit"
         EXIT DIALOG
      ON ACTION approved_vender
         LET g_action_choice="approved_vender"
         EXIT DIALOG
      ON ACTION rep_sub
         LET g_action_choice="rep_sub"
         EXIT DIALOG
      ON ACTION bom_usage
         LET g_action_choice="bom_usage"
         EXIT DIALOG
      ON ACTION ecn
         LET g_action_choice="ecn"
         EXIT DIALOG
      ON ACTION bin_card
         LET g_action_choice="bin_card"
         EXIT DIALOG
      ON ACTION demand_Supply
         LET g_action_choice="demand_Supply"
         EXIT DIALOG
      ON ACTION Stocks_detail
         LET g_action_choice="Stocks_detail"
         EXIT DIALOG
      ON ACTION query_detail
         LET g_action_choice="query_detail"
         EXIT DIALOG
      ON ACTION du_detail
         LET g_action_choice = 'du_detail'
         EXIT DIALOG
      ON ACTION query_lot_data
         LET g_action_choice = 'query_lot_data'
         EXIT DIALOG
      ON ACTION accept
         EXIT DIALOG
      ON ACTION cancel
         LET INT_FLAG=FALSE
         LET g_action_choice="exit"
         EXIT DIALOG
      ON ACTION exporttoexcel
         LET g_action_choice = 'exporttoexcel'
         EXIT DIALOG
      ON IDLE g_idle_seconds
         CALL cl_on_idle()
         CONTINUE DIALOG
      ON ACTION about
         CALL cl_about()
      ON ACTION controls
         CALL cl_set_head_visible("","AUTO")
      # 頁籤改為在資料清單
      ON ACTION item_list
         LET g_bp_flag = 'list'
         EXIT DIALOG
   END DIALOG
   CALL cl_set_act_visible("accept,cancel", TRUE)
END FUNCTION

# 增加資料清單的列表
FUNCTION q102_list_fill()
  DEFINE l_ima01         LIKE ima_file.ima01
  DEFINE l_i             LIKE type_file.num10,
         l_n1            LIKE type_file.num15_3

    CALL g_ima_l.clear()
    LET l_i = 1
    FOREACH q102_list_cur INTO l_ima01
       IF SQLCA.sqlcode THEN
          CALL cl_err('foreach list_cur',SQLCA.sqlcode,1)
          CONTINUE FOREACH
       END IF
       SELECT ima01,ima02,ima021,ima08,ima25,ima27,0,0 INTO g_ima_l[l_i].*
         FROM ima_file
        WHERE ima01 = l_ima01
       SELECT SUM(img10) INTO g_ima_l[l_i].avl_stk_l FROM img_file,imd_file
        WHERE img02 = imd01 AND imd11 = 'Y' AND img01 = l_ima01
       IF cl_null(g_ima_l[l_i].avl_stk_l) THEN LET g_ima_l[l_i].avl_stk_l = 0 END IF
       SELECT SUM(img10) INTO g_ima_l[l_i].unavl_stk_l FROM img_file,imd_file
        WHERE img02 = imd01 AND imd11 = 'N' AND img01 = l_ima01
       IF cl_null(g_ima_l[l_i].unavl_stk_l) THEN LET g_ima_l[l_i].unavl_stk_l = 0 END IF
       LET l_i = l_i + 1
       IF l_i > g_max_rec THEN
          CALL cl_err( '', 9035, 0 )
          EXIT FOREACH
       END IF
    END FOREACH
    LET g_row_count = l_i - 1
    DISPLAY ARRAY g_ima_l TO s_ima_l.* ATTRIBUTE(COUNT=g_row_count)
       BEFORE DISPLAY
          EXIT DISPLAY
    END DISPLAY

END FUNCTION

# 增加資料清單 action 功能鍵和停留在資料清單等待動作
FUNCTION q102_bp1(p_ud)
   DEFINE   p_ud   LIKE type_file.chr1

   IF p_ud <> "G"  THEN
      RETURN
   END IF

   LET g_action_choice = " "

   CALL cl_set_act_visible("accept,cancel", FALSE)

   DISPLAY ARRAY g_ima_l TO s_ima_l.*  ATTRIBUTE(COUNT=g_row_count,UNBUFFERED)

      BEFORE DISPLAY
         CALL cl_navigator_setting( g_curs_index, g_row_count )
         IF g_row_count != 0 THEN
            CALL fgl_set_arr_curr(g_curs_index)
         END IF
         CALL cl_show_fld_cont()

      ON ACTION query
         LET g_action_choice="query"
         EXIT DISPLAY

      ON ACTION first
         CALL q102_fetch('F')
         CALL cl_navigator_setting(g_curs_index, g_row_count)
         IF g_row_count != 0 THEN
            CALL fgl_set_arr_curr(g_curs_index)
         END IF
         ACCEPT DISPLAY

      ON ACTION previous
         CALL q102_fetch('P')
         CALL cl_navigator_setting(g_curs_index, g_row_count)
         IF g_row_count != 0 THEN
            CALL fgl_set_arr_curr(g_curs_index)
         END IF
         ACCEPT DISPLAY

      ON ACTION jump
         CALL q102_fetch('/')
         CALL cl_navigator_setting(g_curs_index, g_row_count)
         IF g_row_count != 0 THEN
            CALL fgl_set_arr_curr(g_curs_index)
         END IF
         ACCEPT DISPLAY

      ON ACTION next
         CALL q102_fetch('N')
         CALL cl_navigator_setting(g_curs_index, g_row_count)
         IF g_row_count != 0 THEN
            CALL fgl_set_arr_curr(g_curs_index)
         END IF
         ACCEPT DISPLAY

      ON ACTION last
         CALL q102_fetch('L')
         CALL cl_navigator_setting(g_curs_index, g_row_count)
         IF g_row_count != 0 THEN
            CALL fgl_set_arr_curr(g_curs_index)
         END IF
         ACCEPT DISPLAY

      ON ACTION help
         LET g_action_choice="help"
         CALL cl_show_help()
         EXIT DISPLAY

      ON ACTION locale
         CALL cl_dynamic_locale()
          CALL cl_show_fld_cont()
         EXIT DISPLAY

      ON ACTION exit
         LET g_action_choice="exit"
         EXIT DISPLAY

      ON ACTION controlg
         LET g_action_choice="controlg"
         EXIT DISPLAY

      ON ACTION cancel
         LET INT_FLAG=FALSE
         LET g_action_choice="exit"
         EXIT DISPLAY

      ON IDLE g_idle_seconds
         CALL cl_on_idle()
         CONTINUE DISPLAY

      ON ACTION about
         CALL cl_about()

      ON ACTION exporttoexcel
         LET g_action_choice = 'exporttoexcel'
         EXIT DISPLAY

      # 頁籤改為在主畫面
      ON ACTION main
         LET g_bp_flag = 'main'
         CALL cl_set_comp_visible("page112", FALSE)
         CALL ui.interface.refresh()
         CALL cl_set_comp_visible("page112", TRUE)
         EXIT DISPLAY

      ON ACTION accept
         LET g_bp_flag = 'main'
         LET l_ac = ARR_CURR()
         CALL cl_show_fld_cont()
         LET l_ac1 = ARR_CURR()
         LET g_jump = l_ac1
         LET g_no_ask = TRUE
         LET g_bp_flag = NULL
         CALL q102_fetch('/')
         CALL cl_set_comp_visible("page112", FALSE)
         CALL ui.interface.refresh()
         CALL cl_set_comp_visible("page112", TRUE)
         EXIT DISPLAY

      BEFORE ROW    # 更新庫存明細的資料
         LET l_ac1 = ARR_CURR()
         LET g_ima.ima01 = g_ima_l[l_ac1].ima01_l
         CALL q102_b_fill()
         DISPLAY ARRAY g_img TO s_img.* ATTRIBUTE(COUNT=g_row_count)
           BEFORE DISPLAY
             EXIT DISPLAY
         END DISPLAY

      AFTER DISPLAY
         CONTINUE DISPLAY

        ON ACTION CONTROLS
           CALL cl_set_head_visible("","AUTO")

        &include "qry_string.4gl"

   END DISPLAY
   CALL cl_set_act_visible("accept,cancel", TRUE)
END FUNCTION

要注意的是,controls 設定 folder01~folder10 才會隱藏,所以 folder 的名稱命名就要依此規則來使用。

17 則留言:

  1. hi 張Sir
    可以將畫面檔給我參考嗎?因為我是初學者,對部分比較不熟悉,不知可否?感謝
    leo

    回覆刪除
    回覆
    1. 在 4fd 畫面檔,增加 Folder 的物件把單頭的所有欄位都移到 Page1 裡面,
      然後在 Page1 的 action 加上 main,然後 Page2 的 action 加上 list ,
      在 Page2 再加上 Table 物件,要顯示的欄位加上去然後設定一下名稱不要重複就可以了。

      刪除
  2. hi 張Sir
    為什麼我新增一個page的動作,然後在action有依照你的增加名稱,然後按儲存卻不會出現

    aimq102 : Successful,請問這是為什麼

    回覆刪除
  3. 可以了,原來是新增的page裡面需要有元件,否則無法編譯成功

    回覆刪除
  4. hi 張sir
    請問你的sig_file是甚麼,我們的沒有這個資料表

    回覆刪除
    回覆
    1. sig_file 備置庫存資料明細表,應該是 5.2 版以上才有的樣子。

      刪除
    2. 那就是我可以mark掉沒錯吧!
      還有我再執行時出現如下的錯誤,請問這個是甚麼問題
      FORMS statement error number 1138.
      The function 'main' has not been defined in any module in the program.

      刪除
  5. hi 張先生
    我已經可以執行可以我在查詢的時候卻沒出現任何東西,只有在main上面有顯示,但是list上面卻沒有任何東西,請問這個是甚麼問題
    leo

    回覆刪除
    回覆
    1. list 沒有顯示大部份的情況,
      畫面的欄位和 4gl 欄位數目、變數名稱沒有對應到,需要依序完全對應。
      試試看~

      刪除
  6. HI 張先生
    我依照你的程式範例內,你在g_ima_l內建了八個table ima01_l
    然後我在4fd內也建了
    name:ima01_1
    data: FORM_ONLY
    dataType:VARCHAR
    這樣還是不行,是不是我哪邊錯了

    回覆刪除
    回覆
    1. debug 看看 q102_list_fill() 是否執行有 errcode

      刪除
  7. hi 張sir
    沒有出現錯誤,再跑FOREACH 102_list_cur INTO l_ima01
    的l_ima01=null,下一行select ima時候
    都是g_ima_l[l_i].*是null
    也就是說在select沒有任何資料

    回覆刪除
    回覆
    1. 看起來 FOREACH 有在跑,但是應該是在
      SELECT ima01,ima02,ima021,ima08,ima25,ima27,0,0 INTO g_ima_l[l_i].* FROM ima_file
      的問題,
      要看你定義的 g_ima_l.* 是不是宣告 8 個變數。

      刪除
  8. hi 張sir
    我宣告的是
    DEFINE g_ima_l DYNAMIC ARRAY OF RECORD # 資料清單的陣列
    ima01_l LIKE ima_file.ima01,
    ima02_l LIKE ima_file.ima02,
    ima021_l LIKE ima_file.ima021,
    ima08_l LIKE ima_file.ima08,
    ima25_l LIKE ima_file.ima25,
    ima27_l LIKE ima_file.ima27,
    avl_stk_l LIKE ima_file.ima261,
    unavl_stk_l LIKE ima_file.ima262
    END RECORD

    回覆刪除
  9. hi 張sir,照您的方式調整程式及畫面後。執行程式,按下資料清單頁面,程式就掛了(整個畫面關閉),請問會是哪裡出問題了?在煩請指導,謝謝。

    回覆刪除