Locate - kleine Frage...

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
starkard
Beiträge: 87
Registriert: Mi 31. Okt 2007, 10:44

Locate - kleine Frage...

Beitrag von starkard »

Moin!

Habe wie erwähnt eine kleine Frage zu Locate, die ich trotz Recherche und Ausprobieren einfach nicht in den Griff bekomme. Ich versuche mich mal auf das Wesentliche zu beschränken:

Habe 2 Formulare. Wird von Form1 zu 2 gewechselt soll ein Grid über SQLQuery gefüllt werden,Soweit sogut. Nun soll genau EIN Datensatz gesucht werden. Dazu muss ich über 2 Felder prüfen. Ist Locate dafür geeignet, da Jedem Suchfeld genau EIN Suchbegriff zugeordnet werden soll? Falls ja, hier meine Gehversuche:

Code: Alles auswählen

KeyValues : Array of Variant;
...
KeyValues := VarArrayOf([unit1.spediteurNr ,Form1.SpediteurNameLb.Caption]);
SQLQuery2.Locate('SpedNr;Kurzname',KeyValues,[loCaseInsensitive]);
Fehlermeldung: "Kann Feld 'SpedNr;Kurzname' nicht finden".... Schon klar sollen ja 2 unterschiedliche Felder sein. Laut Hilfe ist diese Syntax allerdings korrekt. Wäre über einen Tip sehr dankbar. Cu all

P.S. Ach so, klar könnte man ein Select-Befehl ausführen der nach den Suchkriterien die Ergebnismenge sortiert, und dann auf den ersten Satz springt, möchte aber eine konstante Sortierung. Eine Möglichkeit wäre es den DS zu bookmarken. Sollte allerdings während der Laufzeit ein weiterer DS in die DB ungünstig eingefügt werden, und Form2 erneut aufgerufen werden, ist dann der Bookmark noch korrekt?? Hoffe ich habe mich verständlich ausgedrückt

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6857
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Locate - kleine Frage...

Beitrag von af0815 »

starkard hat geschrieben: P.S. Ach so, klar könnte man ein Select-Befehl ausführen der nach den Suchkriterien die Ergebnismenge sortiert, und dann auf den ersten Satz springt, möchte aber eine konstante Sortierung. Eine Möglichkeit wäre es den DS zu bookmarken. Sollte allerdings während der Laufzeit ein weiterer DS in die DB ungünstig eingefügt werden, und Form2 erneut aufgerufen werden, ist dann der Bookmark noch korrekt?? Hoffe ich habe mich verständlich ausgedrückt
Statt sortieren macht man das mit der where-Klausel. Das Locate Statement wird normalerweise intern in eine where-Klausel übergeführt. Zumindest wenn man ein SQL-fähige DB hat.

Bookmarken ist auch so eine Sache, denn der Bookmark bleibt nur solange gültig, wie das Datenset gültig ist - und das kann manchmal sehr kurz sein. Ein Refresh der Datenmenge aus welchen Grund auch immer, macht die die Bookmarks meist ungültig (Hängt von der Verbindungkomponente ab).
Besser ist es, sich den Primärschlüssel zu merken. Mit dem kannst du auch nach einen Refresh noch was anfangen (solange dir nicht wer die Datensätz unterm Hintern weglöscht).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

starkard
Beiträge: 87
Registriert: Mi 31. Okt 2007, 10:44

Beitrag von starkard »

Hallo,

Ersteinmal danke für deine schnelle Antwort. Somit scheidet Bookmark aus. Ja, ich hab eine SQL-fähige DB und meine Tabelle hat leider keinen Primärschlüssel(Bitte nicht nachfragen warum :oops: ), Der DS ist aber über 2 Felder eindeutig.

Das Problem bei einer Where-Klausel ist leider, dass ich dann ausschliesslich den gesuchten DS angezeigt bekomme (DBGrid). Meine Vorstellung war es aber alle DS, wie beim ersten Aufruf des Forms, angezeigt zu bekommen mit dem einzigen Unterschied, dass auf den gesuchten DS gezeigt wird. Schätze Locate ist somit die einzige Möglichkeit oder? Aso, wie gefragt: Kann Locate EINEM Feld genau EIN Suchbegriff zugeordnet werden? Thx

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6857
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

starkard hat geschrieben:Ersteinmal danke für deine schnelle Antwort. Somit scheidet Bookmark aus. Ja, ich hab eine SQL-fähige DB und meine Tabelle hat leider keinen Primärschlüssel(Bitte nicht nachfragen warum :oops: ), Der DS ist aber über 2 Felder eindeutig.
Wenn eindeutig ist, dann ist es mit einem PK austauschbar.
starkard hat geschrieben: Das Problem bei einer Where-Klausel ist leider, dass ich dann ausschliesslich den gesuchten DS angezeigt bekomme (DBGrid). Meine Vorstellung war es aber alle DS, wie beim ersten Aufruf des Forms, angezeigt zu bekommen mit dem einzigen Unterschied, dass auf den gesuchten DS gezeigt wird. Schätze Locate ist somit die einzige Möglichkeit oder? Aso, wie gefragt: Kann Locate EINEM Feld genau EIN Suchbegriff zugeordnet werden?
Sorry, ich habe mich da zwischen Locate ind Filter (=Where-Klausel) verlesen. In deonem Fall ist natürlich Locate das richtige und normalerweise arbeitet Locate auch nur im rückgelieferten Datenset. Du kannst bei locate einem Datensatz eine Suchbegriff zuordnen, das wäre auch dein selberstellter Bookmark.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten