Consultor Eletrônico



Kbase P118509: CHR(10) does not work in dynamic query
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   9/6/2006
Status: Unverified

SYMPTOM(s):

When a string containing CHR(10) is queried from a dynamic temp-table, it returns nothing.

See following example:

DEF VAR cDesc AS CHA NO-UNDO.
DEF VAR haTempDesc AS HANDLE NO-UNDO.
DEF VAR haDescBuffer AS HANDLE NO-UNDO.
DEF VAR haTempQuery AS HANDLE NO-UNDO.

DEF TEMP-TABLE tempDesc
FIELD iNr AS INT
FIELD cDesc AS CHA.

cDesc = "This is the first line." + CHR(10) + "This is the second line.".

CREATE TEMP-TABLE haTempDesc.

haTempDesc:CREATE-LIKE("tempDesc":U).
haTempDesc:TEMP-TABLE-PREPARE("tempDynamicDesc").

haDescBuffer = haTempDesc:DEFAULT-BUFFER-HANDLE.
haDescBuffer:BUFFER-CREATE().
ASSIGN haDescBuffer:BUFFER-FIELD("iNr":U):BUFFER-VALUE = 1
haDescBuffer:BUFFER-FIELD("cDesc":U):BUFFER-VALUE = cDesc.

CREATE QUERY haTempQuery.

haTempQuery:SET-BUFFERS(haDescBuffer).
haTempQuery:QUERY-PREPARE("FOR EACH tempDynamicDesc WHERE tempDynamicDesc.cDesc = ":U + QUOTER(cDesc)).
haTempQuery:QUERY-OPEN().
haTempQuery:GET-FIRST().

MESSAGE haTempQuery:PREPARE-STRING VIEW-AS ALERT-BOX.
MESSAGE haDescBuffer:BUFFER-FIELD("cDesc"):BUFFER-VALUE VIEW-AS ALERT-BOX.

REPEAT WHILE NOT haTempQuery:QUERY-OFF-END:
MESSAGE haDescBuffer:BUFFER-FIELD("iNr"):BUFFER-VALUE VIEW-AS ALERT-BOX.

haTempQuery:GET-NEXT().
END.

This works fine when using CHR(13)

CAUSE:

The QUERY-PREPARE() method ignores each and every CHR(10).
Therefore, the string is evaluated as if cDesc did not have any CHR(10).

This can be tested by assigning cDesc with ?Hello? and changing the QUERY-PREPARE() to:
haTempQuery:QUERY-PREPARE("FOR EACH tempDynamicDesc WHERE tempDynamicDesc.cDesc = ~"He" + CHR(10) + "llo~"").

Even though the query string contains CHR(10), the record [without CHR(10)] is found.

FIX:

Replace the CHR(10) with "~~n" :
haTempQuery:QUERY-PREPARE("FOR EACH tempDynamicDesc WHERE tempDynamicDesc.cDesc = " + QUOTER(REPLACE(cDesc, CHR(10), "~~n"))).