Anmelden

View Full Version : API QCLSCAN



TARASIK
08-12-05, 11:38
Hallo Forum,
wir sind dabei einen Suchstring in einem RPG Programm einzubauen und wir scheitern anscheinend an der Logik.
Wir wollen das APi QCLSCAN nutzen und haben den
Translate Parameter auf "1" gesetzt.
Die Anforderung sollte sein Gross- u. Kleinschreibung zu
ignorieren, aber gefunden werden nur Daten, wenn der
Suchstring in Grossbuchstaben eingegeben wird. Werden
Kleinbuchstaben eingegeben, dann wird nichts gefunden.
Hat jemand eine Idee, was wir falsch machen ?

Fuerchau
08-12-05, 11:50
Translate characters
INPUT;CHAR(1)
A variable that indicates to translate lowercase characters in the specified character string to uppercase characters. If this field contains a 1, the program translates lowercase characters of the string to uppercase before the scan using the coded character set identifier (CCSID) for the current job. If the translation cannot be done using the CCSID for the job, *CCSID37 is used. This does not change the user's data. Note that if 1 is specified and the pattern contains lowercase characters, a match never occurs. If 1 is specified, and the data to be searched contains noncharacter data (for example, packed or binary), unexpected results can occur.

Will heißen:
Die zu durchsuchende Zeichenkette wird in Großbuchstaben übersetzt und nicht die Suchfolge. Der Rest erklärt sich wohl von slbst.

TARASIK
08-12-05, 12:41
Hallo Fuerchau,
danke für die Antwort. So selbsterklärend ist es doch nicht.
Anforderung: es wurde eine Datei erstellt mit Addressdaten
aus dem Internet.
So nun soll ein Abgleich auf vorhandensein der Addresse in
unserer Datenbank stattfinden.
Bei den Addressdaten vom Internet ist z.B.: der Dagobert Duck enthalten. In unserer Datenbank steht er aber mit DAGOBERT DUCK. Und so wird er nicht gefunden:
DCL VAR(&TRANSLATE) TYPE(*CHAR) LEN(1) VALUE('1')
/* ignore upper/lower case */

Was steckt jetzt wirklich dahinter, wir diskutieren bei uns sehr heftig über die Anschauungsweise dieses API's.

Fuerchau
08-12-05, 12:47
Das ist genau das Problem. QCLSCAN kann es nicht lösen, da der Schalter, wie gesagt, nicht die Suchzeichen sondern die zu durchsuchende Zeichenkette umwandelt (siehe Beschreibung).
Ist der Suchbegriff also in GrossKlein muss ich ihn vorher mit QDCXLATE in Grossbuchstaben wandeln.
Ansonsten wäre SQL besser:

where ... upper(mydbfield) like upper(trim(:myfield)) ...

B.Hauser
08-12-05, 13:21
Man könnte sich auch mit einer kleinen RPG-Prozedur mit embedded SQL behelfen:

Die folgende Prozedur bringt *Zeros zurück, wenn der übergebene String nicht gefunden wurde. Ansonsten wird die erste Position an der der Such-String steht zurückgegeben.
Groß- und Kleinschreibung wird dabei ignoriert, d.h. wenn nach 'Dagobert Duck' gesucht wird, wird sowohl 'DAGOBERT DUCK' als auch 'dAgObErT dUcK' gefunden:




P ScanLangIdShr B Export

D ScanLangIdShr PI 10I 0
D PPText 32740A varying Const
D PPSearch 32740A varying Const

D Position S 10I 0
*-------------------------------------------------------
C/EXEC SQL Set Option SrtSeq = *LangIdShr
C/End-EXEC

C/EXEC SQL Set :Position = PosStr(:PPText, :PPSearch)
C/End-EXEC

C Return Position
P ScanLangIdShr E


Birgitta

Fuerchau
08-12-05, 13:29
PosStr ist aber leider nicht so flexibel, da QCLSCAN auch Wildcards unterstützt. Like gibt da auch leider keine Position zurück, hat aber wiederum Wildcards.

B.Hauser
08-12-05, 13:56
Ob ich LIKE oder POSSTR verwende ist im Endeffekt egal!

Mit Like (inclusive Wildcards und unter Berücksichtigung der Sonderzeichen % und _) würde die Funktion wie folgt aussehen:


P Like B Export

D Like PI A
D PPText 32740A varying Const
D PPSearch 32740A varying Const
D PPEscape 1A Const Options(*NoPass)

D ParmEscape C const(3)

D Found S 1A
*----------------------------------------------------------
C/EXEC SQL Set Option SrtSeq = *LangIdShr
C/End-EXEC

C If %Parms >= ParmEscape
C/EXEC SQL
C+ Set :Found = Case when :PPText like :PPSearch escape :PPEscape
C+ then '1' else '0' End
C/END-EXEC
C else
C/EXEC SQL
C+ Set :Found = Case when :PPText like :PPSearch
C+ then '1' else '0' End
C/END-EXEC
C EndIf

C Return Found
P Like E


Birgitta

TARASIK
08-12-05, 14:37
Hallo Birgitta und Fuerchau,
vielen Dank an Euch beide. Es funktioniert jetzt.