I've often needed the capability to delete the trailing character within a character field. With RPG IV, IBM provides this capability with the %TRIMx built-in functions, which strip off the trailing and leading blanks from a character field.
- %TRIML (Trim Left) strips off the blank characters at the beginning a field and returns the content of the field without those leading blanks.
- %TRIMR (Trim Right) strips off the blank characters at the end of a field and returns the content of the field without those trailing blanks.
- %TRIM (Trim Both) strips off the blank characters at the beginning and end of a field and returns the content of the field without trailing or leading blanks.
These three built-in functions are a good first try at a function that is sorely needed in manipulating character values. I constantly use %TRIML (Trim Left) to left-justify data within a field. Here's an example:
This statement will strip off the leading blanks from the COMPNAME field and then copy the data to the COMPNAME field. Effectively, this left-justifies the value within the COMPNAME field.
I tend to use this type of statement right after an EXTFMT opcode within RPG IV. Often, the end-user will inadvertently hit the space bar and type the data into a field with an unintentional leading blank. The %TRIML statement thus avoids those types of data integrity issues.
In addition, with the huge boom in CGI RPG IV applications (RPG IV applications with a browser user interface), %TRIML can help eliminate a lot of common problems associated with entering data into a GUI.
As we move deeper into RPG IV, however, I find that what I really need in the %TRIM built-in functions is the ability to specify a character or characters that I want trimmed off my data. For example, suppose I want trailing blanks and trailing periods deleted. What can I do? Would this work?
It would not work because only the blanks are eliminated. I cannot specify periods or any other character to be trimmed. This is a problem.
Today, the CHECKR opcode can be used to search a field from the end-point (rightmost character) toward the left. CHECKR searches for the first character in the field that does not match a set of characters. It does not delete characters; it only pinpoints the position in the field where it locates a character that is not like those you've specified. For example:
In this example, the period and blank characters are used, and the COMPNAME field is searched. CHECKR is supposed to ensure that every character in the COMPNAME field matches the character or characters specified in Factor 1. If it finds a character that does not match, it stops and reports the rogue character's position in the Result field (nEndPos in our example).
So the end position field (nEndPos) contains the location of the first character that is not the same as the character or characters specified in Factor 1.
Knowing that this is what is returned, you now have the ability do something with that information, such as truncate the data in the COMPNAME field. To do this, use the %SUBST built-in function as follows:
If you use both operations immediately following one another, you can mimic a %TRIMR built-in function that supports multiple trim characters, as follows:
C eval CompName = %subst(CompName:1:nEnd)
Roll Your Own TRIM Function
Wouldn't it be better to wrap those two tasks into one easy-to-use function? I think so, so I did. Listed in Figure 1 is the source code for the TRIMR procedure. This procedure accepts two parameters: the input string and the trim pattern. Essentially, this procedure has the same syntax as %TRIMR plus an additional, second parameter that allows you to indicate one or more characters that you want trimmed.
|
Figure 1: The TRIMR procedure allows you to indicate characters that you want to trim from the end of a field.
The TRIMR procedure accepts a character field up to 4096 bytes in length. If you need a longer field, simply change the field lengths (wherever you see 4096, change it to the new maximum length that you need).
The first parameter is the original field. Its value will be searched, starting on the right side, for a character that is not specified on the second parameter. The second parameter may be one or more characters. These characters are to be deleted from the original input string.
The procedure works by using the CHECKR opcodes. If a position is returned, it uses the %SUBST built-in function to substring the original input value, and then that new value is returned to the caller.
Please note that the data passed into the procedure is passed by value. This means that a copy of the input parameter is made, and that copy is what is trimmed and substringed. The original field specified on the parameter is not modified--unless, of course, it is the target of the EVAL opcode, as follows:
In this example, all blanks and periods are deleted from the right side of the COMPNAME field.
Since it may be useful to also have a similar capability for a %TRIML-like function, I've included the source for the TRIML procedure in Figure 2.
|
Figure 2: The TRIML procedure works like the TRIMR procedure, but it trims characters from the beginning of a field.
You'll note that the TRIML procedure uses the CHECK opcode instead of CHECKR. In addition, it uses the return position as the starting value for the %SUBST built-in function. This is because we want to eliminate any leading characters and continue through to the end of the field.
TRIMR and TRIML procedures offer a level of functionality not currently available with %TRIML and %TRIMR. The ability to specify the character or characters that are being trimmed is beneficial and is consistent with most other programming languages. Perhaps someday soon, RPG IV will support this capability natively.
Bob Cozzi has been programming in RPG since 1978. Since then, he has written many articles and several books, including The Modern RPG Language--the most widely used RPG reference manual in the world. Bob is also a very popular speaker at industry events such as RPG World and is the author of his own Web site and of the RPG ToolKit, an add-on library for RPG IV programmers.
LATEST COMMENTS
MC Press Online