[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Jul 2003
    Beiträge
    10

    Question Letzter Tag eines Monats ermitteln

    Hallo iSerianer,

    gibt es eine Möglichkeit innerhalb eines CL-Pgm's vielleicht mit einem CL-Befehl den letzten Tag eines Kalendermonates zu ermitteln (Januar = 31, Februar = 28/29, März = 30 usw.). Einen mehrjährigen Systemkalender muß es wohl geben auf den z. B. beim CMD ADDJOBSCDE die Option *MONTHEND für GEPLANTES DATUM zugreift, nur bekomme ich nicht heraus wo und wie auf diesen Kalender zugegriffen werden kann.

    Schon jetzt besten Dank für alle Info's.

    Tschüß

    jobra

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.875

    Monats-Ende

    Hallo Jobra,

    mit CL ist das nicht so ganz einfach!
    Aber kannst Du nicht eine kleine RPG-Funktion oder -Programm schreiben, das den Monatsletzen ermittelt?
    Was willst Du? Das Datum oder den Tag?

    Hier ist ein Beispiel, wie aus einem numerischen Datum (JJJJMMTT) der Monatsletzte im gleichen Format ermittelt wird.
    Code:
    D DateNum         S              8P 0 inz(20040525)                      
    D DateNxtMon      S               D                                      
    D MonthEnd        S               D                                      
    D MonthEndNum     S              8P 0 
    *****************************************************
    C                   Monitor                                               
    C                   Eval      DateNxtMon = %Date(DateNum) + %Months(1)   
    C                   Eval      DateNew    =   DateNxtMon                  
    C                                          - %Days(%SubDt(DateNxtMon:*D))
    C                   Move      DateNew       MonthEndNum                  
    C     MonthEndNum   dsply                                                
    C                   on-Error                                             
    C     'Ungült.Dat.' dsply                                                
    C                   EndMon                                               
    C                   eval      *InLR       = *on
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Jul 2003
    Beiträge
    10
    Danke für den prompten Lösungsvorschlag. Wenn es keine direkte Möglichkeit aus dem CL heraus gibt, werde ich es hierüber ausführen. Hintergrund ist, daß für einen regelmäßigen Abrechnungsjob zum Monatsende sichergestellt sein muß, daß als Param. der letzte Monatstag mit übergeben wird. Da bei einem JOBSCDE nicht 100% sicher ist, daß er genau zum Monatsletzten und nicht erst später am folgenden Monatsersten anläuft und ich deshalb nicht auf's Jobdatum zugreifen kann, brauch ich eine Möglichkeit zum abzurechnenden Monat den letzten Monatstag zu ermitteln

  4. #4
    Registriert seit
    Dec 2000
    Beiträge
    450
    Hallo Jobra,

    stelle die Information, was Monatsletzter ist in eine DTAARA. Die kann vom CL-PGM ausgelesen werden und sogar von mehreren Jobs genutzt werden. Und wenn alle gelaufen sind, die mit Datum des Monatsletzten laufen müssen, änderst Du den Inhalt der DTAARA für den nächsten Monat.

    Gruß
    Bruno

  5. #5
    Registriert seit
    Jul 2003
    Beiträge
    10
    Hallo Bruno,

    erstmal vielen Dank für Deinen Tipp. Dein Vorschlag setzt allerdings voraus, daß ich in einem eigenen Pgm. jeweils ermitteln muß ob der Letzte der 30., 31. oder 28. bzw. Schaltjahr 29. ist. Da es offensichtlich aber einen langjährigen systeminternen Kalender gibt, der dies alles schon beinhaltet, suche ich nach einer einfachen Möglichkeit darauf zu zugreifen.

    Tschüß
    Jobra

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    Es gibt keinen systeminternen Kalender sondern komfortable Routinen zur Berechnung von Datum und Zeit (siehe oben), die auch vom OS verwendet werden.
    Es kann daher keine "Zugriffe" auf einen Kalender geben.
    Nutze doch einfach die RPG-Routinen !
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Jul 2003
    Beiträge
    10
    Hallo Fuerchau,

    auf die Vorstellung mit dem Systemkalender bin ich durch die Option *MONTHEND beim Parameter SCDDATE des ADDJOBSCDE gekommen. Zumindest muß hier eine Kalenderroutine dahinterstehen, die ich gerne genutzt hätte, um nicht das Rad neu zu erfinden. Nun muß ich es eben halt doch über eine eigene Routine regeln.

    Danke
    Jobra

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.243
    Die Kalenderroutinen, die du suchst, sind doch genau die oben erwähnten !
    Du kannst alles mit diesen Routinen errechnen. Das System verwendet genau diese Funktionen auch !
    Mit den MI-Befehlen ging das alles auch schon früher und sind nun auch in RPG verfügbar.
    Die Befehle SUBDUR/ADDDUR stehen seit V3 zur Verfügung, die nun bei ILE per Builtin nachgereicht bzw. verbessert wurden.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Nov 2002
    Beiträge
    13
    Code:
                  BEGSR
    
                  SELEC
    Monat         WHEQ        1
    Monat         OREQ         3
    Monat         OREQ         5
    Monat         OREQ         7
    Monat         OREQ         8
    Moant         OREQ        10
    Monat         OREQ        12
                  Z-ADD       31          LetzterTag
    Monat         WHEQ         4
    Monat         OREQ          6
    Monat         OREQ          9
    Monat         OREQ         11
                  Z-ADD        30         LetzterTag
    Monat         WHEQ          2
    Jahr          DIV             4         ZwischenResultat
                  MVR                       Rest
    Rest          IFEQ            0
                  Z-ADD         29        LetzterTag
     * Schaltjahr im Februar 29 Tage!!
                  ELSE
                  Z-ADD         28        LetzterTag
                  ENDIF
                  ENDSL
    
                  ENDSR
    So hab ich das mal ausprogrammiert

    Als Input-Parameter habe ich Jahr, Monat und als Output habe ich den LetztenTag
    Wer anderen eine Grube gräbt besitzt ein Grubengrabgerät.

  10. #10
    Registriert seit
    Jul 2003
    Beiträge
    10
    Dank Euch allen,

    ok Ihr habt mich überzeugt - werde die Pgm.-Bsp. benutzen.

    Bis bald
    Jobra

  11. #11
    Alexander Besucher/Guest
    Und endlich eine CL-Programm:

    PGM
    DCL VAR(&DATUM) TYPE(*CHAR) LEN(7)
    DCL VAR(&TAG) TYPE(*DEC) LEN(2 0) VALUE(31)

    DCL VAR(&DATUM1) TYPE(*CHAR) LEN(7)
    DCL VAR(&cent1) TYPE(*char) LEN(1)
    DCL VAR(&JAHR1) TYPE(*char) LEN(2)
    DCL VAR(&MONAT1) TYPE(*char) LEN(2)
    DCL VAR(&TAG1) TYPE(*CHAR) LEN(2) VALUE('31')

    RTVSYSVAL SYSVAL(QCENTURY) RTNVAR&CENT1)
    RTVSYSVAL SYSVAL(QYEAR) RTNVAR(&JAHR1)
    RTVSYSVAL SYSVAL(QMONTH) RTNVAR(&MONAT1)

    LOOP: CHGVAR VAR(&DATUM1) VALUE(&CENT1 *TCAT &JAHR1 *TCAT +
    &MONAT1 *TCAT &TAG1)

    CVTDAT DATE(&DATUM1) TOVAR(&DATUM) FROMFMT(*CYMD) +
    TOFMT(*CYMD) TOSEP(*NONE)

    MONMSG MSGID(CPF0555) EXEC(DO)
    CHGVAR VAR(&tag) VALUE(&tag - 1)
    CHGVAR VAR(&tag1) VALUE(&tag)
    GOTO CMDLBL(LOOP)
    ENDDO

    ENDPGM


    Jetzt das Feld &DATUM hat, was Sie wollen.
    Und ganz einfach.

  12. #12
    Registriert seit
    Feb 2003
    Beiträge
    137
    Hi FREEK,
    Quote on:

    Monat WHEQ 2
    Jahr DIV 4 ZwischenResultat
    MVR Rest
    Rest IFEQ 0
    Z-ADD 29 LetzterTag
    * Schaltjahr im Februar 29 Tage!!
    ELSE
    Z-ADD 28 LetzterTag
    ENDIF
    ENDSL
    Quote off

    Die Regelung mit dem Säkularjahr wird dabei nicht berücksichtigt.
    Das Jahr 2100 ist kein Schaltjahr (werden wir zwar nicht mehr erleben!)
    Schaltjahr im Säkularjahr ist: Die Jahreszahl ist durch 400 teilbar. Die Jahre 1700, 1800 und 1900 stellten also so genannte Gemeinjahre zu 365 Tagen dar. Die Jahre 1600 und 2000 waren dagegen Schaltjahre zu 366 Tagen.
    Gruss aus HH
    Thierry

Similar Threads

  1. PAGRTT aus Printer-File ermitteln
    By MatthiasK in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 10-01-07, 13:26
  2. Dateigröße ermitteln und anzeigen
    By Bratmaxxe in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 08-01-07, 09:50
  3. nach Insert neu gen. Datensatz ermitteln
    By M.Kasper in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 25-08-06, 07:32
  4. SQL Select mit SUM aus einer DB
    By JonnyRico in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 30-03-06, 12:33
  5. Letzter Tag des Monats
    By HPKahn in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 17-05-05, 14:07

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •