Example of Record Input [ SORT-MERGE/XL Programmer's Guide ] MPE/iX 5.0 Documentation
SORT-MERGE/XL Programmer's Guide
Example of Record Input
The following program sorts the personnel files shown below. They are
sorted by last name. The program marks the employee numbers for the
temporary employees with an asterisk.
The files that are used in the following example are as follows (data
descriptions and character positions are indicated for convenience only):
TEMPEMP Information file about temporary employees:
Last Name First Name Employee Number Hire Date
Gangley, Tomas 000003 06/06/87
Rields, Evelyn 000007 07/12/87
Everett, Joyce 000029 10/19/87
0 1 2 3 4 5 6 7
1234567890123456789012345678901234567890123456789012345678901234567890
PERMEMP Information file about permanent employees:
Last Name First Name Employee Number Hire Date
Jones, Eliza 000001 06/06/87
Smith, James 000005 06/06/87
Jackson, Johnathon 000006 06/06/87
Washington, Lois 000014 07/23/87
Jackson, Rosa 000022 08/15/87
0 1 2 3 4 5 6 7
1234567890123456789012345678901234567890123456789012345678901234567890
Example D-3. SORTREC_INPUT Program
$standard_level system
program SORTREC_INPUT
C
C This program reads the files TEMPEMP and PERMEMP, alters the TEMPEMP
C records, passes all records to SORT/XL, and outputs to the file ALLEMP.
C
integer TEMPFILENUM
2 ,PERMFILENUM
3 ,OUTFILENUM
4 ,STATUS
C
common /PARMS/ TEMPFILENUM, PERMFILENUM
2 ,OUTFILENUM, STATUS
C
call OPEN_FILES
call DO_SORT
call CLOSE_FILES
stop
end
C
subroutine OPEN_FILES
C
system intrinsic HPFOPEN
2 ,QUIT
C
integer DESIGNATOR
2 ,DOMAIN
3 ,ACCESS
4 ,RECORD_SIZE
5 ,PERMANENT
6 ,NEW
7 ,WRITE
8 ,SIZE
9 ,TEMPFILENUM
A ,PERMFILENUM
B ,OUTFILENUM
C ,STATUS
C
character TEMPFILE*10
2 ,PERMFILE*10
3 ,OUTFILE*10
C
common /PARMS/ TEMPFILENUM, PERMFILENUM
2 ,OUTFILENUM, STATUS
C
Example D-3. SORTREC_INPUT Program, continued
DESIGNATOR = 2
DOMAIN = 3
ACCESS = 11
RECORD_SIZE = 19
C
TEMPFILE = '%TEMPEMP%'
PERMANENT = 1
call HPFOPEN (TEMPFILENUM, STATUS, DESIGNATOR,
2 ,TEMPFILE, DOMAIN, PERMANENT)
if (STATUS .ne. 0) then
print *, 'HPFOPEN error on TEMPFILE. Terminating.'
endif
C
PERMFILE = '%PERMEMP%'
call HPFOPEN (PERMFILENUM, STATUS, DESIGNATOR,
2 ,PERMFILE, DOMAIN, PERMANENT)
if (STATUS .ne. 0) then
print *, 'HPFOPEN error on PERMEMP. Terminating.'
call QUIT (2)
endif
C
NEW = 4
WRITE = 1
SIZE = 80
OUTFILE = '%ALLEMP%'
call HPFOPEN (OUTFILENUM, STATUS, DESIGNATOR,
2 ,OUTFILE, DOMAIN, NEW, ACCESS, WRITE,
3 ,RECORD_SIZE, SIZE)
if (STATUS .ne. 0) then
print *, 'HPFOPEN error on ALLEMP. Terminating.'
call QUIT (3)
endif
C
return
end
C
subroutine DO_SORT
C
system intrinsic HPSORTINIT
2 ,HPSORTERRORMESS
3 ,HPSORTEND
4 ,HPSORTINPUT
5 ,FREAD
6 ,QUIT
C
Example D-3. SORTREC_INPUT Program, continued
integer OUTPUT_OPTION
2 ,NUMKEYS
3 ,LENGTH
4 ,OUTPUTFILE(2)
5 ,KEYS(4)
6 ,TEMPFILENUM
7 ,PERMFILENUM
8 ,OUTFILENUM
9 ,STATUS
A ,RECLENGTH
C
integer*2 LNGTH
C
logical EOF
C
character ALTSEQ*2
2 ,MESSAGE*80
3 ,BUFFER*80
C
common /PARMS/ TEMPFILENUM, PERMFILENUM
2 ,OUTFILENUM, STATUS
C
OUTPUTFILE(1) = OUTFILENUM
OUTPUTFILE(2) = 0
OUTPUT_OPTION = 0
RECLENGTH = 80
NUMKEYS = 1
KEYS(1) = 1
KEYS(2) = 20
KEYS(3) = 0
KEYS(4) = 0
ALTSEQ(1:1) = CHAR(255)
ALTSEQ(2:2) = CHAR(255)
call HPSORTINIT (STATUS,, OUTPUTFILE, OUTPUT_OPTION
2 ,RECLENGTH,, NUMKEYS, KEYS, ALTSEQ)
if (STATUS .ne. 0) then
MESSAGE = ' '
call HPSORTERRORMESS (STATUS, MESSAGE, LENGTH)
print *,MESSAGE
endif
Example D-3. SORTREC_INPUT Program, continued
LENGTH = 72
EOF = .false.
C Read TEMPEMP file. Start with a priming read. If EOF is not found on
C the priming read, call HPSORTINPUT to put the record into the sort, then
C read and input until EOF is found.
LNGTH = FREAD (TEMPFILENUM, BUFFER, LENGTH)
if (ccode()) 10,30,20
10 print *, 'FREAD error on TEMPFILE'
call QUIT (10)
20 EOF = .true.
30 continue
do while ( .not. EOF)
BUFFER(40:40) = '*'
call HPSORTINPUT (STATUS, BUFFER, LENGTH)
if (STATUS .ne. 0) then
MESSAGE = ' '
call HPSORTERRORMESS (STATUS, MESSAGE, LENGTH)
print *, MESSAGE
endif
C Read the next record. CCG indicates EOF has been found.
LNGTH = FREAD (TEMPFILENUM, BUFFER, LENGTH)
if (ccode()) 40,60,50
40 print *, 'FREAD error on TEMPFILE'
call QUIT (40)
50 EOF = .true.
60 continue
end do
C Now read PERMEMP, as explained above.
EOF = .false.
LNGTH = FREAD (PERMFILENUM, BUFFER, LENGTH)
if (ccode()) 70,90,80
Example D-3. SORTREC_INPUT Program, continued
70 print *, 'FREAD error on PERMEMP.'
call QUIT (70)
80 EOF = .true.
90 continue
do while (.not. EOF)
call HPSORTINPUT (STATUS, BUFFER, LENGTH)
if (STATUS .ne. 0) then
MESSAGE = ' '
call HPSORTERRORMESS (STATUS, MESSAGE, LENGTH)
print *, MESSAGE
endif
LNGTH = FREAD (PERMFILENUM, BUFFER, LENGTH)
if (ccode()) 100,120,110
100 print *, 'FREAD error on PERMEMP'
call QUIT (100)
110 EOF = .true.
120 continue
end do
call HPSORTEND (STATUS)
if (STATUS .ne. 0) then
MESSAGE = ' '
call HPSORTERRORMESS (STATUS, MESSAGE, LENGTH)
print *,MESSAGE
endif
return
end
C
subroutine CLOSE_FILES
C
system intrinsic FCLOSE
C
integer*2 DISPOSITION
2 ,SECURITYCODE
C
integer TEMPFILENUM
2 ,PERMFILENUM
3 ,OUTFILENUM
4 ,STATUS
Example D-3. SORTREC_INPUT Program, continued
C
common /PARMS/ TEMPFILENUM, PERMFILENUM
2 ,OUTFILENUM, STATUS
C
DISPOSITION = 0
SECURITYCODE = 0
C
call FCLOSE (TEMPFILENUM, DISPOSITION, SECURITYCODE)
call FCLOSE (PERMFILENUM, DISPOSITION, SECURITYCODE)
DISPOSITION = 1
call FCLOSE (OUTFILENUM, DISPOSITION, SECURITYCODE)
return
end
When this program is executed, the output is written to ALLEMP. To view
ALLEMP:
_____________________________________________________________________________
| |
| |
| :print allemp |
| |
| Everett, Joyce *000029 10/19/87 |
| Gangley, Tomas *000003 06/06/87 |
| Jackson, Jonathan 000006 06/06/87 |
| Jackson, Rosa 000022 08/15/87 |
| Jones, Eliza 000001 06/06/87 |
| Rields, Evelyn *000007 07/12/87 |
| Smith, James 000005 06/06/87 |
| Washington, Lois 000014 07/23/87 |
| |
_____________________________________________________________________________
MPE/iX 5.0 Documentation