[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体系中有一个属性称做缓冲。
https://ithelp.ithome.com.tw/upload/images/20210921/20051169onotovoPqH.png

缓冲模式的存在主要为了节省一些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 进行缓冲区域的取消。

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


<<:  Day 06 - MVC 与三层架构

>>:  Day 21 「事有经重缓急」Clean Architecture 简易入门

【从零开始的Swift开发心路历程-Day9】打造美观的App版面!UI属性篇

我们设定好约束後,也来改变一下元件的外貌吧,这里将以UIButton为例来做个简单说明~此时点选元件...

联储局加息步伐明朗化 炒股想胜算高最好买………

美国联邦储备局最新公布的议息结果「鹰味浓郁」,但整体符合市场预期。美国的加息步伐在会议之前还未清晰,...

Day06 建构Project(2)

我们昨天建立完Project後,我们再仔细深入研究的话,会发现第二层的Test里面还有其他额外的四个...

TOGAF架构框架

TOGAF由国际标准权威组织The Open Group制定。The Open Group於1993...

自动化 End-End 测试 nightwatch-html-reporter

nightwatch-html-reporter: https://github.com/jls/n...