Re: [spam] Re: Why you shouldn't be afraid to use VARCHAR in RPGLE
Daniel Gross <[email protected]>
| Newsgroups | gmane.comp.lang.as400.rpg |
|---|---|
| Message-ID | <[email protected]> |
Hi Brian, Marco is absolutely right - of course I-specs are compiled AFTER D-specs - so if the %LEN in a D-spec is referencing an I-spec, it could not work. I finally had the time to try all this on PUB400 - so this will work: dcl-f myFile disk usage(*input); // the original file dcl-ds myType likerec(myFileR) template; // a template from the record format dcl-s vc varchar(%len(myType.field)) inz; // a field length derieved from the template Of course you can also create the template directly with EXTNAME(...). The template data structure doesn't use any Space in your program - it only defines a "type" that can be referenced to define other fields or data structures. Sorry for causing some irritation - in fact I haven't thought about the compile sequence of the specifications. Our team also tends to have a "typeTableName" data structure template for nearly every database table, and we use those intensively. HTH Daniel > Am 06.12.2025 um 16:27 schrieb Brian Parkins <[email protected]>: > You might like to test it your examples, Daniel. I cannot get them to compile unless I code: > > dcl-c #LEN Const(200); > dcl-s w_address1 varchar(#LEN) inz; > > - which doesn't satisfy Doug's request. (The wording in the manual is misleading.) > > Brian. > > On 06/12/2025 03:12, Daniel Gross wrote: >> AFAIK - I might have to test it - this should be possible: >> >> dcl-s w_address1 varchar(%len(phaddress1)) inz; >> >> At least it should be possible to define a constant and use this to define your varchar variable: >> >> dcl-c #LEN %len(phaddress1); >> dcl-s w_address1 varchar(#LEN) inz; >> >> As long as the expression value is resolvable at compile time. But I'm pretty sure, that also the first form should work. >> >> -> https://www.ibm.com/docs/en/i/7.6.0?topic=length-len-used-its-value >> >> And you can also use %LEN to get the maximum size of a VARCHAR variable, simply use: >> >> %len(varchar_variable:*max) >> >> -> https://www.ibm.com/docs/en/i/7.6.0?topic=lgsl-len-used-get-maximum-length-varying-length-expressions >> >> But when %LEN is used in definition statement, it always returns the maximum length of variable length fields like VARCHAR. So it should also work the other way around: >> >> dcl-s x_address1 char(%len(w_address1)) inz; >> >> HTH >> Daniel >> >> >>> Am 06.12.2025 um 03:41 schrieb Jon Paris <[email protected]>: >>> Not quite, Charles. $SIZE returns the storage required to hold the field - it's capacity will be 2 or 4 less than that due to the storage used by the length. >>> So: >>> Dcl-S myVarLen Varchar(200) Inz; // %Len = 0, %Size = 202 bytes. >>> Jon Paris >>> [email protected] >>>> On Dec 5, 2025, at 6:08 PM, Charles Wilt <[email protected]> wrote: >>>> LIKE should pick up the both the type and size... >>>> dcl-s w_address1 like(phaddress1); >>>> note: %len() on a varchar is always the length of the current value. The >>>> max size is retrieved using %size(). >>>> HTH, >>>> Charles >>>>> On Fri, Dec 5, 2025 at 3:28 PM DEnglander--- via RPG400-L < >>>>> [email protected]> wrote: >>>>> 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: [email protected] >>>>> Before posting, please take a moment to review the archives >>>>> at https://archive.midrange.com/rpg400-l. >>>>> Please contact [email protected] 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: [email protected] >>>> Before posting, please take a moment to review the archives >>>> at https://archive.midrange.com/rpg400-l. >>>> Please contact [email protected] 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: [email protected] >>> Before posting, please take a moment to review the archives >>> at https://archive.midrange.com/rpg400-l. >>> Please contact [email protected] 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: [email protected] > Before posting, please take a moment to review the archives > at https://archive.midrange.com/rpg400-l. > > Please contact [email protected] 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: [email protected] Before posting, please take a moment to review the archives at https://archive.midrange.com/rpg400-l. Please contact [email protected] for any subscription related questions.