RE: Compute Date Duration

"Bob Cozzi" <[email protected]>
Newsgroups gmane.comp.lang.as400.mi
Message-ID <003701c5d322$1b40fd80$6701a8c0@LONGSHADOW>
Capito!

-Bob Cozzi
www.RPGxTools.com
RPG xTools - Enjoy programming again.


-----Original Message-----
From: mi400-bounces-Zwy7GipZuJhWk0Htik3J/[email protected] [mailto:mi400-bounces-Zwy7GipZuJhWk0Htik3J/[email protected]] On
Behalf Of Beppe Costa
Sent: Monday, October 17, 2005 8:39 AM
To: MI Programming on the AS400 / iSeries
Subject: Re: [MI400] Compute Date Duration

Bob,

you aren't missing anything.

I already have some basic knowledge of  the various RPG opcodes like %DIFF,
xxxDUR, etc. but my main program is in MI and not in RPG. I already solved
the problem by calculating the object aging in another way but I'm still
interested in seeing how the MI/CDD works.

(isn't this the MI forum ?)

The sample code has been posted in RPG just to make it easier to understand
the CDD.

Giuseppe.


----- Original Message ----- 
From: "Bob Cozzi" <[email protected]>
To: "'MI Programming on the AS400 / iSeries'" <mi400-Zwy7GipZuJhWk0Htik3J/[email protected]>
Sent: Monday, October 17, 2005 3:08 PM
Subject: RE: [MI400] Compute Date Duration


> Did I miss something? Why wouldn't you use SUBDUR in RPG IV to calculate
the
> number of days between two dates? The question always get is how to do
> exactly what you've already done; calculate 50 years, 11 months, 30 days.
> Which you can't do natively in RPG IV, directly.
>
> -Bob Cozzi
> www.RPGxTools.com
> RPG xTools - Enjoy programming again.
>
> -----Original Message-----
> From: mi400-bounces+cozzi=rpgiv.com-Zwy7GipZuJhWk0Htik3J/[email protected]
> [mailto:mi400-bounces+cozzi=rpgiv.com-Zwy7GipZuJhWk0Htik3J/[email protected]] On Behalf Of Beppe
Costa
> Sent: Monday, October 17, 2005 3:39 AM
> To: MI Programming on the AS400 / iSeries
> Subject: Re: [MI400] Compute Date Duration
>
> For those who are interested to explore the MI builtin _CDD, the code
> follows.
>
> It returns a duration in the format 8,0 Pack. In this case the returned
> value is 00501130 (that is 50 years + 11 month + 30 days).
>
> Than, how can I convert this figure to a number of days ?
>
> I've also tried to use CVTD but always unsuccesfully.
>
> ===========
>
> h dftactgrp(*no) actgrp('QILE')
>
> d DateFrom        s             10    inz('1954-12-03')
> d DateTo          s             10    inz('2005-12-02')
>
> d Duration        s              8P 0
>
> d CDD             PR                  ExtProc('_CDD')
> d  DateDuration                   *   value
> d  Date1                          *   value
> d  Date2                          *   value
> d  InstTemplate                   *   value
>
> d TemplateT1      ds
> d  TemplateSize                 10I 0 inz(%len(TemplateT1))
> d  DDAT_1                        5I 0 inz(1)
> d  DDAT_2                        5I 0 inz(2)
> d  DDAT_3                        5I 0 inz(2)
> d  Reserved1_2                   2    inz(*allx'00')
> d  Length_2                      5I 0 inz(10)
> d  Length_3                      5I 0 inz(10)
> d  Reserved3_26                 26    inz(*allx'00')
>
> d*---- DDAT list --- 
> d  DDAT_Size                    10I 0 inz(198)
> d  Num_DDATs                     5I 0 inz(2)
> d  Reserved4_10                 10    inz(*allx'00')
> d  D1_Offset                    10I 0 inz(24)
> d  D2_Offset                    10I 0 inz(140)
>
> d*---- DDAT_1 ------ 
> d  D1_lenght                     5I 0 inz(116)
> d  D1_format                     5I 0 inz(x'0014')
> d  D1_datseptype                 1    inz(x'00')
> d  D1_timseptype                 1    inz(x'00')
> d  D1_hourzone                   5I 0 inz(0)
> d  D1_minzone                    5I 0 inz(0)
> d  D1_monthdef                   5I 0 inz(0)
> d  D1_yeardef                    5I 0 inz(0)
> d  D1_curcent                   10I 0 inz(0)
> d  D1_centdiv                   10I 0 inz(0)
> d  D1_caltoff                   10I 0 inz(0)
> d  D1_resvd1_6                   6    inz(*allx'00')
> d  D1_eratableN                  5I 0 inz(0)
> d  D1_eratable                  48    inz(*allx'00')
> d  D1_caltableN                  5I 0 inz(0)
> d  D1_caltable1n                16    inz(*allx'00')
> d  D1_caltable2                 16    inz(*allx'00')
>
> d*---- DDAT_2 ------ 
> d  D2_lenght                     5I 0 inz(116)
> d  D2_format                     5I 0 inz(x'0003')
>
> d*-D2_separator                  2
> d  D2_datseptype                 1    inz(x'00')
> d  D2_timseptype                 1    inz(x'00')
> d*-D2_timezone                   4
> d  D2_hourzone                   5I 0 inz(0)
> d  D2_minzone                    5I 0 inz(0)
> d*-D2_duratdef                   4
> d  D2_monthdef                   5I 0 inz(0)
> d  D2_yeardef                    5I 0 inz(0)
> d*-D2_century                    8
> d  D2_curcent                   10I 0 inz(0)
> d  D2_centdiv                   10I 0 inz(0)
>
> d  D2_caltoff                   10I 0 inz(82)
> d  D2_resvd1_6                   6    inz(*allx'00')
>
> d*-D2_eratb                     50    inz(*allx'00')
> d  D2_eratbNum                   5I 0 inz(1)
> d  D2_eratbOrig                 10I 0 inz(1721424)
> d  D2_eratbName                 32    inz('AD')
> d  D2_eratbRsvd                 12    inz(*allx'00')
>
> d*-D2_caltable                  34    inz(*allx'00')
> d  D2_caltbNum                   5I 0 inz(2)
> d  D2_caltb1Date                10I 0 inz(1721424)
> d  D2_caltb1Type                 5I 0 inz(x'0001')
> d  D2_caltb1Rsvd                10    inz(*allx'00')
> d  D2_caltb2Date                10I 0 inz(5373485)
> d  D2_caltb2Type                 5I 0 inz(x'0000')
> d  D2_caltb2Rsvd                10    inz(*allx'00')
>
>  /free
>
>   CDD (%addr(duration):
>        %addr(DateTo):
>        %addr(DateFrom):
>        %addr(TemplateT1));
>
>   *inlr = *on;
>
>  /end-free
>
>
>
>
> ----- Original Message ----- 
> From: "Dave McKenzie" <[email protected]>
> To: "MI Programming on the AS400 / iSeries" <mi400-Zwy7GipZuJhWk0Htik3J/[email protected]>
> Sent: Friday, October 14, 2005 6:27 PM
> Subject: Re: [MI400] Compute Date Duration
>
>
> > Beppe,
> >
> > In the CDD documentation it says "The DDAT for operand 1 must be valid
> > for a date duration."
> >
> > In the list of format codes it lists "Date duration" (x14) as separate
> > from the "Labeled durations" (x0D - x13).
> >
> > Maybe that means that the only valid format code for operand 1 is x14.
> >
> > In any case, I don't know exactly what a "labeled duration" is.
> >
> > --Dave
> >
> > Beppe Costa wrote:
> > > I've tried to call CDD from RPG as ExtProc('_CDD')  and from MI.
> > >
> > > When the DDAT 1 is of type x'0014' I pass a pointer to a packed 8,0
and
> CDD
> > > returns correct data (number of years+number of month+number of days).
> > >
> > > When the DDAT 1 is of type x'000F' I pass a pointer to a packed 15,0
and
> it
> > > fails. The message says "exactly" that the error is at offset x'0004'
> where
> > > DDAT 1 starts.
> > >
> > > A similar error occurs when I use a format other than ISO or a char(6)
> date
> > > for DDAT 2  and DDAT 3.
> > >
> > > For example If I use a YYMMDD date it works fine. If I try to use a
> CYYMMDD
> > > or another format it crashes and the MCH5601 signals the offset od
DDAT
> 2.
> > >
> > > Btw in the meanwhile I solved the problem and I compute the duration
in
> > > another way but it would be interesting to see if there is someone
that
> > > tried to use this instruction.
> > >
> > > Giuseppe.
> > >
> > > ----- Original Message ----- 
> > > From: "Postmaster" <fbns-Q/[email protected]>
> > > To: "MI Programming on the AS400 / iSeries" <mi400-Zwy7GipZuJhWk0Htik3J/[email protected]>
> > > Sent: Tuesday, October 11, 2005 1:24 PM
> > > Subject: Re: [MI400] Compute Date Duration
> > >
> > >
> > >>On 11/10/2005, at 6:48 PM, Beppe Costa wrote:
> > >>
> > >>>Simon,
> > >>>I don't think that there is a validation on the output parameter
> > >>>because
> > >>>it's only a pointer.
> > >>Are you trying to run CDD from C or MI? If from C then you pass a
> > >>pointer to a packed decimal variable. If from MI then you pass the
> > >>scalar itself.
> > >>
> > >>The error you reported is caused by validating the 4th input
parameter.
> > >>All MI instructions that accept a template validate the content of the
> > >>template. When the template contains an invalid value the MCH5601
> > >>message is sent. This message tells you exactly what part of the
> > >>template is invalid.
> > >>
> > >>>Btw I'm missing something because the DDAT1 duration in x0014 is
> > >>>returned
> > >>>correctly with ISO and YMD date but I can't get it with other date
> > >>>format.
> > >>>And in any case I can never get a Labeled Duration. Unfortunately the
> > >>>only
> > >>>documentation is from a single page in the MI functional reference
and
> > >>>an
> > >>>example in C that uses ISO dates. I've found nothing else.
> > >>http://publib/boulder.ibm.com/infocenter/iseries/v5r3/topic/rzatk/
> > >>topics.htm
> > >>
> > >>Click Date/Time/Timestamp
> > >>
> > >>Click Date/Time Concepts
> > >>
> > >>Read carefully.
> > >>
> > >>>Thanks in any
> > >>>case for your  response.
> > >>>Giuseppe.
> > >>>
> > >>>
> > >>>----- Original Message -----
> > >>>From: "Simon Coulter" <shc-Q/[email protected]>
> > >>>To: "MI Programming on the AS400 / iSeries" <mi400-Zwy7GipZuJhWk0Htik3J/[email protected]>
> > >>>Sent: Monday, October 10, 2005 11:41 PM
> > >>>Subject: Re: [MI400] Compute Date Duration
> > >>>
> > >>>
> > >>>>On 10/10/2005, at 10:53 PM, Beppe Costa wrote:
> > >>>>
> > >>>>>I'm trying to use the the MI CDD.
> > >>>>>
> > >>>>>When Operand1 is a DDAT x'0014' (Date Duration) I get the right
value
> > >>>>>expressed in Years, Month and Days but when Operand1 is x'000F'
> > >>>>>(Labeled Duration DAY) I always get a "template value invalid".
> > >>>>Show the complete message text of the MCH5601 message. The
> > >>>>substitution
> > >>>>text will usually tell you what part of the template is wrong.
> > >>>>
> > >>>>My guess is that the variable containing the duration value is of
the
> > >>>>wrong type. For x'0014' it must be PKD(8,0) but for x'000F' it must
be
> > >>>>PKD(15,0)
> > >>>>
> > >>>>Regards,
> > >>>>Simon Coulter.
> > >>>>--------------------------------------------------------------------
> > >>>>    FlyByNight Software         AS/400 Technical Specialists
> > >>>>
> > >>>>    http://www.flybynight.com.au/
> > >>>>    Phone: +61 3 9419 0175   Mobile: +61 0411 091 400        /"\
> > >>>>    Fax:   +61 3 9419 0175                                   \ /
> > >>>>                                                              X
> > >>>>                  ASCII Ribbon campaign against HTML E-Mail  / \
> > >>>>--------------------------------------------------------------------
> >
> > _______________________________________________
> > This is the MI Programming on the AS400 / iSeries (MI400) mailing list
> > To post a message email: MI400-Zwy7GipZuJhWk0Htik3J/[email protected]
> > To subscribe, unsubscribe, or change list options,
> > visit: http://lists.midrange.com/mailman/listinfo/mi400
> > or email: MI400-request-Zwy7GipZuJhWk0Htik3J/[email protected]
> > Before posting, please take a moment to review the archives
> > at http://archive.midrange.com/mi400.
> >
>
> _______________________________________________
> This is the MI Programming on the AS400 / iSeries (MI400) mailing list
> To post a message email: MI400-Zwy7GipZuJhWk0Htik3J/[email protected]
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/mi400
> or email: MI400-request-Zwy7GipZuJhWk0Htik3J/[email protected]
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/mi400.
>
>
>
>
> _______________________________________________
> This is the MI Programming on the AS400 / iSeries (MI400) mailing list
> To post a message email: MI400-Zwy7GipZuJhWk0Htik3J/[email protected]
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/mi400
> or email: MI400-request-Zwy7GipZuJhWk0Htik3J/[email protected]
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/mi400.
>

_______________________________________________
This is the MI Programming on the AS400 / iSeries (MI400) mailing list
To post a message email: MI400-Zwy7GipZuJhWk0Htik3J/[email protected]
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/mi400
or email: MI400-request-Zwy7GipZuJhWk0Htik3J/[email protected]
Before posting, please take a moment to review the archives
at http://archive.midrange.com/mi400.




_______________________________________________
This is the MI Programming on the AS400 / iSeries (MI400) mailing list
To post a message email: MI400-Zwy7GipZuJhWk0Htik3J/[email protected]
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/mi400
or email: MI400-request-Zwy7GipZuJhWk0Htik3J/[email protected]
Before posting, please take a moment to review the archives
at http://archive.midrange.com/mi400.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.