DISPLAY a, b – 10 10
END MAIN
MAIN
DEFINE a,b INTEGER
LET a = b = 10
DISPLAY a,b – 0 0
END MAIN
逻辑运算符
数值运算符
MAIN
DEFINE i,j SMALLINT
LET i = 9
LET j = 2
DISPLAY i + j --DISPLAY 11
DISPLAY i - j --DISPLAY 7
DISPLAY i * j --DISPLAY 18
DISPLAY i / j --DISPLAY 4.5
DISPLAY j ** i --DISPLAY 512
DISPLAY i mod j --DISPLAY 1
END MAIN
字符串运算符
?????????
说明:表达式[start,end]
表示从字符串中取出子字符串,此表示方式**仅能用在 CHAR 或
VARCHAR 上**,若变量型态为 STRING,则参照如下范例:
MAIN
DEFINE i,j STRING
LET i = “T100”
LET j = i.subString(1, 4)
DISPLAY j --T100
DISPLAY i.subString(1, 4) --T100
END MAIN
关联语法(Associative syntax) 运算符
日期运算符
对话框处理 (Dialog handling)运算符
语法一:直接写定 GLOBALS 区块
GLOBALS
declaration-statement
[,…]
END GLOBALS
语法二:读入已写好的共同配置文件(外部档案)
GLOBALS “filename”
LOCAL变量(Local Variables)
-
定义位置:定义在 Module 中的函式里 (MAIN、FUNCTION 等)
-
生命周期:只属于该定义的函式使用,离开此函式即不能再使用。
MODULE变量(Module Variables)
-
定义位置:Module 中,但不被任何的函式包围。
-
生命周期:为该 Module 中的共享变数。
GLOBAL变量(Global Variables)
-
定义位置:由 GLOBALS 及 END GLOBALS 所包围的变数。
-
生命周期:使用的所有 MODULE 的共享变量。
SCHEMA ds
GLOBALS
DEFINE g_employee CHAR(10) --GLOBAL
END GLOBALS
DEFINE g_tty CHAR(32) --MODULE
MAIN
DEFINE answer CHAR(1) --LOCAL
END MAIN
FUNCTION ins_employee()
DEFINE flag CHAR(1), --LOCAL
change SMALLINT --LOCAL
END FUNCTION
针对 数值或日期 设定其 显示格式,设定时注意 溢出(overflow) 的问题。
数值格式标志
日期格式标志
???????????????????????
MAIN
DEFINE i,j SMALLINT
LET i = 12345
LET j = -12345
DISPLAY i
DISPLAY j
DISPLAY i USING"*******"
DISPLAY j USING"*******"
DISPLAY i USING"&&&&&&&"
DISPLAY j USING"&&&&&&&"
DISPLAY i USING"#######"
DISPLAY j USING"#######"
DISPLAY i USING"<<<<<<<"
DISPLAY j USING"<<<<<<<"
DISPLAY i USING"-------"
DISPLAY j USING"-------"
DISPLAY i USING"+++++++"
DISPLAY j USING"+++++++"
DISPLAY i USING"$$$$$$$"
DISPLAY j USING"$$$$$$$"
DISPLAY i USING"(######)"
DISPLAY j USING"(######)"
DISPLAY i USING"###,###.&&"
DISPLAY j USING"###,###.&&"
END MAIN
MAIN
DISPLAY TODAY
DISPLAY TODAY USING “yyyy-mm-dd”
DISPLAY TODAY USING “yy-mm-dd”
DISPLAY TODAY USING “yy-mmm-ddd”
END MAIN
==========================================================================
使用 SCHEMA
声明数据库时,只会在编译过程中使用到声明的功能,执行程序时并不会与数据库进行实质联机。
使用 DATABASE
声明数据库时,编译时功能相同,但执行时即会链接数据库。
SCHEMA ds #声明数据库ds
MAIN
DEFINE lc_zz01 LIKE zz_file.zz01
SELECT zz01 INTO lc_zz01 FROM zz_file WHERE zz01=‘tiptop’
END MAIN
???????????
注:使用 SCHEMA
指令,因此并未于实际登入数据库,执行时回报如下:
Program stopped at ‘test_schema.4gl’, line number 5.
SQL statement error number -1803 (-1). Connection does not exist.
MAIN 函数是程序执行的入口,一个完整可执行的程序只能有一个 MAIN 函数。
最简单的完整作业:
MAIN
DISPLAY “hello world!”
END MAIN
MAIN 函数可简单写成如上,也可增加一些 设定区块。
DEFER 设定 可定义程序是否要拦截『当使用者按下中断(interrupt)或离开(quit)键』时所送出的系统讯号:DEFER {INTERRUPT | QUIT}
OPTIONS 设定 可变更系统默认的选项
Exceptions 设定 定义当遇到 SQL 错误时,系统要采什么操作。
语法格式:WHENEVER [ANY] ERROR { CONTINUE | STOP | CALL function | GOTO label }
复杂的 MAIN 函数示例:
MAIN
OPTIONS #改变一些系统默认值
INPUT NO WRAP, #输入的方式:不打转
FORM LINE FIRST + 2, #画面开始的位置
MESSAGE LINE LAST, #讯息显示的位置
PROMPT LINE LAST, #提示讯息的位置
FIELD ORDER FORM #整个画面会依照 p_per 所设定的字段顺序
DEFER INTERRUPT
WHENEVER ERROR STOP #当发生 SQL Error 时即停止程序
DISPLAY “Change Exception!”
WHENEVER ERROR CALL chk_err #此处的 CALL 是没有括号的
END MAIN
FUNCTION chk_err( )
DISPLAY “Error Happened!”
END FUNCTION
语法:[PUBLIC | PRIVATE ] FUNCTION function_name( [arg [ , … ] ] )
当设定为 PRIVATE
时,只限本 4gl 文件内使用;连结时在 42x 或 42r 内无法看到该函数。
MAIN
CALL say_hello_public()
CALL say_hello_private()
END MAIN
FUNCTION say_hello_public()
DISPLAY “Hello, world!”
END FUNCTION
PRIVATE FUNCTION say_hello_private()
DISPLAY “Hello, Private!”
END FUNCTION
CALL
执行指定的函数,若有回传值,以 RETURNING
接回。
语法格式:CALL function ( [ parameter [,...] ] ) [ RETURNING variable [,...] ]
RETURN
返回函数所需的变量值,并停止此函式的执行。
回传单一值:
MAIN
DEFINE var1 CHAR(10)
DEFINE var2 CHAR(2)
LET var1 = foo()
DISPLAY "var1 = " || var1 – var1 = Hello
CALL foo() RETURNING var2
DISPLAY "var2 = " || var2 – var2 = He
DISPLAY "foo() = " foo() – foo() = Hello
END MAIN
FUNCTION foo()
RETURN “Hello”
END FUNCTION
回传单一值(布尔):
MAIN
IF foo() THEN
DISPLAY "Choice is OK!”
END IF
END MAIN
FUNCTION foo()
RETURN TRUE
END FUNCTION
回传多个值: 可用 RETURNING
接收
MAIN
DEFINE var1 CHAR(15)
DEFINE var2 CHAR(15)
CALL foo() RETURNING var1, var2
DISPLAY var1, var2
END MAIN
FUNCTION foo()
DEFINE r1 CHAR(15)
DEFINE r2 CHAR(15)
LET r1 = “return value 1”
LET r2 = “return value 2”
RETURN r1, r2
END FUNCTION
文件之间互相调用:test1.4gl 调用 test2.4gl 中的函数,并且用命令行执行 test3.4gl
test1.4gl
MAIN
DISPLAY “MAIN FUNCTION”
CALL a1()
CALL a2()
RUN “fglrun test3” # 利用RUN执行命令行
END MAIN
FUNCTION a1()
DISPLAY “SUB FUNCTION a1()”
END FUNCTION
以上程序段会呼叫另外两个 Function,并且利用 RUN 指令执行一道 unix 指令
test2.4gl
FUNCTION a2()
a2 function
DISPLAY “SUB FUNCTION a2()”
END FUNCTION
test3.4gl
MAIN
DISPLAY “This is test3.4gl”
END MAIN
这是一种专门用来设定报表打印格式的函数,后续章节有详细的介绍。
语法:??????MATCHES 支持正则表达式?
IF condition THEN
statement
[…]
ELSE
statement
[…]
END IF
MAIN
DEFINE name CHAR(20)
LET name = “John Smith”
IF name MATCHES “John*” THEN
DISPLAY “The first name is too common to be displayed.”
IF name MATCHES “*Smith” THEN
DISPLAY “Even the last name is too common to be displayed.”
END IF
ELSE
DISPLAY "The name is " , name , “.”
END IF
END MAIN
语法1格式:适用于判断式比较简单,如只需判断1个数字
CASE expression-1
WHEN expression-2
{ statement | EXIT CASE }
[…]
OTHERWISE
{ statement | EXIT CASE }
[…]
END CASE
MAIN
DEFINE v CHAR(10)
LET v = “C1”
CASE v
WHEN “C1”
DISPLAY “Value is C1”
WHEN “C2”
DISPLAY “Value is C2”
WHEN “C3”
DISPLAY “Value is C3”
OTHERWISE
DISPLAY “Unexpected value”
END CASE
END MAIN
语法2格式:适用于判断式较复杂
CASE
WHEN boolean-expression
{ statement | EXIT CASE }
[…]
OTHERWISE
{ statement | EXIT CASE }
[…]
END CASE
MAIN
DEFINE v CHAR(10)
LET v = “C1”
CASE
WHEN ( v=“C1” OR v=“C2” )
DISPLAY “Value is either C1 or C2”
WHEN ( v=“C3” OR v=“C4” )
DISPLAY “Value is either C3 or C4”
OTHERWISE
DISPLAY “Unexpected value”
END CASE
END MAIN
语法2注意:若有两种情况成立,系统仅会走第一条符合条件的路径。
下列代码只会显示:a is ok
MAIN
DEFINE a,b INTEGER
LET a = b := 10
CASE
WHEN a = 10 DISPLAY " a is ok "
WHEN b = 20 DISPLAY " b is ok "
OTHERWISE DISPLAY " nothing is ok "
END CASE
END MAIN
语法:默认情况 STEP = 1
FOR counter = a TO b [ STEP value ]
statement
[…]
END FOR
MAIN
DEFINE i, i_min, i_max INTEGER
LET i_min = 1
LET i_max = 10
DISPLAY "Look how well I can count from " , i_min , " to " , i_max
DISPLAY “I can count forwards…”
FOR i = i_min TO i_max # 正序
DISPLAY i
END FOR
DISPLAY “… and backwards!”
FOR i = i_max TO i_min STEP -1 #反序
DISPLAY i
END FOR
END MAIN
语法:执行程序直到条件不成立为止。
WHILE b-expression
statement
[…]
END WHILE
MAIN
DEFINE a,b INTEGER
LET a = 20
LET b = 1
WHILE a > b
DISPLAY a , " > " , b
LET b = b + 1
END WHILE
END MAIN
语法:跳出本次循环。
CONTINUE { FOR | FOREACH | MENU | CONSTRUCT | INPUT | WHILE }
MAIN
DEFINE i INTEGER
LET i = 0
WHILE i < 5
LET i = i + 1
DISPLAY "i = " || i
CONTINUE WHILE
DISPLAY “This will never be displayed !”
END WHILE
END MAIN
语法:离开控制段。
EXIT { CASE | FOR | MENU | CONSTRUCT | FOREACH | REPORT | DISPLAY | INPUT | WHILE | PROGRAM }
MAIN
DEFINE i INTEGER
LET i = 0
WHILE TRUE
DISPLAY “This is an infinite loop. How would you get out of here ?”
LET i = i + 1
IF i = 100 THEN
EXIT WHILE
END IF
END WHILE
DISPLAY “Well done.”
END MAIN
针对重要 SQL 指令可以预先设置专用的错误处理指令。
语法:
TRY
[待侦测是否会发生问题的程序段落]
CATCH
[处理问题或回报讯息的程序段落]
END TRY
示例:
MAIN
LET lc_a = ARG_VAL(1)
TRY
DATABASE lc_a
CATCH
DISPLAY lc_a,’ not in fglprofile, number:', SQLCA.SQLCODE
END TRY
END MAIN
语法:程序依指定秒数暂停。
SLEEP seconds
注意:如果 seconds < 0 或 seconds IS NULL,则程序不会停止。
MAIN
DISPLAY “Please wait 5 seconds…”
SLEEP 5 #暂停5秒
DISPLAY “Thank you.”
END MAIN
为了程序的易读性和结构性,请不要使用该指令。
MAIN
DISPLAY “Before GOTO”
GOTO: label_id1
DISPLAY “Never Been Displayed”
LABEL label_id1:
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
AY lc_a,’ not in fglprofile, number:', SQLCA.SQLCODE
END TRY
END MAIN
语法:程序依指定秒数暂停。
SLEEP seconds
注意:如果 seconds < 0 或 seconds IS NULL,则程序不会停止。
MAIN
DISPLAY “Please wait 5 seconds…”
SLEEP 5 #暂停5秒
DISPLAY “Thank you.”
END MAIN
为了程序的易读性和结构性,请不要使用该指令。
MAIN
DISPLAY “Before GOTO”
GOTO: label_id1
DISPLAY “Never Been Displayed”
LABEL label_id1:
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-OI3Cwujd-1715159388158)]
[外链图片转存中…(img-3rnpMtiP-1715159388159)]
[外链图片转存中…(img-A6CBiOZy-1715159388160)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!