文章来自:iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (ithome.com.tw)
FGL 程序开发(1)-基本指令与流程控制
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)….满足各式各样的应用需求。
转载请注明:赫非域 » [day7]FGL 程序开发(1)-基本指令与流程控制