文章来自:iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (ithome.com.tw)
[day20] FGL 程序开发(3) – 输入用的INPUT系指令与DIALOG
本篇跟着 程序开发(2) ,接续往下讨论
INPUT数组(RECORD或单一变量)数据输入
INPUT依据RECORD的型态,可以有两种指令方式
- 个别变量的输入 INPUT ….FROM….
例如存在变量 a1,a2,a3 画面上域名对应为 s1,s2,s3,则可以用
INPUT a1,a2,a3 FROM formonly.s1, formonly.s2, formonly.s3
进行输入
- 若使用 RECORD,且画面的域名与 RECORD 内的元素名称可以对应得起来,就可使用 INPUT BY NAME…
DEFINE inp RECORD
a1 VARCHAR(10), a2 VARCHAR(10), a3 VARCHAR(10)
END RECORD
INPUT BY NAME inp.*
这样对于大量的字段设定是较为简单的,从 table的创立到程序代码的产生,就可以是一线式的快速完成。但缺点也显而易见,就是若输入的过程中想加入其他表格的字段,可能需要从窗体开始修改起,或是将INPUT BY NAME的星号展开。
INPUT 可以作为单行指令(在不附带任何控制区块的状况下),但作为单行指令时,后方应明确的加上『;』
控制区块(Conteol Block)
INPUT控制区块,大抵与 MENU 是相同的。但是重点功能在做『输入』,因此具备下列协助输入的控制区块。
控制区块不用全部设立出来,有需要的在做就好。
以之前的 INPUT a1 FROM s1 为例:
- BEFORE FIELD a1
此控制区块内的程序段落,是在『进入此字段前』执行的,适合用于协助用户判断默认值 - ON CHANGE s1
此控制区块主要在离开时,若发现此字段的『值』有被异动,就会触发,适合用来做异动的检查 - AFTER FIELD s1
此控制区块主要在离开此字段时触发 (不管有无异动),适合用来做连动字段的复查
在这些控制区块内,可以使用一些跳动的指令,例如:NEXT FIELD s2 (跳入s2) [当然也可使用 NEXT FIELD CURRENT/ PREVIOUS/ NEXT] 跳入指定字段。
INPUT ARRAY数组输入
INPUT ARRAY 只有一种输入的指令:
INPUT ARRAY inp_array FROM s_array.*
- inp_array 必须是一个数组变量,可以是固定数组,也能够是动态数组
- s_array 是画面 (PER/4FD) 中定义出来的 SCREEN RECORD,请特别注意,若 input_array 和s_array 中的元素型态不搭,**在编译的过程不会告诉你,但是在执行过程会显示『型别转换错误』,请务必详加确认 **
- 如果想要在新增资料时,字段上是空的,可以在 FORM前面加上 WITHOUT DEFAULT 抑制画面文件设定的初始数据
控制区块(Conteol Block)
INPUT ARRAY与 INPUT 相比,多出了行的处理。以下列出差异的部分:
- BEFORE ROW 进入一行之前要执行的区块,此区块在进入前会判断是不是新的一行,若为新行,会看是否已经执行过BEFORE INSERT控制区块,若还没有会先安插执行
- ON ROW CHANGE 与ON CHANGE相同意涵,在这一行的范围内,任何一个输入字段被『触发改变』,就会在离开时执行此控制区块。触发改变包含使用DISPLAY TO的方式进行重置,并非是外显值要有改变才算
- AFTER ROW 离开一行时,会执行的程序段落
除此之外,因为数据库中的数据处理方式比较方便的就是一笔、一笔的处理,所以这边为了搭配数据处理,也有下列控制区块:
- BEFORE INSERT 在INPUT ARRAY中,可以透过快速功能键触发插入一行新数据,此时从中间插入的新行,会直接执行BEFORE INSERT控制区块,尔后直接进入第一个字段的 BEFORE FIELD (注意:这种情况会跳过BEFORE ROW)
而若是走到输入窗体的最下缘,在往下增加一行新行,则就会是走 BEFORE ROW在跳过来的途径。两种操作方式跳动位置不同,请特别注意。 - AFTER INSERT 不管是插入或从后面加,只要是新增的一行,在离开前都会执行此控制区块
- BEFORE DELETE 删除的功能,一定都是从快捷键触发的,所以当快捷键执行时,就会先执行此区块
(注意3.00后续版本已删除 AFTER DELETE区块)
从以上的讯息,对照数据库的处理方式,可以归纳下列几点
- 新增一行时,初始值得给予要写在 BEFORE INSERT
- 新增一行的 INSERT INTO指令要放在 AFTER INSERT
- 修改一行的 UPDATE 指令要放在 ON ROW CHANGE
- 删除一行的 DELETE 指令要放在 BEFORE DELETE
缓冲 BUFFERED 与非缓冲 UNBUFFERED 模式
在INPUT / INPUT ARRAY体系中有一个属性称做缓冲。
缓冲模式的存在主要为了节省一些FGLRUN(DVM)与 client之间的传输量,避免过于密集的改变拖累画面的呈现效率,
但此情况常被开发人员在测试中误解为程序未生效。故有需要加以说明澄清。
异动为UNBUFFERED方式
利用 ATTRIBUTES区块进行调整
INPUT BY NAME p_site.* ATTRIBUTES(UNBUFFERED)
PROMPT 询问单一值
Genero FGL中还有一种 自带画面 的询问数据方式,PROMPT。依据输入模式的不同,也区分为 2 种输入指令
PROMPT “今天是什么节日?” FOR answer
或
PROMPT “你喜欢哪一个英文字母?” FOR CHAR ans_1
从上面的范例,可以很明显看出,若只需要单字元的回答,可以增加CHAR 来做控制。
由于是简易的问题答询,因此控制区块如同 MENU 一般,仅有支持
- ON ACTION
- ON IDLE n_seconds
- ON TIMER n_seconds
若有输入数据默认值的异动需求时,同样支持 UNBUFFERED 进行缓冲区域的取消。
透过本章节的汇总,应该对于如何收取用户数据非常理解,若有相关问题可以在下方讨论区留言讨论。