[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    Jun 2005
    Beiträge
    17

    DB2 / SQL / String auf gültige Zeichen prüfen

    Hallo Forum,

    ich habe folgendes Problem:

    ich lese aus einer DB2-Tabelle Daten, die in XML umgesetzt werden. Dafür erzeuge ich mit Hilfe von SQL eine Zwischendatei. Ein Tag sieht so aus:
    Code:
    Exec Sql
       Insert into temp
         (XMLSTRING)
            values(
               XMLSERIALIZE(
               XMLDOCUMENT(
               XMLELEMENT(NAME "ingredients", trim(Char(:variable)))
             )
          AS VARCHAR(5000) CCSID 1208
          ));
    Enthält "variable" ungültige Zeichen, fällt mein SQL mit einem SQLCOD von -20377 auf die Nase.
    Wie schaffe ich es, ungültige Zeichen vor dem SQL herauszufiltern? Oder gibt es eine SQL-Funktion, die ich nur nicht finden kann? ;-)

    Fehlerbeschreibung hier:
    https://www.ibm.com/support/knowledg...pc/n20377.dita
    Da steht euch eine Liste der gültigen Zeichen.

    Gruß,
    Frederik

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Die Frage ist, was sind ungültige Zeichen?
    In einem Element (Attribut oder Knoten) darf z.B. natürlich kein "<" vorkommen, da damit wieder XML eingeleitet wird.
    Hierfür benötigst du eine SQL-Funktion, die dir die Zeichen übersetzt.
    Aus "<" wird dann z.B. "<", aus dem "&" dann "&" usw.
    Nicht druckbare Zeichen (Hexwerte) müssen dann in Pseudo-Unicode (ich glaube "#nnnn;" o.ä.) übersetzt werden.
    Umgedreht, beim Einlesen benötigst du dann eine Rückübersetzung.
    Leider gibt es dafür tatsächlich keine Standard-SQL-Funktion, dafür musst du dir eine schreiben (lassen).
    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
    Feb 2001
    Beiträge
    20.241
    Genaueres kannst du auch hier nachlesen:
    https://wiki.selfhtml.org/wiki/Refer...eichenreferenz
    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
    Jun 2005
    Beiträge
    17
    Ungültige Zeichen sind hier Zeichen, die SQL anmeckert (siehe Link oben - da stehen ja im Text die erlaubten Zeichen). Das Problem ist, dass der gesamte Befehl scheitert und mir der Tag in der XML-Datei fehlt.

    Ich brauche auch gar nicht den großen Aufwand über Pseudocode; es würde mir reichen, die ungültigen Zeichen mit Spaces zu ersetzen, da ich keine Rückübersetzung brauche. Wie stelle ich das an?

    Hintergrund: Hier geht es um Zutatentexte, die von einer Waage aufs Etikett gedruckt werden. Die Daten werden von der AS/400 in XML gewandelt und dann per FTP an die Waage übertragen. Besser als gar keinen Text auszudrucken ist also, die ungültigen Zeichen einfach weg zu lassen.

  5. #5
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Wie wärs mit XLATE in RPG ?

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Mir ist nicht bekannt, dass XLATE aus 1 Zeichen mehr als 1 Zeichen ersetzt.
    Der Vorgang ist da schon etwas komplexer.
    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
    Jun 2005
    Beiträge
    17
    Für %XLATE müsste ich aber wissen, WAS ich ersetzen soll. Leider kann in einem einzelnen Zeichen des Strings irgendein Schrott-Hexwert drin stehen. Besser wäre also mit %CHECK oder so zu prüfen, ob die Zeichen gültig sind. Da das aber ne ganze Latte sind (https://www.ibm.com/support/knowledg...pc/n20377.dita) geht das so auch nicht. Ich wüßte auch gar nicht, wie ich da Hex-Werte angebe...

  8. #8
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Macht er auch nicht. Muß aber auch nicht, oder?
    Ansonsten eben mehrmals %SCAN und %REPLACE oder %SCANRPL (sofern verfügbar).

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Mir ist nicht bekannt, dass XLATE aus 1 Zeichen mehr als 1 Zeichen ersetzt.
    Der Vorgang ist da schon etwas komplexer.

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Siehe obigen Link für die HTML's.

    d MySource s 1000 varying
    d MyDest s 2000 varying
    d Ind s 5i 0

    // grobes Beispiel
    MyDest = '';
    for Ind=1 to %len(MySource);
    select;
    when %subst(MySource:1:1) < *blank
    or %subst(MySource:1:1) >= x'FE';
    MyDest += RoutineHexToHtml(%subst(MySource:1:1)); // #xNNNN, N = 0-9A-F
    when %subst(MySource:1:1) = '&';
    MyDest += '&';
    when %subst(MySource:1:1) = '<';
    MyDest += '<';
    when %subst(MySource:1:1) = '>';
    MyDest += '>';
    :
    :
    other;
    MyDest += %subst(MySource:1:1);
    endsl;
    endfor;
    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

  10. #10
    Registriert seit
    Jun 2005
    Beiträge
    17
    Ich bekomms nicht hin. Ich habe es so probiert:
    Code:
           //-----------------------------------------------------------------------
           // XML-String prüfen
           //-----------------------------------------------------------------------
           dcl-proc XMLConvert;
             dcl-pi *N;
                $string ucs2(5000);
             end-pi;
    
    
             dcl-s #i    zoned(4:0);
             dcl-s $ch   char(1);
             dcl-s $temp ucs2(5000);
    
    
             $temp = '';
             for #i = 1 to %len($string);
               $ch = %char(%subst($string:#i:1));
               if $ch = x'09'
                 or $ch = x'0A'
                 or $ch = x'0D'
                 or ($ch >= x'20' and $ch <= x'D7FF')
                 or ($ch >= x'E000' and $ch <= x'FFFD')
                 or ($ch >= x'100000' and $ch <= x'10FFFF');
                 $temp = $temp + %subst($string:#i:1);
               endif;
             endfor;
             $string = $temp;
             return;
           end-proc;
    Der Ergebnisstring ist aber immer leer. Wenn ich mit Debug durchsteppe, scheint er die Zeile
    Code:
    $temp = $temp + %subst($string:#i:1);
    gar nicht auszuführen.

    Wahrscheinlich sehe ich den Wald aber vor lauter Bäumen nicht mehr. ;-)
    Ich geh jetzt mal ins Wochenende und mache am Montag weiter :-)

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Mach mal $temp als varying und initialisiere es auf ''.
    $temp = $temp + 'x' = 5000 Zeichen + 1 = 5001 => Move 5000 da das Zielfeld zu klein ist.
    Achte bei deinen Vergleichen auch wirklich auf die Länge und nimm keine 1-Byte Zeichenvariable sondern verwende für alles UCS2.
    Aus x'09' wird dann halt x'0009'.
    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

  12. #12
    Registriert seit
    Jun 2005
    Beiträge
    17
    So sieht jetzt die Lösung aus:
    Code:
           //-----------------------------------------------------------------------       // XML-String prüfen
           //-----------------------------------------------------------------------
           dcl-proc XMLConvert;
             dcl-pi *N;
                $string ucs2(5000);
             end-pi;
    
    
             dcl-s #i    int(10);
             dcl-s $ch   ucs2(1);
             dcl-s $temp varchar(5001) inz('');
    
    
             for #i = 1 to %len(%trim($string));
               $ch = %char(%subst($string:#i:1));
               if    $ch =  u'0009'
                 or  $ch =  u'000A'
                 or  $ch =  u'000D'
                 or ($ch >= u'0020' and $ch <= u'D7FF')
                 or ($ch >= u'E000' and $ch <= u'FFFD')
                 or ($ch >= u'00010000' and $ch <= u'0010FFFF');
                 $temp = $temp + $ch;
               else;
                 $temp = $temp + ' ';
               endif;
             endfor;
             $string = $temp;
             return;
           end-proc;
    So funktioniert es erst mal.

    Vielen Dank für das auf den richtigen Weg bringen! :-)

Similar Threads

  1. unbekannte Datei Feldweise in allg. gültige Tabelle schreiben
    By Robi in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 07-01-16, 07:40
  2. suchen im string mit sql
    By ILEMax in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 11-01-14, 09:32
  3. String ausschneiden
    By heynem in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 20-03-03, 09:15
  4. Programmname aus String ermitteln
    By LaLeLi in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 19-06-02, 08:38
  5. Zur Zeit gültige IBM-Promos nutzen !
    By AS-Trade in forum NEWSboard Server & Hardware Markt
    Antworten: 0
    Letzter Beitrag: 08-09-01, 12:29

Berechtigungen

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