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 Alan, if you mean, that a D-spec %LEN should get the actual length of the contents of a VARCHAR at runtime? Then NO - this isn't possible. If you use %LEN in a D-spec with a VARCHAR field, it will return the same result als %LEN(...:*MAX) would return for that VARCHAR field at runtime - the maximum length of the VARCHAR contents according to the D-spec where the VARCHAR was defined. The %LEN in a D-spec must be resolved at compile time. So again - NO you can't define a field at compile time based on the length of another fields contents at runtime. HTH Daniel > Am 06.12.2025 um 14:59 schrieb Infodorado InfoDorado <[email protected]>: > > Sorry the previous message "sent itself" before I finished. > > Isn't there a bif or technique that can be used in the D-specs to get the size of the %len() part of the VARCHAR, or get to the actual data of the variable? > > --Alan Cassidy > > >>> On 12/05/2025 10:12 PM EST Daniel Gross <[email protected]> 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. -- 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.