Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme mit Locate (https://www.delphipraxis.net/165994-probleme-mit-locate.html)

BBoy 25. Jan 2012 10:53

Datenbank: BDE • Version: 5 • Zugriff über: TurboDB

Probleme mit Locate
 
Ich möchte Daten in die DB importieren. Dazu schreibe ich zuerst:
Delphi-Quellcode:
datamodule1.TourTable1.DisableControls
Damit beim importieren das DBgrid nicht mit läuft.

Nun habe ich aber festgestellt das dann der Locate befehl nicht funktioniert.
Delphi-Quellcode:
if datamodule1.TourTable1.Locate('code',Name,[loCaseInsensitive]) = false then begin
Den brauche ich aber dringend da beim Importieren geprüft werden soll ob der Datensatz bereits vorhanden ist.

Kann mir bitte jemand sagen wie ich das nun machen soll?
Danke!

Bernhard Geyer 25. Jan 2012 10:55

AW: Probleme mit Locate
 
Du solltest deinen Import umbauen das er nicht über ein "dumme" Table-Klasse arbeitest.

Stell auf Insert-Statement (INSERT INTO ...) mit Parameter um
Zum check ob Einträge vorhanden sind suche sie mit SELECT-Statements mit Parameter.

Dein Import sollte dann auch viel schneller sein :-)

dataspider 25. Jan 2012 11:08

AW: Probleme mit Locate
 
Ist "Name" ein Variablenname?
Das ist bedenklich, da auch das DataModule das Propertie Name hat.

Ich habe es nicht getestet, aber ich würde nicht darauf vertrauen, dass er nicht nach 'Datamodule1' sucht.

Frank

mkinzler 25. Jan 2012 11:20

AW: Probleme mit Locate
 
Zitat:

Du solltest deinen Import umbauen das er nicht über ein "dumme" Table-Klasse arbeitest.
Wenn BDE stimmt, dann ist das eh egal.

Besser gelich auf eine richtiges DBMS umstellen, welches MERGE ö.ä. bietet.

BBoy 25. Jan 2012 11:35

AW: Probleme mit Locate
 
BDE = Borland Database Engine, ja ich weiß... ist alt.

Importieren möchte ich nicht aus einer anderen DB sondern aus einer XML Datei. Muss also jedes Datenfeld einzeln auslesen und dann alles in den Record schreiben. TurboDB unterstützt mit TSQLQuery auch sql. Aber das wäre ein riesen Aufwand das umzustellen und mit sql kenne ich mich noch weniger aus. Daher wäre mir eine Lösung mit TTable oder so erst mal lieber. Sind ja keine großen Mengen die da importiert werden, von daher kommt es auf ein oder zwei Sekunden nicht an :)

schlecki 25. Jan 2012 11:52

AW: Probleme mit Locate
 
nur mal so am Rande:
TurboDB hat nichts mit der alten BDE zu tun...

und dein importvorgang könnte ungefähr so aussehen:

Delphi-Quellcode:
qryInsert.SQL.Text := 'insert into Tourdaten (id, feld1, feld2) values (:id, :feld1, :feld2)';
qryInsert.Prepare;

qryCheck.SQL.text := 'select count(*) ANZ from Tourdaten where code = :code';
qryCheck.Prepare;

while import do
begin
  qryCheck.ParamByName('code').AsString := name;
  qryCheck.Open;
  if qryCheck.Fields[0].AsInteger = 0 then
  begin
    qryInsert.ParamByName('ID').AsInteger := id_aus_import;
    qryInsert.ParamByName('FELD1').AsString := feld1_aus_import;
    qryInsert.ParamByName('FELD2').AsString := feld2_aus_import;
    qryInsert.ExecSQL;
  end;
  qryCheck.Close;
end;
das dürfte auf jeden fall schneller sein, als mit einer Table...

BBoy 25. Jan 2012 11:55

AW: Probleme mit Locate
 
cool, das sieht ja einfacher aus als ich dachte. werde das später gleich mal testen.
Danke!

Dachte TurboDB basiert auf der BDE, ist halt nur erweitert.

schlecki 25. Jan 2012 12:45

AW: Probleme mit Locate
 
Zitat:

Zitat von BBoy (Beitrag 1147522)
Dachte TurboDB basiert auf der BDE, ist halt nur erweitert.


Wenn wir von TurboDB von dataweb reden, dann nicht. Das ist afaik komplett in Delphi geschrieben.

BBoy 25. Jan 2012 14:18

AW: Probleme mit Locate
 
Ein paar Fragen zu dem Code.

Delphi-Quellcode:
qryInsert.SQL.Text := 'insert into Tourdaten (id, feld1, feld2) values (:id, :feld1, :feld2)';
feld1 feld2 usw. Nehme ich da die Namen der Datensatzfelder der Tabelle? Und ist es ok wenn ich bei den values die selben namen nehme?
Also so:
Delphi-Quellcode:
qryInsert.SQL.Text := 'insert into Tourdaten (Kunde_id, Kunde_name, Kunde_vorname) values (:kunde_id, :Kunde_name, :Kunde_vorname)';
Und später bei:
Delphi-Quellcode:
    qryInsert.ParamByName('FELD1').AsString := feld1_aus_import;
Für FELD1 setze ich hier wieder den Namen des Datenfeldes für die Tabelle?

Bei mir kommt an dieser Stelle immer das er den parameter "kunde_id" nicht findet.

Bernhard Geyer 25. Jan 2012 14:31

AW: Probleme mit Locate
 
:<Name> steht für Platzhaltername. Du kannst da auch die realen Feldnamen nehmen solange die liste der Platzhalternamen eindeutig bleibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 Uhr.
Seite 1 von 2  1 2      

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