Thema: Bulk-Import

Einzelnen Beitrag anzeigen

hoefi

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

AW: Bulk-Import

  Alt 21. Jan 2020, 07: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 07:12 Uhr)
  Mit Zitat antworten Zitat