[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)....满足各式各样的应用需求。


<<:  咕咕家韩式炸鸡Pizza吃到饱-公益店(台中) Korean Chicken Plus+

>>:  Day-8 剖析Excel排序功能

Day 5. 关於.NET後端框架

以.NET Framework来说,网页技术必备要会的有WebForm,MVC,WebAPI三种技术...

D11. 学习基础C、C++语言

D11: 关於EOF 这是一个在C语言里面才有的语法,EOF的意思就是End Of File,是AS...

AE袅袅升起的烟(香菸)-Day13

竟然到了第四个练习!!! 教学范例:https://www.sixvfx.com/ae_combus...

总结

这个系列开始我们先介绍了 RSS feed 里面的内容和不同平台的格式,也了解到要一次处理这麽多又有...

D25 - 「不断线的侏罗纪」:然後他就死掉了

小恐龙现在就像吃了无敌星星一样,完全无视仙人掌,所以我们来让小恐龙死翘翘吧! 撞上仙人掌 我们来加上...