ralfhackmann
Goto Top

Informix SE INSERT Felder initialisieren, aber richtig?

Hallo,

es kommt immer wieder mal vor, dass ich Datensätze in einer CSV Datei erhalte und diese in die Datenbank unseres ERP Systems per INSERT importieren muss (hier Stücklistenpositionen)
Da die in entsprechenden Tabelle mehr Felder enthält wie die Spalten der zu importierenden CSV Datei, habe ich ein Problem mit der Initialisierung der restlichen Felder.
Denn wenn ich nur die Felder der CSV-Datei importiere, bleiben die anderen undefiniert und zeigen später in der Anwendung unsinnige Zeichen an.
Ich behelfe mich damit, indem ich im ERP System einen default Datensatz anlege, oder heraussuche und und per select undloade.
Diesen nutze ich dann als Vorlage für einen awk Befehl, indem ich die Felder aus der zu importierenden CSV-Datei an den richtigen Stellen einfüge.
Diese neue CSV Datei (hier fksag_import_tmp.csv) importiere ich dann Per LOAD un INSERT in die Tabelle.

Das Ganze funktioniert zwar, aber irgendwie kommt mir das unsauber vor!

Wie geht man hier normalerweise vor?

Ich muss zugeben, dass ich mich mit SQL Prozeduren nicht auskenne, falls die Vorgehensweise in diese Richtung geht.

Gruss

Ralf

# Aufbereiten der CSV-Datei fuer Import fksag
# Pos1 -> aplannr
# Pos2 -> arbgang
# Pos3 -> pos
# Pos5 -> te,tm
# Pos6 -> tr
# Pos7 -> tp
gawk -v betrieb=${betrieb} --field-separator=";" '{printf "0;%s;0;%s;0;0,0;0;0;%s;99999999;%s;BPSM;0;text1;text2a; ; ;%s;%s;%s;0,0;%s;0,0;0,0;0,0;0,0;M;M;1,0;1,0;1,0;0;0;50100;1,0;0; ;1,0;1;0,0;1,0;1;N;0;0;0,0;1;1;0,0;0,0; ;0; ; ;%s;sql;0; ; ; ; ; ;100,0;100,0;100,0; ; ;P;0;0,0;0; ;0; ;\n", betrieb, $1, $3, $2, $6, $5, $5, $7, strftime("%Y%m%d") }' $datei > fksag_import_tmp.csv;

dbaccess 1>> $log 2>&1 << EOSQL

  DATABASE $db;
  
  -- Import in fksag
  LOAD FROM fksag_import_tmp.csv DELIMITER ";"
  INSERT INTO fksag
  (
  sa, firma, werk, aplanr, aplavar, losgr, cd_index, gueltigv, pos, gueltigb, arbgang, arbplatz, aggruppe, text1, text2a, text2b, text2c,     
  tr, te, tm, taktme, puffer, liege, tefix, tmfix, tezuschl, zeitkz1, zeitkz2, posmenge, basisme, nutzen, lohnart, lohngrp, kostenst,   
  persfak, grverrkz, erfkz, schwgr, uelapkz, translos, splitfak, splittkz, rechkz, ruestaus, ausstufe, ausproz, bdekz, anzdruck, abwproz,    
  lauf, aendgr, anzmasch, kzopt, cd_status, anldat, anleger, aenddat, aenderer, pruefpl, kzcaq, erfkztr, kalksumm, mindgut, tolneg, tolpos,     
  aplatzb, apgrupb, apagbkz, prkz, sgewicht, sgeweinh, taetgrp, taetlavo, filler99   
  );
EOSQL

Content-ID: 250142

Url: https://administrator.de/contentid/250142

Ausgedruckt am: 21.11.2024 um 18:11 Uhr

MadMax
MadMax 26.09.2014 um 16:44:41 Uhr
Goto Top
Hallo Ralf,

zwar ist Informix nicht mein Gebiet, aber Deine Frage läßt sich ja auch einigermaßen allgemein beantworten.

Sauber lösen kann man es womöglich direkt beim Import, daß man dort definieren kann, was mit den Spalten passiert, die nicht im Import sind. Ob Informix das kann weiß ich nicht.

Wenn Du die Tabelle abändern kannst und es Standardwerte sind, die in die fehlenden Spalten kommen (also keine für diesen Import speziellen Werte), dann kannst Du bei der Tabellendefinition für die Spalten auch Standardwerte festlegen.

Mal abgesehen davon, daß auf einigen Spalten Standardwerte existieren gehe ich normalerweise den Weg, daß ich die Daten 1:1 in eine temporäre Tabelle importiere und von da aus die Zieltabelle fülle, wobei ich dann eben auch beliebige andere Spalten belegen kann. Der Weg ist im Grunde nicht viel anders als Deiner. Du bereitest die Daten auf, schreibst sie in eine temporäre CSV-Datei und importierst sie dann in die Zieltabelle. Ich importiere die Daten in eine temporäre Tabelle, bereite sie auf und schreibe sie dann in die Zieltabelle. Und wenn die CSV-Datei nicht 1:1 in die Tabelle paßt, dann muß man die Daten an irgendeiner Stelle anpassen, da ist nichts unsauberes dabei.

Gruß, Mad Max