ibmi-brunch-learn

Announcement

Collapse
No announcement yet.

qdate arithmetic in CL ??

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • qdate arithmetic in CL ??

    I've written a CL to retrieve the system date and would like to store the previous day in another variable. How do I subtract x number of days from the QDATE and store it in another variable?
    Thanks so much,

  • #2
    Welcome!!

    I havent done this in CL in a while but here is a shot!

    Code:
                 PGM
                 DCL        VAR(&DATE) TYPE(*CHAR) LEN(6)
                 DCL        VAR(&OUTDATE) TYPE(*CHAR) LEN(6)
                 DCL        VAR(&JULIAN) TYPE(*CHAR) LEN(5)
                 DCL        VAR(&DECJULIAN) TYPE(*DEC) LEN(5)
    
                 RTVSYSVAL  SYSVAL(QDATE) RTNVAR(&DATE)
                 CVTDAT     DATE(&DATE) TOVAR(&JULIAN) TOFMT(*JUL) +
                              TOSEP(*NONE)
                 CHGVAR &DECJULIAN &JULIAN
                 CHGVAR     VAR(&DECJULIAN) VALUE(&DECJULIAN - 1)
                 CHGVAR &JULIAN  &DECJULIAN
                 CVTDAT     DATE(&JULIAN) TOVAR(&OUTDATE) FROMFMT(*JUL) +
                              TOFMT(*YMD) TOSEP(*NONE)
    
                 ENDPGM
    Let me know if this works for you
    Take care
    Jamie
    All my answers were extracted from the "Big Dummy's Guide to the As400"
    and I take no responsibility for any of them.

    www.code400.com

    Comment


    • #3
      Perfect ... that worked!

      Comment


      • #4
        IBM's sample

        Here's another way to do date calcs in CL (Personally I prefer RPG-IV). This is from IBM's CL Programming Manual
        Code:
                     PGM        PARM(&CURDATE &DAYSTOCHG)
        
                     DCL        VAR(&CURDATE) TYPE(*CHAR) LEN(8)
                     DCL        VAR(&DAYSTOCHG) TYPE(*DEC) LEN(15 5)
                     DCL        VAR(&DATETIME) TYPE(*CHAR) LEN(17)
                     DCL        VAR(&DATE) TYPE(*CHAR) LEN(8)
                     DCL        VAR(&LILDATEINT) TYPE(*CHAR) LEN(4)
                     DCL        VAR(&LILDATEDEC) TYPE(*DEC) LEN(10 0)
                     DCL        VAR(&ERRCOD) TYPE(*CHAR) LEN(4) +
                                  VALUE(X'00000000')
        
                     DCL        VAR(&MSG) TYPE(*CHAR) LEN(50)
        
        
                     IF         COND(&CURDATE = '*CURRENT') THEN(DO)
                     CALL       PGM(QWCCVTDT) PARM('*CURRENT' ' ' '*YYMD' +
                                  &DATETIME &ERRCOD) /* Get current system +
                                  date and time in YYYYMMDD */
                     CHGVAR     VAR(&DATE) VALUE(%SST(&DATETIME 1 8))
                     ENDDO
                     ELSE       CMD(CHGVAR VAR(&DATE) VALUE(&CURDATE))
                     CALLPRC    PRC(CEEDAYS) PARM(&DATE 'YYYYMMDD' +
                                  &LILDATEINT *OMIT) /* Get Lilian date for +
                                  current date */
                     CHGVAR     VAR(&LILDATEDEC) VALUE(%BIN(&LILDATEINT)) /* +
                                  Get Lilian date in decimal format */
                     CHGVAR     VAR(&LILDATEDEC) VALUE(&LILDATEDEC + +
                                  &DAYSTOCHG) /* Adjust specified number of +
                                  days */
        
                     CHGVAR     VAR(%BIN(&LILDATEINT)) VALUE(&LILDATEDEC) /* +
                                  Get Lilian date in integer format */
                     CALLPRC    PRC(CEEDATE) PARM(&LILDATEINT 'YYYYMMDD' +
                                  &DATE *OMIT) /* Return calculated date in +
                                  YYYYMMDD format */
                     CHGVAR     VAR(&MSG) VALUE('The new date is' || &date)
                     SNDPGMMSG  MSG(&MSG) TOPGMQ(*EXT)
                     ENDPGM

        Comment

        Working...
        X