[gelöst] Wie arbeitet die LOCATE Anweisung?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
wega
Beiträge: 57
Registriert: Di 6. Dez 2011, 15:36

[gelöst] Wie arbeitet die LOCATE Anweisung?

Beitrag von wega »

Hallo zusammen,

ich habe in meiner TBbf-Umgebung den Locate Befehl/Anweisung eingebaut.
Das funktioniert auch weitgehendst sehr gut.
Wenn ich aber in einem Datenfeld den gleichen Ihnalt habe, z.b. beim Vornamen, Nachnamen, Straße, was ja one weiteres passieren kann, dann zeigt Locate immer nur den ersten gefunden Record an, obwohl er nach der Übereinstimmung von ID suchen soll.

Die Feldinhalte sind eventuell gleich, aber der ID-Inhalt ist garantiert nicht gleich.

Wie also muß der/die Locate-Befehl/Anweisung aussehen, daß die richtige Antwort erfolgt?

Zur weiteren Info: ich arbeite mit der internen dBase-Datei.

mit Gruß
Werner
Zuletzt geändert von wega am Do 19. Jan 2012, 09:08, insgesamt 1-mal geändert.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von Christian »

Wir wissen nicht wie der Befehl bei dir jetzt aussieht. Man kann die Frage also nicht beantworten. Wenn du wissen willst wie man etwas richtiger macht als du es jetzt machst musst du uns schon mittelen was du wie machst.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

wega
Beiträge: 57
Registriert: Di 6. Dez 2011, 15:36

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von wega »

Hallo Christian,

nun ja, wenn das nicht verständlich gefragt war, dann hier ein zweiter Versuch:
Bild-01.jpg
In dem gezeigten Grid kann ich die Records mit dem Feldinhalt "Namensgleich" ohne weiteres auswählen.
Bild-02.jpg
Wenn ich mich im Listboxfeld befinde kann ich mit dem Cursor bzw. mit den Pfeiltasten jeden Record anfahren,
bis auf den Record 4. Wenn ich den zeiger darauf stellen will, springt er sofort auf den Record 3, weil da zum ersten mal
der Feldinhalt "Namensgleich" auftaucht.
Wähle ich die anderen Reiter "Vorname2 bzw. "Ort", dann habe ich dieses Verhalten nicht, da da alle Feldinhalte unterschiedlich sind.

Zum weitern Verständnis hier auch noch der Quellcode.

Code: Alles auswählen

procedure TForm2.DBLookupListBox1Click(Sender: TObject);
begin
  GehzumRecord;
 
end;
 
procedure TForm2.DBLookupListBox2Click(Sender: TObject);
begin
  //showmessage (DBText1.caption,);
  //moveto (strtoint(DBText1.caption));
  GehzumRecord;
 
end;
 
procedure TForm2.DBLookupListBox3Click(Sender: TObject);
begin
  GehzumRecord;
 
end;
 
 
procedure TForm2.Button1Click(Sender: TObject);
begin
  Form3.show;
  Form3.setFocus;
end;
 
Procedure TForm2.GehzumRecord;
   begin
  if not Datasource1.DataSet.Locate('PERS_ID',DBText1.caption,[loCaseInsensitive, loPartialKey])
   then
      MessageDlg('Suchrecord nicht gefunden.', mtInformation, [mbOK], 0);
      //edSearch.Color:=clRed;
  end;
 
end.
mit freundlichem Gruß
Werner
Zuletzt geändert von Lori am Mi 18. Jan 2012, 22:07, insgesamt 1-mal geändert.
Grund: Bitte den richtigen Highlighter benutzen

Benutzeravatar
theo
Beiträge: 10893
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von theo »

Welche Optionen hast du denn schon getestet, und welche Informationen gesucht?

Ich habe davon kaum Ahnung, aber rein von der Logik her, würde ich eine ID nicht mit loCaseInsensitive, loPartialKey suchen.

(und bitte mach dieses Doppelbild (Schatten?) im Titel "Personaldatenbank..." weg, dass ist für Leute mit Sehschwäche sehr irritierend)
Zuletzt geändert von theo am Mo 16. Jan 2012, 14:37, insgesamt 1-mal geändert.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von MmVisual »

In dem TList würde ich nicht nur mit Items.Add() den Nachname rein nehmen, sondern mit Items.AddObject(<FeldNachname.AsString>, Pointer(<FeldID.AsInteger)).

Wenn man jetzt auf die Liste klickt, kann man mit Integer(Liste.Objects[Liste.ItemIndex]) die ID erfahren und darauf ein Locate machen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

wega
Beiträge: 57
Registriert: Di 6. Dez 2011, 15:36

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von wega »

Hallo erst mal vielen Dank für die schnellen Antworten.

@ Theo, wo bekomme ich denn mehr Informationen zu LOCATE her?
mit SUCHEN habe ich nur diese Befehlsanordnung gefunden, zu den möglichen anderen Optionen fehlt mir jegliche INFO.

@ MmVisual, ich habe mir da Arbeit gespart und nehme aus "Data Controls" die "DBLookupListBox".
Den ID - Wert lese ich mir aus dem angezeigten "DBText" mit "DBText1.Caption".

mit Gruß
Werner

Benutzeravatar
theo
Beiträge: 10893
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von theo »

wega hat geschrieben: @ Theo, wo bekomme ich denn mehr Informationen zu LOCATE her?
http://lmgtfy.com/?q=tdataset+locate" onclick="window.open(this.href);return false;
wega hat geschrieben: mit SUCHEN habe ich nur diese Befehlsanordnung gefunden, zu den möglichen anderen Optionen fehlt mir jegliche INFO.
Es gibt auch keine anderen, aber weglassen könnte man sie bspw. Weder Teilschlüssel noch GrossKlein sind bei der ID-suche hilfreich.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von Christian »

loPartialKey sagt das nur ein teil des Suchbegriffes übereinstimmen muss.
Wenn du das rausnimmst sollts eher klappen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

wega
Beiträge: 57
Registriert: Di 6. Dez 2011, 15:36

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von wega »

Hallo zusammen,

@ Theo, Danke für die LINKS. In einem Delphi-Forum stand dann doch schon etwas mehr über die LOCATE-Funktion. Sie ist mächtiger als man zuerst denkt.
Scheint aber dennoch irgendwo eine Macke zu haben (siehe in meinem Fall).

@ Hallo Christian, auch Danke für Deinen Hinweis. Habe ich auch schon probiert, funktioniert aber auch nicht besser.

mit Gruß
Werner

Benutzeravatar
theo
Beiträge: 10893
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von theo »

Irgendwie verstehe ich deine Frage gar nicht richtig.
Was passiert denn, wenn du z.B. etwas in dieser Art machst:

Code: Alles auswählen

uses variants; 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Datasource1.DataSet.Locate('MTH_NO;LANG',VarArrayOf(['5','GB']),[]);
end;
Du musst das nat. auf deine DB zuschneidern.

wega
Beiträge: 57
Registriert: Di 6. Dez 2011, 15:36

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von wega »

Hallo Theo,

habe ich da was übersehen oder ist es für mich schon zu spät?
Bild-01.jpg
Gruß
Werner

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von Christian »

VarArrayOf ist in Unit Variants deklariert
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10893
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von theo »

wega hat geschrieben:Hallo Theo,
habe ich da was übersehen oder ist es für mich schon zu spät?
Ich habe oben 5 Zeilen gepostet. Die erste heisst "uses variants".
Lesen musst du halt schon selber.

wega
Beiträge: 57
Registriert: Di 6. Dez 2011, 15:36

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von wega »

Hallo Theo,

ist doch schon etwas spät ;).

Das Ergebnis sieht so aus:
Bild-03.jpg
Der Quellcode:

Code: Alles auswählen

Procedure TForm2.GehzumRecord;
   begin
   //if not Datasource1.DataSet.Locate('PERS_ID',DBText1.caption,[loCaseInsensitive, loPartialKey])
   //if not Datasource1.DataSet.Locate('PERS_ID',DBText1.caption,[])
   //  showmessage (DBEdit3.Text);
   if not Datasource1.DataSet.Locate('Pers_ID;Nachname',VarArrayOf([DBText1.caption,DBEdit3.Text]),[])
     then
      MessageDlg('Suchrecord nicht gefunden.', mtInformation, [mbOK], 0);
      //edSearch.Color:=clRed;
  end;
 
end.
Mit den Inhalten von "DBText1.caption,DBEdit3.Text" möchte ich steuern.
Und das geht wahrscheinlich nicht.

mit Gruß
Werner
Zuletzt geändert von Lori am Mi 18. Jan 2012, 22:08, insgesamt 1-mal geändert.
Grund: Bitte den richtigen Highlighter benutzen

Benutzeravatar
theo
Beiträge: 10893
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie arbeitet die LOCATE Anweisung?

Beitrag von theo »

Also oben hast du PERS_ID und jetzt Pers_ID. Was denn nun?
Das Zeug ist zeimlich sicher case-sensitive.
Auf jeden Fall solltest du sorgfältiger arbeiten.

Antworten