2011年7月6日 星期三

(轉) 鼎新 ERP 技轉課程之 Genero 基礎課程

Genero 將語言稱之為 BDL(Bussiness Development Language)
最常見的副檔名:4gl 副程式, *.per 畫面檔, *.4fd 較新版本的畫面檔
其程式可分為 Form 及 Module
Form 稱為表單,即為畫面檔
Module 稱為副程式,可再分為 Function 及 Report,每支程式都需要一個稱之為 MAIN 的 Function,作為應用程式進入點。
畫面開發:
1、建立 Form 時設定寬度及高度,設定值為字元數(不是像素)
2、Form 裡的元件大致分為 Container control(容器控制項)及 Widget control(一般控制項)
3、Form 裡面不可以直接放 Widget control,一定要使用 Container control,再將 Widget control 放入 Container control 內
4、ScollGrid一定是搭配 MFArray 使用
5、版面配置一般使用 Grid 加上 HBOX、VBOX 排列,HBOX 或 VBOX 類似 Office 的群組功能,要在裡面加元件要先解開
6、輸入文字使用 Edit(文字方塊)或 TextEdit(多行文字方塊)
7、重要屬性:Required─不可空白、NoEntry─唯讀、NoNull─不可無值
8、TIPTOP 有控制表單控制項順序,不需要在表單中自訂
9、TIPTOP 中不使用 Button,程式會在 RunTime 產生
程式開發:
1、TIPTOP 規範指令一律大寫
2、定義變數使用 DEFINE
DEFINE 名稱 型態 #直接定義
DEFINE 名稱 LIKE TableName.FieldName #參照欄位型態
3、註記使用 # 或用 {} 括起來
4、DATABASE dbname #指定連接資料庫名稱
5、LET 設定變數值
6、TIPTOP 只使用 INTEGER,SMALLINT及DECIMAL
7、STRING 是 BDL 中一個很特殊的型態
8、不同資料型態的組合:
DEFINE rec RECORD
名稱 型態,
名稱 型態,
名稱 型態,
名稱 型態
END RECORD

DEFINE rec RECORD LIKE TableName.*
9、INITIALIZE:定義變數時給初始值
10、』,』 表示字串相加,相加中的字串如有 Null 先轉為空白再相加
』||』 表示字串相加,相加中的字串如有 Null 結果為空白
[start,end]取出 CHAR 或 VARCHAR 字串中指定起迄位置的字串,第一碼為 1
11、GLOBALS:定義全域變數
GLOBALS
DEFINE 名稱 型態
END GLOBALS

GLOBALS 『FilePath』 #讀取已寫好的設定檔
12、呼叫 Function 使用 CALL FunctionName()
13、任何地方的變數名稱不可與全域變數同名,包含 Function 的參數名稱
14、CALL 可接收回傳值
CALL FunctionName() RETURNING var1[,var2...]
LET var1 = FunctionName() #只有一個回傳值才能用
Function 中使用 REUTRN 回傳結果值
15、INT_FLAG:當設定 DEFER INTERRUPT 時,系統會在使用者按下中斷鍵時將此變數設為 True
STATUS:最近一次執行 SQL 指令的結果是否成功
16、SQLCA:最近一次執行 SQL 指令的結果,為一物件
SQLCA.SQLCODE:結果狀態,0表示成功,>0表示錯誤訊息代號
SQLCA.SQLERRD[]:結果訊息,SQLCA.SQLERRD[3]表示受影響的資料列
DISPLAY:將程式變數顯示到畫面的指定欄位
DISPLAY 變數 TO 欄位名稱 #標準用法
DISPLAY BY NAME 名稱 #變數名稱與欄位名稱相同
INPUT:將指定欄位的值儲存到變數中
INPUT 變數 FROM 欄位名稱 #標準用法
INPUT BY NAME 名稱 #變數名稱與欄位名稱相同
WITHOUT DEFAULTS 表示不使用欄位預設值
CONSTRUCT:依輸入的欄位建立資料庫查詢語法中的 WHERE 字串
PREPARE:驗證 SQL 字串的正確性
FREE:釋放 PREPARE 的記錄
CURSOR:BDL中使用CURSOR來承載查詢結果指標
DECLARE CursorName [SCROLL] CURSOR FOR [SQL 陳述式 or Prepared_id or SQL 字串]
OPEN:將 CURSOR 開啟,如果 OPEN 時要代入參數,使用 USING
範例:
LET l_sql=』SELECT * FROM a WHERE col1=? AND col2=?; 『
PREPARE a_pre FROM l_sql
DECLARE a_cus SCROLL CURSOR FOR a_pre
OPEN a_cus USINT var1,var2
FETCH first a_cus INTO l_a.
CLOSE a_cus
在 CURSOR 中指定指標使用 FETCH,必需用 SCROLL CURSOR,
使用 FOREACH 可跑迴圈逐筆讀取,不需要 OPEN 及 CLOSE,必需使用 CURSOR
ON ACTION:定義按鈕 Click 事件方法
ON ACTION action名稱
ARRAY:陣列
DEFINE 名稱 ARRAY[長度] OF 型態 #固定長度
DEFINE 名稱 DYNAMIC ARRAY OF 型態 #動態長度
第一個元素的索引位置為1
陣列提供方法可呼叫,除了 getLength() 之外都要加 CALL
BEFORE INPUT ARRAY:將表單中Table的資料儲存到 ARRAY 中
在 4gl 中特定指令是有順序性的,以下指令按照順序列出
DATABASE #必需放在第一行
GLOBALS #第二行,宣告全域變數,可能有多行
DEFINE #宣告整支程式共用的變數,第三行
MAIN … END MAIN #應用程式進入點
FUNCTION … END FUNCTION #其他 FUNCTION
結論:
Genero 算是比較不人性化的語言,畫面檔跟程式檔分得很清楚,如果要存取畫面檔的欄位或定義控制項事件方法,要在程式檔中依控制項名稱指定,可是IDE工具並沒有幫我們關聯,所以如果對應不到在編譯時是不會錯的,要在RunTime才會發現,所以 Debug 並不是很容易。
指令中包含存取資料庫的語法,很容易搞混到底該怎麼下指令,要不要使用引號括起來。
總之,不是很好學,加油。

沒有留言:

張貼留言