3.1 单文件表格模型
单档样板﹝pattern﹞只能支持单一的主表,另外可支持多个子表,但是子表与主表间的关联必须是『1对1』的连结。
形成单文件的主表,表格型态建议须为『M.主檔』或『B.基础数据文件』。因为这两类表格均有可以记录维护数据的共享字段设计。
3.2 单档参考画面
单文件数据浏览页签﹝视需求设定﹞ / 单档输入主页签
开发时,就可以依据需求,设定是否需要『资料浏览区块』页签。
数据浏览页签左侧的『查询方案』、『相关作业』、『系统公告』等区块,均由系统程序统一控管,开发过程中不需额外进行处理﹝程序代码段落由样板产生﹞。
3.3 单文件程序流程
3.4 分段程序流程
3.4.1共享及模块变量宣告
程序注记段落
01 {<section id=”arti305.description” >}
02 #+ Version..: T100-ERP-1.00.00(SD版次:2,PR版次:2) Build-000060
03 #+ Filename…: arti305
04 #+ Description: 流通商品分群维护作业
05 #+ Creator….: 01752(2013/11/05)
06 #+ Modifier…: 01752(2014/07/24) -SD/PR- 01752(2014/07/24)
07 #+ Buildtype..: 应用 i01 样板自动产生
08 #+ 以上段落由子样板a00产生
09 {</section>}
引入及全局变量设定
11 {<section id=”arti305.global” >}
12 #应用 i01 样板自动产生(Version:16)
13 IMPORT os
14 #add-point:增加汇入项目
15 程序中若需使用JAVA或Genero原生lib均须在此处设置IMPORT
16 #end add-point
17 SCHEMA ds
18 GLOBALS “../../cfg/top_global.inc” # cfg/top_global.inc中存放了所有T100系统中所需使用的变量,于此处引入
说明:
在top.global下设定的变量有许多是在程序执行时常会引用或变动的。以下列出较为常用的相关变量,详细定义部分请参照系统说明。
g_enterprise 目前的企业代码,将限制用户所能阅读的数据内容
g_prog 目前执行的作业编号,用于变换画面显示数据与产生系统信息,不可变更
g_code 目前执行的程序代码(4gl)名称,不可变更
g_user 目前用户代码,将纪录用户的操作历程与权限控制,不可变更
g_qryparam 动态开窗查询函式数据传递变量,使用开窗功能时须先给予相关变量
g_dlang 目前用户所选取的数据多语言语系代码,可透过工具进行语系设定
g_site 目前的营运据点名称,可透过切换读取不同据点的数据
g_errparam错误代码传递变量,透过此变量可控制错误代码的显示内容与模式
除上列外还有:
g_bgjob 该支程序是否以背景模式执行,g_today 今日日期,g_max_browse 浏览页签数据最大笔数上限, g_max_rec 单身资料最大笔数上限 … 等等。
19 #add-point:增加汇入变量文件
20 部分大型程序需要拥有自己的inc参数配置文件,可以自行于此处汇入
21 #end add-point
22 #单头 type 宣告
23 PRIVATE TYPE type_g_imck_m RECORD #程序需使用的全局变量,变量数据从画面字段取出,不可增减
24 imck001 LIKE imck_t.imck001,
25 …
26 END RECORD
27 #模块变量(Module Variables)
28 DEFINE g_imck_m type_g_imck_m #单头变量宣告
29 …
30 DEFINE g_browser DYNAMIC ARRAY OF RECORD #查询方案用数组
31 b_statepic LIKE type_t.chr50,
32 b_imck001 LIKE imck_t.imck001
33 END RECORD #變數定義時若需要參照資料型態,但屬於formonly欄位,則參照type_t
34 #单头多语言用
35 DEFINE g_master_multi_table_t RECORD
36 DEFINE g_wc STRING #储存查询条件
37 DEFINE gwin_curr ui.Window #Current Window
38 DEFINE gfrm_curr ui.Form #Current Form
39 #add-point:传入参数说明(global.argv)
40 程序中若需要自行增加要用的全局变量则可于此处设定
# Form和current window都有指定全域物件,因此可以直接使用物件操作
41 #end add-point
42 #add-point:传入参数说明(global.argv)
43 自动补入 azzi900的参数定义说明特别写法
44 #argv[1] imaa_t.imaa002
45 #argv[2] type_t.chr1 #测试用参数
46 #end add-point
47 {</section>}
3.4.2主程序
01 {<section id=”arti305.main” >}
02 #+ 此段落由子样板a26产生
03 #OPTIONS SHORT CIRCUIT
04 #+ 作业开始
略
10 MAIN
11 #add-point:main段define
12 所有FUNCTION开始处均有预设add-point提供置放本区需要的变量设定(标准区用),后续不再呈现
13 #end add-point
14 #add-point:main段define
15 所有FUNCTION开始处均有预设add-point提供置放本区需要的变量设定(客制区用),后续不再呈现
16 #end add-point
17 OPTIONS
18 INPUT NO WRAP
19 DEFER INTERRUPT
20
21 #设定SQL错误记录方式 (模块内定义有效)
22 WHENEVER ERROR CALL cl_err_msg_log #當程式運行中遭遇不可預期的錯誤時將錯誤資訊寫入Log檔內
23 #依模块进行系统初始化设定(系统设定)
24 CALL cl_ap_init(“art”,””) #系統初始化:紀錄相關的資訊(例如程式開啟時間、使用者名稱等資訊)
25 #LOCK CURSOR (identifier)
26 #add-point:SQL_define
27 若不愿使用产生器产出的LOCK CURSOR,则此处可以使用mark=y标记
28 #end add-point
29 LET g_forupd_sql = ” SELECT … WHERE imckent= ? AND imck001=? FOR UPDATE”
30 #add-point:SQL_define
31 当使用mark=y标记时,必须从此处设定您所需要的LOCK CURSOR
32 #end add-point
33 LET g_forupd_sql = cl_sql_forupd(g_forupd_sql) #转换不同数据库语法
34 LET g_forupd_sql = cl_sql_add_mask(g_forupd_sql) #遮蔽特定资料
35 DECLARE arti305_cl CURSOR FROM g_forupd_sql # LOCK CURSOR
41 LET g_sql = ” SELECT UNIQUE t0.imck001,…”
42 PREPARE arti305_master_referesh FROM g_sql
43 IF g_bgjob = “Y” THEN
44 #add-point:Service Call
45 若程序为背景作业,则在此处定义其行为
46 #end add-point
47 ELSE
48 #画面开启 (identifier)
49 OPEN WINDOW w_arti305 WITH FORM cl_ap_formpath(“art”,g_code)
50 #画面资料初始化
51 CALL cl_ui_init() #根據該程式的設定進行畫面初始化, 並匯入ToolBar, TopMenu的資訊
子畫面顯示標題也需要呼叫
52 #程序初始化
53 CALL arti305_init()
54 #进入选单 Menu (=”N”)
55 CALL arti305_ui_dialog()
56 #add-point:画面关闭前
57 画面关闭前如果有需要相关的处理,请增加于此处
58 #end add-point
59 #画面关闭
60 CLOSE WINDOW w_arti305
61 END IF
62 CLOSE arti305_cl
63 #add-point:作业离开前
64 程序关闭前如果有需要相关的处理,请增加于此处
65 #end add-point
66 #离开作业
67 CALL cl_ap_exitprogram(“0”) #程式結束時需呼叫cl_ap_exitprogram, 紀錄所需的相關資訊
68 END MAIN
69 {</section>}
3.4.3 _init初始化
01 {<section id=”arti305.init” >}
02 #+ 程序数据初始化 程式所需的相關初始化皆定義於此(combobox設定、變數設定、畫面設定等)
03 PRIVATE FUNCTION arti305_init()
略
10 #定义combobox状态
11 CALL cl_set_combo_scc_part(‘imckstus’,’17’,’N,Y’) #此为产生器依据画面数据产出
略
15 LET g_error_show = 1
16 LET gwin_curr = ui.Window.getCurrent()
17 LET gfrm_curr = gwin_curr.getForm()
18 #add-point:画面资料初始化
19 #end add-point
20 #根据外部参数进行搜寻
21 CALL arti305_default_search()
22 END FUNCTION
23 {</section>}
3.4.4 _default_search 执行后首次查询数据
01 {<section id=”arti305.default_search” >}
02 #+ 外部参数搜寻
#程式啟動時須先經過此段落, 若有外部參數或預設的查詢方案時則帶出相關資料, 若無則不做任何處理
03 PRIVATE FUNCTION arti305_default_search()
04 DEFINE li_idx LIKE type_t.num10
略
05 IF cl_null(g_order) THEN
06 LET g_order = “ASC”
07 END IF
#根據外部參數組合g_wc, 若沒有傳遞參數則取出該程式的預設查尋方案, 若無設定查詢方案則回傳1=2 (不搜尋任何資料)
08 #根据外部参数(g_argv)组合wc
09 IF NOT cl_null(g_argv[01]) THEN
10 LET ls_wc = ls_wc, ” imck001 = ‘”, g_argv[01], “‘ AND ”
11 END IF
12 #add-point:default_search段after sql
13
14 #end add-point
15 IF NOT cl_null(ls_wc) THEN
16 #若有外部参数则根据该参数组合
17 LET g_wc = ls_wc.subString(1,ls_wc.getLength()-5)
18 LET g_default = TRUE
19 ELSE
20 #若无外部参数则预设为 1=2
21 LET g_default = FALSE
22 #预设查询条件
23 LET g_wc = cl_qbe_get_default_qryplan()
24 IF cl_null(g_wc) THEN
25 LET g_wc = ” 1=2″
26 END IF
27 END IF
略
30 IF g_wc.getIndexOf(” 1=2″, 1) THEN
31 LET g_default = TRUE
32 END IF
33 END FUNCTION
34 {</section>}
3.4.5 _ui_dialog操作功能选单
01 {<section id=”arti305.ui_dialog” >}
02 #+ 选单功能实际执行处
03 PRIVATE FUNCTION arti305_ui_dialog()
04 DEFINE li_exit LIKE type_t.num5 #判别是否为离开作业
05 DEFINE ls_wc STRING #wc用
06 DEFINE la_param RECORD #程序串查用变量
07 prog STRING, #串查程序名称
08 param DYNAMIC ARRAY OF STRING #传递变数
09 END RECORD
10 DEFINE ls_js STRING #转换后的json字符串
略
21 LET li_exit = FALSE
22 LET g_current_row = 0
23 LET g_current_idx = 1
26 #若有外部参数查询, 则直接显示数据(隐藏查询方案)
27 IF g_default THEN
28 CALL gfrm_curr.setElementHidden(“mainlayout”,0)
29 CALL gfrm_curr.setElementHidden(“worksheet”,1)
30 LET g_main_hidden = 0
31 ELSE
32 CALL gfrm_curr.setElementHidden(“mainlayout”,1)
33 CALL gfrm_curr.setElementHidden(“worksheet”,0)
34 LET g_main_hidden = 1
35 END IF
41 #进入程序时默认执行的动作
42 CASE g_actdefault
43 WHEN “insert”
44 IF cl_auth_chk_act(“insert”) THEN
45 CALL azzi020_insert()
46 END IF
47 #add-point:action default自定义
48 若需要带参数,指定进来程序就要做某某工作时,可以于此处设定action
49 #end add-point
根據g_main_hidden決定進入menu段落或dailog段落, 內部的行為相同, 但dialog段增加了display array (browser)
50 END CASE
略
61 #add-point:ui_dialog段before dialog
62 开始进入选单前的前置处理
63 #end add-point
64 WHILE li_exit = FALSE
65 IF g_action_choice = “logistics” THEN
當使用者進行營運據點切換時會離開dialog並重新進入, 視同重啟程式, 清空畫面上已經查詢條件等資訊
66 #清除画面及相关资料
67 CLEAR FORM
68 CALL g_browser.clear()
69 INITIALIZE g_imck_m.* TO NULL
70 LET g_wc = ‘ 1=2’
71 LET g_action_choice = “”
72 CALL arti305_init ()
73 END IF
74 #确保g_current_idx位于正常区间内
避免過程中的段落導致筆數落在不正常的區間內, 重新給予指標內容
75 #小于,等于0则指到第1笔
76 IF g_current_idx <= 0 THEN
77 LET g_current_idx = 1
78 END IF
79 CALL lib_cl_dlg.cl_dlg_before_display()
此處包含了許多系統標準ACTION, accept(確定), cancel(放棄), insert(新增), modify(修改), query(查詢), delete(刪除),
reproduce(複製), first(上一筆),
next(下一筆) … 等等
80 CALL cl_notice()
81
82 IF g_main_hidden = 0 THEN
83 MENU
84 BEFORE MENU
85 CALL arti305_browser_fill(g_wc,””)
86 CALL cl_navigator_setting(g_current_idx, g_current_cnt)
87 #还原为原本指定笔数
略
88 #当每次点任一笔数据都会需要用到
89 IF g_browser_cnt > 0 THEN
90 CALL arti305_fetch(“”)
91 END IF
92 #add-point:ui_dialog段 before menu
93 在对话框之内的控制区块,每一块后方都会给予add-point
94 #end add-point
96
96 #状态代码切换
97 ON ACTION statechange
99 CALL arti305_statechange()
100 LET g_action_choice=”statechange”
透過include的方式引入標準action,此處與下個段落中的dialog皆包含了三個段落的標準action
101 #第一笔资料
102 ON ACTION first
103 CALL arti305_fetch(“F”)
104 LET g_current_row = g_current_idx
略
105 #主选单用ACTION
dialog與menu段主要差異為多了display array的段落(顯示瀏覽頁籤), 其餘內容皆相同
106 &include “main_menu_exit_menu.4gl”
107 &include “relating_action.4gl”
108 #交谈指令共享ACTION
109 &include “common_action.4gl”
110 END MENU
111 ELSE
112 DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
113 #左侧浏览页签
114 DISPLAY ARRAY g_browser TO s_browse.* ATTRIBUTE(COUNT=g_rec_b)
115 BEFORE ROW
116 #回归旧笔数位置 (回到当时异动的笔数)
117 LET g_current_idx = DIALOG.getCurrentRow(“s_browse”)
118 IF g_current_idx = 0 THEN
119 LET g_current_idx = 1
120 END IF
121 LET g_current_row = g_current_idx #目前指标
122 LET g_current_sw = TRUE
確保進到瀏覽頁籤時可以回到上一次指定的筆數
123 CALL cl_show_fld_cont()
124 #当每次点任一笔数据都会需要用到
125 CALL arti305_fetch(“”)
126 END DISPLAY
127
128 BEFORE DIALOG
129 #先填充browser数据
130 CALL arti305_browser_fill(g_wc,””)
131
132 #当每次点任一笔数据都会需要用到
133 IF g_browser_cnt > 0 THEN
134 CALL arti305_fetch(“”)
135 END IF
136
137 #查询方案用
138 SUBDIALOG lib_cl_dlg.cl_dlg_qryplan
139 SUBDIALOG lib_cl_dlg.cl_dlg_relateapps
略 其他部分与MENU段相同
144 &include “main_menu_exit_dialog.4gl”
145 END DIALOG
146 END IF
147 END WHILE
148 END FUNCTION
149 {</section>}
3.4.6 _browser_fill浏览页签数据填充
01 {<section id=”arti305.browser_fill” >}
撈取單頭資料時一律先透過browser_fill 將資料填入 g_browser中
02 #+ 浏览页签数据填充(一般单文件)
03 PRIVATE FUNCTION arti305_browser_fill(p_wc,ps_page_action)
04 DEFINE p_wc STRING
略
11 LET p_wc = p_wc.trim() #当查询按下放弃 g_wc = ” ” 所以要清掉空白
12 IF cl_null(p_wc) THEN #p_wc 查询条件
根據使用者下達的條件, 撈取符合條件的資料總筆數並顯示在畫面上, 若超過最大顯示筆數則提示使用者
13 LET p_wc = ” 1=1 ”
14 END IF
15 #add-point:browser_fill段wc控制
16 where条件 (p_wc) 的手工调整
17 #end add-point
18 LET g_sql = ” SELECT COUNT(*) FROM imck_t …”
19 ” WHERE “,
20 p_wc CLIPPED, cl_sql_add_filter(“gzwk_t”)
21 #add-point:browser_fill段cnt_sql
22 如果有需要自行重新拟定计算笔数的SQL指令,可以由此处更新
23 #end add-point
24 PREPARE header_cnt_pre FROM g_sql
25 EXECUTE header_cnt_pre INTO g_browser_cnt
26 FREE header_cnt_pre
27 #若超过最大显示笔数
28 IF g_browser_cnt > g_max_browse THEN
29 IF g_error_show = 1 THEN
30 INITIALIZE g_errparam TO NULL
31 LET g_errparam.extend = g_browser_cnt
32 LET g_errparam.code = 9035
33 LET g_errparam.popup = TRUE
34 CALL cl_err()
35 END IF
36 END IF
41 IF cl_null(g_add_browse) THEN
42 #清除画面
43 CLEAR FORM
44 INITIALIZE g_gzwk_m.* TO NULL
45 CALL g_browser.clear()
46 LET g_cnt = 1
47 LET ls_wc = p_wc
48 ELSE
根據使用者下達的條件, 組合出撈取瀏覽頁籤資料的SQL, 其中包含了主table及相關的reference
49 LET ls_wc = g_add_browse
50 LET g_cnt = g_current_idx
51 END IF
61 LET g_sql = ” SELECT t0.gzwkstus,t0.gzwk001,t0.gzwk002,t0.gzwk003″,
62 ” FROM gzwk_t t0 “,
63 ” WHERE “, ls_wc, cl_sql_add_filter(“gzwk_t”)
64 #add-point:browser_fill段fill_wc
65
66 #end add-point
67 LET g_sql = g_sql, ” ORDER BY “,l_searchcol,” “,g_order
68 #add-point:browser_fill段before_pre
69
70 #end add-point
71 #LET g_sql = cl_sql_add_tabid(g_sql,”gzwk_t”) #WC重组
72 LET g_sql = cl_sql_add_mask(g_sql) #遮蔽特定资料
73 PREPARE browse_pre FROM g_sql
74 DECLARE browse_cur CURSOR FOR browse_pre
75 FOREACH browse_cur INTO g_browser[g_cnt].b_statepic,g_browser[g_cnt].b_imck001
76 IF SQLCA.sqlcode THEN
略 错误讯息
81 END IF
根據狀態碼的內容調整瀏覽頁籤顯示的圖片, 此處顯示的為狀態碼小圖示(與單頭主頁的圖示不同)
82 #browser段落显示图片
83 CASE g_browser[g_cnt].b_statepic
84 WHEN “N”
85 LET g_browser[g_cnt].b_statepic = “stus/16/inactive.png”
略
86 END CASE
若筆數超出最大筆數上限則中斷資料撈取, 確保撈取的資料不超過該程式限制的筆數上限
91 LET g_cnt = g_cnt + 1
92 IF g_cnt > g_max_rec THEN
93 EXIT FOREACH
94 END IF
95 END FOREACH
96 #清空g_add_browse, 并指定指针位置
97 IF NOT cl_null(g_add_browse) THEN
98 LET g_add_browse = “”
99 CALL g_curr_diag.setCurrentRow(“s_browse”,g_current_idx)
00 END IF
01 IF cl_null(g_browser[g_cnt].b_gzwk001) THEN
02 CALL g_browser.deleteElement(g_cnt)
03 END IF
04 LET g_header_cnt = g_browser.getLength()
05 LET g_current_cnt = g_browser.getLength()
06 LET g_rec_b = g_browser.getLength()
07 LET g_cnt = 0
若使用者所指定的條件無法符合的資料時則關閉特定action的功能
08 DISPLAY g_browser_cnt TO FORMONLY.b_count
09 DISPLAY g_browser_cnt TO FORMONLY.h_count
10 CALL azzi020_fetch(“”)
11 FREE browse_pre
12 #若无数据则关闭相关功能
13 IF g_browser_cnt = 0 THEN
14 CALL cl_set_act_visible(“statechange,modify,delete,reproduce”, FALSE)
15 ELSE
16 CALL cl_set_act_visible(“statechange,modify,delete,reproduce”, TRUE)
17 END IF
18 END FUNCTION
19 {</section>}
3.4.7 _fetch 数据笔数查询与数据抓取
01 {<section id=”arti305.fetch” >}
根據傳入的狀態顯示對應的資料筆數, F(第一筆), N(下一筆), P(上一筆), L(最後筆), /(指定筆)
02 #+ 指定PK后抓取单头其他数据
03 PRIVATE FUNCTION arti305_fetch(p_fl)
略
11 #根据传入的条件决定抓取的资料
12 CASE p_fl
13 WHEN “F”
14 LET g_current_idx = 1
15 WHEN “/”
16 #询问要指定的笔数
17 IF (NOT g_no_ask) THEN
18 CALL cl_getmsg(“fetch”, g_lang) RETURNING ls_msg
19 LET INT_FLAG = 0
20 PROMPT ls_msg CLIPPED,”: ” FOR g_jump
21 &include “common_action.4gl” #交谈指令共享ACTION
22 END PROMPT
23 IF INT_FLAG THEN
24 LET INT_FLAG = 0
25 EXIT CASE
26 END IF
27 END IF
28 IF g_jump > 0 THEN
29 LET g_current_idx = g_jump
30 END IF
31 LET g_no_ask = FALSE
32 END CASE
33 LET g_browser_cnt = g_browser.getLength()
34 #浏览页笔数显示
略
35 #避免超出browser数据笔数上限
36 IF g_current_idx > g_browser.getLength() THEN
37 LET g_current_idx = g_browser.getLength()
38 END IF
39 # 设定browse索引
40 CALL cl_navigator_setting(g_browser_idx, g_browser_cnt)
41 #代表没有数据, 无需做后续数据捞取之动作
42 IF g_current_idx = 0 THEN
43 RETURN
44 END IF
45 #根据选定的笔数给予key域值
46 LET g_imck_m.imck001 = g_browser[g_current_idx].b_imck001
47 #读取单头所有字段数据
48 EXECUTE arti305_master_referesh USING g_imck_m.imck001 INTO g_imck_m.imck001,…
49 #屏蔽相关处理
撈取的資料會先進行備份, 並傳入對應的遮罩函式中處理, 並回傳處理後的結果, 再備份遮罩後的結果
50 LET g_imck_m_mask_o.* = g_imck_m.*
51 CALL arti305_imck_t_mask()
52 LET g_imck_m_mask_n.* = g_imck_m.*
53 #根据资料状态切换action状态
54 CALL cl_set_act_visible(“statechange,modify,delete,reproduce”, TRUE)
55 CALL azzi020_set_act_visible()
56 CALL azzi020_set_act_no_visible()
57 #保存单头旧值
58 LET g_imck_m_t.* = g_imck_m.*
59 LET g_imck_m_o.* = g_imck_m.*
60 #重新显示
61 CALL arti305_show()
62 END FUNCTION
63 {</section>}
3.4.8 _show 数据显示
01 {<section id=”arti305.show” >}
02 #+ 数据显示
03 PRIVATE FUNCTION arti305_show()
略
11 #在browser 移动上下笔可以连动切换数据
12 CALL cl_show_fld_cont()
若有自定義的reference, 於此處撈取(例如此處的imck105_ref為自定義function)
13 CALL arti305_set_pk_array()
14 #显示followup图标
15 CALL cl_user_overview_set_follow_pic()
16 #读入ref值(单头)
17 #add-point:show段reference
18 程序内REFERENCE字段SQL填写位置
19 #end add-point
根據當下的狀態碼轉換成對應的圖片, 並顯示到畫面上的狀態碼圖示上
20 #将数据输出到画面上
21 DISPLAY BY NAME g_imck_m.imck001,…
略
31 #显示状态(stus)图片
32 CASE g_imck_m.imckstus
33 WHEN “N”
34 CALL gfrm_curr.setElementImage(“statechange”, “stus/32/inactive.png”)
35 END CASE
36 END FUNCTION
37 {</section>}
3.4.9 _set_pk_array 设定PK数据提供相关文件使用
將該支程式的key欄位名稱與內容傳入g_pk_array中, 以便於後續相關lib的使用
01 {<section id=”arti305.set_pk_array” >}
02 #+ 给予pk_array内容
03 PRIVATE FUNCTION arti305_set_pk_array()
04 CALL g_pk_array.clear()
05 LET g_pk_array[1].values = g_imck_m.imck001
06 LET g_pk_array[1].column = ‘imck001’
07 END FUNCTION
08 {</section>}
3.4.10 _query 数据查询
01 {<section id=”arti305.query” >}
02 #+ 数据查询QBE功能准备
03 PRIVATE FUNCTION arti305_query()
略
11 LET INT_FLAG = 0
進入資料查詢段時先將左側的瀏覽頁籤摺疊
12 LET ls_wc = g_wc
13 #切换画面
14 IF g_main_hidden THEN
15 CALL gfrm_curr.setElementHidden(“mainlayout”,0)
16 CALL gfrm_curr.setElementHidden(“worksheet”,1)
17 LET g_main_hidden = 0
18 END IF
19 CALL g_browser.clear()
20 #browser panel折迭
略
31 INITIALIZE g_imck_m.* TO NULL
32 ERROR “”
33 DISPLAY ” ” TO FORMONLY.b_count
34 DISPLAY ” ” TO FORMONLY.h_count
Query時進入construct段落由使用者輸入定義的條件
35 CALL arti305_construct()
36 IF INT_FLAG THEN
37 #取消查询
略
41 ELSE
根據使用者所定義的條件重新進行資料撈取, 並填充到g_browser中
42 LET g_current_row = 1
43 LET g_current_cnt = 0
44 END IF
45 #根据条件重新抓取资料
46 LET g_error_show = 1
47 CALL arti305_browser_fill(g_wc,”F”) #移到第一页
48 #储存WC信息
將該次查詢的條件存入資料庫中,提供使用者取用
49 CALL cl_dlg_save_user_latestqry(“(“||g_wc||”)”)
50 IF g_browser.getLength() = 0 THEN
略
61 ELSE
62 CALL arti305_fetch(“F”)
使用者下達的查詢條件若找的到資料則取出第一筆並顯示於畫面上
63 END IF
64 LET g_wc_filter = “”
65 END FUNCTION
66 {</section>}
3.4.11 _construct QBE数据查询
01 {<section id=”arti305.construct” >}
02 #+ QBE数据查询
Construct段資料初始化, 包含給予開窗查詢時Lib所需的相關預設值
03 PRIVATE FUNCTION arti305_construct()
略
11 #清空画面&资料初始化
12 CLEAR FORM
13 INITIALIZE g_gzwk_m.* TO NULL
14 INITIALIZE g_wc TO NULL LET g_current_row = 1
15 LET g_qryparam.state = “c”
16 DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
17 #屏幕上取条件
此處包含了所有能夠提供給使用者下達查詢條件的欄位, 包含了主table欄位以及多語言欄位
18 CONSTRUCT BY NAME g_wc ON imck001, …
略
21 #公用字段开窗相关处理
22 AFTER FIELD imckcrtdt
23 CALL FGL_DIALOG_GETBUFFER() RETURNING ls_result
24 IF NOT cl_null(ls_result) THEN
25 IF NOT cl_chk_date_symbol(ls_result) THEN
26 LET ls_result = cl_add_date_extra_cond(ls_result)
27 END IF
此段落針對公用欄位construct進行特殊處理(例如時間相關的欄位在輸入後會經過轉換成資料庫可辨識的格式)
28 END IF
29 CALL FGL_DIALOG_SETBUFFER(ls_result)
略
31 END CONSTRUCT
進入dialog前先進行QBE相關的資料初始化(cl_qbe_init)
32 BEFORE DIALOG
33 CALL cl_qbe_init()
34 ON ACTION accept
35 ACCEPT DIALOG
36 ON ACTION cancel
37 LET INT_FLAG = 1
38 EXIT DIALOG
39 #查询方案列表
40 ON ACTION qbe_select
41 LET ls_wc = “”
42 CALL cl_qbe_list(“c”) RETURNING ls_wc
43 #条件储存为方案
44 ON ACTION qbe_save
45 CALL cl_qbe_save()
46 #交谈指令共享ACTION
47 &include “common_action.4gl”
48 CONTINUE DIALOG
49 END DIALOG
50 END FUNCTION
51 {</section>}
3.4.12 _insert 资料新增
01 {<section id=”arti305.insert” >}
02 #+ 资料新增
03 PRIVATE FUNCTION arti305_insert()
04 CLEAR FORM #清画面字段内容
05 INITIALIZE g_imck_m.* LIKE imck_t.* #DEFAULT 设定
06 LET g_imck001_t = NULL
07 CALL s_transaction_begin()
08 WHILE TRUE
新增前給予資料預設值, 此處分為一般欄位及共用欄位
09 #公用字段给值
10 LET g_imck_m.imckownid = g_user
略
11 #一般字段给值
12 LET g_imck_m.imck108 = “1”
13 #add-point:单头默认值
14 有需要给予初始值的部分,均在此处设定
15 #end add-point
16 #显示状态(stus)图片
17 CASE g_gzwk_m.gzwkstus
18 WHEN “N”
19 CALL gfrm_curr.setElementImage(“statechange”, “stus/32/open.png”)
略
進入資料輸入段, 並給予狀態a, 表示進行的為新增, 狀態u代表修改, 狀態r代表複製
21 END CASE
22 #数据输入
23 CALL arti305_input(“a”)
31 IF INT_FLAG THEN
32 #若取消则还原数据
略
40 CALL azzi020_show()
根據新增的資料組合WC, 並重新撈取該筆資料到g_browser中(增加到最末筆), 此處須注意的是新增的資料與原本資料的排序方式將有所不同(複製段的處理同新增段)
41 RETURN
42 END IF
43 LET g_rec_b = 0
44 EXIT WHILE
45 END WHILE
46 #根据资料状态切换action状态
47 CALL cl_set_act_visible(“statechange,modify,delete,reproduce”, TRUE)
48 CALL azzi020_set_act_visible()
49 CALL azzi020_set_act_no_visible()
50 #将新增的资料并入搜寻条件中
51 LET g_imck001_t = g_imck_m.imck001
52 LET g_state = “insert”
53 #组合新增数据的条件
54 LET g_add_browse = ” imckent = ‘” ||g_enterprise|| “‘ AND”,
55 ” imck001 = ‘”, g_imck_m.imck001 CLIPPED, “‘ ”
56 #填到最后面
57 LET g_current_idx = g_browser.getLength() + 1
58 CALL arti305_browser_fill(“”,””)
59 DISPLAY g_browser_cnt TO FORMONLY.h_count #总笔数
60 DISPLAY g_current_idx TO FORMONLY.h_index #当下笔数
61 CALL cl_navigator_setting(g_current_idx, g_browser_cnt)
62 EXECUTE arti305_master_referesh USING g_imck_m.imck001 INTO g_imck_m.imckunit,…
63
64 #将数据显示到画面上
65 DISPLAY BY NAME g_imck_m.imckunit,…
66
67 #功能已完成,通报讯息中心
68 CALL arti305_msgcentre_notify(”)
69 END FUNCTION
67 {</section>}
3.4.13 _input 数据输入
01 {<section id=”arti305.input” >}
02 #+ 数据输入
03 PRIVATE FUNCTION arti305_input(p_cmd)
將單頭資料顯示到畫面上, 包含共用欄位的資訊
04 DEFINE p_cmd LIKE type_t.chr1
略
11 #切换至输入画面
12 IF g_main_hidden THEN
13 CALL gfrm_curr.setElementHidden(“mainlayout”,0)
14 CALL gfrm_curr.setElementHidden(“worksheet”,1)
15 LET g_main_hidden = 0
16 END IF
17 #将数据输出到画面上
18 DISPLAY BY NAME g_imck_m.imck001,…
19 CALL cl_set_head_visible(“”,”YES”)
20 #a-新增,r-复制,u-修改
21 IF p_cmd = ‘r’ THEN
對於單檔結構而言, 複製的動作與新增相同, 差異只有複製時保留了key欄位以外的所有欄位內容
22 #此段落的r动作等同于a
23 LET p_cmd = ‘a’
24 END IF
25 LET l_insert = FALSE
26 LET g_action_choice = “”
27 LET g_qryparam.state = “i”
根據輸入的狀態關閉或開啟欄位的編輯功能, 預設在修改時關閉key欄位的編輯功能
28 #控制key字段可否输入
29 CALL arti305_set_entry(p_cmd)
30 CALL arti305_set_no_entry(p_cmd)
31 DISPLAY BY NAME g_imck_m.imck001,…
32 DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
33 #单头段
34 INPUT BY NAME g_imck_m.imck001,… ATTRIBUTE(WITHOUT DEFAULTS)
略
根據設定的ACTION, 會自動產出對應的框架, 並且所有ACTION執行前會先經過身分驗證是否允許執行
41 #+ 此段落由子样板a43产生
42 ON ACTION update_item
43 LET g_action_choice=”update_item”
44 IF cl_auth_chk_act(“update_item”) THEN
45 #add-point:ON ACTION update_item
46 在此处开发个别action功能内容
47 #END add-point
48 END IF
略
进入input段前先开启transaction, 并备份相关的单头变数 |
51 BEFORE INPUT
52 IF s_transaction_chk(“N”,0) THEN
53 CALL s_transaction_begin()
54 END IF
55 #其他table数据备份(确定是否更改用)
56 LET g_master_multi_table_t.imckl001 = g_imck_m.imck001
略
61 #此段落由子样板a01产生
62 BEFORE FIELD imck001
根據欄位需求, 進行欄位管控, 可分為BEFORE FIELD, ON CHANGE, AFTER FILED, ON ACTION CONTROLP
63 #add-point:BEFORE FIELD gzwk002
64 所有区块个别均给定add-point
65 #END add-point
略
71 AFTER INPUT
72 #若点选cancel则离开dialog
73 IF INT_FLAG THEN
74 EXIT DIALOG
75 END IF
根據p_cmd判斷當下的行為是新增(a)或修改(u), 並進行不同的處理段落
76 IF p_cmd <> “u” THEN
77 #当p_cmd不为u代表为新增/复制
78 LET l_count = 1
79 #确定新增的数据不存在(不重复)
80 SELECT COUNT(*) INTO l_count FROM imck_t
81 WHERE imckent = g_enterprise AND imck001 = g_imck_m.imck001
82 IF l_count = 0 THEN
83 #将新增的单头数据写入数据库
84 INSERT INTO imck_t (imckent,…) VALUES (g_enterprise,…)
85 #若写入错误则提示错误讯息并返回输入页面
86 IF SQLCA.sqlcode THEN
略
91 NEXT CURRENT
92 END IF
93 #数据多语言用-增/改
略
01 CALL s_transaction_end(‘Y’,’0′)
02 ELSE
03 #数据重复出现
略
11 CALL s_transaction_end(‘N’,’0′)
12 END IF
13 ELSE
資料修改之前先將遮罩後的欄位進行還原, 並免覆蓋正常的資料內容, 之後再進行寫入
14 #修改状态时
15
16 #将屏蔽字段还原
17 CALL arti305_imck_t_mask_restore(‘restore_mask_o’)
18 UPDATE imck_t SET (imck001,…) = (g_imck_m.imck001,…)
19 WHERE imckent = g_enterprise AND imck001 = g_imck001_t
20 CASE
21 WHEN SQLCA.sqlerrd[3] = 0 #更新不到的处理
略
25 WHEN SQLCA.sqlcode #其他错误
略
更新資料後再進將資料進行遮蔽, 確保資料顯示時已完成遮罩處理
31 OTHERWISE
32 #将屏蔽字段进行遮蔽
33 CALL arti305_imck_t_mask_restore(‘restore_mask_n’)
34 #纪录数据更动
35 LET g_log1 = util.JSON.stringify(g_imck_m_t)
36 LET g_log2 = util.JSON.stringify(g_imck_m)
37 IF NOT cl_log_modified_record(g_log1,g_log2) THEN
紀錄修改前與修改後的單頭資訊並寫入資料庫, 未來若有資料修改上的疑慮可透過工具查看修改log
38 CALL s_transaction_end(‘N’,’0′)
39 ELSE
40 CALL s_transaction_end(‘Y’,’0′)
41 END IF
42 END CASE
一般標準輸入時有提供:controlf﹝線上求助文件﹞、controls﹝單頭折疊﹞等功能
43 END IF
44 END INPUT
略
51 ON ACTION accept
52 ACCEPT DIALOG
53 #放弃输入
54 ON ACTION cancel #按下放弃 (ESC)
56 ON ACTION close #在dialog 右上角 (X)
57 ON ACTION exit #按下toolbar的离开
58 #交谈指令共享ACTION
59 &include “common_action.4gl”
60 CONTINUE DIALOG
61 END DIALOG
62 END FUNCTION
63 {</section>}
3.4.14 _modify 数据修改
01 {<section id=”arti305.modify” >}
02 #+ 数据修改
03 PRIVATE FUNCTION arti305_modify()
04 #先确定key值无遗漏
05 IF g_gzwk_m.gzwk001 IS NULL
06 THEN
07 INITIALIZE g_errparam TO NULL
08 LET g_errparam.extend = “”
09 LET g_errparam.code = “std-00003”
10 LET g_errparam.popup = FALSE
11 CALL cl_err()
12 RETURN
13 END IF
14 ERROR “”
15 #备份key值
16 LET g_imck001_t = g_imck_m.imck001
17 CALL s_transaction_begin()
18 #先lock资料
19 OPEN arti305_cl USING g_enterprise,g_imck_m.imck001
略
21 #显示最新的数据
22 EXECUTE arti305_master_referesh USING g_imck_m.imck001 INTO g_imck_m.imck001,…
23 #数据被他人LOCK, 或是sql执行时出现错误
進入修改段前先撈取最新的資料, 並鎖定該筆資料, 若鎖定時出現錯則提示錯誤訊息
24 IF SQLCA.sqlcode THEN
略
31 CLOSE azzi020_cl
32 CALL s_transaction_end(‘N’,’0′)
33 RETURN
34 END IF
35 #显示数据
36 CALL arti305_show()
將修改者改為目前使用者, 並帶出姓名, 同時將修改時間改為當下的時間
41 WHILE TRUE
42 LET g_imck_m.imck001 = g_imck001_t
43 #写入修改者/修改日期信息
44 LET g_imck_m.imckmodid = g_user
45 LET g_imck_m.imckmoddt = cl_get_current()
46 LET g_imck_m.imckmodid _desc = cl_get_username(g_imck_m.imckmodid)
47 #add-point:modify段修改前
48 修改前就要填入的默认值,设定于此处
49 #end add-point
50 #数据输入
51 CALL arti305_input(“u”)
52 #add-point:modify段修改后
53 修改后若有需要总和处理或是串接其他输入组件,设定于此处
54 #end add-point
略
61 #若有modid跟moddt则进行update
62 UPDATE imck_t SET (imckmodid,imckmoddt) = (g_imck_m.imckmodid, g_imck_m.imckmoddt)
63 WHERE imckent = g_enterprise AND imck001 = g_imck001_t
64 EXIT WHILE
當完成修改動作時, 更新資料修改者與資料修改日期欄位
65 END WHILE
66 #根据资料状态切换action状态
67 CALL cl_set_act_visible(“statechange,modify,delete,reproduce”, TRUE)
68 CALL azzi020_set_act_visible()
69 CALL azzi020_set_act_no_visible()
70 #组合新增数据的条件
71 LET g_add_browse = ” “,
72 ” gzwk001 = ‘”, g_gzwk_m.gzwk001 CLIPPED, “‘ ”
73 #填到对应位置
74 CALL azzi020_browser_fill(g_wc,””)
75 CLOSE arti305_cl
76 CALL s_transaction_end(‘Y’,’0′)
77 #功能已完成,通报讯息中心
78 CALL arti305_msgcentre_notify(”)
79 LET g_worksheet_hidden = 0
80 END FUNCTION
71 {</section>}
3.4.15 _reproduce 数据复制
01 {<section id=”arti305.reproduce” >}
02 #+ 数据复制
03 PRIVATE FUNCTION arti305_reproduce()
04 DEFINE l_newno LIKE imck_t.imck001
進行複製前先檢查所有key欄位皆有值, 否則提示錯誤訊息並返回
05 DEFINE l_oldno LIKE gzwk_t.gzwk001
06 DEFINE l_master RECORD LIKE gzwk_t.*
略
11 #备份key值
12 LET g_gzwk001_t = g_gzwk_m.gzwk001
13 #清空key值
14 LET g_imck_m.imck001 = “”
呼叫管控輸入欄位控制的兩個function, 此處的控制段視同新增
15 CALL arti305_set_entry(“a”)
16 CALL arti305_set_no_entry(“a”)
17 #公用字段新增给值
18 LET g_imck_m.imckownid = g_user
19 LET g_gzwk_m.gzwkmodid = “”
20 LET g_gzwk_m.gzwkmoddt = “”
21 LET g_gzwk_m.gzwkstus = “N”
22 CALL s_transaction_begin()
根據個別程式進行複製時預設資料的設定, 此段的預設值可能與新增段的預設值有所差異
23 #add-point:复制输入前
24 复制前若需要给定相关的默认值,可以在此指定
25 #end add-point
略
31 #数据输入
32 CALL arti305_input(“r”)
33 IF INT_FLAG THEN
34 LET INT_FLAG = 0
35 RETURN
36 END IF
37 CALL s_transaction_end(‘Y’,’0′)
38 #根据资料状态切换action状态
39 CALL cl_set_act_visible(“statechange,modify,delete,reproduce”, TRUE)
40 CALL azzi020_set_act_visible()
41 CALL azzi020_set_act_no_visible()
42 #将新增的资料并入搜寻条件中
43 LET g_state = “insert”
44 LET g_gzwk001_t = g_gzwk_m.gzwk001
45 #组合新增数据的条件
46 LET g_add_browse = ” “,
47 ” gzwk001 = ‘”, g_gzwk_m.gzwk001 CLIPPED, “‘ ”
48 #填到最后面
49 LET g_current_idx = g_browser.getLength() + 1
50 CALL azzi020_browser_fill(“”,””)
略
51 END FUNCTION
52 {</section>}
3.4.16 _delete 数据删除
01 {<section id=”arti305.delete” >}
02 #+ 数据删除
03 PRIVATE FUNCTION arti305_delete()
04 DEFINE l_var_keys DYNAMIC ARRAY OF STRING
進行刪除前先檢查所有key欄位皆有值, 否則提示錯誤訊息並返回
05 #先确定key值无遗漏
略
11 CALL s_transaction_begin()
先進行資料鎖定, 確認是否有其他人正鎖定該筆資料
略
21 OPEN azzi020_cl USING g_gzwk_m.gzwk001
22 #显示最新的数据
23 EXECUTE arti305_master_referesh USING g_imck_m.imck001 INTO g_imck_m….
略
重新撈取資料, 確保呈現到畫面上的資料為最新的內容
31 #将最新数据显示到画面上
32 CALL arti305_show()
33 #确认资料是否删除
34 IF cl_ask_delete() THEN
35 #add-point:单头删除前
36 单头删除前的检查段落
37 #end add-point
38 #删除相关文件
39 CALL arti305_set_pk_array()
40 CALL cl_doc_remove()
41 #删除表数据
42 DELETE FROM gzwk_t WHERE gzwk001 = g_gzwk_m.gzwk001
43 #多语言数据删除
44 #add-point:单头删除后
45 单头删除后,若有关联数据要一起砍除,由此设定
46 #end add-point
47 CLEAR FORM
48 CALL azzi020_ui_browser_refresh()
刪除該筆資料後確認g_browser內是否還有其他資料, 若有則取出被刪除資料的前一筆內容, 若無, 則清空畫面所有資訊
49 #确保画面上保有数据
50 IF g_browser_cnt > 0 THEN
51 CALL arti305_fetch(“P”)
53 ELSE
53 CLEAR FORM
54 END IF
55 END IF
56 CLOSE arti305_cl
57 CALL s_transaction_end(‘Y’,’0′)
58 END FUNCTION
59 {</section>}
3.4.17 _ui_browser_refresh 浏览页签数据重新显示
01 {<section id=”arti305.ui_browser_refresh” >}
02 #+ 浏览页签数据重新显示
03 PRIVATE FUNCTION arti305_ui_browser_refresh()
04 DEFINE l_i LIKE type_t.num10
確認當下被刪除的資料, 並將該資料從瀏覽頁籤的陣列中刪除, 確保畫面資料的一致性
略
08 FOR l_i =1 TO g_browser.getLength()
09 IF g_browser[l_i].b_imck001 = g_imck_m.imck001 THEN
10 CALL g_browser.deleteElement(l_i)
11 END IF
12 END FOR
根據刪除後的資料狀況判定, 如果刪除後畫面無任何資料則關閉特定按鈕的功能並清空畫面資料
略
14 #若无数据则关闭相关功能
15 IF g_browser_cnt = 0 THEN
16 CALL cl_set_act_visible(“statechange,…”, FALSE)
17 CALL cl_navigator_setting(0,0)
18 CLEAR FORM
19 ELSE
20 CALL cl_set_act_visible(“mainhidden”, TRUE)
21 END IF
22 END FUNCTION
23 {</section>}
3.4.18 _set_entry 单头字段开启
01 {<section id=”arti305.set_entry” >}
02 #+ 单头字段开启设定
03 PRIVATE FUNCTION arti305_set_entry(p_cmd)
根據傳入的動作(a為新增,u為修改)決定要開啟編輯的欄位, 預設為key欄位
04 DEFINE p_cmd LIKE type_t.chr1
05 IF p_cmd = “a” THEN
06 CALL cl_set_comp_entry(“imck001”,TRUE)
07 END IF
08 END FUNCTION
09 {</section>}
3.4.19 _set_no_entry 单头字段关闭
01 {<section id=”arti305.set_no_entry” >}
02 #+ 单头字段关闭设定
03 PRIVATE FUNCTION arti305_set_no_entry(p_cmd)
04 DEFINE p_cmd LIKE type_t.chr1
略
11 IF p_cmd = ‘u’ AND g_chkey = ‘N’ THEN
12 CALL cl_set_comp_entry(“imck001”,FALSE)
根據傳入的動作決定要關閉編輯的欄位, 預設為key欄位
13 END IF
略
21 END FUNCTION
22 {</section>}
3.4.20 _statechange 状态代码异动
01 {<section id=”arti305.state_change” >}
02 #+ 确认码变更
03 PRIVATE FUNCTION arti305_statechange()
隱藏當下的狀態, 顯示其他的狀態至選單中, 並根據使用者選擇的狀態進行處理
04 DEFINE lc_state LIKE type_t.chr5
05
06 CALL s_transaction_begin()
07
08 OPEN arti305_cl USING g_enterprise,g_imck_m.imck001
09 IF STATUS THEN
10 INITIALIZE g_errparam TO NULL
略
21 RETURN
22 END IF
23 #显示最新的数据
24 EXECUTE arti305_master_referesh USING g_imck_m.imck001 INTO …
略
31 MENU “” ATTRIBUTES (STYLE=”popup”)
32 BEFORE MENU
33 HIDE OPTION “approved”
34 HIDE OPTION “rejection”
35 CASE g_imck_m.imckstus
36 WHEN “N”
37 HIDE OPTION “inactive”
38 WHEN “Y”
39 HIDE OPTION “active”
40 END CASE
41 #add-point:menu前
42 开始维护前,如果有额外需要处理﹝或不显示的﹞,可由此处隐藏
43 #end add-point
44 ON ACTION inactive
45 IF cl_auth_chk_act(“open”) THEN
46 LET lc_state = “N”
47 #add-point:action控制
48 如果状态变更时,有需要额外处理或连动的原件,设定于此处
49 #end add-point
50 END IF
51 EXIT MENU
略
61 END MENU
62 IF (lc_state <> “N” AND lc_state <> “Y”) OR cl_null(lc_state) THEN
63 RETURN
64 END IF
65 UPDATE imck_t SET imckstus = lc_state
66 WHERE imckent = g_enterprise AND imck001 = g_imck_m.imck001
67 IF SQLCA.sqlcode THEN
略
71 ELSE
72 #根据选择的状态显示图片
73 CASE lc_state
74 WHEN “N”
75 CALL gfrm_curr.setElementImage(“statechange”, “stus/32/inactive.png”)
略
根據所選擇的狀態顯示對應的圖片到畫面上(此處為主頁面的狀態碼圖示)
81 END CASE
82 LET g_imck_m.imckstus = lc_state
83 DISPLAY BY NAME g_imck_m.imckstus
84 END IF
85
86 CLOSE arti305_cl
87 CALL s_transaction_end(‘Y’,’0′)
88
89 #功能已完成,通报讯息中心
90 CALL arti305_msgcentre_notify(lc_state)
91
92 END FUNCTION
93 {</section>}
3.4.21 mask_functions屏蔽处理
遮罩相關的處理函式皆在mask.4gl中, 此4gl透過azzi850遮罩設定產出, 路徑為”com/inc/erp/模組別”底下, 該檔案無法編輯, 且在每次程式產生時會自動產生
01 {<section id=”arti305.mask_functions” >}
02 &include “erp/art/arti305_mask.4gl”
03 {</section>}
3.4.22 _msgcentre_notify 通报讯息中心
01 PRIVATE FUNCTION arti305_msgcentre_notify(lc_state)
02 DEFINE lc_state LIKE type_t.chr5
03
04 INITIALIZE g_msgparam TO NULL
05 #action-id与状态填写
06 IF g_action_choice = “statechange” THEN
07 LET g_msgparam.state = g_action_choice,”:”,lc_state
08 ELSE
09 LET g_msgparam.state = g_action_choice
10 END IF
11
12 #PK数据填写
13 CALL arti305_set_pk_array()
14 #单头数据填写
15 LET g_msgparam.data[1] = util.JSON.stringify(g_imck_m)
略
20 #呼叫讯息中心传递本关完成讯息
21 CALL cl_msgcentre_notify()
22 END FUNCTION
转载请注明:赫非域 » T100手册 单档(arti305)