On 3/30/11 2:39 PM, jmmckee wrote:
I don't men to ask a programming question. Just need somebody else's
eyeballs to look at a OPNQRYF. PDM is complaining "The end of the
expression is expected" and has highlighted a line I will highlight
with >>> and <<<. The purpose of the mapped fields is to convert a
numeric date stored as yymmdd to character and append that to a
century. I am obviously missing something. May be making it harder
than it needs to be.
I appreciate your thoughts.
eval cmdbuf = 'opnqryf ' +
'file((badplpp)) qryslt(''' +
'dscdte *ge "' + start + '" *and ' +
'dscdte *le "' + end + '" *and hsp ' +
'*eq "' + hsp + '"'') keyfld((' +
'lpmrc#) (lpacct)) mapfld((' +
'lpcen2#c lpcen2 *char 2) ' +
'(lpldd#c lpldd *char 6) ' +
'(mmdd#c %sst(lpldd#c 3 4) *char 4) ' +
>>> '(yy#c %sst(lpldd#c 1 2) *char 2) ' + <<<
'(dscdte lpcen2#c || yy#c ' +
'|| mmdd#c'' *char 8)' +
' (lphsp#z lphsp# *zoned 3 0 ) ' +
'(hsp lphsp#z *char 3))'
Presumably "PDM complaining" means to imply either the compiler or
SEU issues an error, and from the text "The end of the expression is
expected" I would guess most likely the former [as text from RNF5377].?
Other than the apostrophes missing for the expression in each of the
MAPFLD "Field definition expression" [except one; i.e. included only
after field name mmdd#c two lines beyond the highlighted line], I do not
see anything obviously incorrect. Nothing that should cause the string
expression to give an error, even though the command string itself would
be ill-formed. Even properly formed however, such a query would not
typically be functional, without also having a FORMAT() specified, since
fields that are not already defined in the record format of the FILE()
can not be generated dynamically like a "result field" in a query
definition.
FWiW my preference would be to format the text differently, in a
manner that I find easier to read:
<code>
cmdbuf = 'opnqryf' +
' file((badplpp))' +
' qryslt(''' +
' dscdte *ge "' + start + '" *and' +
' dscdte *le "' + end + '" *and' +
' hsp *eq "' + hsp + '"' +
''')' +
' keyfld((lpmrc#) (lpacct))' +
' mapfld(' +
' (lpcen2#c ''lpcen2 '' *char 2 )' +
' (lpldd#c ''lpldd '' *char 6 )' +
' (mmdd#c ''%sst(lpldd#c 3 4) '' *char 4 )' +
' (yy#c ''%sst(lpldd#c 1 2) '' *char 2 )' +
' (dscdte ''lpcen2#c || yy#c ' +
' || mmdd#c '' *char 8 )' +
' (lphsp#z ''lphsp# '' *zoned 3 0)' +
' (hsp ''lphsp#z '' *char 3 )' +
')'
</code>
Each MAPFLD element for which the expression is just a field name
does not require the apostrophes, but for consistency across each
element aligning under the previous, including those apostrophes as well
is better IMO for readability.
Note also that casting to *char from a numeric, the expression might
best be written or actually require '%digits(numeric_field)' for correct
results versus just the column name numeric_field specified.
Regards, Chuck
As an Amazon Associate we earn from qualifying purchases.