[NEWSboard IBMi Forum]
Seite 2 von 4 Erste 1 2 3 ... Letzte
  1. #13
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    Sorry für mein wirres Schreiben heute. Das Problem hat sich doch nicht erledigt. Der Doppelpunkt ist natürlich erforderlich.

    Also nochmal: Hat jemand eine Idee?

  2. #14
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Ja, da hat RPGLE leider noch ne kleine Macke:
    Definiere in den H-Zeilen zusätzlich die CCSID für UCS2:

    h ccsid(*ucs2:*utf16)

    Ich habe allerdinsg die Variable so deklariert:

    dcls-s FileString SQLTYPE(DBCLOB:8000000) ccsid(1200);
    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. #15
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    So kompiliert er es:
    Code:
    dcl-proc UM_StmfToStrUni export;
       dcl-pi *n varucs2(300000);
          file varchar(2000) const;  //file incl. Pfad
       end-pi;
    
    
    dcl-s clobFile sqltype(DBCLOB_FILE);
    dcl-s clobDS sqltype(dbclob:300000) ccsid(1200);
    dcl-s text varucs2(300000);
    
    
    clobFile_Name = %trim(file);
    clobFile_NL   = %len(%trim(clobFile_Name));
    clobFile_FO   = SQFRD;  //Read Only
    
    
    exec sql set :clobDS = :clobFile;
    text = clobDS;
    
    
    return text;
    
    
    end-proc;
    Geht das auch "speichersparender"? Ich habe ja bereits die Variable clobDS mit 300000 deklariert. Für die Rückgabe benötige ich anscheinend nochmal extra eine passende Variable text mit nochmal 300000 Zeichen.

  4. #16
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    OK,
    jetzt habe die Lösung ohne die zusätzliche Text-Variable:
    Code:
    dcl-proc UM_StmfToStrUni export;
       dcl-pi *n varucs2(300000);
          file varchar(2000) const;  //file incl. Pfad
       end-pi;
    
    
    dcl-s clobFile sqltype(DBCLOB_FILE);
    dcl-s clobDS sqltype(dbclob:300000) ccsid(1200);
    
    
    clobFile_Name = %trim(file);
    clobFile_NL   = %len(%trim(clobFile_Name));
    clobFile_FO   = SQFRD;  //Read Only
    
    
    exec sql set :clobDS = :clobFile;
    
    
    if clobDS_len > 0;
       return %trimr(%subst(clobDS_data:1:clobDS_len));
    else;
       return %ucs2('');
    endif;
    
    
    end-proc;
    Ich werde jetzt mal verschiedene Tests durchführen, ob auch alle Zeichen korrekt gelesen werden.

  5. #17
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Ich arbeite da ein wenig anders.
    Als Returnwert verwende ich grundsätzlich einen Indicator, so dass ich die Funktion direkt im IF aufrufen kann:

    dcl-pr GetFile ind;
    FileName varucs2(256) const;
    Record varucs2(8000000);
    end-pr;

    if GetFile(FileName:Buffer);
    // Tu was
    endif;

    Den Puffer übergebe ich nicht per CONST sondern per Referenz. Somit spare ich mir auch das Kopieren des Inhalts noch mal im Return. Der Parameter ist ebenso Ziel des SQL's.

    Somit vereinfacht sich auch das Ergebnis:

    exec sql .....
    return SQLCODE = *zero;

    Wichtig ist natürlich, dass die CCSID der Streamfile umwandelbar ist. Ich habe in einer einderen Anwendung bei einem Fehler, da ich UTF8 erwarte, noch mal den "CHGATR OBJ(...) ATR(CCSID) VALUE(1208)" durchgeführt und den Import wiederholt.
    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. #18
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    Ich hatte eben auch schon einige Probleme mit den CCSIDs meiner Testdateien. Aber es scheint zu laufen.

    Das mit der Parameterübergabe per Referenz hat für mich den Nachteil, dass das rufende Programm eine exakt passende Variable bereitstellen muss. Wenn ich den Dateiinhalt als Rückgabeparameter zurückgebe, kann ich direkt die Zuweisung in eine (kleinere) Variable durchführen, z. B. in ein Bildschirmfeld.

    Nochmal danke für eure Hilfe.

  7. #19
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Das prüft der Compiler über haupt nicht.
    Ich hatte schon des öfteren mal Tippfehler bei der Übergabe von DS'n an eine Prozedur. Das hat den Kompiler in keinster Weise gestört ob die DS'n gleich lang definiert sind, geschweige, dass auch noch die Struktur der DS geprüft wurde.
    Bei Single-Variablen magst du Recht haben.
    Allerdings ist es korrekt, dass die Maximalgröße dann vorgesehen werden muss, aber auch das ließe sich per Parameter (wie bei API's auch) definieren.
    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. #20
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    Ich hätte da ein paar Bedenken. Selbst wenn der Compiler es durchlässt: Besteht nicht die Gefahr, dass man in Speicherbereiche anderer Variablen eingreift? (Wenn man noch weitere Parameter hat)

    Aber vielleicht passt es.

  9. #21
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Natürlich besteht da die Gefahr, allerdings prüft ja der Compiler bereits nichts, so dass Überschreiber schon immer möglich sind.
    Das Schlüsselwort CONST verhindert nur zur Compilezeit ein Überschreiben durch Fehlermeldungen, allerdings nicht den Zugriff auf falsch definierte Speicherbereiche.
    Da ein Serviceprogramm ohne Änderung des Aufrufers erneuert werden kann, merkt die Laufzeit hier nichts, da es keine Signaturprüfung gibt.
    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. #22
    Registriert seit
    Aug 2014
    Beiträge
    179
    Hallo Dieter,

    kleiner Tipp mit rtnparm geht es noch etwas schneller
    PHP-Code:
    dcl-pi *n varucs2(300000rtnparm
    Herzliche Grüße
    Rainer Ross

    Webanwendungen auf IBM i so schnell wie Greescreen - Hier klicken und testen
    http://www.myhofi.com/tms/HTML/MySubfileApp.html

    Selektion Umsatz, Kredit und Saldo geht über < oder > oder <= oder >=
    siehe https://docs.webix.com/datatable__filtering.html#number

  11. #23
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    Vielen Dank. Dass mit rtnparm kannte ich noch nicht. Trotz des Nachlesens in der RPG Reference bin ich mir noch nicht ganz sicher, was es tut. In der Referenz steht, dass es Vorteile hat, wenn die realen Rückgabewerte klein sind. Dann wird wohl weniger Speicher benötigt. Die Frage ist, ob es immer funktioniert.

  12. #24
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Hi Dieter,

    eigentlich ist der Vorteil dann, wenn die Rückgabewerte groß sind.
    Normal wird eine Kopie beim Returnwert erstellt. Beim RTNPARM wird lediglich die Speicheradresse (Pointer) vom Wert zurückgegeben.
    Das ist dann am schnellsten.

    lg Andreas

Similar Threads

  1. http_url_get mit unicode
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 29-03-19, 14:56
  2. Zeichenumsetzung AS/400 nach Streamfile
    By Theo in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 02-03-18, 13:46
  3. Ausländische Zeichen in Streamfile schreiben
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 12-12-17, 14:32
  4. Konvertieren in Unicode
    By Rainer Ross in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 28-10-16, 17:16
  5. IFS-Streamfile in RPG bearbeiten
    By Bleil in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 13-10-01, 21:15

Berechtigungen

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