本篇跟著 程式開發(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 進行緩衝區域的取消。
透過本章節的匯總,應該對於如何收取用戶資料非常理解,若有相關問題可以在下方討論區留言討論。