[NEWSboard IBMi Forum]

Thema: API QCLSCAN

Hybrid View

  1. #1
    Registriert seit
    May 2002
    Beiträge
    2.643

    API QCLSCAN

    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 ?

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    May 2002
    Beiträge
    2.643

    QCLSCAN

    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.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    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)) ...
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    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:


    PHP-Code:
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    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:
    PHP-Code:
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  8. #8
    Registriert seit
    May 2002
    Beiträge
    2.643

    vielen Dank an Birgitta und Fuerchau

    Hallo Birgitta und Fuerchau,
    vielen Dank an Euch beide. Es funktioniert jetzt.

Similar Threads

  1. Probleme API QUSLJOB aufzurufen
    By TMusolf in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 25-01-07, 12:42
  2. API QLGSORT/QLGSRTIO
    By muadeep in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 03-01-07, 17:53
  3. javamail api
    By jogisarge in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 22-11-06, 16:02
  4. Eingabe sperren bei Fehlermeldung über API
    By ExAzubi in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 17-10-06, 16:48
  5. API für die Ermittlung aktiver Jobs
    By lyrics in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 29-08-06, 09:03

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •