MainframeSupports
tip uge 46/2011:

Hvis du nogensinde har stået i en situation, hvor du kunne tænke dig at få fat på et timestamp i DB2-format, men uden at skulle kalde DB2, så er denne uges tip lige noget for dig. Det følgende assembler program kaldet TMSTMP kan kaldes fra COBOL eller PL/I og returnerer et timestamp i DB2-format. Programmet er reentrant og kan dermed bruges i CICS programmer. Det vil også fortsætte med at virke korrekt efter den 7. september 2042, hvor det oprindelige tidsformat kaldet TOD wrapper rundt:

* NAME      : TMSTMP
* FUNCTION  : THIS SUBROUTINE RETURNS A LOCAL TIMESTAMP IN DB2 FORMAT.
* CALL CBL  : CALL TMSTMP USING TIMESTMP
* CALL PLI  : CALL TMSTMP(TIMESTMP)
* REMARKS   : PROGRAM IS FULLY REENTRANT.
* PARAMETERS: THE PARAMETERS PASSED TO THIS SUBROUTINE ARE DEFINED AS
*             FOLLOWS:
* TIMESTMP   DS   CL32    THE STORAGE WHERE THE TIMESTAMP IS STORED
*                         IN THE FIRST 26 BYTES AND THE REMAINING
*                         6 BYTES ARE USED AS WORK AREA.
*
* REG-15 WILL CONTAIN THE FOLLOWING RETURN CODE:
* 0:   TIMESTAMP WAS SUCCESSFULLY RETRIEVED
* IN THE FOLLOWING COMMENTS TIMESTMP FORMAT=YYYY-MM-DD-TT.MI.SS.ABCDEF
TMSTMP   CSECT                          MY NAME IS ...
TMSTMP   AMODE ANY                      I CAN LIVE IN HEAVEN..
TMSTMP   RMODE ANY                      ..OR THAT OTHER PLACE
         BAKR  R14,0                    ESA STYLE SAVE
         BASR  R12,0                    ADDRESS THIS CSECT
         USING *,R12                    AH .. ADDRESSABILITY
         L     R2,0(R1)                 R2->TIMESTMP
         TIME  DEC,(R2),ZONE=LT,LINKAGE=SYSTEM,MF=(E,(R2)),            X
               DATETYPE=YYYYMMDD
         UNPK  13(13,R2),0(7,R2)        D2C OF TIME-PORTION
         L     R3,8(R2)                 MOVE DATE-PORTION ...
         ST    R3,9(R2)                 ... ONE BYTE TO THE RIGHT
         UNPK  0(9,R2),9(5,R2)          D2C OF DATE-PORTION
         LH    R3,4(R2)                 R3=MM
         LH    R4,6(R2)                 R4=DD
         MVI   4(R2),C'-'               PUT DASH AFTER YYYY
         STH   R3,5(R2)                 PUT MM IN CORRECT POSITION
         MVI   7(R2),C'-'               PUT DASH AFTER MM
         STH   R4,8(R2)                 PUT DD IN CORRECT POSITION
         MVI   10(R2),C'-'              PUT DASH AFTER DD
         MVC   11(2,R2),13(R2)          MOVE TT TO CORRECT POSITION
         MVI   13(R2),C'.'              PUT DOT AFTER T
         MVC   14(2,R2),15(R2)          MOVE MI TO CORRECT POSITION
         MVI   16(R2),C'.'              PUT DOT AFTER MI
         L     R3,19(R2)                R3=ABCD
         LH    R4,23(R2)                R4=EF
         MVI   19(R2),C'.'              PUT DOT AFTER SS
         ST    R3,20(R2)                MOVE ABCD TO CORRECT POSITION
         STH   R4,24(R2)                MOVE EF TO CORRECT POSITION
         SR    R15,R15                  RC=0
TMSTMPR  EQU   *
         PR                             RETURN TO CALLER
         LTORG
         YREGS
         END

Jeg har forsøgt at kommentere programmet efter bedste evne. Det vigtigste er, at når du kalder det fra COBOL eller PL/I, så skal du kalde det med et areal på 32 bytes, hvor selve timestampet kommer til at stå i de første 26 bytes. De sidste 6 bytes bruges af TIME macroen som arbejdsareal. Jeg kunne godt have lavet programmet, så du kun skulle kalde det med 26 bytes, men så skulle programmet have allokeret et arbejdsareal til TIME macroen. Det ville komplicere programmet og gøre det en anelse langsommere.

Hvis du hellere vil kalde med 26 bytes, så lav et program i COBOL eller PL/I, som kun kaldes med 26 bytes. I dette program laver du en lokal variabel på 32 bytes, som du så kalder videre med til ovenstående program. Når programmet får timestampet tilbage flytter det de første 26 bytes over i programmets egen parameter areal på 26 bytes.

Ovenstående assembler program returnerer et timestamp med den lokale tid (ZONE=LT på TIME macroen). Hvis du hellere vil have GMT tiden, så skal du i stedet skrive ZONE=GMT.

Forrige danske tip        Last tip in english        Tip oversigten