【实习之T100开发】Genero FGL (TIPTOP4GL) 学习笔记(1)

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 区块

GLOBALS

declaration-statement

[,…]

END GLOBALS

语法二:读入已写好的共同配置文件(外部档案)

GLOBALS “filename”

变数的生命周期(LOCALE、MODULE、GLOBAL)


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

控制输出格式(USING)


针对 数值或日期 设定其 显示格式,设定时注意 溢出(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

在这里插入图片描述

函数、流程控制

==========================================================================

IMPORT 引入链接库(跳过)


SCHEMA / DATABASE 声明数据库


使用 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 函数。

最简单的完整作业:

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

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

报表结构 REPORT 函数(跳过)


这是一种专门用来设定报表打印格式的函数,后续章节有详细的介绍。

IF


语法:??????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

CASE


语法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

FOR


语法:默认情况 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


语法:执行程序直到条件不成立为止。

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


语法:跳出本次循环。

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


语法:离开控制段。

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

TRY…CATCH


针对重要 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


语法:程序依指定秒数暂停。

SLEEP seconds

注意:如果 seconds < 0 或 seconds IS NULL,则程序不会停止。

MAIN

DISPLAY “Please wait 5 seconds…”

SLEEP 5 #暂停5秒

DISPLAY “Thank you.”

END MAIN

LABEL 和 GOTO(❌)


为了程序的易读性和结构性,请不要使用该指令。

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


语法:程序依指定秒数暂停。

SLEEP seconds

注意:如果 seconds < 0 或 seconds IS NULL,则程序不会停止。

MAIN

DISPLAY “Please wait 5 seconds…”

SLEEP 5 #暂停5秒

DISPLAY “Thank you.”

END MAIN

LABEL 和 GOTO(❌)


为了程序的易读性和结构性,请不要使用该指令。

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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值