為了協助新進同學,仍應該介紹基本程式的寫法
編寫小程式驗證的做法請參考第一章的套件介紹,hello world部分,利用 fglcomp 與 fglrun
FGL指令不區分大小寫
指令 DISPLAY 與 display 或 Display 或 DisPlay 都一樣。編譯錢系統會將指令轉換為泉小寫在進行編譯。相關Genero文件在指令說明時,尤其在方法 (Method) 常會以大小寫混雜的方式標示,此為便於閱讀,而非該 Method 的語法。
對於字串,單引號與雙引號功能相同,成對出現即可
*指令結束時可用分號 (;) 也可以不寫
指令可寫為
DISPLAY “hello”; DISPLAY “World” 與
DISPLAY “hello” DISPLAY “World” 結果相同,故也可寫成 INPUT BY NAME g_abc ;
程式註解可使用 # (井號) , ( -- ) 兩條短分隔線, { ...} 大括號
注意:大括號不支持巢狀結構,從第一個左大括號到第一次出現的右大括號為止,可跨行出現,請減少使用
井號與兩條短分隔線,均由標註起到該行行尾表示註解
FUNCTION
語法 [PRIVATE | PUBLIC] FUNCTION function_name( input_variable )
PRIVATE 或 PUBLIC 標定這個 function 在其他的 4GL 檔中能否被呼叫,PRIVATE私有的時候就不能提供呼叫。
MAIN
FGL以MAIN作為程式進入點,Genero 3.x 以後的版本可寫為 FUNCTION main( )
CALL function_name( input_variables ) RETURNING output_variables
4GL透過 CALL 和 RETURNING 進行呼叫和接收回傳值。若該 function 沒有回傳資料,則可以省略
RETURN
此指令為完成function執行,要退回上一個呼叫點使用。若有回傳值,則跟在 RETURN 後方。(注意勿和 RETURNING混為一談)
CASE
此指令有兩種語法,分別是將判斷式提出寫在 CASE 後,以及寫在每一行
例如:CASE variable WHEN “a” #此寫法時,本行生效條件為 variable = “a”
又或:CASE WHEN variable = “a” #此寫法簡單粗暴直接指定,適用於判斷變數同時多種條件下
建議在結束 (END CASE) 前,盡量增加 OTHERWISE 描述,避免執行時與設計脫鉤
WHILE WHILE...END WHILE
迴圈。將需要判斷的條件寫在 WHILE 後方,判斷成立才會執行區塊內程式。跳離時需WHILE條件不成立或回圈內執行到 EXIT WHILE
WHILE a<10
DISPLAY a
LET a=a+2
END WHILE
執行結果
0
2
4
6
8
注意 WHILE TRUE 這個語法,一定要部署 EXIT WHILE,不然跑個沒完。
FOR a=1 TO 10 STEP 2
DISPLAY a
END FOR
執行結果
1
3
5
7
9
結果為什麼不一樣? 因為 WHILE 對 a 沒有設定初始值的時候,預設是 0 。而FOR指定從 1 開始 !
GOTO
搭配:LABEL 使用,可直接跳動到指定位置,需在同一function 內避免程式結構被破壞
IF....THEN... [ELSE... ] END IF
如果敘述句,不支援 ELSEIF 多選,那必須改用CASE指令
*SLEEP n * 讓程式暫停 n 秒鐘
DEFINE 設定變數型態與長度,
直接定義 DEFINE a VARCHAR(10)
間接定義 DEFINE a LIKE table_id.column_id (參考上方 SCHEMA或DATABASE 設定)
RECORD 設定數組,如
DEFINE g_arr RECORD
a VARCHAR(10),
B LIKE table_id.column_id
END RECORD
數組資料取用:如 g_arr.B 即為取用 g_arr 數組的 B 元素值
DYNAMIC ARRAY OF RECORD 設定動態陣列數組
陣列有兩種選擇:固定長度與動態長度。有鑑於固定長度的越來越少用,建議盡量改用動態長度的,隨需而變
陣列位置取用:如 g_abc[1] 就是取用第一筆,g_abc[1].def 就是取用第一筆的 def 元素值
ARG_VAL(0) 存在嗎? 在,就是執行的作業名稱 !
STATUS 每一個指令執行完成時,都有自己的 STATUS 狀態報告。發生異常時是 > 0,指令正常完時值為 0
NOTFOUND 對,就是正整數 100,因為資料庫找不到資料就是回傳 100 ,為了方便英語系開發者閱讀,預定義這個值
DATABASE database_id
透過 $FGLPROFILE設定的資料庫連線設定與指定資料庫進行連線
本指令可寫在 FUNCTION 內,也可寫在 FUNCTION 上方。當寫在 FUNCTION 上方,則表示該 4GL 以指定 database_id 作為『編譯參考』,功能與 SCHEMA 相同。
若寫在 MIAN 上方,則特別表示程式執行時即啟動連線功能。
SCHEMA database_id
本指令下給編譯器 (fglcomp) 使用,說明編譯階段的變數,型態長度要參考現有資料庫的型態與長度
CONNECT TO...
連結數據庫,請查看『』篇
DISCONNECT database_id / CLOSE DATABASE
關閉資料庫連線,分別需對應CONNECT 與 DATABASE
*SET CONNECT TO database_id *
FGL支援同時間連多個數據連線,但一次僅能作用一條,其餘均為待命。可利用此指令切換生效連線。例如從 A 連線取資料後,切換到 B 連線進行寫入
WHENEVER ERROR [CONTINUE | STOP | CALL function_id]
發生 SQL 錯誤時,應該要 [繼續| 停止| 呼叫某某 function_id] ,注意最後一項:被呼叫的那個 function 不可以有傳入值,所以,這裡的 CALL 後方跟著的 function 也 不可以有括號!!!!
以上這些指令熟悉之後,接下來我們結合畫面 (OPEN WINDOW)、交談指令(DIALOG),以及一些延伸定義(packages)就可以做出漂亮的程式或系統。然後,放上不同的 client 端,就可在不同的平台呈現。如 Window/MAC/LinuxKDE 桌面(GDC),瀏覽器(GBC)、手機平板等移動裝置(GMA,GMI)....滿足各式各樣的應用需求。