Delphi-PRAXiS

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.

BBoy 25. Jan 2012 14:51

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:
tdbquery_insert.SQL.Text := 'insert into tab1 (kunde_name, kunde_vorname, kunde_telefon) values (:kunde_name, :kunde_vorname, :kunde_telefon)';
tdbquery_insert.Prepare;
Sobald das prepare ausgeführt wird kommt diese Meldung: "The SQL Command has an error at row 1, column1: Select expected"
lass ich das prepare weg, dann kommt später bei diesem Programmteil:
Delphi-Quellcode:
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;
Der Fehler: Parameter kunde_vorname nicht gefunden.

was mache ich falsch??

Peter Pohmann 25. Jan 2012 17:12

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??

BBoy 25. Jan 2012 17:22

AW: Probleme mit Locate
 
Ja bin sicher das es TurboDB ist :) Habe Version 5 aber daran sollte es nicht liegen, ist doch sql.
Zitat:

PS: Noch ne doofe Frage: Oben setzt Du den Text bei tdbquery und unten die Parameter bei tdbquery_insert??
War ein Fehler hier beim einfügen, habe ich korrigiert :)

Peter Pohmann 25. Jan 2012 17:59

AW: Probleme mit Locate
 
Dann schick doch bitte mal Dein Beispielprogramm an support at dataweb.de. Ich sehs mir an.

BBoy 25. Jan 2012 18:16

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.

haentschman 26. Jan 2012 06:38

AW: Probleme mit Locate
 
Moin...
Delphi-Quellcode:
tdbquery_insert.SQL.Text := 'insert into tab1 (kunde_name, kunde_vorname, kunde_telefon) values (:kunde_vorname, :kunde_name, :kunde_telefon)';
...die Reihenfolge deiner Feldnamen und Values sind unterschiedlich. Wenn man sich nach den Bezeichnungen richtet kommt der Vorname im Feld Name an. 8-)

BBoy 26. Jan 2012 08:59

AW: Probleme mit Locate
 
Das ist ein Tippfehler hier im Forum. In meinem Code sieht das anders aus. Habe es im beitrag geändert.

BBoy 26. Jan 2012 11:48

AW: Probleme mit Locate
 
Das Problem ist gelöst!
Delphi-Quellcode:
  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;
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 :)

Danke für eure Hilfe!


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