5.控制流程與敘述
5-1 informix-4gl 的程式架構
<語法格式>
DATABASE
database-name
GLOBAL
...
END
GLOBALS
MAIN
...
END
MAIN
FUNCTION
function-name()
...
END
FUNCTION
REPORT
report-name()
...
END
REPORT
5-2 註解敘述
1.行註解 { # text }
2.行註解 { -- text }
3.段註解 {
text }
5-3 IF 敘述
<語法格式>
IF boolean-exp THEN
statement
...
ELSE
statement
...
END
IF
§例:
IF p_count < 1 THEN
ERROR "小於1"
ELSE
LET p_count = p_count + 1
END
IF
5-4 FOR 敘述
<語法格式>
FOR
varibale = integer_exp TO
integer_exp
STATEMENT
...
[CONTINUE FOR]
...
[EXIT FOR]
...
END
FOR
§例:
let
order_total = 0
for i
= 1 to ARR_COUNT()
let order_tatal =
order_total + p_item[i].total_price
end
for
5-4 WHILE 敘述
<語法格式>
WHILE
boolean-exp
STATEMENT
...
[CONTINUE WHILE]
STATEMENT
...
[EXIT WHILE]
END
WHILE
§例:
while
true
call check()
returning answer
if answer matches [yY] then
continue while
else if x is null then
exit while
end if
end if
...
end
while
FOR i = 1 TO 100
LET sw = 0
FOR j = 1 TO 100
IF A = 1 THEN
CONTINUE FOR
ELSE
IF A = 2 THEN
EXIT
FOR
ELSE IF A = 3 THEN
LET sw = 1
EXIT FOR
ELSE IF A = 4 THEN
LET sw = 2
EXIT FOR
END IF
END IF
END IF
END IF
END FOR
IF sw = 1 THEN
CONTINUE
FOR
ELSE IF sw = 2 THEN
EXIT FOR
END IF
END IF
....
....
....
....
....
END FOR
....
....
....
....
5-5 CASE 敘述
<語法格式>
CASE [(exp)]
WHEN {exp|boolean}
statement
...
[exit case]
WHEN {exp|boolean}
statement
...
[exit case]
...
OTHERWISE
statement
...
[exit case]
END
CASE
§例:
case choise
when 1 : call choice-1()
when 2 : call choice-2()
when 3 : call choice-3()
when 4 : call choice-4()
...
end
case
§例:
case
when
choice = 1 call choice_1()
when
choice = 2 call choice_2()
when
choice = 3 call choice_3()
when
choice = 4 call choice_4()
...
end
case
5-6 CONTINUE 敘述
提早返迴迴圈開始處。
<語法格式>
CONTINUE
{CASE|DISPLAY|FOR|FOREACH|INPUT|MENU|WHILE}
5-7 EXIT 敘述
提早跳出迴圈、程式、INPUT、DISPLAY之外。
<語法格式>
EXIT{CASE|DISPLAY|FOR|FOREACH|INPUT|MENU|WHILE}
5-8 GOTO 敘述
無條件跳至標記處(同一函數、報表、MAIN之中)執行命令。
<語法格式>
GOTO標記名稱
§例:
if status != 0 then
goto stop_run
end
if
statement
...
label
stop_run: statement
...
5-8 LABEL 敘述
標記GOTO跳到的位址。
<語法格式>
LABEL 標記名稱
5-9 SLEEP 敘述
使程式暫停幾秒。
<語法格式>
SLEEP 整數運算式
§例:
sleep
2
5-10 WHENEVER 敘述
當錯誤或警告發生時執行 ...
<語法格式>
WHENEVER
{ERROR|WARNING}
{GOTO 標計|CALL 函數|CONTINUE|STOP}
§例:
whenever
error continue
...
whenever
error stop
...
5-11 FOREACH 敘述
相當於 WHILE 迴圈半和 FETCH 的組合。
<語法格式>
FOREACH
指標名稱 [INTO 變數串列]
statement
...
[CONTINUE FOREACH]
...
[EXIT FOREACH]
END FOREACH
§例:
foreach psn_cursor INTO p_psn.*
...
if p_psn.type =
"n" then
continue foreach
end
if
...
if int_flag = true
exit foreach
end
if
...
end
foreach
5-12 CALL 敘述
<語法格式>
CALL 函數([參數串列])
[RETURNING 變數串列]
§例:
call sample_function(parm1,parm2)
returning variable
call sample_function(parm)
call sample_function()
5-13 RETURN 敘述
立刻返迴呼叫之程式,並可傳回值。
<語法格式>
RETURN
[運算式串列]
§例:
return
x,y,z
return x+y
return 7
return true
return
5-14 DEFER 敘述
阻止使用者中斷程式執行
<語法格式>
DEFER INTERRUPT
一旦宣告,無法改變。
5-15 RUN 敘述
執行作業系統下的可執行檔
<語法格式>
RUN 可執行檔名稱
§例:
run sample.4ge
5-16 PROMPT 敘述
PROMPT 敘述可以從使用者處,交談式的接受所輸入之資料
<語法格式>
PROMPT display_list FOR variable
§例:
define stuff_num char(7)
prompt "請輸入員工編號" for stuff_num
5-17 DISPLAY 敘述
<語法格式>
DISPLAY display_list [USING|CLIPPED]
AT ROW,COLUMN
§例:
display p_ssaltab.idno at 24,1
display p_emp_name CLIPPED at 24,20
display "" at 2,1
5-17 CLIPPED 敘述
若變數是 CHAR 的資料型態時,當設定一個值給變數時,如果所設定的資料長
度比要設定的值還要大時,informix-4gl 會自動把空白值填入變數尾部多餘的長
度內,直到和它所定義的長度為止。所以,使用者若要將變數尾部多餘的空白
清除掉,則必須使用 CLIPPED 敘述。
<語法格式>
DISPLAY display_list CLIPPED
§例:
define emp_name char(10)
define title_name char(4)
let emp_name = "張三豐"
let title_name = "先生"
display
emp_name clipped,title_name
clipped
5-18 MESSAGE 敘述
用來顯示訊息至螢幕的訊息行(default 第二行)
<語法格式>
MESSAGE display_list
§例:
let address="台南市"
message "請選擇戶籍所在地為",address
sleep 2
message ""
5-19 ERROR 敘述
用來顯示錯誤訊息至螢幕的錯誤行(default 第
24 行)
<語法格式>
ERROR display_list
§例:
error "身份證號重覆"
5-20 CLEAR 敘述
<語法格式一>
CLEAR SCREEN
此敘述用來清除整個螢幕,包刮訊息行、錯誤行。
<語法格式二>
CLEAR FORM
此敘述用來清除所有的螢幕欄位資料值。
<語法格式三>
CLEAR VARIABLE_LIST
此敘述用來清除 field_list 所包含的一個或一個以上的螢幕欄位資料值。
§例:
clear emp_name,idno,stuff_num ...
5-21 INITIALIZE 敘述
通常變數可以用lLET 設定,但若要設定為 NULL 時,必須使用 INITIALIZE。
§例:
INITIALIZE variable TO NULL
INITIALIZE record_name.* TO NULL