PDA

View Full Version : NULL Felder / CPYTOIMPF



Seiten : [1] 2

cicero22
03-09-14, 08:46
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

malzusrex
03-09-14, 08:56
Das sollte eigentlich der Parameter RMVBLANK(*BOTH) erledigen.
Da schneidet bei allen Textfeldern die Blanks vorn und hinten ab.
Gruß
Ronald

Fuerchau
03-09-14, 09:00
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.

cicero22
03-09-14, 09:17
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 :(

Pikachu
03-09-14, 09:19
Sieh mal hier (http://newsolutions.de/forum-systemi-as400-i5-iseries/threads/19121-CPYTOIMPF-Blank-beim-Export-aber-Inhalt-von-Feld-leer) und suche mal nach QCPNOBLANK.

CPYFRMIMPF and CPYTOIMPF Data Areas (http://www-01.ibm.com/support/docview.wss?uid=nas8N1011149)

Robi
03-09-14, 09:38
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

Fuerchau
03-09-14, 09:51
Bei den ganzen Klimmzügen weiß ich schon, warum ich CSV's per SQL und CPYTOSTMF erstelle ;-).

balu40
03-09-14, 14:32
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

cicero22
03-09-14, 14:59
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......

Robi
03-09-14, 15:06
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