4.1 双文件表格模型
双档样板﹝pattern﹞只能支持单一的主表,另外可支持多个单头子表,单身子表;而且每个单身子表个别可接二层子表。
4.2 双档参考画面
双文件与单文件的数据浏览页签在设计上并无差别,主要差别在数据输入页签的单身表格排列上。单身表格可以设置单一页签、也可以将相近的数据收纳于同一个页签内,视需求设置。
个别的单身子表可以置放于同一个『表格容器﹝table container﹞』或分散于多个表格容器内。分散于多个表格容器内时,编号数较大的容器不可维护PK数据。
4.3 双文件程序流程
4.4 分段程序流程
4.4.1共享及模块变量宣告
程序注记段落
01 {<section id=”adet400.description” >}
02 #+ Version..: T100-ERP-1.00.00(SD版次:2,PR版次:2) Build-000147
03 #+
04 #+ Filename…: adet400
05 #+ Description: 门店备用金领用作业
06 #+ Creator….: 02748(2014/03/27)
07 #+ Modifier…: 02748(2014/06/30) -SD/PR- 00000(2013/01/01)
08 #+ Buildtype..: 应用 t01 样板自动产生
09 #+ 以上段落由子样板a00产生
10 {</section>}
引入及全局变量设定
11 {<section id=”adet400.global” >}
12 #应用 t01 样板自动产生(Version:19)
13 IMPORT os
14 IMPORT util
15 IMPORT FGL lib_cl_dlg
16 #add-point:增加汇入项目
17 程序中若需要使用JAVA或Genero原生lib均须在此处设置IMPORT
18 #end add-point
19 SCHEMA ds
20 GLOBALS “../../cfg/top_global.inc”
21
22 #add-point:增加汇入变量文件
23 部分大型程序需要拥有自己的inc参数配置文件,可以自行于此处汇入
24 #end add-point
25
26 #单头 type 宣告
程式需使用的全域變數,變數資料從畫面欄位取出,不可增減
27 PRIVATE type type_g_deaq_m RECORD
略
62 #add-point:传入参数说明(global.argv)
63 程序中若需要自行增加要用的全局变量则可于此处设定
Form和current window都有指定全域物件,因此可以直接使用物件操作
64 #end add-point
65 #add-point:传入参数说明(global.argv)
66 自动补入 azzi900的参数定义说明特别写法
67 #argv[1] imaa_t.imaa002
68 #argv[2] type_t.chr1 #测试用参数
69 #end add-point
70 {</section >}
4.4.2主程序
01 {<section id=”adet400.main” >}
02 #+ 此段落由子样板a26产生
03 #OPTIONS SHORT CIRCUIT
04 #+ 作业开始
05 MAIN
同单档
68 END MAIN
69 {</section>}
4.4.3 _init初始化
01 {<section id=”adet400.init” >}
02 #+ 浏览页签数据初始化
03 PRIVATE FUNCTION adet400_init()
同单档
22 END FUNCTION
23 {</section>}
4.4.4 _default_search 执行后首次查询数据
01 {<section id=”adet400.default_search” >}
02 #+ 外部参数搜寻
03 PRIVATE FUNCTION adet400_default_search()
同单档
31 END FUNCTION
32 {</section>}
4.4.5 _ui_dialog操作功能选单
01 {<section id=”adet400.ui_dialog” >}
02 #+ 功能选单
03 PRIVATE FUNCTION adet400_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字符串
11 CALL cl_set_act_visible(“accept,cancel”, FALSE)
12
13 #因应查询方案进行处理
14 CALL gfrm_curr.setElementImage(“logo”,”logo/applogo.png”)
程式開啟時顯示的頁面為瀏覽頁籤, 此處先隱藏單頭/單身資訊頁, 只顯示瀏覽頁
15 IF g_default THEN
16 CALL gfrm_curr.setElementHidden(“mainlayout”,0)
17 CALL gfrm_curr.setElementHidden(“worksheet”,1)
18 LET g_main_hidden = 0
19 ELSE
20 CALL gfrm_curr.setElementHidden(“mainlayout”,1)
21 CALL gfrm_curr.setElementHidden(“worksheet”,0)
22 LET g_main_hidden = 1
23 END IF
24
若程式有預設行為, 則在進入此段時會先直接該動作
25 #action default动作
同单档
40 LET lb_first = TRUE
41 WHILE TRUE
42
43 IF g_action_choice = “logistics” THEN
當使用者進行營運據點切換時會離開dialog並重新進入, 視同重啟程式, 清空畫面上已經查詢條件等資訊
44 #清除画面及相关资料
45 CLEAR FORM
46 CALL g_browser.clear()
47 INITIALIZE g_deaq_m.* TO NULL
48 CALL g_dear_d.clear()
49 LET g_wc = ‘ 1=2’
50 LET g_wc2 = ‘ 1=1’
51 LET g_action_choice = “”
52 CALL adet400_init()
53 END IF
54
55 #先填充browser数据
56 CALL lib_cl_dlg.cl_dlg_before_display()
57 CALL cl_notice()
58
59 DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
60
61 #左侧浏览页签
62 DISPLAY ARRAY g_browser TO s_browse.* ATTRIBUTES(COUNT=g_header_cnt)
同单档
69 END DISPLAY
70
71 DISPLAY ARRAY g_dear_d TO s_detail1.* ATTRIBUTES(COUNT=g_rec_b) #page1
72 BEFORE ROW
73 #显示单身笔数
74 CALL adet400_idx_chk()
75 #确定当下选择的笔数
76 LET l_ac = DIALOG.getCurrentRow(“s_detail1”)
77 LET g_detail_idx = l_ac
78
79 BEFORE DISPLAY
此樣板同時支援第一階單身及第二階單身, 此處的控制段是當資料停留在第一階單身時筆數的控制
80 #如果一直都在第一阶则控制笔数位置
81 IF g_loc = ‘m’ THEN
82 CALL FGL_SET_ARR_CURR(g_detail_idx)
83 END IF
84 LET g_loc = ‘m’
85 LET l_ac = DIALOG.getCurrentRow(“s_detail1”)
86 LET g_current_page = 1
根據當下所停留的頁面, 顯示該頁面的筆數資訊
87 #显示单身笔数
88 CALL adet400_idx_chk()
89 END DISPLAY
90
此處採用subdialog寫法, 引入額外的兩個dialog資訊
91 SUBDIALOG lib_cl_dlg.cl_dlg_qryplan
92 SUBDIALOG lib_cl_dlg.cl_dlg_relateapps
93
94 BEFORE DIALOG
95 #先填充browser数据
96 CALL adet400_browser_fill(“”)
97 CALL cl_navigator_setting(g_current_idx, g_detail_cnt)
98 LET g_curr_diag = ui.DIALOG.getCurrent()
99 LET g_current_sw = FALSE
100 #回归旧笔数位置 (回到当时异动的笔数)
略
110 LET g_current_sw = TRUE
111 LET g_current_row = g_current_idx #目前指标
112
113 #有数据才进行fetch
114 IF g_current_idx <> 0 THEN
115 CALL adet400_fetch(”) # reload data
116 END IF
117 #LET g_detail_idx = 1
118 CALL adet400_ui_detailshow() #Setting the current row
119
120 #笔数显示
121 LET g_current_page = 1
122 CALL adet400_idx_chk()
123
124 #状态代码切换action
同单档
134
135 #+ 此段落由子样板a43产生
136 ON ACTION modify_detail
當使用者直接雙點擊單身進入修改段落時會先經過此action, 並判定當下所選擇的單身, 直接進入到該單身的第一個欄位
137 LET g_action_choice=”modify_detail”
138 IF cl_auth_chk_act(“modify”) THEN
139 LET g_aw = g_curr_diag.getCurrentItem()
140 CALL adet400_modify()
141 EXIT DIALOG
142 END IF
同单档
154 CONTINUE DIALOG
155 END DIALOG
156
157 IF g_action_choice = “exit” AND NOT cl_null(g_action_choice) THEN
158 EXIT WHILE
159 END IF
160
161 END WHILE
162
163 CALL cl_set_act_visible(“accept,cancel”, TRUE)
164
165 END FUNCTION
166 {</section>}
4.4.6 _browser_fill浏览页签数据填充
01 {<section id=”adet400.browser_fill” >}
瀏覽頁資料填充的段落大致上與單檔相同, 差異僅在於統計資料筆數與搜尋資料時會納入單身的搜尋條件(g_wc2)
02 #+ 浏览页签数据填充
03 PRIVATE FUNCTION adet400_browser_fill(ps_page_action)
同单档
12 IF g_wc2 <> ” 1=1″ THEN
13 #单身有输入搜寻条件
14 LET l_sub_sql = ” SELECT UNIQUE deaqdocno,… ”
15 ELSE
16 #单身未输入搜寻条件
17 LET l_sub_sql = ” SELECT UNIQUE deaqdocno,… ”
18 END IF
同单档
34 LET g_sql = ” SELECT DISTINCT t0.deaqstus,t0.deaqsite,…”,
35 ” WHERE t0.deaqent = ‘” ||g_enterprise|| “‘ AND “…
同单档
76 END FUNCTION
77 {</section>}
4.4.7 _ui_headershow刷新单头数据内容
根據當下所選擇的單頭資料, 重新從資料庫撈取最新的資料內容
01 {<section id=”adet400.ui_headershow” >}
02 #+ 单头数据重新显示
03 PRIVATE FUNCTION adet400_ui_headershow()
04 LET g_deaq_m.deaqdocno = g_browser[g_current_idx].b_deaqdocno
05 EXECUTE adet400_master_referesh USING g_deaq_m.deaqdocno INTO g_deaq_m.deaqsite,…
06 CALL adet400_show()
07 END FUNCTION
08 {</section>}
4.4.8 _ui_detailshow刷新单身数据内容
01 {<section id=”adet400.ui_detailshow” >}
此處僅刷新單身筆數的位置, 若需要重刷新單身資料可於add-point自行撰寫
02 #+ 单身数据重新显示
03 PRIVATE FUNCTION adet400_ui_detailshow()
04 #add-point:ui_detailshow段before
05 于此段落定义单身刷新前的行为
06 #end add-point
07 IF g_curr_diag IS NOT NULL THEN
08 CALL g_curr_diag.setCurrentRow(“s_detail1”,g_detail_idx)
09 END IF
抓取單頭資料的段落同單檔, 但須額外呼叫show段進行填充單身的動作
10 #add-point:ui_detailshow段after
11 于此段落定义单身刷新后所需处理的相关段落
12 #end add-pointEND FUNCTION
13 {</section>}
4.4.9 _fetch 数据笔数查询与数据抓取
01 {<section id=”adet400.fetch” >}
02 #+ 指定PK后抓取单头其他数据
03 PRIVATE FUNCTION adet400_fetch(p_flag)
同单档
34 #重新显示
35 CALL adet400_show()
36
37 #+ 此段落由子样板a56产生
38 #检查此单据是否需显示BPM签核状况按钮
此段落僅針對有簽核功能的程式, 根據該單據的資訊,判定是否顯示BPM簽核狀況的按鈕
39 IF cl_bpm_chk() THEN
40 CALL cl_set_act_visible(“bpm_status”,TRUE)
41 ELSE
42 CALL cl_set_act_visible(“bpm_status”,FALSE)
43 END IF
44 END FUNCTION
45 {</section>}
4.4.10 _b_fill单身数据笔数查询与数据抓取
01 {<section id=”adet400.b_fill” >}
02 #+ 单身数组填充
03 PRIVATE FUNCTION adet400_b_fill()
判斷該單身是否進行填充, 會依據fill_chk所取得的資訊決定填充與否, 並且根據當下執行的動作確定是否需重重組SQL, 切換上下筆資料時不重組SQL
略
09 CALL g_dear_d.clear() #g_dear_d 单头及单身
10 #判断是否填充
11 IF adet400_fill_chk(1) THEN
12 #切换上下笔时不重组SQL
13 IF g_action_choice <> ‘fetch’ OR cl_null(g_action_choice) THEN
14 LET g_sql = “SELECT UNIQUE … ”
15 LET g_sql = cl_sql_add_mask(g_sql) #遮蔽特定资料
16 IF NOT cl_null(g_wc2_table1) THEN
17 LET g_sql = g_sql CLIPPED, ” AND “, g_wc2_table1 CLIPPED
18 END IF
19 LET g_sql = g_sql, ” ORDER BY dear_t.dearseq”
20
21 LET g_sql = cl_sql_add_mask(g_sql) #遮蔽特定资料
22 PREPARE adet400_pb FROM g_sql
23 DECLARE b_fill_cs CURSOR FOR adet400_pb
24 END IF
25 LET g_cnt = l_ac
26 LET l_ac = 1
27 OPEN b_fill_cs USING g_enterprise,g_deaq_m.deaqdocno
28 FOREACH b_fill_cs INTO g_dear_d[l_ac].dearseq,…
29 IF SQLCA.sqlcode THEN
略
35 END IF
36
37 LET l_ac = l_ac + 1
38 IF l_ac > g_max_rec THEN
39 EXIT FOREACH
40 END IF
41 END FOREACH
42 IF l_ac > g_max_rec AND g_error_show = 1 THEN
略
當資料筆數超出上限時會提示錯誤訊息
51 END IF
52 LET g_error_show = 0
53 END IF
55 CALL g_dear_d.deleteElement(g_dear_d.getLength())
56
57 #屏蔽相关处理
58 FOR l_ac = 1 TO g_dear_d.getLength()
將所有取得的資料進行備份, 接著遮罩處理, 最後備份遮罩後資料
59 LET g_dear_d_mask_o[l_ac].* = g_dear_d[l_ac].*
60 CALL adet400_dear_t_mask()
61 LET g_dear_d_mask_n[l_ac].* = g_dear_d[l_ac].*
62 END FOR
63 LET l_ac = g_cnt
64 LET g_cnt = 0
65 FREE adet400_pb
66 FUNCTION
67 {</section>}
4.4.11 _b_fill2第二阶单身数据笔数查询与数据抓取
01 {<section id=”adet400.b_fill2″ >}
第二階單身的資料填充段, 此程式無第二階單身因此無作用
02 #+ 单身数组填充2
03 PRIVATE FUNCTION adet400_b_fill2(pi_idx)
略
19 END FUNCTION
20 {</section>}
4.4.12 _show 数据显示
01 {<section id=”adet400.show” >}
02 #+ 单头数据重新显示及单身数据重抓
03 PRIVATE FUNCTION adet400_show()
略
14 IF g_bfill = “Y” THEN
特定段落僅需刷新reference(單頭及單身)與顯示, 利用g_bfill控制是否連同單身資料一同刷新
15 CALL adet400_b_fill() #单身填充
16 CALL adet400_b_fill2(‘0’) #单身填充
17 END IF
18
19 #显示followup图标
20 #+ 此段落由子样板a48产生
21 CALL adet400_set_pk_array()
22 CALL cl_user_overview_set_follow_pic()
一般的單頭帶值會在fetch段段一同帶出資料, 若有比較特別需獨立處理的帶值則在此段的add-point中自行撰寫處理段, 例如多語言的欄位的帶值處理皆會在此段落處理。
23 LET l_ac_t = l_ac
24
25 #读入ref值(单头)
26 #add-point:show段reference
27 若单头有自定义的参照字段或多语言字段,可于此处进行处理
28 #end add-point
29
30 #将数据输出到画面上
31 DISPLAY BY NAME g_deaq_m.deaqsite,…
32 #显示状态(stus)图片
33 #此段落由子样板a21产生
34 #根据状态代码显示对应图片
35 CASE g_deaq_m.deaqstus
36 WHEN “N”
37 CALL gfrm_curr.setElementImage(“statechange”, “stus/32/unconfirmed.png”)
略
一般單身帶值會在b_fill帶出資料, 若有需獨立處理的帶值則在此段的add-point中自行撰寫段, 例如自定義參照欄位, 多語言欄位或是非主要單身表的欄位等等
47 END CASE
48
49 #读入ref值(单身)
50 FOR l_ac = 1 TO g_dear_d.getLength()
51 #add-point:show段单身reference
52 自定义的参照字段, 多语言字段或非主表的单身字段带值,可于此处进行处理
53 #end add-point
54 END FOR
55
56 LET l_ac = l_ac_t
57 #移动上下笔可以连动切换数据
58 CALL cl_show_fld_cont()
59 CALL adet400_detail_show()
60 END FUNCTION
61 {</section>}
4.4.13 _detail_show 单身数据显示
01 {<section id=”adet400.detail_show” >}
此function處理的為第二階單身的帶值, 若有需要特別的處理則撰寫於此段落
02 #+ 第二阶单身reference
03 PRIVATE FUNCTION adet400_detail_show()
略
05 END FUNCTION
06 {</section>}
4.4.14 _set_pk_array 设定单头PK数据提供相关文件使用
01 {<section id=”adet400.set_pk_array” >}
02 #+ 此段落由子样板a51产生
03 #+ 给予pk_array内容
04 PRIVATE FUNCTION adet400_set_pk_array()
同单档
18 END FUNCTION
19 {</section>}
4.4.15 _query 数据查询
01 {<section id=”adet400.query” >}
此段Query的行為同單檔, 但多了清空畫面上filter條件的段落
02 #+ 数据查询QBE功能准备
03 PRIVATE FUNCTION adet400_query()
同单档
14 #清空filter条件
15 CALL adet400_filter_show(‘deaqsite’)
略
21 END FUNCTION
22 {</section>}
4.4.16 _ui_browser_refresh 浏览页签数据重新显示
{<section id=”adet400.ui_browser_refresh” >}
#+ 浏览页签数据重新显示
PRIVATE FUNCTION adet400_ui_browser_refresh()
同单档
END FUNCTION
{</section>}
4.4.17 _construct QBE数据查询
01 {<section id=”adet400.construct” >}
02 #+ QBE数据查询
03 PRIVATE FUNCTION adet400_construct()
同单档
11
12 #使用DIALOG包住 单头CONSTRUCT及单身CONSTRUCT
13 DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
同单档
41 #单身根据table分拆construct
42 CONSTRUCT g_wc2_table1 ON dearseq… FROM s_detail1[1].dearseq,…
43 BEFORE CONSTRUCT
Construct單身段落, 根據單身table的數量會有多個construct, 也會有對應的g_wc2_table變數承接
44
45 #单身一般字段开窗相关处理
略
77 END CONSTRUCT
78
79 BEFORE DIALOG
80 CALL cl_qbe_init()
81
82 #查询方案列表
83 ON ACTION qbe_select
略
121 CONTINUE DIALOG
construct段結束前會重新將所有的g_wc2_table (若有多個單身table則會有對應數量的g_wc2_table)組合為g_wc2, 代表單身所下的查詢條件
122 END DIALOG
123
124 #组合g_wc2
125 LET g_wc2 = g_wc2_table1
126
127 IF INT_FLAG THEN
128 RETURN
129 END IF
130 END FUNCTION
131 {</section>}
4.4.18 _filter 过滤条件功能
01 {<section id=”adet400.filter” >}
根據Query所查詢出來的條件可能不夠精確, 可以經過瀏覽頁籤的過濾功能進行第二次資料篩選
02 #+ 此段落由子样板a50产生
03 #+ filter过滤功能
04 PRIVATE FUNCTION adet400_filter()
05 #切换画面回浏览页签页面
先將原先g_wc中的篩選條件取消方便後續的處理
略
12 LET g_wc = cl_replace_str(g_wc, g_wc_filter_t, ”)
13
14 #使用DIALOG包住 单头CONSTRUCT及单身CONSTRUCT
15 DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
16
此段construct可供查詢的欄位只有瀏覽頁籤的主表欄位
17 CONSTRUCT g_wc_filter ON deaqsite,…
18
19 BEFORE CONSTRUCT #先将原本的条件还原到画面上
20 DISPLAY adet400_filter_parser(‘deaqsite’) TO s_browse[1].b_deaqsite
略
每次使用filter時會將查詢條件儲存至變數中, 當下一次進行filter時會將前一次過濾的條件顯示於畫面上, 但須注意的是若進行filter功能後重新Query則會清空filter先前的條件
41 END CONSTRUCT
42
43 BEFORE DIALOG
44 #add-point:filter段b_dialog
45 进入fitler功能前若有需要处理的段落可于此处定义
46 #end add-point
47 ON ACTION accept
48 CONTINUE DIALOG
49 END DIALOG
將fitler取得的條件併入g_wc中, 取得更精確且符合使用者需求的資料新Query則會清空filter先前的條件
50
51 #组合条件
52 IF NOT INT_FLAG THEN
53 LET g_wc_filter = ” AND “, g_wc_filter, ” ”
54 LET g_wc = g_wc , g_wc_filter
55 ELSE
56 LET g_wc_filter = g_wc_filter_t
57 LET g_wc = g_wc_t
58 END IF
59
60 #显示条件到字段title
同時將使用者所輸入的filter條件顯示於瀏覽頁籤的標題上
61 CALL adet400_filter_show(‘deaqsite’)
略
88 END FUNCTION
89 {</section>}
4.4.19 _filter_parser 过滤条件功能(条件解析)
01 {<section id=”adet400.filter_parser” >}
02 #+ filter过滤功能
03 PRIVATE FUNCTION adet400_filter_parser(ps_field)
略
此function主要解析fitler所取得的各個條件並解析, 之後回傳該欄位所下達的過濾條件
11 #一般条件解析
12 LET ls_tmp = ps_field, “='”
略
18 #模糊条件解析
19 LET ls_tmp = ps_field, ” like ‘”
略
25 RETURN ls_var
26 END FUNCTION
27 {</section>}
4.4.20 _filter_show 过滤条件功能(条件显示)
01 {<section id=”adet400.filter_show” >}
02 #+ 显示过滤条件
03 PRIVATE FUNCTION adet400_filter_show(ps_field)
略
此function將fitler取得的欄位過濾條件顯示到瀏覽頁籤上
14 LET ls_name = “formonly.b_”, ps_field
略
19 #显示数据组合
20 LET ls_condition = adet400_filter_parser(ps_field)
略
28 #将数据显示回去
29 CALL lnode_item.setAttribute(“text”,ls_title)
30 END FUNCTION
31 {</section>}
4.4.21 _insert 资料新增
01 {<section id=”adet400.insert” >}
02 #+ 资料新增
03 PRIVATE FUNCTION adet400_insert()
同单档
67 END FUNCTION
68 {</section>}
4.4.22 _insert_b 单身资料新增
01{<section id=”adet400.insert_b” >}
02 #+ 新增单身后其他table连动
03 PRIVATE FUNCTION adet400_insert_b(ps_table,ps_keys,ps_page)
04 DEFINE ps_table STRING
略
06 LET g_update = TRUE
07 #判断是否是同一群组的table
08 LET ls_group = “‘1’,”
09 IF ls_group.getIndexOf(ps_page,1) > 0 THEN
10 INSERT INTO dear_t (dearent,…) VALUES(g_enterprise,…)
11 IF SQLCA.sqlcode THEN
單身資料新增除時會確認是否有其他單身為同一個群組, 若有的話則在同群組內的單身新增該筆資料
略
15 END IF
16 END IF
17 END FUNCTION
18 {</section>}
4.4.23 _input 数据输入
01 {<section id=”adet400.input” >}
02 #+ 数据输入
03 PRIVATE FUNCTION adet400_input(p_cmd)
略
32 #先做状态判定
33 IF p_cmd = ‘r’ THEN
進入input段時同單檔須先進行p_cmd的轉換, 但是此處的r(複製)行為與單檔有所不同, 需額外進行單身的複製處理
34 LET l_cmd_t = ‘r’
35 LET p_cmd = ‘a’
36 ELSE
37 LET l_cmd_t = p_cmd
38 END IF
略
56 LET g_forupd_sql = “SELECT dearseq,… WHERE …”
此處定義的是單身的lock SQL, 若有超過一個的單身, 則此處會產出多段SQL
57 LET g_forupd_sql = cl_sql_forupd(g_forupd_sql)
58 LET g_forupd_sql = cl_sql_add_mask(g_forupd_sql)
59 #遮蔽特定资料
60 DECLARE adet400_bcl CURSOR FROM g_forupd_sql
61
62 LET l_allow_insert = cl_auth_detail_input(“insert”)
取得單身是否允許新增/修改/刪除的權限
63 LET l_allow_delete = cl_auth_detail_input(“delete”)
64 LET g_qryparam.state = ‘i’
略
65 DISPLAY BY NAME g_deaq_m.deaqsite,…
66 LET lb_reproduce = FALSE #确定是否复制过单身
67
68 DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
69 {</section>}
70 {<section id=”adet400.input.head” >}
71 #单头段
72 INPUT BY NAME g_deaq_m.deaqsite, … ATTRIBUTE(WITHOUT DEFAULTS)
同单档
102 AFTER INPUT
同单档
187 IF l_cmd_t = ‘r’ AND p_cmd = ‘a’ THEN
此處判斷如果是複製, 則需在寫入單頭資料後一併複製單身資料
188 CALL adet400_detail_reproduce()
189 END IF
190 LET p_cmd = ‘u’
同单档
244 END INPUT
單身輸入段, 資料可否新增/刪除可透過設定處理, 每個單身頁籤會有一個對應的INPUT ARRAY段
245 {</section>}
246 {<section id=”adet400.input.body” >}
247 #Page1 默认值产生于此处
248 INPUT ARRAY g_dear_d FROM s_detail1.* ATTRIBUTE(COUNT = g_rec_b, …)
249 BEFORE INPUT
250 IF g_insert = ‘Y’ AND NOT cl_null(g_insert) THEN
251 CALL FGL_SET_ARR_CURR(g_dear_d.getLength()+1)
252 LET g_insert = ‘N’
單身的新增只能夠在該表格的第一個頁籤, 若是在其他頁籤新增資料時則會被強制導回第一頁進行新增
253 END IF
254 CALL adet400_b_fill()
255 #如果一直都在单身1则控制笔数位置
256 IF g_loc = ‘m’ AND g_rec_b != 0 THEN
257 CALL FGL_SET_ARR_CURR(g_detail_idx)
258 END IF
259 LET g_loc = ‘m’ 255
260 LET g_rec_b = g_dear_d.getLength()
261 BEFORE ROW
262 LET l_insert = FALSE
進入到任何一筆單身資料時先進行鎖定, 確保後續的修改能夠正常寫入
略
280 CALL s_transaction_begin()
281 OPEN adet400_cl USING g_enterprise,g_deaq_m.deaqdocno
282 IF STATUS THEN
略
290 END IF
291
292 LET g_rec_b = g_dear_d.getLength()
293 IF g_rec_b >= l_ac AND g_dear_d[l_ac].dearseq IS NOT NULL THEN
294 LET l_cmd=’u’
295 LET g_dear_d_t.* = g_dear_d[l_ac].* #BACKUP
296 LET g_dear_d_o.* = g_dear_d[l_ac].* #BACKUP
297 CALL adet400_set_entry_b(l_cmd)
進入每一筆單身資料前先進行資料備份, 以及開啟或關閉特定欄位的處理, 並進行相關資料的lock
298 CALL adet400_set_no_entry_b(l_cmd)
299 IF NOT adet400_lock_b(“dear_t”,”‘1′”) THEN
300 LET l_lock_sw=’Y’
301 ELSE
302 FETCH adet400_bcl INTO g_dear_d[l_ac].dearseq,…
303 IF SQLCA.sqlcode THEN
略
重新帶出參照欄位的內容, 但不刷新單身資料, 確保不影響單身的筆數內容
321 END IF
322 LET g_bfill = “N”
323 CALL adet400_show()
324 LET g_bfill = “Y”
325 CALL cl_show_fld_cont()
325 END IF
327 ELSE
328 LET l_cmd=’a’
329 END IF
330
331 BEFORE INSERT
略
341 CALL adet400_set_entry_b(l_cmd)
關閉/開啟單身特定欄位的編輯功能
342 CALL adet400_set_no_entry_b(l_cmd)
343 IF lb_reproduce THEN
344 LET lb_reproduce = FALSE
345 LET g_dear_d[li_reproduce_target].* = g_dear_d[li_reproduce].*
346 LET g_dear_d[li_reproduce_target].dearseq = NULL
347 END IF
348
349 AFTER INSERT
略
376 SELECT COUNT(*) INTO l_count FROM dear_t WHERE dearent = g_enterprise AND …
377 #数据未重复, 插入新增数据
378 IF l_count = 0 THEN
判定該筆資料的鍵值沒有重複時則呼叫insert_b, 將資料寫入對應的單身表中
379 #同步新增到同层的table
380 INITIALIZE gs_keys TO NULL
381 LET gs_keys[1] = g_deaq_m.deaqdocno
382 LET gs_keys[2] = g_dear_d[g_detail_idx].dearseq
383 CALL adet400_insert_b(‘dear_t’,gs_keys,”‘1′”)
略
401 BEFORE DELETE #是否取消单身
若為l_cmd為a代表剛資料為剛新增, 尚未寫入資料庫
402 IF l_cmd = ‘a’ THEN
403 LET l_cmd=’d’
404 ELSE
405 IF NOT cl_ask_del_detail() THEN
先進行詢問, 確定刪除該筆單身資料, 如果為否則取消刪除
406 CANCEL DELETE
407 END IF
408 IF l_lock_sw = “Y” THEN
若該筆資料已被鎖定, 則提示錯誤訊息並取消刪除
略
414 CALL cl_err()
415 CANCEL DELETE
416 END IF
417
418 #取得该笔资料key值
419 INITIALIZE gs_keys TO NULL
420 LET gs_keys[01] = g_deaq_m.deaqdocno
421 LET gs_keys[gs_keys.getLength()+1] = g_dear_d_t.dearseq
422
423 #删除同层单身
424 IF NOT adet400_delete_b(‘dear_t’,gs_keys,”‘1′”) THEN
425 CALL s_transaction_end(‘N’,’0′)
根據要刪除的資料與表格進行比對, 一同刪除其他相關表格的對應資料
426 CLOSE adet400_bcl
427 CANCEL DELETE
428 END IF
429
430 #删除下层单身
431 IF NOT adet400_key_delete_b(gs_keys,’dear_t’) THEN
432 CALL s_transaction_end(‘N’,’0′)
該段落為上層單身, 刪除時連帶刪除下層單身資料
433 CLOSE adet400_bcl
434 CANCEL DELETE
435 END IF
436
437 CALL s_transaction_end(‘Y’,’0′)
438 CLOSE adet400_bcl
439 LET g_rec_b = g_rec_b-1
440 LET l_count = g_dear_d.getLength()
441 END IF
442
443 AFTER DELETE
444 #如果是最后一笔
若刪除的資料為該單身的最後一筆資料則將指標往前挪一筆
445 IF l_ac = (g_dear_d.getLength() + 1) THEN
446 CALL FGL_SET_ARR_CURR(l_ac-1)
447 END IF
略
461 ON ROW CHANGE
略
467 IF l_lock_sw = ‘Y’ THEN
略
469 LET g_dear_d[l_ac].* = g_dear_d_t.*
資料更新前先將被遮罩的欄位資料還原, 然後再進行資料更新
470 ELSE
471 #将屏蔽字段还原
472 CALL adet400_dear_t_mask_restore(‘restore_mask_o’)
473
474 UPDATE dear_t SET (deardocno,…) = (g_deaq_m.deaqdocno,…)
475 WHERE dearent = g_enterprise …
476
477 CASE
478 WHEN SQLCA.sqlerrd[3] = 0 #更新不到的处理
略
根據要修改的資料與表格進行比對, 一同修改其他相關表格的對應資料
482 OTHERWISE
483 INITIALIZE gs_keys TO NULL
484 LET gs_keys[1] = g_deaq_m.deaqdocno
485 LET gs_keys_bak[1] = g_deaqdocno_t
486 LET gs_keys[2] = g_dear_d[g_detail_idx].dearseq
487 LET gs_keys_bak[2] = g_dear_d_t.dearseq
488 CALL adet400_update_b(‘dear_t’,gs_keys,gs_keys_bak,”‘1′”)
489 END CASE
再次在資料進行遮蔽, 確保資料顯示於畫面上時已完成遮罩處理
490
491 #将屏蔽字段进行遮蔽
492 CALL adet400_dear_t_mask_restore(‘restore_mask_n’)
493
該段落為上層單身, 異動key值時連帶更動下層單身資料
494 #判断key是否有改变
495 INITIALIZE gs_keys TO NULL
496 IF NOT(g_dear_d[g_detail_idx].dearseq = g_dear_d_t.dearseq) THEN
497 LET gs_keys[01] = g_deaq_m.deaqdocno
498 LET gs_keys[gs_keys.getLength()+1] = g_dear_d_t.dearseq
499 CALL adet400_key_update_b(gs_keys,’dear_t’)
500 END IF
501 #修改历程记录
502 LET g_log1 = util.JSON.stringify(g_deaq_m),util.JSON.stringify(g_dear_d_t)
503 LET g_log2 = util.JSON.stringify(g_deaq_m),util.JSON.stringify(g_dear_d[l_ac])
504 IF NOT cl_log_modified_record(g_log1,g_log2) THEN
505 CALL s_transaction_end(‘N’,’0′)
506 END IF
記錄修改前與修改後的單身資料, 該資料將存入資料庫, 可透過對應的工具查看相關的修改紀錄
507 END IF
508
509 AFTER ROW
略
514 CALL adet400_unlock_b(“dear_t”,”‘1′”)
515 CALL s_transaction_end(‘Y’,’0′)
離開該筆單身時將解開該筆資料的lock, 並將過程中的動作寫入資料庫
516
517 AFTER INPUT
略
521 ON ACTION controlo
複製單身功能, 將當下筆數選擇的資料複製並移動到最末筆, 同時清除單身鍵值欄位的資料
522 CALL FGL_SET_ARR_CURR(g_dear_d.getLength()+1)
523 LET lb_reproduce = TRUE
524 LET li_reproduce = l_ac
525 LET li_reproduce_target = g_dear_d.getLength()+1
526 END INPUT
527 {</section>}
528 {<section id=”adet400.input.other” >}
529 BEFORE DIALOG
略
538 #新增时强制从单头开始填
點擊新增功能時會強制先導到單頭段落, 若點擊modify_detail按鈕進到此段落則會根據當下點擊的頁籤進行對應的頁籤key欄位
539 IF p_cmd = ‘a’ THEN
540 NEXT FIELD deaqdocno
541 ELSE
542 CASE g_aw
543 WHEN “s_detail1”
544 NEXT FIELD dearseq
545 END CASE
546 END IF
略
557 CONTINUE DIALOG
558 END DIALOG
559 END FUNCTION
560{</section>}
4.4.24 _lock_b单身数据锁定
01 {<section id=”adet400.lock_b” >}
02 #+ 连动lock其他单身table数据
03 PRIVATE FUNCTION adet400_lock_b(ps_table,ps_page)
略
單身資料進入修改前須先鎖定該筆資料, 此處針對同群組的單身資料一同進行鎖定(key值相同)
13 #锁定整组table
14 #LET ls_group = “‘1’,”
15 #仅锁定自身table
16 LET ls_group = “dear_t”
17 IF ls_group.getIndexOf(ps_table,1) THEN
18 OPEN adet400_bcl USING g_enterprise,…
19 IF SQLCA.sqlcode THEN
略
25 END IF
26 END IF
27 RETURN TRUE
28 END FUNCTION
29 {</section>}
4.4.25 _unlock_b单身资料解锁
01 {<section id=”adet400.unlock_b” >}
02 #+ 连动unlock其他单身table数据
03 PRIVATE FUNCTION adet400_unlock_b(ps_table,ps_page)
略
單身資料結束修改前須則解鎖該筆資料, 此處針對同群組的單身資料一同進行解鎖(key值相同)
08 LET ls_group = “‘1’,”
09 IF ls_group.getIndexOf(ps_page,1) THEN
10 CLOSE adet400_bcl
11 END IF
12 END FUNCTION
13 {</section>}
4.4.26 _modify 数据修改
01 {<section id=”adet400.modify” >}
02 #+ 数据修改
03 PRIVATE FUNCTION adet400_modify()
同单档
41 #字段更改
42 LET g_update = FALSE
43 CALL adet400_input(“u”)
略
確認資料有異動後(單頭或單身)進行修改者以及修改時間欄位的異動
50 IF g_update OR NOT INT_FLAG THEN
51 #若有modid跟moddt则进行update
52 UPDATE deaq_t SET (deaqmodid,deaqmoddt) = (g_deaq_m.deaqmodid,g_deaq_m.deaqmoddt)
53 WHERE deaqent = g_enterprise AND deaqdocno = g_deaqdocno_t
54 END IF
同单档
85 END FUNCTION
86 {</section>}
4.4.27 _update_b 单身数据修改
01 {<section id=”adet400.update_b” >}
02 #+ 修改单身后其他table连动
03 PRIVATE FUNCTION adet400_update_b(ps_table,ps_keys,ps_keys_bak,ps_page)
略
07 LET g_update = TRUE
08 #判断key是否有改变
09 LET lb_chk = TRUE
10 FOR li_idx = 1 TO ps_keys.getLength()
11 IF ps_keys[li_idx] <> ps_keys_bak[li_idx] THEN
12 LET lb_chk = FALSE
13 EXIT FOR
單身資料修改後須進行檢查, 若key值內容有異動則會影響同群組內的其他單身資料, 此處先針對key是否異動進行檢查key欄位
14 END IF
15 END FOR
16
17 #不需要做处理
18 IF lb_chk THEN
19 RETURN
20 END IF
確定key值有異動的狀況下則對同群組內的其他單身資料進行鍵值異動
21
22 #判断是否是同一群组的table
23 LET ls_group = “‘1’,”
24 IF ls_group.getIndexOf(ps_page,1) > 0 AND ps_table <> “dear_t” THEN
25 UPDATE dear_t SET (deardocno,…) = (ps_keys[1],…)
26 WHERE dearent = g_enterprise …
略
41 END IF
42 END FUNCTION
43 {</section>}
4.4.28 _reproduce 数据复制
01 {<section id=”adet400.reproduce” >}
02 #+ 数据复制
03 PRIVATE FUNCTION adet400_reproduce()
同单档
54 END FUNCTION
55 {</section>}
4.4.29 _detail_reproduce单身数据复制
01 {<section id=”adet400.detail_reproduce” >}
02 #+ 单身自动复制
不同於單檔的複製功能, 雙檔的複製功能同時包含了單身的複製段落, 此段落在單頭複製完成時呼叫此段落進行單身資料複製
03 PRIVATE FUNCTION adet400_detail_reproduce()
略
08 CALL s_transaction_begin()
09 LET ld_date = cl_get_current()
10 DROP TABLE adet400_detail
11
12 #CREATE TEMP TABLE
13 LET ls_sql = “CREATE GLOBAL TEMPORARY TABLE adet400_detail AS “,
14 “SELECT * FROM dear_t ”
15 PREPARE repro_tbl FROM ls_sql
16 EXECUTE repro_tbl
17 FREE repro_tbl
18
19 #将符合条件的资料丢入TEMP TABLE
20 INSERT INTO adet400_detail SELECT * FROM dear_t
21 WHERE dearent = g_enterprise AND deardocno = g_deaqdocno_t
22
23 #将key修正为调整后
24 UPDATE adet400_detail SET deardocno = g_deaq_m.deaqdocno
25
將原資料寫入暫存表中, 並且將原單身的FK修正為新的單頭鍵值
26 #将资料塞回原table
27 INSERT INTO dear_t SELECT * FROM adet400_detail
28 IF SQLCA.sqlcode THEN
略
35 END IF
36
37 #删除TEMP TABLE
複製單身的動作完成後, 清除暫存表, 並將上述的動作寫入資料庫內
38 DROP TABLE adet400_detail
39 CALL s_transaction_end(‘Y’,’0′)
40
41 #已新增完, 调整数据内容(修改时使用)
42 LET g_deaqdocno_t = g_deaq_m.deaqdocno
43 END FUNCTION
44 {</section>}
4.4.30 _delete数据删除
01 {<section id=”adet400.delete” >}
根據單頭與單身的關聯(FK), 進行單身資料的刪除, 若單身有多張表則會產出多段
02 #+ 数据删除
03 PRIVATE FUNCTION adet400_delete()
同单档
60 #删除单身
61 DELETE FROM dear_t
62 WHERE dearent = g_enterprise AND deardocno = g_deaq_m.deaqdocno
63 IF SQLCA.sqlcode THEN
資料刪除完成後會講指標提前到前一筆資料上, 若是已無資料則清空畫面
略
70 END IF
略
81 IF g_browser_cnt > 0 THEN
82 CALL adet400_fetch(‘P’)
83 DISPLAY g_browser_cnt TO FORMONLY.h_count #总笔数的显示
84 DISPLAY g_browser_cnt TO FORMONLY.b_count #总笔数的显示
85 ELSE
86 CLEAR FORM
87 END IF
88 END IF
89
90 CALL s_transaction_end(‘Y’,’0′)
91 CLOSE adet400_cl
92 #功能已完成,通报讯息中心
93 CALL adet400_msgcentre_notify(”)
94 END FUNCTION
95 {</section>}
4.4.31 _delete_b单身数据删除
01 {<section id=”adet400.delete_b” >}
02 #+ 删除单身后其他table连动
03 PRIVATE FUNCTION adet400_delete_b(ps_table,ps_keys_bak,ps_page)
略
10 LET g_update = TRUE
11 #判断是否是同一群组的table
單身資料刪除時會確認是否為同一個群組, 移除該群組的某單身資料時, 會連同同群組的其他單身的該筆資料進行刪除
12 LET ls_group = “‘1’,”
13 IF ls_group.getIndexOf(ps_page,1) > 0 THEN
14 DELETE FROM dear_t
15 WHERE dearent = g_enterprise AND deardocno = ps_keys_bak[1] AND dearseq = ps_keys_bak[2]
16 IF SQLCA.sqlcode THEN
略
21 RETURN FALSE
刪除資料過程中發生任何錯誤則回傳錯誤, 若完成所有動作且無發生錯誤則回傳正確
22 END IF
23 END IF
24 LET li_idx = g_detail_idx
25 IF ps_page <> “‘1′” THEN
刪除此頁籤以外的其他頁籤資料, 連動的相關頁籤的同筆資料皆刪除, 確保畫面一致
26 CALL g_dear_d.deleteElement(li_idx)
27 END IF
28 RETURN TRUE
29 END FUNCTION
30 {</section>}
4.4.32 _set_entry 字段编辑开启
01 {<section id=”adet400.set_entry” >}
02 #+ 单头字段开启设定
03 PRIVATE FUNCTION adet400_set_entry(p_cmd)
同单档
08 END FUNCTION
09 {</section>}
4.4.33 _set_no_entry 字段编辑关闭
01 {<section id=”adet400.set_no_entry” >}
02 #+ 单头字段关闭设定
03 PRIVATE FUNCTION adet400_set_no_entry(p_cmd)
同单档
04 END FUNCTION
05 {</section>}
4.4.34 _set_entry_b 单身字段编辑开启
01 {<section id=”adet400.set_entry_b” >}
在進入輸入段前會針對特定欄位解開輸入功能, p_cmd為a時代表新增段要解開的欄位, p_cmd為u時代表修改段時要解開的欄位(此處的欄位是指單身欄位)
02 #+ 单身字段开启设定
03 PRIVATE FUNCTION adet400_set_entry_b(p_cmd)
略
09 IF p_cmd = ‘a’ THEN
10 CALL cl_set_comp_entry(“”,TRUE)
11 END IF
略
18 END FUNCTION
19 {</section>}
4.4.35 _set_no_entry_b 单身字段编辑关闭
01 {<section id=”adet400.set_no_entry_b” >}
02 #+ 单身字段关闭设定
03 PRIVATE FUNCTION adet400_set_no_entry_b(p_cmd)
略
在進入輸入段前會針對特定欄位關閉輸入功能, p_cmd為a時代表新增段要關閉的欄位, p_cmd為u時代表修改段時要關閉的欄位(此處的欄位是指單身欄位)
08 DEFINE p_cmd LIKE type_t.chr1
09 IF p_cmd = ‘u’ AND g_chkey = ‘N’ THEN
10 CALL cl_set_comp_entry(“”,FALSE)
11 END IF
略
19 END FUNCTION
20 {</section>}
4.4.36 _state_change状态代码异动
01 {<section id=”adet400.state_change” >}
02 #+ 此段落由子样板a09产生
03 #+ 确认码变更
04 PRIVATE FUNCTION adet400_statechange()
同单档
09 END FUNCTION
10 {</section>}
4.4.37 _idx_chk单身笔数显示
01 {<section id=”adet400.idx_chk” >}
02 #+ 显示正确的单身数据笔数
根據當下所選擇的單身頁籤, 解析後取得對應的當下筆數與總筆數資訊並顯示至畫面上
03 PRIVATE FUNCTION adet400_idx_chk()
略
12 IF g_current_page = 1 THEN
13 LET g_detail_idx = g_curr_diag.getCurrentRow(“s_detail1”)
14 IF g_detail_idx > g_dear_d.getLength() THEN
15 LET g_detail_idx = g_dear_d.getLength()
16 END IF
17 IF g_detail_idx = 0 AND g_dear_d.getLength() <> 0 THEN
18 LET g_detail_idx = 1
19 END IF
20 DISPLAY g_detail_idx TO FORMONLY.idx
21 DISPLAY g_dear_d.getLength() TO FORMONLY.cnt
22 END IF
略
29 END FUNCTION
30 {</section>}
4.4.38 _fill_chk单身填充确认
01 {<section id=”adet400.fill_chk” >}
02 #+ 单身填充确认
03 PRIVATE FUNCTION adet400_fill_chk(ps_idx)
04 #此funtion功能暂时停用
05 #无论传入值为何皆回传true(代表要填充该单身)
06
07 #全部为1=1 or null时回传true
08 IF (cl_null(g_wc2_table1) OR g_wc2_table1.trim() = ‘1=1’) THEN
09 RETURN TRUE
10 END IF
11 RETURN TRUE
12 END FUNCTION
13 {</section>}
4.4.39 _send BPM提交
01 {<section id=”adet400.signature” >}
02 #此段落由子样板a39产生
03 #+ BPM提交
04 PRIVATE FUNCTION adet400_send()
05 #add-point:send段define
06 DEFINE l_success LIKE type_t.num5
07 #end add-point
08
09 IF g_deaq_m.deaqdocno IS NULL THEN
略
14 END IF
15
16 #重新取得与显示完整单据数据(最新单据数据)
17 EXECUTE adet400_master_referesh USING g_deaq_m.deaqdocno INTO g_deaq_m.deaqsite,…
18
19 ERROR “”
20 CALL s_transaction_begin()
21
22 OPEN adet400_cl USING g_enterprise,g_deaq_m.deaqdocno
23 IF STATUS THEN
略
28 END IF
29
30 #锁住将被更改的数据
31 FETCH adet400_cl INTO g_deaq_m.deaqsite,…
32
33 #数据被他人LOCK, 或是sql执行时出现错误
34 IF SQLCA.sqlcode THEN
略
41 END IF
42
43 #依据单据个数,需要指定所有单身条件为” 1=1″ (单身有几个就要设几个)
44 LET g_wc2_table1 = ” 1=1″
45
46 CALL adet400_show()
47 CALL adet400_set_pk_array()
略
59 #公用变数初始化
60 CALL cl_bpm_data_init()
61
62 #依照主檔/单身个数产生 CALL cl_bpm_set_master_data() / cl_bpm_set_detail_data()
63 #单头固定为 CALL cl_bpm_set_master_data(util.JSONObject.fromFGL(xxxx)) 传入参数: (1)单头数组 ; 回传值: 无
64 CALL cl_bpm_set_master_data(util.JSONObject.fromFGL(g_deaq_m))
65
66 #单身固定为 CALL cl_bpm_set_detail_data(s_detailX, util.JSONArray.fromFGL(xxxx)) 传入参数: (1)单身SR名称 (2)单身数组 ; 回传值: 无
67 CALL cl_bpm_set_detail_data(“s_detail1”, util.JSONArray.fromFGL(g_dear_d))
68
69 #开单失败
70 IF NOT cl_bpm_cli() THEN
71 CLOSE adet400_cl
72 CALL s_transaction_end(‘N’,’0′)
73 RETURN FALSE
74 END IF
75
76 #完成状态更新
77 CLOSE adet400_cl
78 CALL s_transaction_end(‘Y’,’0′)
79
80 #重新指定此笔单据数据状态图片=>送签中
81 LET g_browser[g_current_row].b_statepic = “stus/16/signing.png”
82
83 #重新取得单头/单身资料,DISPLAY在画面上
84 CALL adet400_ui_headershow()
85 CALL adet400_ui_detailshow()
86
87 RETURN TRUE
88
89 END FUNCTION
4.4.40 _draw_out BPM抽单
01 #此段落由子样板a40产生
02 #+ BPM抽单
03 PRIVATE FUNCTION adet400_draw_out()
04
05 #检查资料是否存在
06 IF g_deaq_m.deaqdocno IS NULL THEN
略
10 END IF
11
12 #LOCK主文件资料
13 CALL s_transaction_begin()
14
15 #进行BPM抽单功能
16 OPEN adet400_cl USING g_enterprise,g_deaq_m.deaqdocno
17 IF STATUS THEN
略
20 END IF
21
22 #锁住将被更改的数据
23 FETCH adet400_cl INTO g_deaq_m.deaqsite,…
24
25 #数据被他人LOCK, 或是sql执行时出现错误
26 IF SQLCA.sqlcode THEN
略
29 END IF
30
31 #抽单失败
32 IF NOT cl_bpm_draw_out() THEN
33 CLOSE adet400_cl
34 CALL s_transaction_end(‘N’,’0′)
35 RETURN FALSE
36 END IF
37
38 #完成状态更新
39 CLOSE adet400_cl
40 CALL s_transaction_end(‘Y’,’0′)
41
42 #重新指定此笔单据数据状态图片=>抽单
43 LET g_browser[g_current_row].b_statepic = “stus/16/draw_out.png”
44
45 #重新取得单头/单身资料,DISPLAY在画面上
46 CALL adet400_ui_headershow()
47 CALL adet400_ui_detailshow()
48
49 RETURN TRUE
50 END FUNCTION
51 {</section>}
4.4.41 _ key_update_b 下层单身key值异动
01 {<section id=”adet400.key_update_b” >}
02 #+ 上层单身key字段变动后, 连带修正下层单身key字段
03 PRIVATE FUNCTION adet400_key_update_b(ps_keys_bak,ps_table)
04 DEFINE ps_keys_bak DYNAMIC ARRAY OF VARCHAR(500)
因該隻程式無下階單身, 因此此段落無內容, 若有下階單身則會根據傳入的key值修改資料
05 DEFINE ps_table STRING
06
07 END FUNCTION
08 {</section>}
4.4.42 _key_delete_b下层单身删除
01 {<section id=”adet400.key_delete_b” >}
02 #+ 上层单身删除后, 连带删除下层单身key字段
03 PRIVATE FUNCTION adet400_key_delete_b(ps_keys_bak,ps_table)
04 DEFINE ps_keys_bak DYNAMIC ARRAY OF VARCHAR(500)
因該隻程式無下階單身, 因此此段落無內容, 若有下階單身則會根據傳入的key值刪除資料
05 DEFINE ps_table STRING
06
07 RETURN TRUE
08 END FUNCTION
09 {</section>}
4.4.43 mask_functions屏蔽处理
遮罩相關的處理函式皆在mask.4gl中, 此4gl透過azzi850遮罩設定產出, 路徑為”com/inc/erp/模組別”底下, 該檔案無法編輯, 且在每次程式產生時會自動產生
01 {<section id=” adet400.mask_functions” >}
02 &include “erp/ade/ adet400_mask.4gl”
03 {</section>}
4.4.44 _ msgcentre_notify通报讯息中心
01 {<section id=”adet400.msgcentre_notify” >}
02 #应用 a66 样板自动产生(Version:1)
03 PRIVATE FUNCTION adet400_msgcentre_notify(lc_state)
04 DEFINE lc_state LIKE type_t.chr5
同单档
47 END FUNCTION
48 {</section>}
转载请注明:赫非域 » 04 T100手册 双档(adet400)