AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bulk-Import

Ein Thema von hoefi · begonnen am 20. Jan 2020 · letzter Beitrag vom 21. Jan 2020
Antwort Antwort
Seite 2 von 2     12   
hoefi

Registriert seit: 20. Aug 2007
10 Beiträge
 
#11

AW: Bulk-Import

  Alt 21. Jan 2020, 08:08
Hallo jobo,

hier mein Ansatz.
1. Erzeugen der CSV-Datei (hier aus einer HANA-DB) in Delphi:
Delphi-Quellcode:
    laenge[0] := 8; // Laengenvorgabe der Ausgabefelder
    laenge[1] := 12;
    laenge[2] := 8;
    laenge[3] := 8;
    laenge[4] := 4;
    laenge[5] := 16;
    laenge[6] := 32;
    laenge[7] := 24;
    laenge[8] := 160;
    laenge[9] := 80;
    laenge[10] := 12;
    laenge[11] := 8;
    laenge[12] := 8;
    laenge[13] := 8;
    datei := 'C:\temp\qamv1.csv'; // Ausgabedatei
    AssignFile(dd,datei);
    REWRITE(dd);
    WITH H2R_Query DO
      BEGIN
       CLOSE;
       SQL.CLEAR;
       SQL.Add('SELECT C.PRUEFLOS, C.VORGLFNR, C.MERKNR, C.SATZSTATUS, C.QPMK_WERKS, C.VERWMERKM, C.MKVERSION, C.KURZTEXT, C.DUMMY20, C.MASSEINHSW, C.SOLLWERT, C.TOLERANZOB, C.TOLERANZUN');
       SQL.Add('FROM QALS Q, QAMV" C');
       SQL.ADD('WHERE Q.WERK = ''XXXX'' AND');
       SQL.ADD(' C.PRUEFLOS = Q.PRUEFLOS AND');
       SQL.ADD(' Q.ERSTELDAT >= TO_DATE(''01.01.2010'',''dd.mm.yyyy'')');
       OPEN; // holen der Daten
       i := 0;
       WHILE NOT EOF DO
         BEGIN
           s := IntToStr(i);
           WHILE LENGTH(s) < 8 DO s := '0' + s; // ID als Integer darstellen
           st := '';
           FOR j := 0 TO Fields.Count - 1 DO // Felder anpassen
             BEGIN
               st := Fields[j].AsString;
               WHILE LENGTH(st) < lae[j+1] DO st := st + ' ';
               IF Fields[i].DataType IN [ftFloat, ftCurrency, ftSingle]
                 THEN WHILE POS(',',st) > 0 DO st[POS(',',st)] := '.'; // numerische Felder einen Punkt als Dezimaltrenner geben
               s := s + st;
             END;
             WRITELN(dd,s);
           INC(i);
           IF i = max_anz THEN BREAK;
           NEXT;
         END;
      END;
    CloseFile(dd);
2: Definition der externen Tabelle in FB:

SQL-Code:
CREATE TABLE QAMV_TEXT EXTERNAL 'C:\TEMP\QAMV1.CSV' (
    ID CHAR(8),
    PRUEFLOS CHAR(12),
    VORGLFNR CHAR(8),
    MERKNR CHAR(8),
    SATZSTATUS CHAR(4),
    QPMK_WERKS CHAR(16),
    VERWMERKM CHAR(32),
    MKVERSION CHAR(24),
    KURZTEXT CHAR(160),
    DUMMY20 CHAR(80),
    MASSEINHSW CHAR(12),
    SOLLWERT CHAR(8),
    TOLERANZOB CHAR(8),
    TOLERANZUN CHAR(8),
    LFCR CHAR(2)
);

3: Definition der Zieltabelle in FB:
CREATE TABLE QAMV (
    ID INTEGER,
    PRUEFLOS CHAR(12),
    VORGLFNR INTEGER,
    MERKNR INTEGER,
    SATZSTATUS VARCHAR(4),
    QPMK_WERKS VARCHAR(16),
    VERWMERKM VARCHAR(32),
    MKVERSION VARCHAR(24),
    KURZTEXT VARCHAR(160),
    DUMMY20 VARCHAR(80),
    MASSEINHSW VARCHAR(12),
    SOLLWERT DOUBLE PRECISION,
    TOLERANZOB DOUBLE PRECISION,
    TOLERANZUN DOUBLE PRECISION,
    LFCR CHAR(2)
);
4: Stored Procedure für das Übertragen der externen Tabelle in die Zieltabelle:
SQL-Code:
create or alter procedure QAMV_WANDELN
as
begin
  insert into qamv
    select * from QAMV_TEXT;
end
Was ich nicht berechnet habe, ist das anschließende Erzeugen des Indexes.
Werde heute mal probieren, weitere Tabellen ebenso zu übertragen.

Geändert von mkinzler (21. Jan 2020 um 08:12 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#12

AW: Bulk-Import

  Alt 21. Jan 2020, 09:37
Brauchst Du die CRLF Spalte wirklich im Ziel? Das ist doch eine Import Krücke oder?

Die ID kannst Du doch auch innerhalb der DB erzeugen, das spart extra Programmcode und macht es flexibler.

Und was die Konvertierung angeht, auch die würde ich bereits im Select Statement machen, bei Zahlen gleich mit der Längenformatierung, bei Text mit Padding, spart noch mehr Code und macht das Codestück universeller.
Gruß, Jo
  Mit Zitat antworten Zitat
hoefi

Registriert seit: 20. Aug 2007
10 Beiträge
 
#13

AW: Bulk-Import

  Alt 21. Jan 2020, 10:50
Hallo jobo,

in der Zieltabelle ist das LFCR-Feld nicht nötig, sondern praktisch, wenn man die StoredProcedure mit "SELECT *" verwenden will. Falls man die Felder für den Select und Insert ausschreibt, kann man darauf verzichten.

Die ID habe ich absichtlich nicht per Trigger und Generator automatisch erzeugen lassen, da ich die Geschwindigkeit erreichen will und erstmal auf alles Reduzierende verzichte.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#14

AW: Bulk-Import

  Alt 21. Jan 2020, 15:24
in der Zieltabelle ist das LFCR-Feld ..praktisch, wenn man die StoredProcedure mit "SELECT *" verwenden will. ..

Die ID habe ich absichtlich nicht per Trigger und Generator automatisch erzeugen lassen, da ich die Geschwindigkeit erreichen will und erstmal auf alles Reduzierende verzichte.
Ok, praktisch find ich gut.
Das kann ja für jeden anders ausfallen.

Zur Performance:
Ich kann mir nicht vorstellen, dass die Nutzung einer Sequenz sich negativ auswirkt. Z.B. so (ohne ID as dem Textfile, sondern aus der Sequenz):
Code:
insert into qamv
  select NEXT VALUE FOR <SequenceName> ,qt.* from QAMV_TEXT qt;
Ein Trigger ist für den reinen Import unnötig. Das zu importierende Textfile dürfte ohne ID sogar ein gute Stück kleiner sein.
Gruß, Jo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Bulk-Import

  Alt 21. Jan 2020, 15:53
Zitat:
Zur Performance:
Ich kann mir nicht vorstellen, dass die Nutzung einer Sequenz sich negativ auswirkt. Z.B. so (ohne ID as dem Textfile, sondern aus der Sequenz):
Da es wohl weitere Tabellen gibt u.U. auch FK verwendet werden würde ich auch die vorhandenen mitnehmen und die Sequenzen anschliessend händisch setzen.
Zitat:
Werde heute mal probieren, weitere Tabellen ebenso zu übertragen.
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#16

AW: Bulk-Import

  Alt 21. Jan 2020, 15:59
Ich meine, im Export-Code hätte er eine ID erzeugt. Das ginge halt auch billiger.
Wenn Refconstraints da sind, müssen si enatürlich so wie sie vorliegen importiert werden.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#17

AW: Bulk-Import

  Alt 21. Jan 2020, 17:44
Bei
[SQL]INSERT INTO tabelle
SELECT ...[/SQL]
Müssen natürlich auch die Felder der Quelle und des Ziels übereinstimmen, vor allem in Anzahl und Reihenfolge.
Die Zielfelder mit anzugeben kann da auch nie schaden.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Bulk-Import

  Alt 21. Jan 2020, 17:50
Bei
[SQL]INSERT INTO tabelle
SELECT ...[/SQL]
Müssen natürlich auch die Felder der Quelle und des Ziels übereinstimmen, vor allem in Anzahl und Reihenfolge.
Die Zielfelder mit anzugeben kann da auch nie schaden.
Ist gegeben Siehe #11
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#19

AW: Bulk-Import

  Alt 21. Jan 2020, 18:03
Aber auch nur wenn beide Tabellen gleichzeitig erstellt werden, bzw. die neue Tabelle beim Erstellen den Aufbau der Anderen erbt.
Es wurde ja nirgends gesagt, ob das Ziel nicht eine bereits bestehende Tabelle/Datenbank sein könnte, wo über die Jahrzehnte fleißig Felder ein-/ausgebaut wurden (ALTER TABLE).
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#20

AW: Bulk-Import

  Alt 21. Jan 2020, 20:21
Es geht ja offensichtlich um einen adhoc Prozess und anhand der Antworten des TE darf man annehmen, dass die Problematik geläufig ist.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz