HP 3000 Manuals

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