|
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-2024 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.