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

[day20] FGL 程序开发(3) – 输入用的INPUT系指令与DIALOG

后端代码 bron1984 2414浏览

文章来自:iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (ithome.com.tw)

[day20] FGL 程序开发(3) – 输入用的INPUT系指令与DIALOG

本篇跟着 程序开发(2) ,接续往下讨论

INPUT数组(RECORD或单一变量)数据输入

INPUT依据RECORD的型态,可以有两种指令方式

  1. 个别变量的输入 INPUT ….FROM….
    例如存在变量 a1,a2,a3 画面上域名对应为 s1,s2,s3,则可以用

INPUT a1,a2,a3 FROM formonly.s1, formonly.s2, formonly.s3

进行输入

  1. 若使用 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] 跳入指定字段。

Genero INPUT 范例

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区块)

从以上的讯息,对照数据库的处理方式,可以归纳下列几点

  1. 新增一行时,初始值得给予要写在 BEFORE INSERT
  2. 新增一行的 INSERT INTO指令要放在 AFTER INSERT
  3. 修改一行的 UPDATE 指令要放在 ON ROW CHANGE
  4. 删除一行的 DELETE 指令要放在 BEFORE DELETE

Genero INPUT ARRAY 范例

缓冲 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 进行缓冲区域的取消。

透过本章节的汇总,应该对于如何收取用户数据非常理解,若有相关问题可以在下方讨论区留言讨论。

转载请注明:赫非域 » [day20] FGL 程序开发(3) – 输入用的INPUT系指令与DIALOG