|
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" <davemck@xxxxxxxxxxxxx>
To: "MI Programming on the AS400 / iSeries" <mi400@xxxxxxxxxxxx>
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@xxxxxxxxxxxxxxxxx>
> > To: "MI Programming on the AS400 / iSeries" <mi400@xxxxxxxxxxxx>
> > 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@xxxxxxxxxxxxxxxxx>
> >>>To: "MI Programming on the AS400 / iSeries" <mi400@xxxxxxxxxxxx>
> >>>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@xxxxxxxxxxxx
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/mi400
> or email: MI400-request@xxxxxxxxxxxx
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/mi400.
>
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.