Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenimport: DS einfügen oder ersetzen, wie am geschickteste (https://www.delphipraxis.net/110043-datenimport-ds-einfuegen-oder-ersetzen-wie-am-geschickteste.html)

guidok 12. Mär 2008 06:54

Datenbank: MSSQL • Version: Express • Zugriff über: ADO

Datenimport: DS einfügen oder ersetzen, wie am geschickteste
 
Hallo!

Ich muss Daten aus einer Textdatei in eine DB importieren, was auch grundsätzlich funktioniert. Aber: Dieser Import wird nicht nur einmalig stattfinden, sondern vermutlich in regelmäßigen Abständen (es handelt sich um Daten, die aus SAP kommen und sich ändern können), d.h. Datensätze können neu dazu kommen, oder bereits vorhanden sein. Ich muss demnach entweder ein INSERT machen oder ein UPDATE. Jetzt kann ich mit einem SELECT prüfen, ob der DS bereits existiert und danach entsprechend verfahren, aber das kommt mir nicht sehr elegant vor. Wie kann ich das am besten bewerkstelligen, ggf. in einem Query-Aufruf?

Guido

Sharky 12. Mär 2008 06:58

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt
 
Zitat:

Zitat von guidok
... Jetzt kann ich mit einem SELECT prüfen, ob der DS bereits existiert und danach entsprechend verfahren, aber das kommt mir nicht sehr elegant vor. ...

Hai Guido,

Du wirst um diesen Weg nicht herumkommen. Um das ganze nicht auf dem Client zu machen würde ich eine SP vorschlagen. Dann läuft das SELECT "nur" auf dem Server und es werden keine unnötigen Daten übertragen.

Thorben_Ko 12. Mär 2008 06:59

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt
 
Wie wäre es einfach das ChangeDatum als Feld in die Tabelle schreiben- Dann musst du nur noch wissen wann der letze Import/export gemacht wurde, und kannst einfach mit select alles neuere auslesen. So würde ich es machen.

Thorben

mkinzler 12. Mär 2008 07:03

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt
 
mit Merge

guidok 12. Mär 2008 07:19

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt
 
Zitat:

Zitat von mkinzler
mit Merge

Zitat:

introduced in upcoming SQL Server 2008
Wenn ich das so lese, dann hab ich das noch gar nicht, oder?

@Thorben_Ko: Entweder ich verstehe das nicht ganz, oder es löst mein Problem nicht. Ich muss ja trotzdem vorher prüfen, ob der Datensatz eingefügt oder geändert werden soll.

@Sharky: Ich kenn mich ja sowas von gar nicht mit SP aus. Gibt es da ein gescheites Tutorial dazu?

mkinzler 12. Mär 2008 07:37

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt
 
Zitat:

Wenn ich das so lese, dann hab ich das noch gar nicht, oder?
Das musst du wissen, welche Version du hast.

guidok 12. Mär 2008 07:53

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt
 
@mkinzler: Ich gebe zu, dass ich der Meinung war mit SQL Server 2005 Express die neueste Version zu haben. Gut, da habe ich mich geirrt, allerdings werde ich das zunächst auch mal nicht ändern (wollen).

Wird so etwas in der Art funktionieren?

IF NOT EXISTS (SELECT TP FROM TEPL WHERE TP = :pTP) THEN
INSERT INTO TEPL... usw.
ELSE
UPDATE... usw.

guidok 12. Mär 2008 10:29

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt
 
Ich habe es jetzt hingekriegt:

Delphi-Quellcode:
    SQL.Add('IF EXISTS (SELECT TP FROM TEPL WHERE TP=:pSTP)' +
            ' BEGIN' +
            '   UPDATE TEPL SET BEZ=:pUBEZ, KST=:pUKST, ANL=:pUANL, ANR=:pUANR, STAT=:pUSTAT' +
            '     WHERE TP=:pUTP' +
            ' END' +
            ' ELSE' +
            '   INSERT INTO TEPL (TP, BEZ, KST, ANL, ANR, STAT)' +
            '     VALUES(:pITP, :pIBEZ, :pIKST, :pIANL, :pIANR, :pISTAT);');
Es funktioniert und ist auch hinreichend schnell für meine Anwendung.

RavenIV 12. Mär 2008 11:15

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt
 
Ich mach das immer anderst:
(Keine Ahnung, ob das performant oder glücklich oder schön ist. Das ist mir aber egal. Es funktioniert. ;-))
Delphi-Quellcode:
Query.SQL = 'SELECT Feld_1, Feld_2, ..., Feld_n FROM tabelle WHERE Feld_x = irgendwas';
Query.Open;

if Query.Locate('Feld_a, Feld_b, Feld_c', VarArrayOf([Wert_1, Wert_2, Wert_3]), [loCaseInsensitive]) then
begin
  Query.Insert;
  // Felder setzen, die nur bei insert gesetzt werden sollen
  Query.FieldByName('Feld_x').AsString = 'abcd';
end
else
begin
  Query.Edit;
  // Felder setzen, die nur bei update gesetzt werden sollen
  Query.FieldByName('Feld_y').AsString = 'efgh';
end;
// Felder setzen, die immer gesetzt werden sollen
Query.FieldByName('Feld_z').AsString = 'ijkl';

// in DB eintragen
Query.Post;
Query.Close;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 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