Running PH from Cobol

Tim Ericson tericson@denkor.com
Thu, 17 Feb 2000 12:00:20 -0800


Hi,

Since I wrote...

> Qdesign screens from COBOL are okay, but it's much more effecient
> if a Qdesign screen can run the COBOL program (because COBOL can
> be suspended from within Quick, and then re-activated, picking
> up just where it left off, without having to re-open any files)
> If you'd like a sample of that (developed from old "Cognos Tech
> News" articles), let me know and I'll forward it.

I've received a couple requests for this sample, so here's the
whole thing, sending and receiving CI variables from a Quick
screen to an MPE/iX COBOL program and the other way around, plus
calling and suspending an MPE/iX COBOL program from a Quick
screen:

In COBOL:
......
 SPECIAL-NAMES.
     CONDITION-CODE IS COND-CODE.
......
     02  THRU-DATE-INTEGER         PIC S9(09) COMP.
     02  DISPLAY-NUMERIC           PIC  9(08).
     02  RECORD-COUNT              PIC  9(04).
     02  COUNT-DISPLAY
         REDEFINES RECORD-COUNT    PIC  X(04).
     02  STATUS-RETURNED           PIC S9(09) COMP.
     02  STATUS-REDEFINED REDEFINES STATUS-RETURNED.
         03  STATUS-INFO           PIC S9(04) COMP.
         03  STATUS-SUBSYS         PIC S9(04) COMP.
     02  STRING-LENGTH             PIC  9(09) COMP.
     02  STRING-VALUE              PIC  9(09) COMP.
     02  VARIABLE-NAME             PIC  X(16).
......
 01-LOOP-POINT.

     MOVE "THRU_DATE" TO VARIABLE-NAME.
     MOVE 1 TO STRING-VALUE.
     CALL INTRINSIC "HPCIGETVAR"
         USING VARIABLE-NAME, STATUS-RETURNED,
             STRING-VALUE, THRU-DATE-INTEGER.
     IF STATUS-RETURNED <> ZERO
        DISPLAY "HPCIGETVAR 'THRU_DATE' failed in PROGRAM1."
        GO TO 01-STOP-RUN.

     MOVE "PLACE" TO VARIABLE-NAME.
     MOVE 2 TO STRING-VALUE.
     CALL INTRINSIC "HPCIGETVAR"
         USING VARIABLE-NAME, STATUS-RETURNED,
             STRING-VALUE, PLACE-HOLD.
     IF STATUS-RETURNED <> ZERO
        DISPLAY "HPCIGETVAR 'PLACE' failed in PROGRAM1
        GO TO 01-STOP-RUN.

     MOVE 0 TO RECORD-COUNT.
     PERFORM 50-PROCESS-RECORDS THRU 50-EXIT.

     MOVE "RECORD_COUNT" TO VARIABLE-NAME.
     MOVE 2 TO STRING-VALUE.
     MOVE 4 TO STRING-LENGTH.
     CALL INTRINSIC "HPCIPUTVAR"
         USING VARIABLE-NAME, STATUS-RETURNED,
             STRING-VALUE, COUNT-DISPLAY,
             11, STRING-LENGTH.                     
     IF STATUS-RETURNED <> ZERO
        DISPLAY "HPCIPUTVAR 'RECORD_COUNT' failed in PROGRAM1."
        COMPUTE DISPLAY-NUMERIC = STATUS-INFO
        DISPLAY "STATUS-INFO   = ", DISPLAY-NUMERIC
        COMPUTE DISPLAY-NUMERIC = STATUS-SUBSYS
        DISPLAY "STATUS-SUBSYS = ", DISPLAY-NUMERIC
        DISPLAY "RECORD-COUNT    ", RECORD-COUNT
        DISPLAY "      -DISPLAY  ", COUNT-DISPLAY
        GO TO 01-STOP-RUN.

     CALL INTRINSIC "ACTIVATE" USING ZERO.
     IF COND-CODE <> ZERO
        DISPLAY "The ACTIVATE intrinsic failed in PROGRAM1."
        GO TO 01-STOP-RUN.

     CALL INTRINSIC "SUSPEND" USING 1.
     IF COND-CODE <> ZERO
        DISPLAY "The SUSPEND intrinsic failed in PROGRAM1."
        GO TO 01-STOP-RUN.

     GO TO 01-LOOP-POINT.
......

In Qdesign:
......
TEMPORARY PASS-THRU-DATE CHARACTER * 8  RESET AT STARTUP
TEMPORARY PASS-PLACE     CHARACTER * 2  RESET AT STARTUP
TEMPORARY CHILD          INTEGER SIZE 2 INITIAL 0   RESET AT STARTUP
TEMPORARY COMMAND-STMT   CHARACTER * 80 INITIAL " " RESET AT STARTUP
TEMPORARY PROGRAM-NAME   CHARACTER * 34 INITIAL " " RESET AT STARTUP
TEMPORARY PROGRAM-PIN    INTEGER SIZE 2 INITIAL 0   RESET AT STARTUP
TEMPORARY RECORD-COUNT   NUMERIC * 4    INITIAL 0   RESET AT STARTUP
......
;*************************************************************
PROCEDURE INTERNAL RUN-PROGRAM
  BEGIN

    IF PROGRAM-PIN = 0
      THEN BEGIN
        LET CHILD = NCONVERT ( GETSYSTEMVAL ( "CHILD" ) ) + 1
        LET COMMAND-STMT = "RUN " + PROGRAM-NAME
        RUN COMMAND COMMAND-STMT ON ERROR CONTINUE
        DO EXTERNAL NM "getpin" (CHILD, PROGRAM-PIN)
        IF NOT SETSYSTEMVAL ( "CHILD", ASCII ( CHILD ) )
          THEN INFO = "SETSYSTEMVAL failed in RUN-PROGRAM." NOW
          ELSE NULL
      END
      ELSE BEGIN
        DO EXTERNAL NM "activate" (PROGRAM-PIN)
    END

  END                  
;*************************************************************
......
    IF NOT SETSYSTEMVAL &
      ( "THRU_DATE", PASS-THRU-DATE )
      THEN INFORMATION = "SETSYSTEMVAL failed in REGEN." NOW
      ELSE NULL
    IF NOT SETSYSTEMVAL &
      ( "PLACE", PASS-PLACE )
      THEN INFORMATION = "SETSYSTEMVAL failed in REGEN." NOW
      ELSE BEGIN
        LET PROGRAM-NAME = "PROGRAM1.OBJ.COBOL"
        LET PROGRAM-PIN  = &
          NCONVERT ( GETSYSTEMVAL ( "PROGRAM1_PIN" ) )
        DO INTERNAL RUN-PROGRAM
        LET RECORD-COUNT  = &
          NCONVERT ( GETSYSTEMVAL ( "RECORD_COUNT" ) )
        IF NOT SETSYSTEMVAL &
          ( "PROGRAM1_PIN", ASCII ( PROGRAM-PIN ) )
          THEN INFORMATION = "SETSYSTEMVAL failed in REGEN." NOW
          ELSE NULL
      END
......

Cheers!

 +-------------------------------------------------------------------+
  My mind is my own, as are my ideas and opinions.
  My heart, body, and soul, however, all belong to others.       Tim.
 +-------------------------------------------------------------------+
  Tim Ericson            tericson      DenKor Dental Management Corp.
  Sr. Systems Analyst     at denkor    503-526-4440 (my direct number)
    (& Systems Manager)     dot com         http://www.denkor.com
  Programming HP3000s since 1983!      Quality dental care since 1970!
 +-------------------------------------------------------------------+
  UDCs and Command Files:  http://www.denkor.com/hp3000/command_files
 +-------------------------------------------------------------------+



= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Subscribe: "subscribe powerh-l" in message body to majordomo@lists.swau.edu
Unsubscribe: "unsubscribe powerh-l" in message to majordomo@lists.swau.edu
This list is closed, thus to post to the list, you must be a subscriber.