iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
Software Development

Genero Packages - 可接替4GL的LowCode商業語言系列 第 20

[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 進行緩衝區域的取消。

透過本章節的匯總,應該對於如何收取用戶資料非常理解,若有相關問題可以在下方討論區留言討論。


上一篇
[FGL] 程式開發(2) - 4類6個交談指令-功能選單部分
下一篇
[FGL] 程式開發(4) - 查詢條件輸入(QBE: Query By Example)
系列文
Genero Packages - 可接替4GL的LowCode商業語言32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言