USER-DEFINED PROCEDURES [ QUERY/V Reference Manual ] MPE/iX 5.0 Documentation
QUERY/V Reference Manual
Appendix F USER-DEFINED PROCEDURES
This appendix documents a feature of the QUERY subsystem which is used
primarily by the programmer or data base administrator. QUERY allows you
to specify your own procedure(s) which will enable a report to read or
write from another data base, data set, or file, modify registers, or
perform other specialized tasks not provided by QUERY. The name of the
user-defined procedure cannot be the name of any data item in the data
sets referenced by the retrieval command.
User-defined procedures can be called from either a header, group, total,
or detail statement within the REPORT command, and can be written in SPL,
COBOL, FORTRAN or PASCAL. Note that programming errors in user-defined
procedures will cause QUERY to terminate. The procedure must be stored
in one of the segmented libraries. These libraries are searched in the
following order:
group
account
system
To call your defined procedure, replace the print element with the name
of the procedure, and replace the print position with a slash (/).
Seventeen parameters are automatically passed to the procedure by QUERY.
You may provide a single integer parameter for each procedure. To
specify a value for a particular call of the procedure, the value should
be placed in parenthesis after the name of the procedure.
report statement type,procedure name [(user parameter)],/,[statement
parameter]
The following statement parameters are allowed with a REPORT statement
containing a call to a user-defined procedure:
SPACE A
SPACE B
SKIP A
SKIP B
For example:
REPORT
H1,PROC1(5),/,SPACE A3
H1,ITEM3,50
D1,PROC2,/
D1,ITEM1,10
D2,ITEM2,10
END
The following is not allowed:
EDIT masks
ADD
AVERAGE
COUNT
If you specify an option that is not allowed, QUERY will issue the
following message.
A SPECIFIED OPTION IS NOT ALLOWED FOR USER PROCEDURES
There are eight parameters that you can set. These are: CALLAGAIN,
PAGE'EJECT, LINEBUF, REGARR, USERSTOR, USERPARAM, DATA'BASE'NAME, and
DATA'SET'NAME. The other nine parameters are values returned by QUERY.
Within your procedure, you must declare parameters with the same or
different names in the following order:
LOGICAL CALLAGAIN, 1 word
PAGE'EJECT; 1 word
INTEGER ARRAY BASE'IDS, 130 words
DBBUF, 2051 words
DSET'LIST 53 words
DATA'BASE'LIST 53 words
LINEBUF, 69 words
REGARR, 150 words
USERSTOR, 64 words
USERPARAM, 1 word
DATA'BASE'NAME, 13 words
DATA'SET'NAME, 8 words
INTEGER CALL'NUM, 1 word
LINES'LEFT, 1 word
PAGENO, 1 word
NUM'DSETS 1 word
NUM'DBASES; 1 word
* The following parameters can be set by you.
Parameters
*CALLAGAIN is a flag telling QUERY to call this procedure
again. QUERY will stop calling the procedure only
when this parameter is returned FALSE. This flag
is for the particular report statement being
processed. For example, if D1,PROC,/ + CALLAGAIN
= T, then the procedure will be called again from
this detail statement until CALLAGAIN is set to
false. The default value is FALSE.
*PAGE'EJECT is a flag telling QUERY to perform a page eject
upon return. If you determine by the LINES'LEFT
parameter that there are not enough lines left on
the page to perform the desired task, you can
assign TRUE to this parameter. In this case the
CALLAGAIN parameter may also be returned and the
procedure will be executed on the new page
following headers (if any). This parameter can
also be used if a page eject is desired after
execution. The default value is FALSE.
BASE'IDS is the data base name of the data base(s)
currently being accessed. Each base id is 26
bytes (13 words) long for a total of 10 base id's.
Each name is preceded by the BASE'ID number (1
word) assigned by IMAGE.
DBBUF is an array which holds the values of the data
items to which you have access for a specific data
set for the current entry or compound entry being
output. The values of the data set are placed in
DBBUF as follows:
If the FIND command, or a SUBSET of a FIND
command, was used to select the entries for
reporting, then the data set that the FIND or
SUBSET command referenced will be used.
If the MULTIFIND command or a SUBSET of a
MULTIFIND was used, then the first data set
mentioned in the JOIN command is used.
The length of the entry being passed to you is
placed in the last word of this array (word 2051).
If the entry is a null entry, from a MULTIFIND
following a join containing an @ sign, this length
will be set to zero and DBBUF will be filled with
ASCII nulls.
If you want a different entry from any data set
mentioned in the FIND, SUBSET, or JOIN command,
set the DATA'BASE'NAME and DATA'SET'NAME
parameters with the appropriate names and set the
CALLAGAIN parameter to TRUE. The items from the
desired data set will be returned to your
procedure from QUERY.
DSET'LIST contains the data set numbers of those data sets
accessed by the FIND, MULTIFIND, or SUBSET
command.
DATA'BASE'LIST contains the position of the data base name in the
parameter BASE'IDS for the corresponding entry in
the parameter DSET'LIST. For example:
A zero (0) in DATA'BASE'LIST(2) means that the
data set in DSET'LIST(2) belongs to the first
database named in BASE'IDS.
*LINEBUF is the buffer that QUERY uses to build each line
of REPORT. For each line of output that is
generated, those statements corresponding to that
line which contain a print element or which call a
user procedure that modifies LINEBUF, operate
cummulatively on LINEBUF to create the line of
output. If LINEBUF has been changed by the
procedure, it will print when all report
statements of that level have been processed.
(For example, it will be printed when all D1
statements have been processed.)
*REGARR contains the 30 registers, with 5 words allocated
for each register. You must know the types of the
registers that you access. The types used by
QUERY are:
P20: uses all five words (right-justified)
R2: uses the leftmost 2 words (left-justified)
R4: uses the leftmost 4 words (left-justified)
The section on registers in the REPORT command
description explains how QUERY determines the type
of a register.
*USERSTOR is a global scratch area for user data which is
shared by all of your procedures that are
referenced in any one report. Not initialized.
*USERPARAM is where the value of your parameter is stored.
One use of this parameter might be to indicate
where in the output buffer to place the value.
(For example, D1,PROC,/;D1,PROC (20),/;...)
*DATA'BASE'NAME is set with the correct data base name if data
item values are needed from a data set(s) other
than the default data set(s), (see above parameter
DBBUF) or data item values are needed for data
items not mentioned in the report. The name
should be upper case, left-justified and, if
necessary, qualified with group and account. The
rest of the array should be filled with blanks.
The parameter DATA'SET'NAME must also be set. If
the specified name is invalid, QUERY will give the
message:
NO RETRIEVAL WAS MADE FROM THE DATA BASE XX,
WHICH WAS NAMED IN A USER PROCEDURE.
*DATA'SET'NAME is set with the correct data set name if data item
values are needed from a data set(s) other than
the default data set(s), (see above parameter
DBBUF), or data item values are needed of a data
items other than those mentioned in the report.
The name should be upper case and left-justified
and the rest of the array should be filled with
blanks. The parameter DATA'BASE'NAME must also be
set. If the specified name is invalid, QUERY will
give the following error message:
THE DATA SET XX, NAMED IN A USER PROCEDURE,
IS NOT IN DATA BASE YY
CALL'NUM is the number of times that a procedure has been
called from the same level of report statements.
The first time the procedure is called the number
will be 1. CALL'NUM is reset to 1 after all the
report statements of a particular level are
processed. For example (assume CALLAGAIN is
always FALSE):
D1,PROC1,1 << call'num = 1 >>
D1,PROC2,1 << call'num = 2 >>
D1,ITEM,10
D2,ITEM,10
D2,PROC3,1 << call'num = 1 >>
LINES-LEFT is the number of lines that are left on the page.
PAGENO tells which page is currently being output.
NUM'DSETS is the number of data sets that are accessed by
REPORT.
NUM'DBASES is the number of data bases open by the current
user of QUERY.
Examples
The following examples show two user-defined procedures: MPROC and
QPROC. MPROC is shown in four languages and QPROC is shown in two
languages.
MPROC Procedure
The following examples show MPROC in SPL, COBOL, PASCAL and FORTRAN. The
data base, retrieval, and report are shown for understanding the context
of the use of the procedure.
The data base is defined as follows:
BEGIN DATA BASE ACCTS;
PASSWORDS:
ITEMS:
ACCT-NUM, X6;
ORDER-DATE, I2; << DATES ARE STORED AS DOUBLE INTEGERS, >>
SHIP-DATE, I2; << IE 84140 IS 1984, 140TH DAY IN YEAR >>
DEPT, U4;
CARRIER, U4;
SETS:
NAME: ACCT-MAST, A;
ENTRY: ACCT-NUM (2);
CAPACITY: 11;
NAME: ORDER-D, D;
ENTRY: ACCT-NUM (!ACCT-MAST),
ORDER-DATE,
DEPT;
CAPACITY: 11;
NAME: SHIP-D, D;
ENTRY: ACCT-NUM (!ACCT-MAST),
CARRIER,
SHIP-DATE;
CAPACITY: 11;
END.
The retrieval and report are defined as follows:
>JOIN ORDER-D.ACCT-NUM TO SHIP-D.ACCT-NUM
>MU ALL
USING SERIAL READ
14 COMPOUND ENTRIES RETRIEVED
>XEQ MULTIREP
The XEQ file, MULTIREP, contains:
REPORT
H1,"REPORT ON ALL ACCOUNT DATES",45,SPACE A2
H2,"ACCOUNT",8
H2,"DEPT",14
H2,"DATE OF ORDER",35
H2,"SHIPPING DATE",55
H2,"CARRIER",65
H3,"-------",8
H3,"----",14
H3,"-------------",35
H3,"-------------",55,SPACE A2
H3,"-------",65
S1,ORDER-DATE
S2,ACCT-NUM
D1,ACCT-NUM,8,E1
D1,":",9
D1,DEPT,14
D1,CARRIER,65
D1,MPROC,/
G2," ",5
E1,"XXX-XXX"
END
The output is:
___________________________________________________________________________
| |
| REPORT ON ALL ACCOUNT DATES |
| |
| |
| ACCOUNT DEPT DATE OF ORDER SHIPPING DATE CARRIER|
| ------- ---- ------------- ------------- -------|
| |
| |
| 010-666: 008 WED, DEC 5, 1984 THU, DEC 27, 1984 UPS |
| 010-666: 008 WED, DEC 5, 1984 THU, DEC 27, 1984 UPS |
| 010-666: 008 WED, DEC 5, 1984 THU, DEC 27, 1984 UPS |
| 010-666: 008 WED, DEC 12, 1984 THU, DEC 27, 1984 UPS |
| 010-666: 008 WED, DEC 12, 1984 THU, DEC 27, 1984 UPS |
| 010-666: 008 WED, DEC 12, 1984 THU, DEC 27, 1984 UPS |
| 010-666: 008 WED, DEC 26, 1984 THU, DEC 27, 1984 UPS |
| 010-666: 008 WED, DEC 26, 1984 THU, DEC 27, 1984 UPS |
| 010-666: 008 WED, DEC 26, 1984 THU, DEC 27, 1984 UPS |
| |
| 041-321: 003 WED, DEC 12, 1984 THU, DEC 13, 1984 UPS |
| |
| 055-433: 005 FRI, DEC 14, 1984 FRI, DEC 28, 1984 UPS |
| 055-433: 005 FRI, DEC 14, 1984 FRI, DEC 28, 1984 UPS |
| 055-433: 005 WED, DEC 26, 1984 FRI, DEC 28, 1984 UPS |
| 055-433: 005 WED, DEC 26, 1984 FRI, DEC 28, 1984 UPS |
___________________________________________________________________________
SPL - MPROC Procedure
<<------------------------------------------------------->>
<< HAVING USLINIT AND SUBPROGRAM WILL GENERATE A WARNING,>>
<< YOU WILL NOT WANT TO INITIALIZE THE USL FILE IF YOU >>
<< ARE COMPILING DIFFERENT SUBPROGRAMS INTO IT. >>
<<------------------------------------------------------->>
$CONTROL MAP, USLINIT, SUBPROGRAM
$CONTROL SEGMENT=MULTISEG
<<------------------------------------------------------>>
<< >>
<< MPROC >>
<< >>
<< EXAMPLE OF A SPL USER-DEFINED PROCEDURE, USED WITH A >>
<< REPORT STATEMENT. >>
<< >>
<<------------------------------------------------------>>
<< THIS PROCEDURE TAKES A JULIAN DATE AND CONVERTS IT >>
<< TO "DAY, MONTH, YEAR" FORMAT BY CALLING THE MPE >>
<< INTRINSIC FMTCALENDAR. >>
<<------------------------------------------------------>>
BEGIN
<<------------------------------------------>>
<< MPROC DECLARATION >>
<<------------------------------------------>>
PROCEDURE MPROC (CALLAGAIN, PAGE'EJECT, BASE'IDS, DBBUF,
DSET'LIST, DATA'BASE'LIST, LINEBUF, REGARR,
USERSTOR, USERPARAM, DATA'BASE'NAME,
DATA'SET'NAME, CALL'NUM, LINES'LEFT, PAGENO,
NUM'DSETS, NUM'DBASES);
LOGICAL CALLAGAIN, PAGE'EJECT;
INTEGER ARRAY BASE'IDS, DBBUF, DSET'LIST, DATA'BASE'LIST,
LINEBUF, REGARR, USERSTOR, USERPARAM,
DATA'BASE'NAME, DATA'SET'NAME;
INTEGER CALL'NUM, LINES'LEFT, PAGENO, NUM'DSETS, NUM'DBASES;
BEGIN
BYTE ARRAY FMTDATE (0:16),
BLINEBUF (*) = LINEBUF;
DOUBLE POINTER D'DATE;
SPL - MPROC Procedure (Continued)
DOUBLE ARRAY D'DAY (0:0),
D'YEAR (0:0);
INTEGER ARRAY DAY (*) = D'DAY,
YEAR (*) = D'YEAR;
DOUBLE HOLD;
INTEGER JDATE;
INTRINSIC FMTCALENDAR;
<<-------------------------------------------------------->>
<< THERE ARE TWO DATES IN THE DATA BASE TO BE FORMATTED. >>
<< ONE IS IN THE ORDER-D DATA SET, THE OTHER IS IN THE >>
<< SHIP-D DATA SET. BECAUSE THE SETS HAVE BEEN JOINED, >>
<< IT IS POSSIBLE TO GET BOTH DATES AND FORMAT THEM. >>
<< NOTE: IT IS THE APPLICATIONS RESPONSIBILITY TO KNOW >>
<< WHERE IN THE DATA BUFFER THE VALUE IS LOCATED. >>
<<-------------------------------------------------------->>
<<-------------------------------------------------------->>
<< THE DATE IS IN A TWO WORD INTEGER AND NEEDS TO BE RE- >>
<< FORMATTED BEFORE PASSING TO FMTCALENDAR. >>
<<-------------------------------------------------------->>
<<-------------------------------------------------------->>
<< IF CALL'NUM IS ONE THEN WE CAN ASSUME THE ENTRY IS >>
<< FROM THE ORDER-D DATA SET, SINCE IT IS THE FIRST DATA >>
<< SET MENTIONED IN THE JOIN COMMAND. IF CALL'NUM IS NOT >>
<< ONE THEN WE CAN ASSUME THAT THE PROCEDURE HAS BEEN >>
<< CALLED AGAIN, AND WE NOW HAVE THE ENTRY FROM THE >>
<< SHIP-D DATA SET. >>
<<-------------------------------------------------------->>
IF CALL'NUM =1 THEN << FIRST DATE >>
@D'DATE := @DBBUF(3)
ELSE << SECOND DATE >>
@D'DATE := @DBBUF(5);
D'YEAR := D'DATE / 1000D; << ISOLATE YEAR >>
HOLD := D'YEAR * 1000D;
D'DAY := D'DATE - HOLD;
JDATE := DAY (1); << DAY IN BITS 0-6 >>
JDATE.(0:7) := YEAR (1); << YEAR IN BITS 7-15 >>
FMTCALENDAR (JDATE, FMTDATE);
SPL - MPROC Procedure (Continued)
<<-------------------------------------------------------->>
<< PUT THE FORMATTED DATE INTO THE OUTPUT BUFFER USED BY >>
<< QUERY FOR THE REPORT OUTPUT LINE. AGAIN, CALL'NUM IS >>
<< USED TO DETERMINE WHERE IN THE OUTPUT BUFFER TO PLACE >>
<< THE VALUE. ALSO, IF CALL'NUM IS ONE THEN WE NEED TO >>
<< SET THE DATA BASE NAME, THE DATA SET NAME, AND THE >>
<< CALLAGAIN PARAMETERS IN ORDER TO GET THE ENTRY FROM >>
<< THE SHIP-D DATA SET TO FORMAT THE SHIPPING DATE. >>
<<-------------------------------------------------------->>
IF CALL'NUM = 1 THEN << ORDER-D DATA SET >>
BEGIN
MOVE BLINEBUF(18) := FMTDATE, (17);
MOVE DATA'BASE'NAME := "ACCTS ";
MOVE DATA'SET'NAME := "SHIP-D ";
CALLAGAIN := TRUE;
END
ELSE << SHIP-D DATA SET >>
BEGIN
MOVE BLINEBUF(38) := FMTDATE, (17);
CALLAGAIN := FALSE;
END;
END;
END.
COBOL - MPROC Procedure
$CONTROL USLINIT, SUBPROGRAM, MAP, DYNAMIC
IDENTIFICATION DIVISION.
PROGRAM-ID. MPROC.
AUTHOR. HP.
*------------------------------------------------------*
* *
* MPROC *
* *
* EXAMPLE OF A COBOL USER-DEFINED PROCEDURE, USED WITH *
* A REPORT STATEMENT. *
* *
* THIS MUST BE COMPILED WITH THE COBOLII COMPILIER. *
* *
*------------------------------------------------------*
* THIS PROCEDURE TAKES A JULIAN DATE AND CONVERTS IT *
* TO "DAY, MONTH, YEAR" FORMAT BY CALLING THE MPE *
* INTRINSIC FMTCALENDAR. *
*------------------------------------------------------*
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FMTDATE-REC.
05 FMTDATE OCCURS 17 PIC X.
01 I-DAY PIC S9(4) COMP.
01 YEAR PIC S9(4) COMP.
01 HOLD PIC S9(9) COMP.
01 D-JDATE PIC S9(9) COMP.
01 JDATE REDEFINES D-JDATE.
05 I-JDATE OCCURS 2 PIC S9(4) COMP.
01 INDX PIC S9(4) COMP.
LINKAGE SECTION.
01 CALLAGAIN PIC S9(4) COMP.
01 PAGE-EJECT PIC S9(4) COMP.
01 BASE-IDS.
05 BASE-ID1 PIC S9(4) COMP.
05 BASE-NAME1 PIC X(24).
05 BASE-ID2 PIC S9(4) COMP.
COBOL - MPROC Procedure (Continued)
05 BASE-NAME2 PIC X(24).
05 BASE-ID-OTHERS PIC X(208).
01 DBBUF PIC X(4102).
01 DBBUF-2 REDEFINES DBBUF.
05 FILLER PIC X(6).
05 DBBUFD OCCURS 2 PIC S9(9) COMP.
05 FILLER PIC X(4088).
01 DSET-LIST.
05 DSET OCCURS 100 TIMES PIC S9(4) COMP.
01 DATA-BASE-LIST.
05 DBASE OCCURS 100 TIMES PIC S9(4) COMP.
01 LINEBUF.
05 LINEBUF-70 PIC X(70).
05 LINEBUF-OTHER PIC X(66).
01 BLINEBUF1 REDEFINES LINEBUF.
05 FILLER PIC X(18).
05 BA-LINEBUF1 PIC X(17).
05 FILLER PIC X(101).
01 BLINEBUF2 REDEFINES LINEBUF.
05 FILLER PIC X(38).
05 BA-LINEBUF2 PIC X(17).
05 FILLER PIC X(81).
01 REGARR.
05 REG OCCURS 30 TIMES PIC S9(18) COMP-3.
01 USERSTOR.
05 USERSTOR-70 PIC X(70).
05 USERSTOR-OTHER PIC X(58).
01 USERPARAM PIC S9(4) COMP.
01 DATA-BASE-NAME PIC X(26).
01 DATA-SET-NAME PIC X(16).
01 CALL-NUM PIC S9(4) COMP.
01 LINES-LEFT PIC S9(4) COMP.
01 PAGENO PIC S9(4) COMP.
01 NUM-DSETS PIC S9(4) COMP.
01 NUM-DBASES PIC S9(4) COMP.
*---------------------------------------------------------*
* MPROC PROCEDURE DIVISION *
*---------------------------------------------------------*
PROCEDURE DIVISION USING CALLAGAIN, PAGE-EJECT, BASE-IDS,
DBBUF, DSET-LIST, DATA-BASE-LIST, LINEBUF, REGARR,
USERSTOR, USERPARAM, DATA-BASE-NAME, DATA-SET-NAME,
CALL-NUM, LINES-LEFT, PAGENO, NUM-DSETS, NUM-DBASES.
COBOL - MPROC Procedure (Continued)
BEGIN-MPROC.
*--------------------------------------------------------*
* THERE ARE TWO DATES IN THE DATA BASE TO BE FORMATTED. *
* ONE IS IN THE ORDER-D DATA SET, THE OTHER IS IN THE *
* SHIP-D DATA SET. BECAUSE THE SETS HAVE BEEN JOINED, *
* IT IS POSSIBLE TO GET BOTH DATES AND FORMAT THEM. *
* NOTE: IT IS THE APPLICATIONS RESPONSIBILITY TO KNOW *
* WHERE IN THE DATA BUFFER THE VALUE IS LOCATED. *
*--------------------------------------------------------*
*--------------------------------------------------------*
* THE DATE IS IN A TWO WORD INTEGER AND NEEDS TO BE RE- *
* FORMATTED BEFORE PASSING TO FMTCALENDAR. *
*--------------------------------------------------------*
*--------------------------------------------------------*
* IF CALL'NUM IS ONE THEN WE CAN ASSUME THE ENTRY IS *
* FROM THE ORDER-D DATA SET, SINCE IT IS THE FIRST DATA *
* SET MENTIONED IN THE JOIN COMMAND. IF CALL'NUM IS NOT *
* ONE THEN WE CAN ASSUME THAT THE PROCEDURE HAS BEEN *
* CALLED AGAIN, AND WE NOW HAVE THE ENTRY FROM THE *
* SHIP-D DATA SET. *
*--------------------------------------------------------*
IF CALL-NUM = 1 THEN
MOVE 1 TO INDX
ELSE
MOVE 2 TO INDX.
DIVIDE DBBUFD(INDX) BY 1000 GIVING YEAR.
MULTIPLY YEAR BY 1000 GIVING HOLD.
SUBTRACT HOLD FROM DBBUFD(INDX) GIVING I-DAY.
MULTIPLY YEAR BY 512 GIVING D-JDATE.
ADD I-DAY TO D-JDATE.
CALL INTRINSIC "FMTCALENDAR" USING I-JDATE(2), FMTDATE.
*--------------------------------------------------------*
* PUT THE FORMATTED DATE INTO THE OUTPUT BUFFER USED BY *
* QUERY FOR THE REPORT OUTPUT LINE. AGAIN, CALL'NUM IS *
* USED TO DETERMINE WHERE IN THE OUTPUT BUFFER TO PLACE *
* THE VALUE. ALSO, IF CALL'NUM IS ONE THEN WE NEED TO *
* SET THE DATA BASE NAME, THE DATA SET NAME, AND THE *
* CALLAGAIN PARAMETERS IN ORDER TO GET THE ENTRY FROM *
* THE SHIP-D DATA SET TO FORMAT THE SHIPPING DATE. *
*--------------------------------------------------------*
COBOL - MPROC Procedure (Continued)
IF CALL-NUM = 1 THEN
MOVE FMTDATE-REC TO BA-LINEBUF1
MOVE "ACCTS " TO DATA-BASE-NAME
MOVE "SHIP-D " TO DATA-SET-NAME
MOVE 1 TO CALLAGAIN
ELSE
MOVE FMTDATE-REC TO BA-LINEBUF2
MOVE 0 TO CALLAGAIN.
GOBACK.
COBOL Notes
The call to FMTCALENDAR will generate a 'Questionable' error because the
second word of the I-JDATE array is being passed.
PASCAL - MPROC Procedure
(*-------------------------------------------------------*)
(* YOU WILL NOT WANT TO INITIALIZE THE USL FILE IF YOU *)
(* ARE COMPILING DIFFERENT SUBPROGRAMS INTO IT. *)
(*-------------------------------------------------------*)
$CODE_OFFSETS ON; TABLES ON; USLINIT; SUBPROGRAM$
$STANDARD_LEVEL 'HP3000'$
$SEGMENT 'MULTISEG'$
(*------------------------------------------------------*)
(* *)
(* MPROC *)
(* *)
(* EXAMPLE OF A PASCAL USER-DEFINED PROCEDURE, USED *)
(* WITH A REPORT STATEMENT. *)
(* *)
(* THE PROCEDURE CONTAINS COMMENT LINES WHICH ONLY *)
(* CONTAIN A NUMBER. THESE COMMENTS ARE REFERENCES TO *)
(* NOTES ON THE USE OF PASCAL DATA TYPES AND STRUCTURES.*)
(* THE NOTES APPEAR AT THE END OF THE PROCEDURE. *)
(* *)
(*------------------------------------------------------*)
(* THIS PROCEDURE TAKES A JULIAN DATE AND CONVERTS IT *)
(* TO "DAY, MONTH, YEAR" FORMAT BY CALLING THE MPE *)
(* INTRINSIC FMTCALENDAR. *)
(*------------------------------------------------------*)
PROGRAM PASPROC(INPUT,OUTPUT);
TYPE SMALLINT = -32768..32767;
DBBUF_REC = RECORD CASE INTEGER OF (* 1 *)
0 : (DBBUF_CHAR : PACKED ARRAY [1..4102] OF CHAR);
1 : (DBBUF_INT : ARRAY [1..2051] OF SMALLINT);
END;
BASEARRAY = ARRAY [1..130] OF SMALLINT;
LISTARRAY = ARRAY [1..53] OF SMALLINT;
REGARRAY = ARRAY [1..150] OF SMALLINT;
STORARRAY = ARRAY [1..64] OF SMALLINT;
LINEARRAY = RECORD (* 2 *)
BLINEBUF : PACKED ARRAY [1..138] OF CHAR;
END;
DBARRAY = RECORD
BDB_NAME : PACKED ARRAY [1..26] OF CHAR;
END;
DSARRAY = RECORD
BDS_NAME : PACKED ARRAY [1..16] OF CHAR;
END;
MPE/iX 5.0 Documentation