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