このドキュメントには、Natural ステートメントおよびシステム変数の参照ドキュメントで参照されている追加のプログラム例が含まれています。これらすべての例は SYSEXSYN ライブラリに含まれています。
注意:
一般に、ステートメントの説明で示されているプログラム例はストラクチャードモードで記述されています。レポーティングモードとストラクチャードモードで構文が大幅に異なるステートメントについては、同等のレポーティングモードの例も参照として提供されています。これらのプログラム例は、Natural
ライブラリ SYSEXSYN にソースコード形式で用意されています。Natural ステートメントのその他のプログラム例については、『プログラミングガイド』の「参照プログラム例」を参照してください。これらのプログラム例は、Natural ライブラリ SYSEXPG に用意されています。これらのライブラリが使用可能であるかを Natural 管理者に確認してください。プログラム例では、Software AG 提供のデモ用ファイル EMPLOYEES と VEHICLES のデータを使用します。
ここに記載されているプログラム例は、以下のステートメントまたはシステム変数の説明で参照されています。
次の例は、ASSIGN/COMPUTE ステートメントの説明で参照されています。
** Example 'ASGEX1R': ASSIGN (reporting mode)
************************************************************************
RESET #A (N3)
#B (A6)
#C (N0.3)
#D (N0.5)
#E (N1.3)
#F (N5)
#G (A25)
#H (A3/1:3)
*
#A = 5 WRITE NOTITLE '=' #A
#B = 'ABC' WRITE '=' #B
#C = .45 WRITE '=' #C
#D = #E = -0.12345 WRITE '=' #D / '=' #E
ASSIGN ROUNDED #F = 199.999 WRITE '=' #F
#G = 'HELLO' WRITE '=' #G
*
#H (1) = 'UVW'
#H (3) = 'XYZ' WRITE '=' #H (1:3)
*
END
プログラム AEDEX1R の出力:
#A: 5 #B: ABC #C: .450 #D: -.12345 #E: -0.123 #F: 200 #G: HELLO #H: UVW XYZ
次の例は、AT BREAK ステートメントの説明で参照されています。
** Example 'ATBEX1R': AT BREAK (reporting mode)
************************************************************************
*
LIMIT 10
READ EMPLOYEES BY CITY
AT BREAK OF CITY DO
SKIP 1
DOEND
/*
DISPLAY NOTITLE CITY (IS=ON) COUNTRY (IS=ON) NAME
LOOP
END
プログラム ATBEX1R の出力:
CITY COUNTRY NAME
-------------------- ------- --------------------
AIKEN USA SENKO
AIX EN OTHE F GODEFROY
AJACCIO CANALE
ALBERTSLUND DK PLOUG
ALBUQUERQUE USA HAMMOND
ROLLING
FREEMAN
LINCOLN
ALFRETON UK GOLDBERG
ALICANTE E GOMEZ
** Example 'ATBEX5R': AT BREAK (multiple break levels) (reporting mode)
************************************************************************
RESET LEAVE-DUE-L (N4)
*
LIMIT 5
FIND EMPLOYEES WITH CITY = 'PHILADELPHIA' OR = 'PITTSBURGH'
SORTED BY CITY DEPT
MOVE LEAVE-DUE TO LEAVE-DUE-L
DISPLAY CITY (IS=ON) DEPT (IS=ON) NAME LEAVE-DUE-L
AT BREAK OF DEPT
WRITE NOTITLE /
T*DEPT OLD(DEPT) T*LEAVE-DUE-L SUM(LEAVE-DUE-L) /
AT BREAK OF CITY
WRITE NOTITLE
T*CITY OLD(CITY) T*LEAVE-DUE-L SUM(LEAVE-DUE-L) //
LOOP
*
END
プログラム ATBEX5R の出力:
CITY DEPARTMENT NAME LEAVE-DUE-L
CODE
-------------------- ---------- -------------------- -----------
PHILADELPHIA MGMT30 WOLF-TERROINE 11
MACKARNESS 27
MGMT30 38
TECH10 BUSH 39
NETTLEFOLDS 24
TECH10 63
PHILADELPHIA 101
PITTSBURGH MGMT10 FLETCHER 34
MGMT10 34
PITTSBURGH 34
次の例は、AT END OF DATA ステートメントの説明で参照されています。
** Example 'AEDEX1R': AT END OF DATA (reporting mode)
************************************************************************
LIMIT 5
EMP. FIND EMPLOYEES WITH CITY = 'STUTTGART'
IF NO RECORDS FOUND
ENTER
DISPLAY PERSONNEL-ID NAME FIRST-NAME
SALARY (1) CURR-CODE (1)
/*
AT END OF DATA DO
IF *COUNTER (EMP.) = 0 DO
WRITE 'NO RECORDS FOUND'
ESCAPE BOTTOM
DOEND
WRITE NOTITLE / 'SALARY STATISTICS:'
/ 7X 'MAXIMUM:' MAX(SALARY(1)) CURR-CODE (1)
/ 7X 'MINIMUM:' MIN(SALARY(1)) CURR-CODE (1)
/ 7X 'AVERAGE:' AVER(SALARY(1)) CURR-CODE (1)
DOEND
LOOP
END
プログラム AEDEX1R の出力:
PERSONNEL NAME FIRST-NAME ANNUAL CURRENCY
ID SALARY CODE
--------- -------------------- -------------------- ---------- --------
11100328 BERGHAUS ROSE 70800 DM
11100329 BARTHEL PETER 42000 DM
11300313 AECKERLE SUSANNE 55200 DM
11300316 KANTE GABRIELE 61200 DM
11500304 KLUGE ELKE 49200 DM
SALARY STATISTICS:
MAXIMUM: 70800 DM
MINIMUM: 42000 DM
AVERAGE: 55680 DM
次の例は、AT END OF PAGE ステートメントの説明で参照されています。
** Example 'AEPEX1R': AT END OF PAGE (reporting mode)
************************************************************************
FORMAT PS=10
LIMIT 10
READ EMPLOYEES BY PERSONNEL-ID FROM '20017000'
DISPLAY NOTITLE GIVE SYSTEM FUNCTIONS
NAME JOB-TITLE 'SALARY' SALARY(1) CURR-CODE (1)
/*
AT END OF PAGE DO
WRITE / 28T 'AVERAGE SALARY: ...' AVER(SALARY(1)) CURR-CODE (1)
DOEND
/*
LOOP
END
プログラム AEPEX1R の出力:
NAME CURRENT SALARY CURRENCY
POSITION CODE
-------------------- ------------------------- ---------- --------
CREMER ANALYST 34000 USD
MARKUSH TRAINEE 22000 USD
GEE MANAGER 39500 USD
KUNEY DBA 40200 USD
NEEDHAM PROGRAMMER 32500 USD
JACKSON PROGRAMMER 33000 USD
AVERAGE SALARY: ... 33533 USD
次の例は、AT START OF DATA ステートメントの説明で参照されています。
** Example 'ASDEX1R': AT START OF DATA (reporting mode)
***********************************************************************
RESET #CITY (A20) #CNTL (A1)
*
REPEAT
INPUT 'ENTER VALUE FOR CITY' #CITY
/*
IF #CITY = ' ' OR= 'END' DO
STOP
DOEND
FIND EMPLOYEES WITH CITY = #CITY
IF NO RECORDS FOUND DO
WRITE NOTITLE NOHDR 'NO RECORDS FOUND'
ESCAPE
DOEND
/*
AT START OF DATA DO
INPUT (AD=O) 'RECORDS FOUND' *NUMBER //
'ENTER ''D'' TO DISPLAY RECORDS' #CNTL (AD=A)
IF #CNTL NE 'D' DO
ESCAPE BOTTOM
DOEND
DOEND
/*
DISPLAY NAME FIRST-NAME
LOOP
LOOP
END
プログラム ASDEX1R の出力:
ENTER VALUE FOR CITY PARIS
市町村名を入力して確認した後:
RECORDS FOUND 26 ENTER 'D' TO DISPLAY RECORDS D
D を入力して確認した後:
NAME FIRST-NAME
-------------------- --------------------
MAIZIERE ELISABETH
MARX JEAN-MARIE
REIGNARD JACQUELINE
RENAUD MICHEL
REMOUE GERMAINE
LAVENDA SALOMON
BROUSSE GUY
GIORDA LOUIS
SIECA FRANCOIS
CENSIER BERNARD
DUC JEAN-PAUL
CAHN RAYMOND
MAZUY ROBERT
FAURIE HENRI
VALLY ALAIN
BRETON JEAN-MARIE
GIGLEUX JACQUES
KORAB-BRZOZOWSKI BOGDAN
XOLIN CHRISTIAN
LEGRIS ROGER
VVVV
次の例は、AT TOP OF PAGE ステートメントの説明で参照されています。
** Example 'ATPEX1R': AT TOP OF PAGE (reporting mode)
************************************************************************
*
FORMAT PS=15
LIMIT 15
*
READ EMPLOYEES BY NAME STARTING FROM 'L'
DISPLAY 2X NAME 4X FIRST-NAME CITY DEPT
WRITE TITLE UNDERLINED 'EMPLOYEE REPORT'
WRITE TRAILER '-' (78)
/*
AT TOP OF PAGE DO
WRITE 'BEGINNING NAME:' NAME
DOEND
/*
AT END OF PAGE DO
SKIP 1
WRITE 'ENDING NAME: ' NAME
DOEND
LOOP
END
次の例は、DEFINE SUBROUTINE ステートメントの説明で参照されています。
** Example 'DSREX1R': DEFINE SUBROUTINE (reporting mode)
************************************************************************
RESET #ARRAY-ALL (A300)
#X (N2) #Y (N2)
REDEFINE #ARRAY-ALL (#ARRAY (A75/1:4))
#ARRAY-ALL (#ALINE (A25/1:4,1:3))
*
FORMAT PS=20
LIMIT 5
*
MOVE 1 TO #X #Y
*
FIND EMPLOYEES WITH NAME = 'SMITH'
OBTAIN ADDRESS-LINE (1:2)
/*
MOVE NAME TO #ALINE (#X,#Y)
MOVE ADDRESS-LINE(1) TO #ALINE (#X+1,#Y)
MOVE ADDRESS-LINE(2) TO #ALINE (#X+2,#Y)
MOVE PHONE TO #ALINE (#X+3,#Y)
IF #Y = 3 DO
MOVE 1 TO #Y
PERFORM PRINT
DOEND
ELSE DO
ADD 1 TO #Y
DOEND
AT END OF DATA DO
PERFORM PRINT
DOEND
LOOP
*
DEFINE SUBROUTINE PRINT
WRITE NOTITLE (AD=OI) #ARRAY(*)
RESET #ARRAY(*)
SKIP 1
RETURN
*
END
プログラム AEDEX1R の出力:
SMITH SMITH SMITH
ENGLANDSVEJ 222 3152 SHETLAND ROAD 14100 ESWORTHY RD.
MILWAUKEE MONTERREY
554349 877-4563 994-2260
SMITH SMITH
5 HAWTHORN 13002 NEW ARDEN COUR
OAK BROOK SILVER SPRING
150-9351 639-8963
次の例は、FIND ステートメントの説明で参照されています。
** Example 'FNDFIR': FIND FIRST
************************************************************************
*
FIND FIRST EMPLOYEES WITH CITY = 'DERBY'
*
WRITE NOTITLE 'TOTAL RECORDS SELECTED:' *NUMBER
SKIP 2
WRITE '***FIRST PERSON SELECTED***' //
'NAME: ' NAME /
'DEPARTMENT:' DEPT /
'JOB TITLE: ' JOB-TITLE
*
END
プログラム FNDFIR の出力:
TOTAL RECORDS SELECTED: 141
***FIRST PERSON SELECTED***
NAME: DEAKIN
DEPARTMENT: SALE01
JOB TITLE: SALES ACCOUNTANT
** Example 'FNDNUM': FIND NUMBER
************************************************************************
RESET #BIRTH (D)
*
MOVE EDITED '19500101' TO #BIRTH (EM=YYYYMMDD)
*
FIND NUMBER EMPLOYEES WITH CITY = 'MADRID'
WHERE BIRTH LT #BIRTH
*
WRITE NOTITLE 'TOTAL RECORDS SELECTED: ' *NUMBER
/ 'TOTAL BORN BEFORE 1 JAN 1950: ' *COUNTER
*
END
プログラム FNDNUM の出力:
TOTAL RECORDS SELECTED: 41 TOTAL BORN BEFORE 1 JAN 1950: 16
** Example 'FNDUNQ': FIND UNIQUE ************************************************************************ RESET #NAME (A20) * * INPUT 'ENTER EMPLOYEE NAME: ' #NAME IF #NAME = ' ' STOP * FIND UNIQUE EMPLOYEES WITH NAME = #NAME * DISPLAY NOTITLE NAME FIRST-NAME JOB-TITLE * ON ERROR DO WRITE 'NAME EITHER NOT UNIQUE OR DOES NOT EXIST' FETCH 'FNDUNQ' DOEND * END
プログラム FNDUNQ の出力:
ENTER EMPLOYEE NAME: HEURTEBISE
名前 HEURTEBISE を入力して確認した後:
NAME FIRST-NAME CURRENT
POSITION
-------------------- -------------------- -------------------------
HEURTEBISE MICHEL CONTROLEUR DE GESTION
次の例は、FOR ステートメントの説明で参照されています。
** Example 'FOREX1R': FOR (reporting mode)
************************************************************************
RESET #INDEX (I1)
#ROOT (N2.7)
*
FOR #INDEX 1 TO 5
COMPUTE #ROOT = SQRT (#INDEX)
WRITE NOTITLE '=' #INDEX 3X '=' #ROOT
LOOP
*
SKIP 1
FOR #INDEX 1 TO 5 STEP 2
COMPUTE #ROOT = SQRT (#INDEX)
WRITE '=' #INDEX 3X '=' #ROOT
LOOP
*
END
プログラム FOREX1R の出力:
#INDEX: 1 #ROOT: 1.0000000
#INDEX: 2 #ROOT: 1.4142135
#INDEX: 3 #ROOT: 1.7320508
#INDEX: 4 #ROOT: 2.0000000
#INDEX: 5 #ROOT: 2.2360679
#INDEX: 1 #ROOT: 1.0000000
#INDEX: 3 #ROOT: 1.7320508
#INDEX: 5 #ROOT: 2.2360679
次の例は、HISTOGRAM ステートメントの説明で参照されています。
** Example 'HSTEX1R': HISTOGRAM (reporting mode)
************************************************************************
*
LIMIT 8
HISTOGRAM EMPLOYEES CITY STARTING FROM 'M'
DISPLAY NOTITLE CITY
'NUMBER OF/PERSONS' *NUMBER *COUNTER
LOOP
*
END
プログラム HSTEX1R の出力:
CITY NUMBER OF CNT
PERSONS
-------------------- ----------- -----------
MADISON 3 1
MADRID 41 2
MAILLY LE CAMP 1 3
MAMERS 1 4
MANSFIELD 4 5
MARSEILLE 2 6
MATLOCK 1 7
MELBOURNE 2 8
次の例は、IF ステートメントの説明で参照されています。
** Example 'IFEX1R': IF (reporting mode)
************************************************************************
RESET #BIRTH (D)
*
MOVE EDITED '19450101' TO #BIRTH (EM=YYYYMMDD)
SUSPEND IDENTICAL SUPPRESS
LIMIT 20
*
FND. FIND EMPLOYEES WITH CITY = 'FRANKFURT'
SORTED BY NAME BIRTH
IF SALARY (1) LT 40000
WRITE NOTITLE '*****' NAME 30X 'SALARY LT 40000'
ELSE DO
IF BIRTH GT #BIRTH DO
FIND VEHICLES WITH PERSONNEL-ID = PERSONNEL-ID (FND.)
DISPLAY (IS=ON) NAME BIRTH (EM=YYYY-MM-DD)
SALARY (1) MAKE (AL=8)
LOOP
DOEND
DOEND
LOOP
END
プログラム IFEX1R の出力:
NAME DATE ANNUAL MAKE
OF SALARY
BIRTH
-------------------- ---------- ---------- --------
BAECKER 1956-01-05 74400 BMW
***** BECKER SALARY LT 40000
BLOEMER 1979-11-07 45200 FIAT
FALTER 1954-05-23 70800 FORD
***** FALTER SALARY LT 40000
***** GROTHE SALARY LT 40000
***** HEILBROCK SALARY LT 40000
***** HESCHMANN SALARY LT 40000
HUCH 1952-09-12 67200 MERCEDES
***** KICKSTEIN SALARY LT 40000
***** KLEENE SALARY LT 40000
***** KRAMER SALARY LT 40000
次の例は、PERFORM BREAK PROCESSING ステートメントの説明で参照されています。
** Example 'PBPEX1R': PERFORM BREAK PROCESSING (reporting mode)
************************************************************************
RESET #LINE (N2) #INDEX (N2)
*
MOVE 1 TO #LINE
FOR #INDEX 1 TO 18
PERFORM BREAK PROCESSING
/*
AT BREAK OF #INDEX /1/ DO
WRITE NOTITLE / 'PLEASE COMPLETE LINES 1-9 ABOVE' /
MOVE 1 TO #LINE
DOEND
/*
WRITE NOTITLE '_' (64) '=' #LINE
ADD 1 TO #LINE
LOOP
END
プログラム PBPEX1R の出力:
________________________________________________________________ #LINE: 1
________________________________________________________________ #LINE: 2
________________________________________________________________ #LINE: 3
________________________________________________________________ #LINE: 4
________________________________________________________________ #LINE: 5
________________________________________________________________ #LINE: 6
________________________________________________________________ #LINE: 7
________________________________________________________________ #LINE: 8
________________________________________________________________ #LINE: 9
PLEASE COMPLETE LINES 1-9 ABOVE
________________________________________________________________ #LINE: 1
________________________________________________________________ #LINE: 2
________________________________________________________________ #LINE: 3
________________________________________________________________ #LINE: 4
________________________________________________________________ #LINE: 5
________________________________________________________________ #LINE: 6
________________________________________________________________ #LINE: 7
________________________________________________________________ #LINE: 8
________________________________________________________________ #LINE: 9
PLEASE COMPLETE LINES 1-9 ABOVE
次の例は、READ ステートメントの説明で参照されています。
** Example 'REAEX1R': READ (reporting mode) ************************************************************************ LIMIT 3 * WRITE 'READ IN PHYSICAL SEQUENCE' READ EMPLOYEES IN PHYSICAL SEQUENCE DISPLAY NOTITLE PERSONNEL-ID NAME *ISN *COUNTER LOOP * WRITE / 'READ IN ISN SEQUENCE' READ EMPLOYEES BY ISN STARTING FROM 1 ENDING AT 3 DISPLAY PERSONNEL-ID NAME *ISN *COUNTER LOOP * WRITE / 'READ IN NAME SEQUENCE' READ EMPLOYEES BY NAME DISPLAY PERSONNEL-ID NAME *ISN *COUNTER LOOP * WRITE / 'READ IN NAME SEQUENCE STARTING FROM ''M''' READ EMPLOYEES BY NAME STARTING FROM 'M' DISPLAY PERSONNEL-ID NAME *ISN *COUNTER LOOP * END
プログラム REAEX1R の出力:
PERSONNEL NAME ISN CNT
ID
--------- -------------------- ----------- -----------
READ IN PHYSICAL SEQUENCE
50005800 ADAM 1 1
50005600 MORENO 2 2
50005500 BLOND 3 3
READ IN ISN SEQUENCE
50005800 ADAM 1 1
50005600 MORENO 2 2
50005500 BLOND 3 3
READ IN NAME SEQUENCE
60008339 ABELLAN 478 1
30000231 ACHIESON 878 2
50005800 ADAM 1 3
READ IN NAME SEQUENCE STARTING FROM 'M'
30008125 MACDONALD 923 1
20028700 MACKARNESS 765 2
40000045 MADSEN 508 3
次の例は、REPEAT ステートメントの説明で参照されています。
** Example 'RPTEX1R': REPEAT (reporting mode)
************************************************************************
RESET #PERS-NR (A8)
*
REPEAT
INPUT 'ENTER A PERSONNEL NUMBER:' #PERS-NR
IF #PERS-NR = ' '
ESCAPE BOTTOM
FIND EMPLOYEES WITH PERSONNEL-ID = #PERS-NR
IF NO RECORD FOUND
REINPUT 'NO RECORD FOUND'
DISPLAY NOTITLE NAME
LOOP
LOOP
*
END
プログラム RPTEX1R の出力:
ENTER A PERSONNEL NUMBER:
** Example 'RPTEX2R': REPEAT (with WHILE and UNTIL option) ************************************************************************ RESET #X (I1) #Y (I1) * * REPEAT WHILE #X <= 5 ADD 1 TO #X WRITE NOTITLE '=' #X LOOP * SKIP 3 REPEAT ADD 1 TO #Y WRITE '=' #Y UNTIL #Y = 6 LOOP * END
プログラム RPTEX2R の出力:
#X: 1
#X: 2
#X: 3
#X: 4
#X: 5
#X: 6
#Y: 1
#Y: 2
#Y: 3
#Y: 4
#Y: 5
#Y: 6
次の例は、SORT ステートメントの説明で参照されています。
** Example 'SRTEX1R': SORT (reporting mode)
************************************************************************
RESET #AVG (P11) #TOTAL-TOTAL (P11) #TOTAL-SALARY (P11)
#AVER-PERCENT (N3.2)
*
LIMIT 3
FIND EMPLOYEES WITH CITY = 'BOSTON'
OBTAIN SALARY(1:2)
COMPUTE #TOTAL-SALARY = SALARY (1) + SALARY (2)
ACCEPT IF #TOTAL-SALARY GT 0
/*
SORT BY PERSONNEL-ID USING #TOTAL-SALARY SALARY(*) CURR-CODE
GIVE AVER(#TOTAL-SALARY)
/*
AT START OF DATA DO
WRITE NOTITLE '*' (40)
'AVG CUMULATIVE SALARY:' *AVER (#TOTAL-SALARY) /
MOVE *AVER (#TOTAL-SALARY) TO #AVG
DOEND
COMPUTE ROUNDED #AVER-PERCENT = #TOTAL-SALARY / #AVG * 100
ADD #TOTAL-SALARY TO #TOTAL-TOTAL
/*
DISPLAY NOTITLE PERSONNEL-ID SALARY (1) SALARY (2)
#TOTAL-SALARY CURR-CODE (1)
'PERCENT/OF/AVER' #AVER-PERCENT
AT END OF DATA
WRITE / '*' (40) 'TOTAL SALARIES PAID: ' #TOTAL-TOTAL
LOOP
*
END
プログラム SRTEX1R の出力:
PERSONNEL ANNUAL ANNUAL #TOTAL-SALARY CURRENCY PERCENT
ID SALARY SALARY CODE OF
AVER
--------- ---------- ---------- ------------- -------- -------
**************************************** AVG CUMULATIVE SALARY: 44633
20000100 31000 29400 60400 USD 135.30
20019200 18000 17100 35100 USD 78.60
20020400 20000 18400 38400 USD 86.00
**************************************** TOTAL SALARIES PAID: 133900
次の例は、STORE ステートメントの説明で参照されています。
** Example 'STOEX1R': STORE (reporting mode)
**
** CAUTION: Executing this example will modify the database records!
************************************************************************
RESET #PERSONNEL-ID (A8)
#NAME (A20)
#FIRST-NAME (A15)
#BIRTH-D (D)
#MAR-STAT (A1)
#BIRTH (A8)
#CITY (A20)
#COUNTRY (A3)
#CONF (A1)
*
REPEAT
INPUT 'ENTER A PERSONNEL ID AND NAME (OR ''END'' TO END)' //
'PERSONNEL-ID : ' #PERSONNEL-ID //
'NAME : ' #NAME /
'FIRST-NAME : ' #FIRST-NAME
/*
/* VALIDATE ENTERED DATA
/*
IF #PERSONNEL-ID = 'END' OR #NAME = 'END'
STOP
IF #NAME = ' '
REINPUT WITH TEXT 'ENTER A LAST-NAME' MARK 2 AND SOUND ALARM
IF #FIRST-NAME = ' '
REINPUT WITH TEXT 'ENTER A FIRST-NAME' MARK 3 AND SOUND ALARM
/*
/* ENSURE PERSON IS NOT ALREADY ON FILE
/*
FIND NUMBER EMPLOYEES WITH PERSONNEL-ID = #PERSONNEL-ID
IF *NUMBER > 0
REINPUT 'PERSON WITH SAME PERSONNEL-ID ALREADY EXISTS'
MARK 1 AND SOUND ALARM
MOVE 'N' TO #CONF
/*
/* GET FURTHER INFORMATION
/*
INPUT
'ADDITIONAL PERSONNEL DATA' ////
'PERSONNEL-ID :' #PERSONNEL-ID (AD=IO) /
'NAME :' #NAME (AD=IO) /
'FIRST-NAME :' #FIRST-NAME (AD=IO) ///
'MARITAL STATUS :' #MAR-STAT /
'DATE OF BIRTH (YYYYMMDD) :' #BIRTH /
'CITY :' #CITY /
'COUNTRY (3 CHARACTERS) :' #COUNTRY //
'ADD THIS RECORD (Y/N) :' #CONF (AD=M)
/*
/* ENSURE REQUIRED FIELDS CONTAIN VALID DATA
/*
IF NOT (#MAR-STAT = 'S' OR = 'M' OR = 'D' OR = 'W')
REINPUT TEXT 'ENTER VALID MARITAL STATUS S=SINGLE ' -
'M=MARRIED D=DIVORCED W=WIDOWED' MARK 1
IF NOT (#BIRTH = MASK(YYYYMMDD) AND #BIRTH = MASK(1582-2699))
REINPUT TEXT 'ENTER CORRECT DATE' MARK 2
IF #CITY = ' '
REINPUT TEXT 'ENTER A CITY NAME' MARK 3
IF #COUNTRY = ' '
REINPUT TEXT 'ENTER A COUNTRY CODE' MARK 4
IF NOT (#CONF = 'N' OR= 'Y')
REINPUT TEXT 'ENTER Y (YES) OR N (NO)' MARK 5
IF #CONF = 'N'
ESCAPE TOP
/*
/* ADD THE RECORD
/*
MOVE EDITED #BIRTH TO #BIRTH-D (EM=YYYYMMDD)
/*
STORE RECORD IN EMPLOYEES
WITH PERSONNEL-ID = #PERSONNEL-ID
NAME = #NAME
FIRST-NAME = #FIRST-NAME
MAR-STAT = #MAR-STAT
BIRTH = #BIRTH-D
CITY = #CITY
COUNTRY = #COUNTRY
END OF TRANSACTION
/*
WRITE NOTITLE 'RECORD HAS BEEN ADDED'
/*
LOOP
END
次の例は、UPDATE ステートメントの説明で参照されています。
** Example 'UPDEX1R': UPDATE (reporting mode)
**
** CAUTION: Executing this example will modify the database records!
************************************************************************
RESET #NAME (A20)
*
INPUT 'ENTER A NAME:' #NAME (AD=M)
IF #NAME = ' '
STOP
*
FIND EMPLOYEES WITH NAME = #NAME
IF NO RECORDS FOUND
REINPUT WITH 'NO RECORDS FOUND' MARK 1
/*
INPUT 'NAME: ' NAME (AD=O) /
'FIRST NAME:' FIRST-NAME (AD=M) /
'CITY: ' CITY (AD=M)
/*
UPDATE USING SAME RECORD
/*
END TRANSACTION
/*
LOOP
*
END
プログラム UPDEX1R の出力:
ENTER A NAME:
次の例は、*OCCURRENCE システム変数の説明で参照されています。
** Example 'OCC1P': *OCCURRENCE ************************************************************************ DEFINE DATA LOCAL 1 #N1 (N7/1:10) 1 #N2 (N7/1:10,1:10) 1 #N3 (N7/1:10,1:10,1:10) END-DEFINE * CALLNAT 'OCC1N' #N1(*) #N2(1:2,1:4) #N3(1:6,1:7,1:8) * END
プログラム OCC1P で呼び出されたサブプログラム OCC1N:
** Example 'OCC1N': *OCCURRENCE (called by OCC1P)
**********************************************************************
DEFINE DATA
PARAMETER
1 PARM1 (N7/1:V)
1 PARM2 (N7/1:V,1:V)
1 PARM3 (N7/1:V,1:V,1:V)
LOCAL
1 #OCC2 (I4/1:2)
1 #OCC3 (I4/1:3)
1 #OCC1 (I4)
END-DEFINE
*
MOVE *OCC(PARM1) TO #OCC1
MOVE *OCC(PARM2,*) TO #OCC2(*)
MOVE *OCC(PARM3,*) TO #OCC3(*)
*
DISPLAY #OCC1 #OCC2(*) #OCC3(*)
DISPLAY *OCC(PARM1,*) *OCC(PARM2,*) *OCC(PARM3,*)
*
NEWPAGE
*
WRITE NOHDR
'Occurrences of 1. parameter:' *OCC(PARM1)
/ 'Occurrences of 1. parameter:' *OCC(PARM1,1)
/ 'Occurrences of 1. parameter:' *OCC(PARM1,*)
/ 'Occurrences of 2. parameter:' *OCC(PARM2,1) *OCC(PARM2,2)
/ 'Occurrences of 2. parameter:' *OCC(PARM2,*)
/ 'Occurrences of 3. parameter:' *OCC(PARM3,1) *OCC(PARM3,2)
*OCC(PARM3,3)
/ 'Occurrences of 3. parameter:' *OCC(PARM3,*)
*
END
プログラム OCC1P の出力 - ページ 1:
Page 1 05-01-18 10:21:30
#OCC1 #OCC2 #OCC3
----------- ----------- -----------
10 2 6
4 7
8
10 2 6
4 7
8
プログラム OCC1P の出力 - ページ 2:
Page 2 05-01-18 10:21:30
Occurrences of 1. parameter: 10
Occurrences of 1. parameter: 10
Occurrences of 1. parameter: 10
Occurrences of 2. parameter: 2 4
Occurrences of 2. parameter: 2 4
Occurrences of 3. parameter: 6 7 8
Occurrences of 3. parameter: 6 7 8
** Example 'OCC2P': *OCCURRENCE ************************************************************************ DEFINE DATA LOCAL 1 #N (N7/1:10) 1 #I (I4) END-DEFINE * FOR #I=1 TO 10 MOVE #I TO #N(#I) END-FOR * WRITE 'Passing occurrences 1:5' CALLNAT 'OCC2N' #N(1:5) * WRITE 'Passing occurrences 5:10' CALLNAT 'OCC2N' #N(5:10) * END
プログラム OCC2P で呼び出されたサブプログラム OCC2N:
** Example 'OCC2N': *OCCURRENCE (called by OCC2P) ********************************************************************** DEFINE DATA PARAMETER 1 #ARR (N7/1:V) LOCAL 1 I (N7) END-DEFINE * FOR I=1 TO *OCC(#ARR) DISPLAY #ARR(I) END-FOR * END
プログラム OCC2P の出力:
Page 1 05-01-18 10:33:03
Passing occurrences 1:5
1
2
3
4
5
Passing occurrences 5:10
5
6
7
8
9
10