This document contains additional example programs that are referenced
in the Natural statements and system variables reference documentation. All
these examples are contained in the library SYSEXSYN.
Note:
Generally, the example programs shown in the statement descriptions
are written in structured mode. For statements where the reporting-mode syntax
differs considerably from the structured-mode syntax, references to equivalent
reporting-mode examples are also provided. The example programs are available
in source-code form in the Natural library SYSEXSYN. Further
example programs of using Natural statements are documented in the section
Referenced Example
Programs in the Programming Guide.
These example programs are provided in the Natural library
SYSEXPG. Ask your Natural administrator about the availability of
these libraries at your site. The example programs use data from the files
EMPLOYEES and VEHICLES, which are supplied by
Software AG for demonstration purposes.
The example programs listed here are referenced in the descriptions of the following statements or system variables:
The following example is referenced in the ASSIGN/COMPUTE
statement description:
** 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
Output of Program AEDEX1R:
#A: 5 #B: ABC #C: .450 #D: -.12345 #E: -0.123 #F: 200 #G: HELLO #H: UVW XYZ
The following examples are referenced in the
AT BREAK statement
description:
** 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
Output of Program 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
Output of Program 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
The following example is referenced in the AT END OF DATA statement
description:
** 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
Output of Program 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
The following example is referenced in the AT END OF PAGE statement
description:
** 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
Output of Program 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
The following example is referenced in the AT START OF DATA statement
description:
** 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
Output of Program ASDEX1R:
ENTER VALUE FOR CITY PARIS
After entering and confirming city name:
RECORDS FOUND 26 ENTER 'D' TO DISPLAY RECORDS D
After entering and confirming 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
The following example is referenced in the AT TOP OF PAGE statement
description:
** 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
The following example is referenced in the DEFINE SUBROUTINE statement
description:
** 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
Output of Program 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
The following examples are referenced in the FIND statement description:
** 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
Output of Program 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
Output of Program 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
Output of Program FNDUNQ:
ENTER EMPLOYEE NAME: HEURTEBISE
After entering and confirming name HEURTEBISE:
NAME FIRST-NAME CURRENT
POSITION
-------------------- -------------------- -------------------------
HEURTEBISE MICHEL CONTROLEUR DE GESTION
The following example is referenced in the FOR statement description:
** 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
Output of Program 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
The following example is referenced in the HISTOGRAM statement
description:
** Example 'HSTEX1R': HISTOGRAM (reporting mode)
************************************************************************
*
LIMIT 8
HISTOGRAM EMPLOYEES CITY STARTING FROM 'M'
DISPLAY NOTITLE CITY
'NUMBER OF/PERSONS' *NUMBER *COUNTER
LOOP
*
END
Output of Program 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
The following example is referenced in the IF statement description:
** 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
Output of Program 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
The following example is referenced in the PERFORM BREAK PROCESSING statement
description:
** 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
Output of Program 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
The following example is referenced in the READ statement description:
** 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
Output of Program 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
The following examples are referenced in the REPEAT statement description:
** 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
Output of Program 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
Output of Program 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
The following example is referenced in the SORT statement description:
** 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
Output of Program 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
The following example is referenced in the STORE statement description:
** 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
The following example is referenced in the UPDATE statement description:
** 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
Output of Program UPDEX1R:
ENTER A NAME:
The following examples are referenced in the
*OCCURRENCE
system variable description:
** 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
Subprogram OCC1N Called by Program OCC1P:
** 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
Output of Program OCC1P - Page 1:
Page 1 05-01-18 10:21:30
#OCC1 #OCC2 #OCC3
----------- ----------- -----------
10 2 6
4 7
8
10 2 6
4 7
8
Output of Program OCC1P - Page 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
Subprogram OCC2N Called by Program OCC2P:
** 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
Output of Program 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