Hello Tomasz,
It's great to see that you are trying to use some new techniques,
instead of simply sticking with RPG III. It's always encouraging when
you see that people are trying to improve their skills instead of just
sticking with what they learned 15 years ago.
Unfortunately, sometimes when we try to mix old techniques with newer
ones, we run into trouble. It might be worth taking things a step
further and using a few more RPG IV techniques in your code, replacing
some of the old RPG III stuff you still use.
There are several problems with your code. The one that's causing you
the most grief is the fact that you are using the MOVEL op-code with a
VARYING field. MOVEL was invented perhaps 30 years before VARYING, and
it doesn't really understand VARYING. MOVEL will never change the
length of a VARYING field.
On the last line of your program, you have this:
C Movel TXTO gsqTXTT
As I mentioned, MOVEL never changes the length of a VARYING field.
gsqTXTT had a length of 0 when the program started, and MOVEL won't
change that, it'll keep it at 0. So nothing actually gets moved into
gsqTXTT in this statement. Using RPG III opcodes with VARYING fields
will usually leave you frustrated.
The quickest fix to your program is to use EVAL instead. Remove the
final MOVEL and use EVAL in it's place as follows:
C eval gsqTXTT = %trimr(TXTO)
That's the error that is causing you problems. However, there are
several other problems with your code that you may not have noticed (and
probably wouldn't find during testing):
1) You have the sqlFinalFlg flag coded incorrectly. It should be coded
as "10i 0" instead of "5i 0".
2) You have specified "allow parallel" which I don't think should be
used with code that's not threadsafe. I suggest changing it to
"disallow parallel"
3) Your scratchpad parameter (sqlScrPad) is coded too short. The system
always adds an Integer (10i 0) containing the length to the start of
this field, so you should have coded it at 254 long. Though, I don't
understand why you are using a scratchpad in this program. (You don't
appear to use it for anything... so you'd never see the error...)
4) Your program starts by moving a varying (Varchar) field into a
fixed-length field. That means you lose the ability to detect the
original length of the field! That seems silly. If this were my code,
I'd use VARYING throughout. (Unfortunately, that also means replacing
the remainder of the MOVEL and XLATE opcodes with modern replacements)
5) You repeatedly do MOVEL *BLANKS and then on the next line of code
replace the blanked out field with something else. This isn't really a
bug, but it's a waste of CPU cycles. why fill it with blanks, then
overwrite the blanks with something else? Why not just overwrite the
data to begin with?
6) You set on LR in a NOMAIN subprocedure. This isn't really a bug, but
it doesn't do anything, since there's no RPG logic cycle to check for
the LR indicator. So setting it on does nothing. (It just looks foolish)
If you take all of these things into consideration, the resultant code
looks like this: (I won't repeat the D-specs from what you had -- they
just be self-explanatory...)
D TXT S like(gsqTXTF)
C eval TXT = %xlate(PO:LAT:gsqTXTF)
C eval TXT = %xlate(LOW:CAP:TXT)
C eval TXT = %xlate(SPC:BLK:TXT)
C eval gsqTXTT = TXT
Or better yet in free-format:
D TXT S like(gsqTXTF)
/free
TXT = %xlate(POL:LAT:gsqTXTF);
TXT = %xlate(LOW:CAP:TXT);
TXT = %xlate(SPC:BLK:TXT);
gsqTXTT = TXT;
/end-free
Good luck!
Tomasz Skorża wrote:
Hi
I created a function ZIPTXT which should "clean" text (change polish
national chars to lating chars, and change all special chars to space)
code is:
H NoMain Option(*SrcStmt : *NoDebugIO)
D zipTXT pr
D gsqTXTF 100 Varying
D gsqTXTT 100 Varying
D sqlNull1 5i 0
D sqlOutNull 5i 0
D sqlState 5
D sqlFuncNm 517 Varying
D sqlSpecName 128 Varying
D sqlMsgTxt 70 Varying
D sqlScrPad 250
D sqlFinalFlg 5i 0
P zipTXT b
Export
D zipTXT
pi
D gsqTXTF 100
Varying
D gsqTXTT 100
Varying
D sqlNull1 5i
0
D sqlOutNull 5i
0
D sqlState
5
D sqlFuncNm 517
Varying
D sqlSpecName 128
Varying
D sqlMsgTxt 70
Varying
D sqlScrPad
250
D sqlFinalFlg 5i
0
* Tables for
conversion
D POL C
'ąęćśżźńółĄĘĆŚŻŹŃÓŁ'
D LAT C
'aecszznolAECSZZNOL'
D LOW C
'aąbcćdeęfghijklłmnńoóprsśtuvwxyzźż'
D CAP C
'AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUVWXYZŹŻ'
D SPC C
'~`!@#$%˘&*()_-+={}\|;:",<>?/'
D BLK C '
'
C Movel *blanks TXTI
100
C Movel *blanks TXTO
100
C Movel gsqTXTF
TXTI
C POL:LAT XLate TXTI
TXTO
C Movel *blanks
TXTI
C Movel TXTO
TXTI
C Movel *blanks
TXTO
C LOW:CAP XLate TXTI
TXTO
C Movel *blanks
TXTI
C Movel TXTO
TXTI
C Movel *blanks
TXTO
C SPC:BLK XLate TXTI
TXTO
C Movel TXTO
gsqTXTT
C SetOn
LR
C Return
P zipTXT e
Then I created it with command:
1) CRTRPGMOD MODULE(LIB/ZIPTXT) SRCFILE(LIB/SQLSRC)
DBGVIEW(*LIST)
2) CRTSRVPGM SRVPGM(LIB/ZIPTXT)
EXPORT(*ALL)
3) CREATE FUNCTION LIB/ZIPTEXT
(varCHAR(100))
RETURNS varCHAR (100) LANGUAGE RPGLE DETERMINISTIC NO
SQL
RETURNS NULL ON NULL INPUT NO EXTERNAL ACTION ALLOW PARALLEL
FINAL
CALL SCRATCHPAD 250 PARAMETER STYLE DB2SQL EXTERNAL
NAME
'LIB/ZIPTXT(ZIPTXT)'
When I calling this function it returns blank text with 100-chars length.
What is wrong?
As an Amazon Associate we earn from qualifying purchases.