iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
Software Development

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

[FGL] 程式開發(1) - 基本指令與流程控制

為了協助新進同學,仍應該介紹基本程式的寫法
編寫小程式驗證的做法請參考第一章的套件介紹,hello world部分,利用 fglcomp 與 fglrun

FGL特性介紹

  • 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 FOR...END FOR
    迴圈,語法為 FOR 變數=起始值, 終止值 [,STEP =疊加值 ]
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 秒鐘

運算元 (Operator)

  • 一般數值運算 加 + 、減 - 、乘 * 、除 / 、取餘數 MOD
  • 字元連結 直接連結 , 若有一側為空 (null)則整串為空 ||

定義

  • 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 元素值

  • CONSTANT 常數,可直接設定值
  • INITIALIZE 初始化變數值,例如:INITIALIZE g_wc2_table2 TO NULL

資料型態

  • CHAR/VARCHAR 字元 (固定長度/變動長度)
  • INT或INTEGER 整數
  • SMALLINT 五碼內的小整數
  • DECIMAL(m,n) 浮點數 m全長, n 小數位
  • STRING 長字串
  • BLOB/TEXT 可用來存長文字或 BINARY (如檔案內容) 的,使用前須先透過LOCATE 定位

預定義變數 (不用寫DEFINE)

  • ARG_VAL(n) 接入外部參數,例如 DISPLAY ARG_VAL(1) 就是將外部參數第一個值顯示出來

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)....滿足各式各樣的應用需求。


上一篇
[GAS] Genero GAS 控制台網頁版 (3.20後套件提供)
下一篇
[GAS] GBC上運作的Hello world!
系列文
Genero Packages - 可接替4GL的LowCode商業語言32

尚未有邦友留言

立即登入留言