Entwickler-Ecke

Datenbanken - Zeile in DBGRID auswaehlen


wilfried - Do 18.08.05 20:09
Titel: Zeile in DBGRID auswaehlen
Hallo,

ich habe folgendes Problem: Ich habe eine Tabelle und eine SQL Abfage auf einer Form. Die Tabelle läuft auf Datasource 1 und wird mit einem DBGrid angezeigt während die Query auf Data Source 2 läuft und mit 2 DBEdit Feldern das Ergebnis anzeigt. Jetzt möchte ich aber dass im DBGrid nicht der erste Datensatz mit dem Markierungspfeil angezeigt wird sondern auch dort auf den aktuellen (von TQuery gefundenen Satz) zeigt. Wie kann ich das programmieren? Ein Versuch mit recno schlug fehl.

Delphi-Quelltext
1:
2:
3:
4:
....
 i := Query1.recno;
 Table1.recno :=i;
....

Über hilfe würde ich mich sehr freuen.

Vielen Dank
Wilfried

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt & überflüssige Zeilenumbrüche entfernt.


Blawen - Do 18.08.05 20:16

Wieso verwendest Du für das DBGrid nicht auch gleich die Query?

Ansonsten Stichwort:

Delphi-Quelltext
1:
2:
Table.FieldbyName('Feldname').AsString := Query.FieldByName('Feldname').AsString;  // oder Integer,... je nach Bedarf
Table.GotoKey;


Moderiert von user profile iconTino: Delphi-Tags hinzugefügt


wilfried - Do 18.08.05 20:31

Hallo Blawen,

wenn das so einfach wäre.

Das DBgrid soll ja immer die ganze Tabelle anzeigen. Das Ergebnis wird ja in den Edit Feldern angezeigt. Wenn ich das Grid auf die Query lege wird ja immer nur der ausgewählte Satz angezeigt. Das Grid soll sozusagen zum Blättern sein aber nach der Suche soll es den gefundenen Satz markieren.

Wilfried

Moderiert von user profile iconTino: Überflüssige Zeilenumbrüche entfernt.


Blawen - Do 18.08.05 20:35

Verstehe ich es richtig, dass Du im Prinzip ein Edit-Feld hast und beim eingeben eines Wertes einfach zum "nächsten" Datensatz springen möchtest? Dann brauchst Du aber die Query nicht...


alzaimar - Do 18.08.05 20:41


Delphi-Quelltext
1:
Table1.locate ('KeyField',KeyValue, []);                    


wilfried - Do 18.08.05 20:45

Hallo Blawen,

das ganze soll so funktionieren: Ich habe ein normales Edit Feld. Dort wird der Suchbegriff eingegeben. Daraus wird dann eine SQL Abfrage erzeugt an die Query übergeben und das Ergebnis in den DBEdit Feldern angezeigt. Das DBGrid ist eigentlich unabhängig von der Query zeigt aber die gleiche Tabelle an in der auch die Suche stattfindet. Jetzt möchte ich nur dass im Grid auf den von der Query gefundenen Satz navigiert wird (normal steht das Grid auf Satz1 wird jetzt durch die Abfrage Satz 128 gefunden soll das Grid auch auf Satz 128 springen)

Moderiert von user profile iconTino: Überflüssige Zeilenumbrüche entfernt.


Blawen - Do 18.08.05 20:46

Ich habe es "früher" so gelöst gehabt: (OnKeyUp Ereignis des Editfeldes)



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TAuswDebitor.Edit_sucheKeyUp(Sender: TObject; var Key: Word;
                                       Shift: TShiftState);

begin
  Table_Debitor.SetKey;
  Table_Debitor.FieldbyName('Feldname').AsString := Edit_Suche.Text;
  Table_Debitor.GotoNearest;
end;


//Edit
Hinweise:
Wie bereits geschrieben brauchst Du in diesem Falle kein Query. Betreffs Edit-Feldern musst Du selbstverständlich nichts unternehmen, das Ändern der Anzeige geschieht völlig automatisch. Einmal zuweisen und fertig.

Ich hoffe Dein Problem ist nun gelöst.

Gruss
Blawen

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt


Blawen - Do 18.08.05 21:02

user profile iconalzaimar hat folgendes geschrieben:

Delphi-Quelltext
1:
Table1.locate ('KeyField',KeyValue, []);                    

Hat den Nachteil
Zitat:
Wird ein übereinstimmender Datensatz gefunden, gibt Locate den Wert True zurück und aktiviert den gefundenen Datensatz. Andernfalls wird False zurückgegeben.
Somit müsste der Name m.E. exakt gleich geschrieben werden.


wilfried - Fr 19.08.05 19:09

Hallo,

das Problem ist gelöst. Blawen's Code hat einwandfrei funktioniert. Die DBF Edit Felder sind übrigens als Read only deklariert so daß dort nichts eingegeben werden kann.

Zur Anwendung: Das Programm ist für Amateurfunk Conteste und soll nach Eingabe eines Rufzeichens in Das Standard Editfeld das dazugehörende Land anzeigen. Das wird in den beiden DBEdit Feldern gemacht in die der User aber nichts eingeben darf. Die Eingabe erfolgt nur über das Text Edit Feld. Daraus wird dann eine SQL Query gebastelt und über ein TQuery in der Datenbank gesucht und das ganze über eine Data Source mit beiden DB Editfeldern verbunden. Das DBGrid hängt an über eine 2. Data Source direkt an der Table. Dass im Grid auf den gefundenen Satz gesprungen wird ist eigentlich nur ein bischen Kosmetik für die eigentliche Funktion nich nötig.

Aber wie schon gesagt es funktioniert jetzt. Danke Blawen für deine Hilfe.

Wilfried

Moderiert von user profile iconTino: Überflüssige Zeilenumbrüche entfernt.


alzaimar - Fr 19.08.05 20:42

user profile iconBlawen hat folgendes geschrieben:
user profile iconalzaimar hat folgendes geschrieben:

Delphi-Quelltext
1:
Table1.locate ('KeyField',KeyValue, []);                    

Hat den Nachteil
Zitat:
Wird ein übereinstimmender Datensatz gefunden, gibt Locate den Wert True zurück und aktiviert den gefundenen Datensatz. Andernfalls wird False zurückgegeben.
Somit müsste der Name m.E. exakt gleich geschrieben werden.


Lies mal genauer bzw. den Rest der OH. Man kann in den Optionen [] noch angeben, ob die Gross/Kleinschreibung berücksichtigt wird, und/oder ob auch ein Teilschlüssel angegeben werden kann.


Blawen - Fr 19.08.05 23:34

Zitat:
Lies mal genauer bzw. den Rest der OH. Man kann in den Optionen [] noch angeben, ob die Gross/Kleinschreibung berücksichtigt wird, und/oder ob auch ein Teilschlüssel angegeben werden kann.
OK. Du hast recht, man kann sich ganze zwei Zeilen sparen... :wink:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TAuswDebitor.Edit_sucheKeyUp(Sender: TObject; var Key: Word;  
                                       Shift: TShiftState);  
begin  
  Table_Debitor.locate('Feldname',Edit_Suche.Text, [loCaseInsensitive, loPartialKey])
end;