Autor Beitrag
PSi
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 14.04.03 15:09 
Hallo Forum,

ich habe ein kleines Problem: bei mir kommt Delphi3Pro zum Einsatz und als Datenbankserver MySQL über ODBC.

Ich hab ein Formular mit SQL-Query, DataSource und DBGrid Komponente. Über Query frage ich Daten (2 Spalten) ab und speichere sie in DBGrid.

Nun möchte ich aber die Anzahl der Zeilen von DBGrid herausfinden bzw. ich suche einen Eintrag in der 2 Spalte. Leider gelingt mir das nicht ! Was mache ich falsch?

Habe auch schon, wie in der Online-Hilfe beschrieben, mit TBookmarkList gearbeitet, das geht aber auch nicht:
DBGrid1.SelectedRows.Count oder
ausblenden Quelltext
1:
DBGrid1.SelectedRows.IndexOf					


Gut, ich könnte mich ja in der Datenmenge von Query bewegen, aber das möchte ich nicht :(

Sollte ich vielleicht doch lieber StringGrid statt DBGrid nehmen?

Vielen Dank im voraus

Gruss - PSi
infomio
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Win xy

BeitragVerfasst: Mo 14.04.03 15:32 
du greifst via sql zu, dann versuchs doch mal mit:

sqlxyz.Rowsaffected (gibt integer zurück).

hoffe ich habe deine Frage richtig verstanden!
PSi Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 14.04.03 15:45 
Hallo infomio,

vielen Dank für deine Antwort.

Ja, ich greife über SQL auf die Datenbank zu, gebe die Daten an die DBGrid-Komponente und schliesse wieder sofort die Verbindung:
ausblenden Quelltext
1:
2:
3:
4:
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM meineTabelle;');
Query1.Open;
Query1.Close;

DBGrid ist über DataSource mit der Query verbunden! DBGrid zeigt mir auch die richtigen Daten an.

Auf dem Formular habe ich nun die Möglichkeit gegeben, neue Datensätze hinzuzufügen, auch über SQL (also INSERT INTO ...).
Nun soll aber vor der SQL-Anweisung geprüft werden, ob der Datensatz schon existiert.
Und deshalb möchte ich die DBGrid-Zeilen einzeln abklappern bzw. suchen.

Vielleicht bin ich hier falsch, ich müsste unter Datenbanken posten, aber die Frage handelt sich eigentlich um eine VCL-Komponente - sorry Moderator :oops:

Gruss - PSi
infomio
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Win xy

BeitragVerfasst: Mo 14.04.03 23:11 
Nun, ich weiß nicht...in einem Multiuser-Sytem ist es fast unabdinglich nachzulesen (über eine weitere SQL-Anweisung) , ob es den Datensatz schon gibt oder nicht. Im Single-User System willst du aber eigentlich nur wissen, ob der Satz im Grid schon angezeigt wird. Was hindert dich daran, die Datensätze nochmal zu durchfordten??? Ist es die Laufzeit?
Mal ein Beispiel: du hast eine Tabelle mit 100000 Sätzen, schon recht ordentlich. Du willst wissen, ob der Satz mit de ID 16767 schon vorhanden ist. Wenn du eine Tabelle generiert hast mit ID = primary key, dann brauchst du nicht einmal einen Index anzulegen, der ist über den Key eh schon vorhanden. select * from Tabelle where ID = 16767 geht mit dem davor gestellten if not SQL.prepared then SQL.prepare rasend schnell, da das Datenbank-Management-System immer schneller ist als jegliche Art der DataSource-Handling oder DBGrid-Handling-Geschichten. Ich habe das in Millisekunden belegen können ! Und noch dazu bekommst du über ODBC oder BDE fast nie alle Datensätze auf deine Computer, sondern nur ein Fragment bei größeren Sätzen. Des Weiteren ist es nicht verkehrt, weil im Falle von Multiusern-Systemen du fast nichts ändern brauchst, vielleicht nur ein paar Transaktionen einfügen. Meiner Erfahrung nach - Ich bin zwar nur Junior-Member, habe trotzdem schon ... egal... fährst du mit der Methode Vor dem Speichern Nachlesen obe noch da oder nicht immer am besten, da die Möglichkeit in der selben Millisekunde einen Satz zu ändern äußerst gering ist!
PSi Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 15.04.03 11:30 
Hi,

ja da hast du Recht :roll:

das Programm soll mal eines Tages im Multiuser-Modus laufen; ich wollte im Prinzip nur die Daten von der Datenbank holen, Verbindung wieder sofort schliessen, Daten editieren und bei Abschluss wieder per SQL die Änderungen vornehmen.

Eigentlich hatte ich vor, alles über Querys, und das nur bei Bedarf, zu verwalten, anstatt einzelne Tabellen mit Komponenten zu verbinden.

Ich war nur erstaunt, daß DBGrid so eine Methode nicht kennt - obwohl ja DBGrid direkter Nachfahrer von StringGrid ist, oder nicht?

Nun habe ich das anders gelöst, ich ermittle die Anzahl der Datensätze bzw. suche im Datenbestand per Query.Fields[1].AsString / Query.RecordCount

Vielen Dank für deine Antwort und schönen Tag noch 8)

Gruss
PSi
Seraph
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 163

Windows.:siXPack:.
Delphi7 Professional
BeitragVerfasst: Fr 25.01.08 11:35 
Titel: SELECT ohne DataSource und DBGrid
Hi Leute!

Hier noch etwas für diejenigen die das Forum durchsuchen und nicht das passende finden ;-)
::::

Ich habe die ADO-Komponenten benutzt und gehe davon aus, dass jemand schon mit der
Connection-Komponente eine Verbindung hergestellt hat.

Ich habe die ADOQuery-Komponente benutzt und sie über die Connection-Schnittstelle mit
meiner ADOConnection-Komponente verknüpft. (eh klar!)

Hier ein kleines Beispiel:
Es liest von jedem Datensatz den Inhalt des ersten (0ten) Feldes in einer MessageBox aus...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 procedure EineProzedur();
 var i, rowcount: integer;
 begin
  ADOQuery1.SQL.Add('SELECT SrcPath FROM RepositoryObjects');//Anfrage adden
  ADOQuery1.Active := true; //Komponente Aktivieren und somit Query ausfuehren
  rowcount := ADOQuery1.RecordCount; //die Anzahl der Datensaetze ermitteln
  for i := 0 to (rowcount - 1) do //i bei 0 starten lassen...
  begin //...und fuer jeden Datensatz um 1 erhoehen
   ShowMessage(ADOQuery1.Fields[0].AsString); //das 1. Feld des aktuellen Datensatzes ausgeben
   if(i < (rowcount - 1)) //wenn i noch nicht den index des letzten Datensatzes hat ...
    then ADOQuery1.FindNext; //... zum naechsten Datensatz springen
  end; //fertig
 end;


Um jedes Feld eines Datensatzes auszulesen, müsste man in der for-schleife
noch eine zweite öffnen, die den ADOQuery1.FieldCount durchzählt!

Hoffe es nutzt jemand auf eine Schnelle Lösung seines Problems zu kommen! :roll:

Gruß,
Seraph
raiguen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Mo 28.01.08 12:26 
user profile iconPSi hat folgendes geschrieben:
...Ja, ich greife über SQL auf die Datenbank zu, gebe die Daten an die DBGrid-Komponente und schliesse wieder sofort die Verbindung:
ausblenden Quelltext
1:
2:
3:
4:
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM meineTabelle;');
Query1.Open;
Query1.Close;

DBGrid ist über DataSource mit der Query verbunden! DBGrid zeigt mir auch die richtigen Daten an.

:roll: Ich bezweifle, dass du mit einer geschlossenen Query im DBGRid die Daten sehen kannst :roll:
user profile iconPSi hat folgendes geschrieben:
...geprüft werden, ob der Datensatz schon existiert....
...Gut, ich könnte mich ja in der Datenmenge von Query bewegen, aber das möchte ich nicht :( ...

Warum das denn nicht? Suchen in der Datenmenge von ner Query geht doch recht einfach so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  if Query1.Locate('{Feldname}', {Suchbegriff}, []) then
    ShowMessage('Datensatz vorhanden')
  else
    {weitere Anweisungen wie bspw. Abspeichern}
...
Schau mal in der OH Stichwort Locate nach weiteren Informationen ;)

Andere Möglichkeit, nach einem vorhandenen Datensatz zu suchen-> eine weitere Query absetzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
...
qrySuch.SLQ.Text := 'SELECT Feldname FROM MeineTabelle WHERE Feldname=Suchbegriff';
qyrSuch.Open;
if qrySuch.RecordCount = 0 then
   ...
else
   ...