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

genero语法总结

开发相关 bron1984 8289浏览

文件组成结构

  1. 命名规则
  2. Program 的组成:
  3. 基础语法
  4. 报表与除错指令
  5. 文件组成结构
原始程序 编译后的程序 可执行程序
MODULE 程序文件 *.4gl *.42m *.42r
FORM文件 *.per *.42f
其他格式 *.sch
  1. 命名规则
组成部分 详细内容
程序命名规则 S_XXXXXXXX :一般子程序 存于 $top/sub

CL_XXXXXXX :共享子程序 存于 $top/lib

Q_XXXXXXXX :查询子程序 存于 $top/qry

函数命名规则 XXXX_yy :程序代码简称_函数功能名

如: i010_a 为i010作业的新增函数 i010_tmp 函数名字

变量命名规则 G_xxxxxx :全局变量

L_xxxxxx :区域性变量

P_xxxxxx :传递变量

S_xxxxxx :屏幕变量

文件命名规则 文件名称(TABLE NAME) : xxx_file 数据库

字段名称(FIELD NAME) : xxx99 99代表流水编号

上面两项内容 需于 P-ZTA中注册方可使用。

存于UNIX的外部名称(Sch Files) : c_xxx.sch

 

  1. Program 的组成: Module + Form
    1. Module
组成部分 详细内容
database Database dbname # 编译时参考的schema 数据库,不是实际数据库
GLOBALS Globals “../config/top.global” #全部程序共用的全局变量

Define var_Name datatype #定义变量

Constant cons_name datatype #定义常量

MAIN MAIN

……

END MAIN

FUNCTION FUNCTION FunName()

……

END FUNCTION

REPORT REPORT Rep_Name(sr)

...

FORMAT

PAGE HEADER

BEFORE GROUP

ON EVERY ROW

AFTER GROUP

...

END REPORT

    1. Form
组成部分 详细内容
SCHEMA Schema ds #表示设计画面时所参考的数据库,默认为FOMRONLY 表示与数据库无关;

为了与旧版本兼容 SCHEMA 可以用DATABASE指令代替

Action default 不使用,用其他方式设定(参考TIPTOP GP技术手册)必须紧接在SCHEMA下面做

Action Defaults

Action add(text=”Append”,accelerator=control-v)

Action del(text=”delete”,accelerator=shift-F2)

Action zoom(text=”Zoom”,comment=”Open zoom window”)

Action quit(text= “quit”,accelerator=Shift-F5,image=”quit”)

END

第二种处理方式:

在程序act.4gl 中

去呼叫CALL ui.Interface.loadActionDefaults(“act”) 传得参数是act.4ad 档名,附

档名可不写,则产生的结果也可跟在per 档编辑ACTION DEFAULTS 的结果一样

编写下面的XML文档 “ACT.4ad”

<ActionDefaultList>

<ActionDefault name=”add” text=”Append” acceleratorName=”CONTROL-V” />

<ActionDefault name=”del” text=”Delete” acceleratorName=”SHIFT-F2″/>

<ActionDefault name=”zoom” text=”Zoom” comment=”Open zoom window” />

<ActionDefault name=”quit” text=”Quit” acceleratorName=”SHIFT-F5″ image=”quit” />

</ActionDefaultList>

MAIN

#呼叫并载入默认ACTION项

CALL ui.Interface.loadActionDefaults(“act”)

……

MENU “”

ON ACTION add

CALL act_a()

ON ACTION del ……

ON ACTION zoom ……

ON ACTION quit ……

EXIT Program

END MENU

TOPMENU 不使用,用其他方式设定(参考TIPTOP GP技术手册)

TOPMENU MenuName

GROUP form(TEXT=”Form”)

COMMAND help(Text=”Form”,IMAGE=”quest”)

COMMAND quit(Text=”quit”)

END

GROUP Edit(TEXT=”Edit”)

COMMAND accecpt(Text=”validate” image=”ok”,tag=”AcceptMenu”)

COMMAND Cancel(Text=”Cancel”,IMAGE=”cancel”)

SEPARATOR

COMMAND editCut

……

END

END –TOPMENU

LAYOUT LAYOUT #不能与SCREEN同时出现

VBOX

GROUP #显示组合框

FOLDER

#FOLDER下面只能用PAGE,PAGE下面可以有FORDER-PAGE

PAGE PageName (text = “main”)

GRID

{

Employee no [azb1]

Name [gen02]

Department no [gen03] [gem02]

}

END –GRID

END – PAGE

PAGE PageName (text = “main”)

GRID

{

Employee no [azb1]

Name [gen02]

Department no [gen03] [gem02]

}

END –GRID

END — PAGE

END –FOLDER

END –GROUP

END –VBOX

END–LAYOUT

Table 屏幕画面显示的字段所对应的表格名称
ATTRIBUTES 定义屏幕画面上字段的名称及显示特性,所有SCREEN与LAYOUT里要定义的字段Tag在这里都要做进一步的定义

ATTRIBUTES

END

INSTRUCTCTIONS 定义屏幕记录

语法:SCREEN RECORD record-name (field-list)

例子:SCREEN RECORD s_aaa (aaa.*)屏幕记录是一个完整的表格 SCREEN RECORD s_employee(emp_no,emp_age)

定义屏幕数组

语法:SCREEN RECORD array-name [ size ] ( field-list )

例子:SCREEN RECORD s_aaa[3] (f001f002f003)

INSTRUCTIONS

SCREEN RECORD s_employee(emp_no,emp_age)

END

  1. 基础语法
    1. 变量及表达式
变量的类型和定义 DATABASE ds

GLOBALS

DEFINE g_employee CHAR(10) #全局变量

END GLOBALS

DEFINE g_tty CHAR(32) #模块变量

MAIN

DEFINE answer CHAR(1) #局部变量,直接定义

DEFINE p_employee_no LIKE employee_file.employee_no

#对应数据库字段定义

END MAIN

FUNCTION ins_employee()

DEFINE flag CHAR(1),

change SMALLINT

END FUNCTION

数据类型 型态名称 说明 默认值

CHAR 固定字符 Null

VARCHAR 动态字符 Null

STRING 动态定义大小的字符串储存空间 Null

DATE 日期 1899-12-31

DATETIME 日期时间 Null

INTEGER 4 BYTE 整数 Zero

SMALLINT 2 BYTE 整数 Zero

FLOAT 8 BYTE 单精度浮点数 Zero

SMALLFLOAT 4 BYTE 双精度浮点数 Zero

DEC(p,s)

高精度数值-precision 为所有数字个数(不含小数

点),scale 为小数点的位数,不可大于precision

的位数

Null

MONEY 同DECIMAL,但会在数值前面加上货币符号 Null

BYTE 大量二进制数据(图片) Null

TEXT 大量字符数据 Null

变量的集合(Records MAIN

DEFINE rec RECORD

id INTEGER,

name VARCHAR(100),

birth DATE

END RECORD #集合的定义

LET rec.id = 50 #集合变量元素的赋值

LET rec.name = “Scott”

LET rec.birth = TODAY

DISPLAY rec.*

END MAIN

初始化一组变量 INITIALIZE DATABASE ds

MAIN

DEFINE cr RECORD LIKE customer.*

INITIALIZE cr.cust_name TO NULL

INITIALIZE cr.* LIKE customer.*

END MAIN

表达式 字符串表达式

表达式 意义

, 字符串连结

|| 字符串连结,但连结值有一个是NULL,结果就会是 NULL

[start,end] 从字符串中取出子字符串(开始到结束)

USING 针对数值或日期设定其打印的格式

CLIPPED 消除尾部空白

SPACES 输出空白字符串

USING 数值 * 空白的地方以*置换

& 空白的地方以0 置换

不会对输出的数字作任何影响,通常用于限制字符串输出时的最大长度

< 将数字改为向左靠

, 指定逗号出现的位置

. 指定小数点出现的位置

- 当输出的数字小于零时,加上一个负号

+ 当输出的数字大于零,加上一个正号

当输出的数字小于零,加上一个负号

$ 数值出现一个钱字号

( 当输出的数字小于零时,加上一个左括号

) 当输出的数字小于零时,加上一个右括号

USING 日期 dd 以二位数字表示日期

ddd 以三位英文简写表示星 MON,TUE……

mm 以二位数字表示月份 01,02……12

mmm 以三位英文简写表示月 JUN,FEB……DEC

yy 以二位数字表示年度 95

yyyy 以四位数字表示年度 1995

using ‘yyyy’

    1. 程序流程控制
CALL CALL function ( [ parameter [,…] ] ) # 呼叫执行函式

[ RETURNING variable [,…] ] #返回指定变量的值

动态查询的回传值如果有多组则:

let g_qryparam.default1= g_azb.azb01

let g_qryparam.default2= g_azb.azb02

let g_qryparam.default1= g_azb.azb03

returning g_azb.azb01 <=> returning g_qryparam.multiret

let g_qryparam.multiret_index = 1

RETURN RETURN [ value [,…] ] 在FUNCTION中使用,用于返回一组变量的值
CASE 语法一、

CASE expression-1

WHEN expression-2

{ statement | EXIT CASE }

[…]

[ OTHERWISE

{ statement | EXIT CASE }

[…]

]

END CASE

语法二、

CASE

WHEN boolean-expression #

{ statement | EXIT CASE }

[…]

[ OTHERWISE

{ statement | EXIT CASE }

[…]

]

END CASE

FOR FOR counter = start TO finish [ STEP value ]

statement

[…]

END FOR

IF IF condition THEN

statement

[…]

[ ELSE

statement

[…]]

END IF

SLEEP SLEEP seconds #程序暂停几秒
WHILE WHILE b-expression #条件不成立,跳出循环

statement

[…]

END WHILE

CONTINUE CONTINUE { FOR | FOREACH | MENU | CONSTRUCT | INPUT |

WHILE } #重新执行上面的指令

EXIT EXIT { CASE | FOR | MENU | CONSTRUCT | FOREACH | REPORT |

DISPLAY | INPUT | WHILE } #离开上面的程序结构

    1. WINDOWS与FORM
OPEN OPEN WINDOW OPEN WINDOW identifier [AT line, column ]

WITH [ FORM form-file | height ROWS, width COLUMNS ]

#Form_file 为编译过产生的文件,*.42f(扩展名可不写)

[ ATTRIBUTES ( window-attributes ) ]

CLEAR CLEAR field-list #清除指定字段变量的内容

CLEAR FORM #清除指定表单所有变量的内容

CLOSE WINDOW CLOSE WINDOW WindowName #关闭窗口
CURRENT WINDOW CURRENT WINDOW IS identifier #指定当前的活动窗口名:identifier
OPEN FORM OPEN FORM form-name FROM “file-name” form_name是程序中定义的画面名称,FILE-NAME是编译产生的表单文件名
DISPLAY FORM DISPLAY FORM form-name #要现有OPEN,才能有DISPLAY
CLOSE FORM CLOSE FORM form-name #释放资源
    1. 菜单功能
OPEN MENU MENU [title]

ATTRIBUTE ( control-attributes )

BEFORE MENU #以下为菜单载入前的设置

COMMAND option [comment] #MENU功能名称及快捷键定义并显示

[ HELP help-number ]

COMMAND KEY ( key-name ) #MENU功能快捷键并不显示在菜单

option [comment]

[ HELP help-number ]

COMMAND KEY ( key-name )

ON ACTION action-name #执行指令

ON IDLE idle-seconds #空闲时间

END MENU

    1. INPUT和DISPLAY
OPEN INPUT 语法 语法一、 字顶名称和变量名称可以不同

INPUT { variable | record.* } [,…]

[ WITHOUT DEFAULTS ]

FROM field-list

语法二、

INPUT BY NAME { variable | record.* } [,…]

[ WITHOUT DEFAULTS ]

#默认字段显示值均为空,要显示原值必须加这上面这行命令

INPUT BY NAME p_employee.no #变量名称和字段名称必须相同

INPUT 结构 INPUT variable-list FROM field-list

BEFORE INPUT #输入前

AFTER INPUT #完成所有输入时

BEFORE FIELD field-list #进入某栏位输入前

AFTER FIELD field-list #完成某栏位输入时

ON CHANGE field-list #字段值在修改时

ON IDLE idle-seconds #输入空闲多少时间时

ON ACTION action-name #设置特定功能

NEXT FIELD field_name #将游标移到下一字段上

EXIT INPUT #跳出INPUT 的叙述

END INPUT

DISPLAY 语法 语法1: #变量名只要对应PER档里定义的名称即可

DISPLAY expression [,…] TO field-list [,…]

[ ATTRIBUTES ( display-attribute [,…] ) ]

语法2: #变量名要与真实的字段相同

DISPLAY BY NAME { variable | record.* } [,…]

[ ATTRIBUTES ( display-attribute ,…) ] ]

    1. 游标
Scrolling Cursor 通常运用在查询程序,可以随机抓取数据。

EX:1. DECLARE cursor_name SCROLL CURSOR

FOR sql statement

2. DECLARE cursor_name SCROLL CURSOR WITH HOLD

FOR sql statement

Non-scrolling Cursor 通常运用在报表程序,抓取数据的方式是依序(seguential)的方式。

EX : DECLARE cursor_name CURSOR

FOR sql statement

Locking Cursor 通常运用在Update 程序,做数据Lock 的动作。

EX: DECLARE cursor_name CURSOR

FOR sql statement

FOR UPDATE

CONSTRUCT

他可以

让使用者在画面上下查询资料的条件(也就是做QBE 的动作),

语法1:

CONSTRUCT BY NAME char_variable ON column_list

语法2:

CONSTRUCT char_variable ON column_list FROM field_list

说明:char_variable 为 程序变量(通常定义成字符串变量)

column_list 为 table 中的字段

field_list 为 SCREEN 上的字段。

PREPARE 将此段程序转成可执行的叙述

PREPARE statement-name FROM char_variable

说明:

statement-name 是PREPARE 的一个变量,事先不用定义。

char_variable是组合的SELECT叙述

在做PREPARE 叙述之前必须先组好SELECT 的叙述。

OPEN OPEN cursor_name
CLOSE CLOSE cursor_name
FETCH FETCH语法:必须先OPEN CURSOR ,最后必须CLOSE CURSOR

FETCH可以与WHILE一起用,

FETCH cursor_name INTO program_variable

FOREACH FOREACH 语法:(只能用于 non_scrolling cursor)只能用于循环,自动开启和关闭CURSOR

FOREACH emp_cs INTO p_employee.*

Statement

[CONTINUE FOREACH]

……

[EXIT FOREACH]

……

END FOREACH

    1. 数组
OPEs 数组的定义 固定数组(Static Array)定义

ARRAY [ intconst [,intconst [,intconst] ] ] OF datatype

动态数组(Dynamic Array)定义

DYNAMIC ARRAY [ WITH DIMENSION rank ] OF datatype

数组的 数组的事件 getLength( ) RETURNING INTEGER: 回传单层数组的长度

clear: 将动态数组(Dynamic Array)中,所有记录移除。

将固定数组(Static Array)中,所有纪录值清为NULL。

appendElement():

在动态数组(Dynamic Array)后面加上一笔新的记录。

这个对象在固定数组(Static Array)中无效。

insertElement( INTEGER ) :

在指定位置新增记录,并将指定位置后之数据往下移。

动态数组(Dynamic Array)的笔数加1。

deleteElement( INTEGER ):

移除指定位置记录,并将指定位置后之数据往上移。

动态数组(Dynamic Array)的笔数减1。

D DD DISPLAY ARRAY 目的:将程序数组的值显示在画面上

语法:

DISPLAY ARRAY record-array TO screen-array.*

INPUT ARRAY 目的:Input Array 可以让使用者透过Screen Record 输入资料

语法:

INPUT ARRAY array [ WITHOUT DEFAULTS ] FROM screen-array.*

[ HELP help-number ]

[ ATTRIBUTE ( {display-attribute | control-attribute }

[,…] ) ]

  1. 报表与除错指令
    1. 报表命令
OPEs START REPORT 语法:

START REPORT rep_name [TO { SCREEN |FILE filename | PRINTER } ]

说明:

(1)这个指令是在驱动REPORT DRIVER。

(2)TO SCREEN:为系统DEFAULT 可不写。

(3)TO FILE filenme:将REPORT 的结果送到一个档案中(这个文件名由程序人员自订)。

(4)TO PRINTER:将REPORT 结果送到打印机(系统打印机)。

(5)若(2)、(3)都不写,则系统会将结果自动送到屏幕。

OUTPUT TO REPORT 语法:

OUTPUT TO REPORT rep_name(expr_list)

说明:

(1)该功能类似CALL function 时,并且顺便传递参数,将数据送到REPORT FUNCTION 中。

FINISH REPORT 语法:

FINISH REPORT rep_name

说明:

(1)这个指令是结束报表的指令。

REPORT FUNCTION REPORT report_name(expr_list)

[DEFINE define_statement]

[OUTPUT output_statement] #定义报表的边界及长度

[ORDER BY sort_list]

FORMAT

control_block

statement

:

END REPORT

ORDER BY 语法:

ORDER [ EXTERNAL(external外部的) ] BY variable-list

说明:

(1)ORDER BY 区间,主要是作排序字段用,以逗号分开,摆在最前面的字段为主键,同时只能用所接收的参数内的字段来排序。

(2)ORDER BY 会先将数据排序过并存在暂存盘中,配合BEFORE

GROUP OF 或 AFTER GROUP OF 区段排序后再由暂存档印出。

(3)ORDER EXTERNAL BY 表是输入数据排序过后不存在暂存盘中。

FORMAT 部分 FIRST PAGE HEADER :报表第一页的表头控制段。

PAGE HEADER :报表每一页的表头控制段。

BEFORE GROUP OF :在控制区段设定在一组数据的开始之前所必须执行

的叙述。

ON EVERY ROW :指定每一笔记录的输出格式。

AFTER GROUP OF :在控制区段设定一组数据之后必须执行的叙述。

PAGE TRAILER(trailer) :每一页报尾的控制段。

ON LAST ROW :所有数据印完后要做的动作,例如”总计”。

FORMAT 指令 1.PRINT 将讯息或数据印出来。

ex:PRINT “员工编号:”, employee_no

2.SKIP 打印时要跳几行或几页。

ex:SKIP 2 LINES ?跳两行

SKIP TO TOP OF PAGE?跳页

3.NEED

语法: NEED integer_value LINES

在打印前,先确定是否有足够的剩余行数,可供接下来打印,如果不够将先跳页后,再继续往下印。

打印时可用的表达式 1.CLIPPED 将字符串后面的空白清掉。

2.USING 针对数值定其打印的格式。

3.COLUMN 指定输出的行位置。

4.LINENO 取得目前打印行的列号值。

5.PAGENO 取得目前的页数。

6.SPACES 传回空白。

7.TIME 传回系统时间,格式:”hh:mm:ss”

8.TODAY 传回系统今天的日期。

9.LENGTH(expr) expr 为一字符串变量,其会传回expr 的长度。

群组函数 GROUP SUM(expression) :GROUP 区块中,数值的加总。

GROUP COUNT(*) :GROUP 区块中,资料的总数。

GROUP MIN(expression) :GROUP 区块中,取得数值的最小值。

GROUP MAX(expression) :GROUP 区块中,取得数值的最大值。

GROUP AVG(expression) :GROUP 区块中,取得数值的平均值。

GROUP PERCENT(*) :GROUP 区块中,资料的百分比。

    1. DEBUGGER的使用
OPEs 程序的执行 一般执行程序的命令为 fglrun 程序名称

以除错模式执行程序的命令为 fglrun -d 程序名称

除错模式的常用指令 break 设定断点 break test01_a b

run 执行程序 run ru

step 逐步执行程序 step 10 s

continue 执行到下一个断点 continue co

list 列出程序代码line list l

print 显示变量值 print g_sql p

quit 结束Debugger 环境 quit q

delete 删除断点 delete 1 d

help 查看指令内容 help list h

 

转载请注明:赫非域 » genero语法总结