[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Feb 2007
    Beiträge
    68

    NULL Felder / CPYTOIMPF

    Hallo *ALL

    Vielleicht kann mir jemand helfen?

    Ich möchte versch. physische Dateien mit CPYTOIMPF in ein CSV File ausgeben.
    Das klappt natürlich auch alles gut - nun die Frage:

    Felder ohne Inhalt sollen auch in der CSV ausgegeben werden ohne irgendeinen
    Wert zwischen den Trennzeichen - auch kein Blank.
    Das funktioniert bisher, indem ich die Felder als NULL Felder in der DDS spezifieziere
    und explit jedes einzelne dieser Felder abfrage und wenn '' der Wert ist dann mit
    eval %nullind(o_feld ) = *on setze... Das ist bei knapp 500 Feldern ein wenig
    Aufwand.

    Gibt es irgendeine Möglichkeit die Felder immer auf *NULL zu setzen, wenn wirklich
    kein Inhalt vorhanden ist bzw. der Wert BLANK ist. Die Dateien aus denen ich lese
    (ERP System) sind leider nicht NULL allowed.

    Danke für jeden Hinweis.

    gruss cicero22

  2. #2
    Registriert seit
    May 2002
    Beiträge
    1.121
    Das sollte eigentlich der Parameter RMVBLANK(*BOTH) erledigen.
    Da schneidet bei allen Textfeldern die Blanks vorn und hinten ab.
    Gruß
    Ronald

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.238
    CPYTOIMPF ... RMVBLANK(*LEADING/*TRAILING/*BOTH)

    Leider gibt es für die NULL-Behandlung keinen Standard.
    NULL wird von SQL nur dann gesetzt, wenn das Feld
    a) im Insert nicht erwähnt wird und NULL erlaubt ist
    b) im Insert eine NULL-Indikator auch auf -1 gesetzt ist

    Im RPG mit Native-IO kann man dies nun so gar nicht definieren.
    Das System führt intern einen IO-Puffer, der in 2 Bereiche geteilt ist.
    1. Feldpuffer
    2. NULL-Indikatoren je Feld
    Beim Lesen wird aus dem IO-Puffer in RPG-Variablen kopiert.
    Beim Schreiben wird aus den Variablen in den Puffer kopiert und der INSERT/UPDATE ausgeführt.
    Ein "Nicht erwähnen" eines Feldes wie in SQL ist daher nicht möglich!
    Man ist also gezwungen per %NULLIND(Name) das Flag zu setzen oder zu löschen.
    Dabei ist natürlich darauf zu achten, dass beim Füllen der Variablen ein gesetztes NULL-Flag nicht gelöscht wird!
    Vergisst man also das Zurücksetzen, wird NULL an Stelle des neuen Wertes geschrieben.

    Auch per Trigger hat man es da nicht einfacher. Man bekommt den Daten-Puffer und NULL-Indikatoren übergeben.
    Die NULL-Indikatoren sind ein "5I 0 DIM(nn)". Wenn der Trigger also das NULL-Flag setzen will muss man genau Zählen.
    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 2007
    Beiträge
    68
    schonmal Danke soweit Ihr Beiden:

    Also das mit RMVBLANK(*BOTH) hatte ich schon so gesetzt....
    Leider erscheint in der CSV Datei jedoch trotzdem das Feld so:
    ;" ";

    Komme ich also wohl um das %NULLIND nicht herum

  5. #5
    Registriert seit
    Nov 2003
    Beiträge
    2.307

  6. #6
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    wir verwenden SED
    /* -------------------------------------------------------------------------- */
    /* ACHTUNG "; ; ; ; ; ;" IST NACH DEM SED */
    /* ";; ;; ; ;" ER FINDET "; ;" TAUSCHT ES IN ;; UND FINDET DAHINTER */
    /* " ; ; ; ;" DARAUS WIRD " ;; ; ;" */
    /* " ; ;" DARAUS WIRD " ;;" */
    /* GESAMTERGEBNISS : ";; ;; ;;" */
    /* D.H. UM ALLE BLANK ZU ELEMINIREN IST SED 2 * ERFORDERLICH !!! */
    /* -------------------------------------------------------------------------- */

    RMV_BLANK: /* s = suche '; ;' tausche in ';;' g = global, alle vorkommen */
    CHGVAR VAR(&QSH) VALUE('SED s/''; ;''/'';;''/g' *BCAT &P2 *BCAT '>' *CAT &PFAD)
    STRQSH CMD(&QSH)
    &P2 ist /pfad/der/datei/incl/datei.csv
    &Pfad ist das gleiche (anderer Dateiname)

    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.238
    Bei den ganzen Klimmzügen weiß ich schon, warum ich CSV's per SQL und CPYTOSTMF erstelle ;-).
    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
    Apr 2009
    Beiträge
    11
    Moin Moin *ALL

    ich habe ein ähnliches Problem gestern auch gehabt, bei mir hat es funktioniert indem ich die Codepages explizit angegben habe:

    QSYS/CPYTOIMPF FROMFILE(liba/filea) +
    TOSTMF('/HOME/export/path/filea.csv')
    MBROPT(*REPLACE) FROMCCSID(273) +
    STMFCCSID(1250) RCDDLM(*CR) DTAFMT(*DLM) +
    STRDLM(*DBLQUOTE) RMVBLANK(*BOTH) +
    FLDDLM(';') NULLIND(*YES) DECPNT(*COMMA) +
    ADDCOLNAM(*SYS)
    MONMSG CPF2817

    Dabei war der Knackpunkt die CP 1250 MS Win Latin2 und nicht die Standard CP 1252 zu verwenden, dann erscheint X'0' immer als @.
    Mit der 1250 sehen die Felder dann auch im Excel korrekt aus...
    Vielleicht hilft Die das auch!

    Volker

  9. #9
    Registriert seit
    Feb 2007
    Beiträge
    68
    Vielen Dank Euch soweit. Leider hat noch nichts wirklich zum Ziel geführt - leider (V5R4) aber teilweise auch mit anderen Releases nicht. Das einzigste womit ich es wirklich zuverlässig hinbekomme ist das %NULLIND im RPG . Aber ich werde nochmals alles durchprobieren... Danke

    PS: Das mit "SED" wollte ich nicht nutzen......

  10. #10
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    SED wurde bei mir auch zu 5.4 er Zeiten ohne RMVBLANK(*BOTH) erdacht.

    Nachdem wir festgestellt hatten das es 2 mal laufen muß läuft es stabil und einigermassen schnell.
    (8-9 Mio Datensätze in 3-5 Minuten auf einem /qntc/ gemapten PC

    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.238
    Also 273 nach 1250 ist schon gewagt, da 1250 der 870 (polnisch) entspricht.
    Da sind wohl die Daten von einem Nicht-273-Terminal erfasst worden.

    Ansonsten per SQL:
    select
    trim(f1) concat ";" concat
    trim(char(f2)) concat ";"
    :
    from mytable
    where
    ...

    Das Ergebnis lässt sich sehr schön als CSV weitergeben.
    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
    Feb 2007
    Beiträge
    68
    Ich hatte das mit *BOTH nun einige male versucht - aber immer wieder bringt er mir die Felder " "; " "; usw... Das mit SQL ist auch nett Fuerchau - Danke. mal sehen wie ich es löse... Danke

Similar Threads

  1. UPDDTA und Null-Werte
    By alexk2013 in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 14-05-14, 12:33
  2. SQL IS nOT NULL funktioniert nicht auf V7.1
    By hs in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 31-01-14, 11:49
  3. CPYTOIMPF
    By alex in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 03-06-03, 08:22
  4. Antworten: 5
    Letzter Beitrag: 23-04-03, 13:48
  5. Virtuelle Spalten im VIEW auf NULL
    By KB in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 18-05-01, 15:04

Berechtigungen

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