PDA

View Full Version : CPYFRMIMPF (Tausenderpunkt)



Seiten : 1 [2]

Robi
04-02-14, 13:35
Doch, hab ich doch geschrieben.
Definiere ALLE Felder der Zieldatei als alpa.
Schreibe ein mini Pgm, das via input/output die Felder prüft, formatiert und so ausgibt, wie du es brauchst.
Läuft hier bestimmt mit 20 Schnittstellen so!
Robi

KingofKning
04-02-14, 13:38
Und was hälst Du dann davon, die Datei in eine Zwischendatei zu importieren, das Feld per SQL zu ändern und entweder dann per SQL in die richtige Datei schreiben Alpha-Feld per Cast in numerisch wandeln oder zu exportieren und dann in die richtige Datei zu importieren.Dürfte nicht viel Zeit kosten das zu realisieren. Alternativ habt Ihr jemanden der Cobol oder RPG kann.GG

Fuerchau
04-02-14, 13:59
1000er Trennzeichen werden tatsächlich von SQL nicht unterstützt.
CPYFRMIMPF verwendet intern nämlich SQL.
Um die Daten per SQL zu verarbeiten ist ein Replace der Punkte mit "Nichts" erforderlich um anschließend per CAST(TRIM(...)...) in Dezimal zu wandeln.
Also, wie der Vorredner schon sagt:
Importdatei mit Alphafeldern, SQL-View über die Alphafelder mit erforderlichen Casts.
Dann kann locker die View verwendet werden.

fpxx
04-02-14, 14:07
Danke für Tipps; ich werde wohl die SQL-Variante verwenden.

Trotzdem schade, dass es keinen "eigenen" Parameter im CPYFRMIMPF gibt (ähnlich zu DECPNT oder RPLNULLVAL).
Da ist wohl IBM gefordert. ;-)

AG1965_2
04-02-14, 16:35
Oder man lässt csv-Dateien von Programmierern erstellen, die wissen, was sie tun.
Nicht für jeden Schrott ist gleich IBM aufgerufen, was zu tun.

Robi
04-02-14, 17:09
Stimmt!
Häufig sind CSV Dateien Excel 'Masken', erstellt vom Neffen vom Chef, in denen der Anwender ALLES machen kann.
Bsp.:
Datum der Abgabe: 08.04.2014, 14/04/08, 20140408 ,"Schnellstens"
Monat der Fertigstellung: Januar, Jan, 01, 01/2014, "bald"
Wert: 15,00 oder 1.500,99 oder "steht noch nicht fest"

fröhliches Schnitstellen gestalten mit SQL :D

BenderD
05-02-14, 07:27
... CPYFRMIMPF ist lediglich ein dümmlicher Name. Andere Datenbanken nennen solche Routinen load und unload. Sprich: die CSV Files kommen aus einer Datenbank, werden transportiert und dann landen sie wieder in einer anderen Datenbank - und wenn die Tabellen zueinander passen, dann geht das alles.
Für "echten" Schrott (Datum schnellstens etc.) hat CPYFRMIMPF die beiden Parameter ERRLVL, ERRRCDFILE und ERRRCDOPT (F1 und lesen macht schlauer). Mit den Tausenderpunkten ist das so eine Sache, das könnte CPYFRMIMPF händeln und sollte es wohl auch tun. EIn search/replace ist wohl zu wenig, der würde auch "." in Strings entfernen, sich dafür einen Filter zu schreiben, sollte wohl jeder Programmeur-AZUBI hinbekommen...

D*B

E305GL
22-04-14, 08:25
bin zufällig auf diesen beitrag gestossen; wie wurde das problem tatsächlich gelöst ?

fpxx
22-04-14, 09:55
Die Daten stammen von einem Kunden und werden auf einem FTP-Server bereitgestellt, von wo sie dann abgeholt werden; eine Vorlauf-Routine in der "PC-Welt" (das aufgrund der Problemstellung von einem Dienstleister erstellt wurde) entfernt dann in den relevanten Feldern die Tausenderpunkte.
Wie das technisch geschieht, weiß ich selbst nicht; ich erhalte die bereinigte Datei in einem IFS-Folder, von dort kann sie dann problemlos mit CPYFRMIMPF in die AS400 importiert werden.
fpxx

AG1965_2
22-04-14, 10:14
Wurde höchstwahrscheinlich über eine Hilfsdatei mit ausschließlich Alpha-Feldern gelöst.

Andere Lösung:
Wir haben eine Funktion csvRead geschrieben, die nach jeder Zeile eine Prozedur oder ein Programm aufruft (Callback) und dieser eine Feldgruppe mit bis zu 999 Elementen zu je bis zu 1.024 varchar übergibt.
Zuvor ruft man csvInfo auf, das einem die Anzahl der Zeilen und Spalten usw. liefert. So kann man sein Programm vor falschen Dateien schützen.


C EVAL csvInfoDS = csvInfo(#IFSFile)
C IF csvInfoDS.cols <> 17
C* Fehlermeldung, Datei hat falsche Spaltenanzahl
C ENDIF
...
C CALLP csvRead(#IFSFile:
C %PADDR(Zeile): Adresse der Zeilen-Prozedur
C *BLANK: alternativ Programmname
C csvInfoDS) DS mit Infos über das csv-file

"Zeile" ist der Name einer Prozedur im selben Programm. Sie wird für jede Zeile der csv-Datei aufgerufen. Die hat so auszusehen:


P Zeile B
D PI
D csvInfoDS LIKEDS(csvInfoDS_T) CONST Info über csv-file
D row 10U 0 CONST aktuelle Zeilen-Nr
D csvval 1024 VARYING DIM(999) CONST Spalten-Werte
...
C EVAL myFeldA = csvval(1)
C EVAL myFeldB = csvval(2)
...
P E

So muss man sich über das Thema "csv" nur einmal den Kopf zerbrechen und kommt ohne Hilfsdatei aus und schränkt den anwendenden Programmierer nicht ein.

Hier kann man sich jedes einzelnen Feldinhaltes natürlich liebevollst annehmen und so fehlertolerant sein, wie man möchte.

Obwohl die Datei zweimal byteweise von vorn bis hinten durchgelesen wird (1x für csvInfo und 1x für csvRead), performt das sehr gut.