文件组成结构
- 命名规则
- Program 的组成:
- 基础语法
- 报表与除错指令
- 文件组成结构
原始程序 | 编译后的程序 | 可执行程序 |
MODULE 程序文件 *.4gl | *.42m | *.42r |
FORM文件 *.per | *.42f | |
其他格式 *.sch |
- 命名规则
组成部分 | 详细内容 |
程序命名规则 | 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 |
- Program 的组成: Module + Form
- 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 |
-
- Form
组成部分 | 详细内容 |
SCHEMA | Schema ds #表示设计画面时所参考的数据库,默认为FOMRONLY 表示与数据库无关;
为了与旧版本兼容 SCHEMA 可以用DATABASE指令代替 |
Action default | 不使用,用其他方式设定(参考TIPTOP GP技术手册)必须紧接在SCHEMA下面做
Action DefaultsAction 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] (f001,f002,f003) INSTRUCTIONS SCREEN RECORD s_employee(emp_no,emp_age) END |
- 基础语法
- 变量及表达式
变量的类型和定义 | DATABASE ds
GLOBALS DEFINE g_employee CHAR(10) #全局变量 END GLOBALSDEFINE 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’ |
-
- 程序流程控制
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 } #离开上面的程序结构 |
-
- 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 #释放资源 |
-
- 菜单功能
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 |
-
- 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 ,…) ] ] |
-
- 游标
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 |
-
- 数组
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 } [,…] ) ] |
- 报表与除错指令
- 报表命令
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 区块中,资料的百分比。 |
-
- 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语法总结