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.