最新消息:本站持续更新中,请注意添加收藏夹。搜索关键词时,多换一个同义词。比如要搜索界面,可以尝试页面,画面,PER档等词汇。善于搜索,将大大提高你的查找效率。

[day7]FGL 程序开发(1)-基本指令与流程控制

后端代码 bron1984 3944浏览

文章来自: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)-基本指令与流程控制