nullnull_aMAINMENU_u_qNP_copy_r_x_out_show_cs_show_u_show_show_rep_i_fetch_show_del_i_fetch新增修改查詢下一筆上一筆複製刪除有效無效碼单档维护流程图_set_entry做輸入的動作显示資料做重show的動作依條件值抓取Key值1.提供使用者輸入查詢條件
2.依條件組sql复制並修改Key值null屏幕
格
filename.perORACLE
4gl程序报表数据库KEYININPUTDISPLAYINSERTUPDATESELECTDELETE资料输入者Top.globalTop.global所有子系统下的全局变量集中至 top.global
非所有程序会用到的变量均移出 GLOBALS
如:DEFINE g_before_input_done SMALLINTROWIDROWID这个编号是由系统给定的
每次增加一笔资料列的时候,系统会自动给定一个ROWID 给该笔资料列
此ROWID 无法由我们来修改
是一个唯一值单档资料查询单档资料查询q()cs() fetch()show()查询函
习重点:查询函数学习重点:查询函数中开窗查询的写法
Lock Cursor 的写法开窗查询函式开窗查询函式动态查询函式须使用:cl_create_qry( )
使用 p_qry 工具程序查询
传入默认值、回传值
特殊自变量
特殊where条件
null如果是hard-code,务必要勾选此处最好在此处加上简单的
,让别人可容易了解这支查询程序如何使用,或是范例档是哪一个由于在 Construct 时希望能查到最大数量的资料因此把 Where 条件的输入拆成 Input 时与Construct时。里面的 argX 表示由系统传入的可变自变量
同样的,此处是设定 Construct 时的 Where 条件可以使用 arg 变量
若要合并其它的 table 资料进来 Construct 时做查询时,请务必在此填入要 join 的 table name
如果要查询的值,只是 Key 值组合的一部份,必然会出现重复资料的错误
此时请勾选此处,程序会补上 Distinct 叙述
使用 cl_create_qry 說明使用 cl_create_qry 說明『INPUT』状态下:
WHEN INFIELD(imz09)
CALL cl_init_qry_var( )必呼叫,以清空 g_qryparam
LET g_qryparam.form = "q_azf" 定义要查询的那一组
LET g_qryparam.default1 = g_imz.imz09
依照p_qry中有勾选的顺序定义回传预设
LET g_qryparam.arg1 = "D”
依照p_qry中有设定的特殊代换字符串给定
CALL cl_create_qry() RETURNING g_imz.imz09
呼叫 cl_create_qry
DISPLAY g_imz.imz09 TO imz09
NEXT FIELD imz09使用 cl_create_qry 說明使用 cl_create_qry 說明『CONSTRUCT』状态下:
WHEN INFIELD(imz09)
CALL cl_init_qry_var( )
LET g_qryparam.form = "q_azf"
LET g_qryparam.default1 = g_imz.imz09
LET g_qryparam.arg1 = "D”
LET g_qryparam.state = "c"
现在是在CONSTRUCT状态
CALL cl_create_qry() RETURNING g_qryparam.multiret
呼叫 cl_create_qry后会回传STRING
DISPLAY g_qryparam.multiret TO imz09
使用STRING把值显示出去
NEXT FIELD imz09复杂查询函式复杂查询函式p_qry 中设定的查询函式只能做简单处理,有部份查询函式有特殊需求,故无法使用,故需另外撰程序代码,称为 Hard-code
Hard-Code 设置
回传值超过 3 个
传入变量超过 9 个
可跨工厂查询或须夹杂权限判断
Hard-Code 设置规则Hard-Code 设置规则一律须置放于 $TOP/qry/4gl 目录下
以 $TOP/qry/qry_4gl.sample 为例制作 qry 程序
以 $TOP/qry/qry_per.sample 为例制作 qry 画面
完成后需到 p_qry:设定说明 p_perlang:设定组件多语言显示值
重新打包 qry.42x (动态连结及 qry 函式制作将另外说明)LOCK CURSOR 修改部份LOCK CURSOR 修改部份写法:
LET g_forupd_sql = “SELECT * FROM azb_file “, “ WHERE ROWID = ? FOR UPDATE NOWAIT ” DECLARE i010_cl CURSOR FROM g_forupd_sql
在OPEN时,因有使用『?』 ,故需使用USING 传入自变量
并且 OPEN 及 FETCH 应将之拆开成两个段落,分别加上 STATUS 判断成功否单档资料新增单档资料新增a()i()set_entry()set_no_entry()新增函数学习重点:
INPUT 基本语法的掌握
栏位Entry的设定_i( ) 基本结构_i( ) 基本结构FUNCTION _i( )
INPUT BY NAME g_xxx.xx01,g_xxx.xx02,g_xxx.xx03
BEFORE INPUT
BEFORE FIELD xx01
AFTER FIELD xx01
ON ACTION CONTROLP
END INPUT
END FUNCTIONEntry 设定Entry 设定若有『当xxxx成立时,则xxxx可/不可输入』条件存在时 ,是以下列函数来做管控的:
Set_entry( ) 设置开启条件
Set_no_entry( ) 设置关闭条件
使用cl_set_comp_entry( ) 公用函式
规格上的说明规格上的说明在设定规格时即应依程序逻辑设定影响范围列表,并在per文件下方的程序规格字段中写入条件字段 被影响字段 NOENTRY成立条件
----------------- -------------------------------- -------------------------------------
g_sma.sma12 imz36,imz27,imz28,imz71, g_sma.sma12 MATCHES '[nN]'
imz25,imz17,imz19,imz21,
imz106,imz903
imz37 imz38,imz99 g_imz.imz37 != '0'锁与解锁的时机点(1)锁与解锁的时机点(1)条件:当B > 5 时,C不可输入ABCBefore Field
After FieldBefore Field
After FieldBefore Field
After FieldDBefore Field
After Field情形一:从A进B,且B=3,点C欲进,可进
情形二:从A进B,且B=6,点C欲进,不可进
情形三:B=3时,从A欲进C,可进
情形四:B=6时,从A欲进C,不可进
情形五:一进来就到D,要进CBEFORE INPUT控端被控端锁与解锁的时机点(2)锁与解锁的时机点(2)条件:当B+X > 5 时,C不可输入ABefore Field
After FieldBEFORE INPUT控端被控端BBefore Field
After FieldCBefore Field
After FieldXBefore Field
After FieldDBefore Field
After Field控端情形很多,但可由单锁类推锁与解锁的时机点(3)锁与解锁的时机点(3)条件:当X > 5 时,C不可输入ABCBefore Field
After FieldBefore Field
After FieldBefore Field
After FieldDBefore Field
After Field只须写在 BEFORE INPUTBEFORE INPUT被控端g_before_input_doneg_before_input_done刚进入程序的时候,该关的就关,该开的就开
g_before_input_done此变量是用来控制现在是否为第一次进入INPUT
请于本程序的GLOBAL区定义 DEFINE g_before_input_done SMALLINT
若是刚进程序执行_set_entry( )及_set_no_entry( ) 时,则必令 g_before_input_done = FALSE
开始执行
完成第一次执行后必令 g_before_input_done = TRUE_i( ) BEFORE FIELD 程序部份_i( ) BEFORE FIELD 程序部份只在遇有set_no_entry( )时,须在属于『被控端』者的BEFORE FIELD段解锁
故属于『被控端』者的BEFORE FIELD需加上『CALL _set_entry(…)』Example:
BEFORE FIELD imz37
CALL i110_set_entry(p_cmd)
_i( ) AFTER FIELD 程序部份_i( ) AFTER FIELD 程序部份只在遇有set_entry( )时,须在属于『被控端』者的AFTER FIELD段上锁
故属于『被控端』者的AFTER FIELD段最后面需加上『CALL _set_no_entry(...) 』
新增时,条件字段的AFTER FIELD内应该要有所影响的输入字段的默认值,请作检查AFTER FIELD imz37
IF NOT cl_null(g_imz.imz37) THEN
CALL cl_err(g_imz.imz37,'mfg1003',0)
LET g_imz.imz37 = g_imz_o.imz37
DISPLAY BY NAME g_imz.imz37
NEXT FIELD imz37
END IF
LET g_imz_o.imz37 = g_imz.imz37
CALL i110_set_no_entry(p_cmd)set_entry函式制作set_entry函式制作若某些输入字段被同一条件影响的话,在_set_no_entry( ) 函式中,要写成一个判断,不用每个字段判断一次
cl_set_comp_entry此公用函式可以同时让多个字段开启或关闭
cl_set_comp_entry( ps_fields, pi_entry )
ps_fields STRING 设定组件的字段名称,逗点分隔不同字段
pi_entry SMALLINT 是否可输入,TRUE:可输入;FALSE:不可输入_i( ) ON ACTION 程式部份_i( ) ON ACTION 程式部份ON ACTION CONTROLY
CASE
WHEN INFIELD(imz25)
CALL cl_cmdrun('aooi101 ')
OTHERWISE EXIT CASE
END CASE
ON ACTION CONTROLT
CASE
WHEN INFIELD(imz25)
CALL cl_cmdrun("aooi102 ")
OTHERWISE EXIT CASE
END CASE
状态STATUS变量
SQLCA.sqlcode状态STATUS变量
SQLCA.sqlcode
判断 4gl指令的执行成功与否
STATUS = 100 没有抓到任何符合条件的资料STATUS = 0 成功的执行STATUS < 0 执行的过程中发生错误确保资料的完整性确保资料的完整性宣告transaction的起始将资料写入数据库中放弃该交易的执行
将资料回复至交易执行前的状态单档资料复制单档资料复制copy()u()nullXazb_file