MainframeSupports
tip uge 40/2010:

En af de informationer, der ikke er tilgængelig i hverken COBOL eller PL/I, er userid'et. DB2 stiller det til rådighed via USER special register, REXX har funktionen USERID() og under CICS får du fat i det med en EXEC CICS ASSIGN USERID(variabel-navn). Så COBOL eller PL/I kan jo så enten skaffe et userid ved at spørge DB2 eller CICS, men hvad nu hvis ens program hverken har adgang til CICS eller DB2? Tja, så kan du i COBOL gøre således:

DATA DIVISION.
WORKING-STORAGE SECTION.
01  PSA-POINTER POINTER.
01  USERID PIC X(8).
LINKAGE SECTION.
01  PSA.
  02  FILLER PIC X(548).
  02  ASCB-POINTER POINTER.
01  ASCB.
  02  FILLER PIC X(108).
  02  ASXB-POINTER POINTER.
01  ASXB.
  02  FILLER PIC X(192).
  02  ASUSER PIC X(8).
PROCEDURE DIVISION.
...
SET PSA-POINTER TO NULL
SET ADDRESS OF PSA TO PSA-POINTER
SET ADDRESS OF ASCB TO ASCB-POINTER
SET ADDRESS OF ASXB TO ASXB-POINTER
MOVE ASUSER TO USERID
DISPLAY 'ADDRESS SPACE USERID = ' USERID
...

I PL/I kan det kodes som en funktion sådan her:

userid: PROC RETURNS(CHAR(8));

  DCL psa_address FIXED BIN(31) INIT(0);
  DCL psa_pointer POINTER BASED(ADDR(psa_address));
  DCL 1 psa BASED(psa_pointer)
    , 2 filler CHAR(548)
    , 2 ascb_pointer POINTER
    ;
  DCL 1 ascb BASED(ascb_pointer)
    , 2 filler CHAR(108)
    , 2 asxb_pointer POINTER
    ;
  DCL 1 asxb BASED(asxb_pointer)
    , 2 filler CHAR(192)
    , 2 username CHAR(8)
    ;

  RETURN(asxb.username);

END userid;

Ovenstående kodestumper vil under TSO returnere TSO user'ens userid. I batch returneres userid for den, der submittede jobbet, eller userid angivet på jobkortet. Under CICS returneres det userid, som CICS-systemet startes med og altså ikke det userid, som transaktionen afvikles under. Hvis du vil have transaktionens userid, er du nødt til at anvende EXEC CICS ASSIGN USERID.

Forrige danske tip        Last tip in english        Tip oversigten