[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    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.

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

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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

  4. #4
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    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.

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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

  6. #6
    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 :-)

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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

  8. #8
    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! :-)

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Ich würde den Parameter ebenso "varying" definieren und die For-Schleife darf nicht mit %trim() arbeiten.
    Wenn mal Leerzeichen am Anfang stehen arbeitest du zu kurz.
    Außerdem sollten diese ggf. ja nicht entfernt werden (siehe u'0020').
    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
    Feb 2001
    Beiträge
    20.696
    Was soll die Abfrage

    or ($ch >= u'00010000' and $ch <= u'0010FFFF');

    Du hast doch kein UCS4.
    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

  11. #11
    Registriert seit
    Jun 2005
    Beiträge
    17
    Ich arbeite in der For-Schleife absichtlich mit Trim, da ich eine größere Menge Sätze bearbeite und das ganze spürbar langsamer wird, wenn man die gesamten 5000 Zeichen durchläuft, auch wenn evtl. nur 200 Zeichen belegt sind. So ist es wesentlich schneller und Leerzeichen am Anfang kommen bei mir nicht vor.

    Ich habe die Abfrage so gebaut, weil in der Fehlermeldung unter https://www.ibm.com/support/knowledg...pc/n20377.dita alle erlaubten Zeichen angeben sind - diese habe ich so übernommen.

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Wenn du die PI-Variable mit Varying definierst, werden dir ja nur so viele Zeichen übergeben, wie die Quelle lang ist. Du arbeitest ja eben keine 5000 Zeichen durch!
    Außerdem musst du folgendes beachten:
    Der Aufruf kopiert deine Quelle in ein 5K-Feld und füllt mit Leerzeichen auf.
    Die %trim() entfernt die Leerzeichen wieder, %Len() gibt dir die Länge, anschließend verwirfst du das Trim-Ergebnis wieder.
    Übergibst du also z.B. " A", gibt deine Routine nur das Leerzeichen zurück.

    Also:
    Definiere PR/PI mit "varying const" und arbeite ohne Trim die Zeichen ab.
    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

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
  •