![]() |
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.
|
AW: Probleme mit Locate
Also bei mir funktioniert das nicht :(
Ich habe eine Datenbank test darin sind 3 Tabellen: tab1, tab2, tab3. Hier geht es jetzt um tab1 In Tab1 sind folgende felder: kunde_name, kunde_vorname, kunde_telefon usw usw
Delphi-Quellcode:
Sobald das prepare ausgeführt wird kommt diese Meldung: "The SQL Command has an error at row 1, column1: Select expected"
tdbquery_insert.SQL.Text := 'insert into tab1 (kunde_name, kunde_vorname, kunde_telefon) values (:kunde_name, :kunde_vorname, :kunde_telefon)';
tdbquery_insert.Prepare; lass ich das prepare weg, dann kommt später bei diesem Programmteil:
Delphi-Quellcode:
Der Fehler: Parameter kunde_vorname nicht gefunden.
tdbquery_insert.ParamByName('kunde_vorname').AsString := nodelist.Items[z].Nodes[0].value;
tdbquery_insert.ParamByName('kunde_name').AsString := nodelist.Items[z].Nodes[1].value; tdbquery_insert.ExecSQL; was mache ich falsch?? |
AW: Probleme mit Locate
Hallo BBoy,
bist Du sicher, dass Du mit TurboDB arbeitest? Ich frage das deshalb, weil es dort keine Komponente TSQLQuery oder so gibt sondern z.B. ein TTdbQuery. Falls ja, welche Version hast Du? Mit Version 6 habe ich Deinen Code gerade probiert und er funktioniert wie Du es erwartest. PS: Noch ne doofe Frage: Oben setzt Du den Text bei tdbquery und unten die Parameter bei tdbquery_insert?? |
AW: Probleme mit Locate
Ja bin sicher das es TurboDB ist :) Habe Version 5 aber daran sollte es nicht liegen, ist doch sql.
Zitat:
|
AW: Probleme mit Locate
Dann schick doch bitte mal Dein Beispielprogramm an support at dataweb.de. Ich sehs mir an.
|
AW: Probleme mit Locate
ich hatte heute den code direkt in mein fertiges Programm eingefügt. Werde morgen mal ein testprogramm schreiben wo auf meine Datenbank zugreift und wenn das auch nicht geht, dann werde ich es schicken.
|
AW: Probleme mit Locate
Moin...
Delphi-Quellcode:
...die Reihenfolge deiner Feldnamen und Values sind unterschiedlich. Wenn man sich nach den Bezeichnungen richtet kommt der Vorname im Feld Name an. 8-)
tdbquery_insert.SQL.Text := 'insert into tab1 (kunde_name, kunde_vorname, kunde_telefon) values (:kunde_vorname, :kunde_name, :kunde_telefon)';
|
AW: Probleme mit Locate
Das ist ein Tippfehler hier im Forum. In meinem Code sieht das anders aus. Habe es im beitrag geändert.
|
AW: Probleme mit Locate
Das Problem ist gelöst!
Delphi-Quellcode:
Das ganze hat nicht funktioniert weil bei TdbQuery die Option ParamCheck auf False war. Habe da auf True gestellt und dann funktioniert das auch. War ja klar das es sowas banales ist :)
TdbQuery_insert.DatabaseName := tdbtable1.DatabaseName;
tdbquery_insert.SQL.Text := 'insert into tour (gccode,tourpos) values (:code, :tpos)' ; tdbquery_insert.Prepare; tdbquery_insert.ParamByName('code').AsString := 'GC12149'; //tdbquery_insert.DataSource.DataSet.RecordCount; tdbquery_insert.ParamByName('tpos').AsString := '1'; tdbquery_insert.ExecSQL; Danke für eure Hilfe! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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