最新消息:本站持续更新中,请注意添加收藏夹。搜索关键词时,多换一个同义词。比如要搜索界面,可以尝试页面,画面,PER档等词汇。善于搜索,将大大提高你的查找效率。

04 T100手册 双档(adet400)

后端代码 bron1984 9448浏览

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)