Re: Why you shouldn't be afraid to use VARCHAR in RPGLE

Marco Facchinetti <marco.facchinetti-kthxv0ud/[email protected]>
Newsgroups gmane.comp.lang.as400.rpg
Message-ID <CAMsgu4qSe7q_mwGN1vTnXYdvsJv6++KiFGkfQmc3A-4c0a1oBA@mail.gmail.com>
And this is what you should not do with Ds and varchar:

     A          R TST54                     TEXT('Test 54')
     A*
     A            FIXED1        10          TEXT('Len 10')
     A            FIXED2        50          TEXT('Len 50')
     A            FIXED3       200          TEXT('Len 200')

       Dcl-f tst0054pf disk usage(*input);

       Dcl-Ds rTst54              likerec(Tst54);
       Dcl-Ds sTst54              likerec(Tst54);
       Dcl-Ds wTst54              qualified inz;
         wFixed1                  uns(5) inz(0);
         Fixed1                   like(fixed1);
         wFixed2                  uns(5) inz(0);
         Fixed2                   like(fixed2);
         wFixed3                  uns(5) inz(0);
         Fixed3                   like(fixed3);
       End-Ds;
       Dcl-Ds vTst54              qualified based(p_vTst54);
         Fixed1                   varchar(%len(rTst54.Fixed1));
         Fixed2                   varchar(%len(rTst54.Fixed2));
         Fixed3                   varchar(%len(rTst54.Fixed3));
       End-Ds;

       Dcl-s p_vTst54             pointer inz(%addr(wTst54));

       read Tst54 rTst54;
       eval-corr sTst54 = rTst54;

       Moove();
       vTst54.Fixed1 += ' + NEW';
       vTst54.Fixed2 += ' +NEW CHARS';
       vTst54.Fixed3 += ' +NEW SENTENCE';

       eval-corr rTst54 = wTst54;

       eval-corr rTst54 = sTst54;
       Reset wTst54;
       Moove();
       %len(vTst54.Fixed1) = %len(vTst54.Fixed1) - 3;
       %len(vTst54.Fixed2) = %len(vTst54.Fixed2) + 5;
       %len(vTst54.Fixed3) = %len(vTst54.Fixed3) - 10;

       eval-corr rTst54 = wTst54;

       *inlr = *on;
       return;

       Dcl-Proc Moove;
       Dcl-pi *n;
       End-Pi;

       wTst54.wFixed1 = %checkr(' ':rTst54.Fixed1);
       wTst54.wFixed2 = %checkr(' ':rTst54.Fixed2);
       wTst54.wFixed3 = %checkr(' ':rTst54.Fixed3);
       eval-corr wTst54 = rTst54;

       End-Proc;

Have fun!

--
Marco Facchinetti

Mr S.r.l.

Tel. 035 962885
Cel. 393 9620498

Skype: facchinettimarco


Il giorno sab 6 dic 2025 alle ore 16:40 Brian Parkins <
[email protected]> ha scritto:

> No apology needed, Marco. I understand now - and of course it works!
>
> DOUG: Try the approach that Marco describes (below).
>
> Brian.
>
> On 06/12/2025 15:17, Marco Facchinetti wrote:
> > Hi Brian, sorry I was lazy. Writing in English is not my best talent.
> >
> > What I suggested is NOT how to eliminate the %RTRIM but how to handle the
> > varchar definition when the basing var is in a record format.
> >
> > Since the compiler defines record formats using I spec and I specs are
> > after D specs the value of the %LEN(dbfield) is not valid (RNF3320).
> >
> > Let's say the file with PHADDRESS1 is MyFile.
> >
> > dcl-s   w_address1      varchar(%len(phaddress1));   // RNF3320
> >
> > But if you add:
> >
> > Dcl-Ds wMyfile extname('MYFILE') End-Ds;
> > dcl-s   w_address1      varchar(%len(phaddress1));
> >
> > the compiler will accept the varchar definition.
> >
> > Of course to have a value in w_address1 you have to
> >
> > chain MyFileKey MyFile;
> > w_address1 = %rtrim(address1);
> >
> > Or, as suggested in another post, use address1 in a function with *TRIM.
> >
> > The advantage of using %len in the varchar string definition is that the
> > maximum length is guaranteed even when the original field changes size.
> > This allows older RPG programmers to use varchars without too much hassle
> > or anxiety. :-)
> >
> > Best regards
> > --
> > Marco Facchinetti
> >
> > Mr S.r.l.
> >
> > Tel. 035 962885
> > Cel. 393 9620498
> >
> > Skype: facchinettimarco
> >
> >
> > Il giorno sab 6 dic 2025 alle ore 15:56 Brian Parkins <
> > [email protected]> ha scritto:
> >
> >> Marco, can you provide an example? I can't see how that would work, but
> >> I may be misunderstanding. Please prove me wrong.
> >>
> >> Brian.
> >>
> >> On 05/12/2025 23:04, Marco Facchinetti wrote:
> >>> Just define e Ds based on the file prior of the varchar definition.
> >>>
> >>> HTH
> >>> --
> >>> Marco Facchinetti
> >>>
> >>> Mr S.r.l.
> >>>
> >>> Tel. 035 962885
> >>> Cel. 393 9620498
> >>>
> >>> Skype: facchinettimarco
> >>>
> >>>
> >>> Il giorno ven 5 dic 2025 alle ore 23:28 DEnglander--- via RPG400-L <
> >>> [email protected]> ha scritto:
> >>>
> >>>> Does anyone know how to do something like this:
> >>>>
> >>>> I would like to define a %TRIMmed disk field that is CHAR(200)
> >>>> [PHADDRESS1] as a VARCHAR and eliminate the %TRIMs.
> >>>>
> >>>> So as not to hardcode the size of the VARCHAR, can I define it as
> >> VARCHAR
> >>>> but based on the length of the CHAR(200) field? Something like:
> >>>>
> >>>> dcl-s   w_address1      varchar(%len(phaddress1));
> >>>>
> >>>>
> >>>> Can that be done?
> >>>>
> >>>> Thank you,
> >>>>
> >>>> Doug
> >>>>
> >>>>
> >>>>
> >>>> "CONFIDENTIALITY NOTICE:  This e-mail transmission (and/or the
> >> attachments
> >>>> accompanying it) contain confidential information belonging to the
> >> sender.
> >>>> The information is intended only for the use of the intended
> >> recipient.  If
> >>>> you are not the intended recipient, you are hereby notified that any
> >>>> disclosure, copying, distribution or the taking of any action in
> >> reliance
> >>>> on the contents of the information is strictly prohibited.  Any
> >>>> unauthorized interception of this transmission is illegal under the
> law.
> >>>> If you have received this transmission in error, please promptly
> notify
> >> the
> >>>> sender by reply e-mail, and then destroy all copies of the
> >> transmission."
> >>>> --
> >>>> This is the RPG programming on IBM i (RPG400-L) mailing list
> >>>> To post a message email: [email protected]
> >>>> To subscribe, unsubscribe, or change list options,
> >>>> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
> >>>> or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org
> >>>> Before posting, please take a moment to review the archives
> >>>> at https://archive.midrange.com/rpg400-l.
> >>>>
> >>>> Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription
> >> related
> >>>> questions.
> >>>>
> >>>>
> >> --
> >> This is the RPG programming on IBM i (RPG400-L) mailing list
> >> To post a message email: [email protected]
> >> To subscribe, unsubscribe, or change list options,
> >> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
> >> or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org
> >> Before posting, please take a moment to review the archives
> >> at https://archive.midrange.com/rpg400-l.
> >>
> >> Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription
> related
> >> questions.
> >>
> >>
>
> --
> This is the RPG programming on IBM i (RPG400-L) mailing list
> To post a message email: [email protected]
> To subscribe, unsubscribe, or change list options,
> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
> or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org
> Before posting, please take a moment to review the archives
> at https://archive.midrange.com/rpg400-l.
>
> Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription related
> questions.
>
>
-- 
This is the RPG programming on IBM i (RPG400-L) mailing list
To post a message email: [email protected]
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org
Before posting, please take a moment to review the archives
at https://archive.midrange.com/rpg400-l.

Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription related questions.
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.