![]() |
Datenbank: BDE • Version: 5 • Zugriff über: TurboDB
Probleme mit Locate
Ich möchte Daten in die DB importieren. Dazu schreibe ich zuerst:
Delphi-Quellcode:
Damit beim importieren das DBgrid nicht mit läuft.
datamodule1.TourTable1.DisableControls
Nun habe ich aber festgestellt das dann der Locate befehl nicht funktioniert.
Delphi-Quellcode:
Den brauche ich aber dringend da beim Importieren geprüft werden soll ob der Datensatz bereits vorhanden ist.
if datamodule1.TourTable1.Locate('code',Name,[loCaseInsensitive]) = false then begin
Kann mir bitte jemand sagen wie ich das nun machen soll? Danke! |
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 :-) |
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 |
AW: Probleme mit Locate
Zitat:
Besser gelich auf eine richtiges DBMS umstellen, welches MERGE ö.ä. bietet. |
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 :) |
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:
das dürfte auf jeden fall schneller sein, als mit einer Table...
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; |
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. |
AW: Probleme mit Locate
Zitat:
Wenn wir von TurboDB von ![]() |
AW: Probleme mit Locate
Ein paar Fragen zu dem Code.
Delphi-Quellcode:
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?
qryInsert.SQL.Text := 'insert into Tourdaten (id, feld1, feld2) values (:id, :feld1, :feld2)';
Also so:
Delphi-Quellcode:
Und später bei:
qryInsert.SQL.Text := 'insert into Tourdaten (Kunde_id, Kunde_name, Kunde_vorname) values (:kunde_id, :Kunde_name, :Kunde_vorname)';
Delphi-Quellcode:
Für FELD1 setze ich hier wieder den Namen des Datenfeldes für die Tabelle?
qryInsert.ParamByName('FELD1').AsString := feld1_aus_import;
Bei mir kommt an dieser Stelle immer das er den parameter "kunde_id" nicht findet. |
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 10:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz