[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Feb 2007
    Beiträge
    70

    SCANNEN Buchstabenfolge

    Hallo,
    gibt es eine einfache Möglichkeit eine Buchstabenfolge in einem Feld zu scannen ohne Berücksichtigung der Groß/Kleinschreibung.
    Mit %SCAN finde ich nur die Suchargumente wo Groß/Kleinschreibung übereinstimmen. Ich habe nun eine Suche und möchte eine Anzeige die nur die Buchstaben überprüft, egal ob groß oder kleingeschrieben.


    Danke.

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Hallo,

    Embedded SQL:
    Code:
    Exec Sql Set :ergebnis = case  when upper('abcd') like 'ABC%' then 1 else 0 end;
    lg Andreas

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Mit Variablen sollte das so aussehen:

    Vergleich = '%abcd%';
    exec SQL set : Ergebnis = case when upper(: feld) like trim(upper(: Vergleich)) then 1 else 0 end;

    Wichtig ist der Trim für das Vergleichsfeld, da sonst die Leerzeichen mit gesucht werden.
    Möchte man die Position dann geht das über:

    vergleich = 'abcd';
    exec SQL set : Ergebnis = posstr(upper(: Vergleich), upper(: Feld));
    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

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Natürlich gehört der TRIM auch zum 2. Beispiel.
    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
    Jul 2011
    Beiträge
    4
    Und ohne SQL:

    D lo c 'abcdefghijklmnopqrstuvwxyz'
    D up c 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'


    Gefunden = *off;
    if %scan('ABC' : %xlate(lo : up : String) : 1) > 0;
    Gefunden = *on;
    endif;

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Da werden dann aber sämtliche Sonderzeichen (éâ...) und Umlaute ausgeschlossen.
    Diese Sonderzeichen sollten aber nicht im Code eingetragen werden da sie dann nicht CCSID-Unabhängig verwendet werden können.
    SQL arbeitet mit der CCSID des Job's und damit klappt es auch mit Sonderzeichen.
    SQL kann auch mit Unicode Feldtyp "C" umgehen.
    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
    Vielleicht noch eine Anmerkung zu der SQL-Geschichte:
    1. Ein Trim ist nicht unbedingt erforderlich, wenn die Host-Variable mit variabler Länge definiert wurde und die führenden/folgenden Blanks bereits vorab entfernt wurden. (Ein zusätzlicher SQL-TRIM ist natürlich auf alle Fälle sicherer.

    2. Auf die Konvertierung mit UPPER oder LOWER kann man verzichten, wenn man die Sortierreihenfolgen LANGIDSHR verwendet. Große und kleine Buchstaben erhalten dann die gleiche Wertigkeit. Die Sortierreihenfolge kann in dem SET OPTION Statement gesetzt werden. Dabei ist allerdings zu beachten, dass die gesetzte Sortierreihenfolge unversell, für alle SQL-Statments gilt und innerhalb des Moduls nicht mehr geändert werden kann. Es macht jedoch durchaus Sinn sich alle Funktionen, mit denen caseinsensitive verglichten, durchsucht oder geändert werden in einem einzigen Modul zu hinterlegen und dieses in ein Service-Programm zu binden.

    3. Ich würde auch die % Zeichen im SQL-Statement hinterlegen.

    Code:
    Exec SQL  Set Option SortSeq = *LangIdShr, ... weitere Optionen;
    
    Exec SQL  Set :isFound = Case When :HostVar Like '%' concat Trim(:Vergleich) concat '%'
                                   Then 1 else 0 End;
    oder

    Code:
    Exec SQL Set :Position = PosStr(Trim(:Vergleich), Trim(:HostVar));
    oder Locate funktioniert wie Posstr, nur dass es einen optionalen 3 Parameter hat über den die Position ab der gesucht werden soll angegeben werden kann.

    Code:
    Exec SQL Set :Position = Locate(Trim(:HostVar), Trim(:Vergleich));
    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

Berechtigungen

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