Autor Beitrag
KeinePanik
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131



BeitragVerfasst: Do 25.07.02 00:31 
Also ich bin Totaler Newbie in Sachen Datenbanken ...

Ich hab mir also eine (Adress-) Datenbank angelegt ! Alle Nachnamen werden in einer Listbox angezeigt! Wenn ich jetzt auf einen Nachnamen in der Listbox klicke sollen zumindest erstmal die Vornamen dazu angezeigt werden (am liebsten auch in einer Listbox) ....

Meine Frage nun : Wie kann ich die Daten auslesen ? Ich hab mir zwar die Hilfe von Delphi angeschaut aber hab nichts dazu gefunden (Ich nutze Delphi 4) ... Kann mir da jemand weiterhelfen ??

_________________
Es gibt keine dummen Fragen ... Nur blöde Antworten !!!
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 25.07.02 10:33 
Hallo,

wenn du nicht mit Datenbankgebundenen komponenten machen möchtest findest du ein paar Grundlagen ind diesem Tutorial.

Gruß
Klabautermann
MrSpock
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Do 25.07.02 21:49 
Hallo KeinePanik,

wenn der Nachname als Schlüssel definiert ist, kannst du den Datensatz mit dem entsprechenden Nachnamen über die Funktion FindKey finden. Anderenfalls über Locate. Diese beiden Funktionen wählen den entsprechenden Datensatz innerhalb eines TTable Objektes dann als "aktuellen Datensatz" aus. Auf den Vornamen kannst du dann z.B. über:

ausblenden Quelltext
1:
2:
3:
4:
if Table1.FindKey([Nachname]) then
  Vorname := Table1.FieldByName('Vorname')
else
   ShowMessage('Der Nachname '+Nachname+' existiert nicht.');

_________________
Live long and prosper
MrSpock \\//
KeinePanik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131



BeitragVerfasst: Do 25.07.02 23:48 
Also mit den Fieldbyname ist klar ... Allerdings hab ich mit dem FindKey Probleme ...

Ich schreib mal mein Programm :

- Form1 mit einer Listbox1 und einem Richedit ("rich")
- Datenbank mit Nachnamen (Feld "Nachname") und Vornamen (Feld "name")
- Datenbank wird mit "data1.table1" angesprochen ...

Wenn die Form1 aktiviert wird, werden alle Nachnamen in die Listbox eingelesen:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.FormActivate(Sender: TObject);
begin
rich.Lines.clear;
count := 0;
max := data1.table1.FieldDefs.Count;
while (count < max ) do
begin
  listbox1.items.add(data1.table1['Nachname']);
  data1.table1.Next;
  inc(count);
end;//while
end;//Form activate


Wenn jetzt ein Eintrag der Nachnamen in der Listbox gewählt wird (onclick) soll der entsprechende Vorname angezeigt werden (in dem Beispiel im Richedit ("rich") :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.ListBox1Click(Sender: TObject);
var sel: integer;
begin
sel := listbox1.ItemIndex;
nachname := listbox1.Items.Strings[sel];

//if data1.Table1.FindKey([???]) then
Vorname := data1.Table1.FieldByName('vorname').asstring; //Hier brauch ich eben irgendwoher den Index der Zeile

// Ist nur zum anzeigen, was ich gelesen habe, bevor es weiterverarbeitet wird :
rich.lines.clear;
rich.lines.add('Nachname = ' + nachname + '(' + inttostr(sel) +') ... Vorname = ' + vorname);
end; //Listboxclick


Also was müsste ich an dem Code ändern, damit es gelesen wird ... Bei meinem Beispiel wird mir immer der letzte Vorname aus meiner DB angezeigt ... ist ja auch klar : der Index rattert im form1.activate ja bis zum Schluss durch ... wie kann ich also auf den aktuellen Datensatz zugreifen ???

Es muss doch irgendwie so nach dem Schema gehen :
Nachname aus Zeile X=Schmidt > Vorname aus Zeile x = sowieso

Den index der Zeile hab ich ja bereits in der Variablen "sel" gespeichert ...

(Hoffe ist verständlich :D )

_________________
Es gibt keine dummen Fragen ... Nur blöde Antworten !!!
wwerner
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 185



BeitragVerfasst: Fr 26.07.02 06:43 
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.FormActivate(Sender: TObject); 
begin 
rich.Lines.clear; 
//count := 0; 
//max := data1.table1.FieldDefs.Count; Zählt die Felder!
data1.table1.open;
data1.table1.first;
while not data1.table1.eof() do 
begin 
  listbox1.items.add(data1.table1.Fieldbyname('Nachname').asstring); 
  data1.table1.Next; 
//  inc(count); 
end;//while 
data1.table1.close;
end;//Form activate

_________________
Gruß

Wolfgang

----------
zu hause ist es doch am schönsten
MrSpock
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Fr 26.07.02 08:02 
Hallo KeinePanik,

zunächst ein Hinweis zur Verwendung der OnActivate Methode. Diese wird nicht nur bei der ersten Aktivieruing der Form aufgerufen, sondern auch z.B. wenn ein minimiertes Formular wiederhergestellt wird. Ich verwende deshalb immer eine Variable "FirstTime", die in OnCreate auf True gesetzt wird und in OnActivate wie folgt benutzt wird:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if FirstTime then
begin
   FirstTime := False;
   { hier alles, was nur einmal ausgeführt werden soll }
end
else begin
   { hier alles, was bei jeder Aktivierung ausgeführt werden soll }
end;


Zum Durchlaufen der Tabelle solltest du den Code von wwerner verwenden.

Für die Suche benutzt du dann deinen Code mit der Zeile:
ausblenden Quelltext
1:
2:
3:
4:
5:
if data1.Table1.FindKey([nachname]) then
   vorname := data1.Table1.FieldByName('name').asstring
else
  { Nachname nicht gefunden }
  ...;


Du benötigst keinen Index, weil die Methode Findkey den gesuchten Satz zum aktuellen Datensatz macht (sofern er gefunden wurde). Der Zugriff auf das Feld "name" ist dann der Zugriff auf das Feld "name" des gesuchten Datensatzes. Voraussetzung ist, dass der aktuell gewählte Index von Table1 auch auf Nachname zeigt.

_________________
Live long and prosper
MrSpock \\//
KeinePanik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131



BeitragVerfasst: Fr 26.07.02 15:13 
Also erstmal danke für die Antworten ...

Ich hab jetzt mal den code von wwerner genommen (Form1.activate) und hab die Procedure "Listbox1.click" so geändert wie vorgeschlagen :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.ListBox1Click(Sender: TObject);
var sel: integer;
begin
sel := listbox1.ItemIndex;
nachname := listbox1.Items.Strings[sel];

data1.table1.Open;

if data1.Table1.FindKey([nachname]) then vorname := 
data1.Table1.FieldByName('name').asstring else showmessage('Fehler');

data1.table.close;
end;


Nun bekomm ich einen Fehler : "Table1 : Es ist momentan kein Index aktiv" !!! Das ist ja mein Problem ....

_________________
Es gibt keine dummen Fragen ... Nur blöde Antworten !!!
KeinePanik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131



BeitragVerfasst: Fr 26.07.02 15:34 
Ok ... jetzt hab ich den Fehler :

Hatte die DB nochmal neu angelegt und vergessen den Schlüssel zu setzen :D ... Jetzt funktionierts ... Danke an Euch !!

_________________
Es gibt keine dummen Fragen ... Nur blöde Antworten !!!
KeinePanik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131



BeitragVerfasst: Fr 26.07.02 16:26 
Das eine Problem hat sich gelöst ... Jetzt tritt auch gleich das nächste auf :D (ist ja klar) :

Ich hab jetzt also meine Datenbank, in die ich verschiedene Namen eintragen will ... Da viele Namen öfter vorkommen (z.B. Schmidt) muss ich das ja auch mit berücksichtigen ... Wenn ich nun mit der DB-Oberfläche versuche einen gleichlautenden Nachnamen einzutragen, geht das nicht ! (es muss ja aber irgendwie gehen, da ja andere Adressprogramme auch doppelte Namen speichern :wink: )

Also meine nächste Frage:

Liegt das jetzt an der verwendeten Datenbank (Paradox-7) und muss einen anderen Typ DB wählen oder muss ich da irgendwo noch irgendeine Einstellung beachten !?

_________________
Es gibt keine dummen Fragen ... Nur blöde Antworten !!!
SnergleTheDwarf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 27.07.02 01:13 
Titel: wird wahrscheinlich daran ...
... liegen, daß dein Index-Feld "Nachname" nur uniques verwendet ...,
will heißen, daß der nachname nur einmal auftauchen darf ...

schau mal nach in der DB-Oberfläche bei der Index-Erstellung, da gabes so nen punkt soweit ich weiß ...

nutze doch lieber ein auto-increment-Feld welches automatisch hochgezählt wird und trage diesen wert in als foreign-key(Fremdschlüssel)
um den verweis auf die zweite db zu steuern ...

hat auch den vorteil, daß du platz in der db sparen kannst ...

Tabel1(Name)
1 Klein table2.1 (Klein, Otto)
2 Müller table2.1 (Müller, Otto)
3 Peters table2.2 (...)
4 Hansens table2.3 (...)
5 Kallens table2.2 (...)

Table2(Vorname)
1 Otto
2 Jürgen
3 Peter
4 Karl
5 Steffen


wenn nicht klar ist was ich meine meld dich nochmal ... (auch icq wenn nötig)
KeinePanik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131



BeitragVerfasst: Sa 27.07.02 02:50 
Also mit anderen Worten sollte ich für : ''Vorname'', ''Nachname'', ''Telefonnummer'', ''Strasse'', ''Ort'' usw. jeweils eine eigene DB anlegen !?!? Hab ich das jetzt richtig verstanden oder muss man das dann wirklich so kompliziert machen ... Was ist nun, wenn zum Beispiel die Hausnummer abgefragt werden soll und 50 Leute wohnen nun in verschiedenen Strassen, haben aber die gleiche Hausnummer !!??? .... Muss ich dann für jeden dieser 50 Leute eine eigene Datenbank anlegen !? ... Was ist dann überhaupt der Sinn einer Datenbank ? ... Da kann ich mir ja gleich zu jedem Namen eine eigene Datei anlegen .................

Sorry Snergle : Aber ich denke, das ist nicht die Lösung ... oder !?

_________________
Es gibt keine dummen Fragen ... Nur blöde Antworten !!!
SnergleTheDwarf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Sa 27.07.02 13:47 
... bzw. ich scheine nicht richtig mitbekommen zu haben was du machen willst.

der sinn in meiner vorgehensweise liegt darin ... sich wiederholende daten einzusparen ...

Mach es doch einfach so:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Table1.first;
while not table1.eof do
begin
  listbox1.items.add(table1.fields.fields[0].AsString);  //Spalte"nachnamen"
  listbox2.items.add(table1.fields.fields[1].AsString);  //Spalte "vornamen"
  table1.next;
end; // END OF while (table1)

listbox1OnClick ()
begin
  listbox2.itemindex := listbox1.itemindex;
end;


Aso ... da fällt mir ein ... hast du die spalte Nachname zu einer gemacht die schlüsselwerte enthält ... die müssen immer eindeutig sein ... als schlüsselfeld weg und dafür ne extra spalte (mit zähler ) wie oben bereits beschrieben ...
KeinePanik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131



BeitragVerfasst: Sa 27.07.02 15:10 
SnergleTheDwarf hat folgendes geschrieben:
der sinn in meiner vorgehensweise liegt darin ... sich wiederholende daten einzusparen ...


In dem Fall muss man nichts einsparen ! Wenn ich nun 2 Nachnamen habe, die beide z.B. "Schmidt" lauten, haben sie trotzdem jeweils unterschiedliche Telefonnummern und Adressen ...

Zitat:

die müssen immer eindeutig sein ... als schlüsselfeld weg und dafür ne extra spalte (mit zähler ) wie oben bereits beschrieben ...


Ich denk so wirds gehen ... Ich hab ja das Feld "Nachname" als Schlüsselfeld deklariert ... also Zähler einbauen ! ..Danke

_________________
Es gibt keine dummen Fragen ... Nur blöde Antworten !!!
GPF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 85



BeitragVerfasst: Sa 27.07.02 23:14 
Ich habe mir die restlichen Antworten zwar nicht durchgelesen - aber ein TDBGrid sollte genau das sein, wonach Du suchst. Durch Doppelklick auf ein TDBGrid (sofern die Datasource existiert) kannst Du die sichtbaren Spalten und deren Eigenschaften festlegen