| Autor |
Beitrag |
kloti
Hält's aus hier
Beiträge: 8
|
Verfasst: Di 28.01.03 18:25
Hi @ all,
als erstes möchte ich vorweg schicken, dass ich, was Delphi betrifft, leider nicht sehr fit bin
Ich muß ein (Teil)Projekt bearbeiten, dass eben in Delphi erstellt werden soll.
Die Aufgabe ist ganz einfach.
Ich habe eine Excel Liste, in der ca. 200 Datensätze enthalten sind. Die Felder sind ganz gewöhnlich (Vorname, Nachname, Straße usw.).
Meine Aufgabe besteht nur darin, eine Suchmaske zu entwerfen, wo man eben nur den Vor- und Nachnamen eingibt, und in den Datensätzen gesucht wird. Wenn der Name enthalten ist, sollen alle Einträge dargeszellt werden.
Meine Fragen:
1. Kann ich diese Abfragen auch direkt in Excel machen (..oder muss ich die Excel Liste in eine Datenbank umwandeln) ?
2. Wenn ich ich es mit Datenbanken machen muss, was ist da der "leichteste" Weg ?
Bin für jeden Tipp dankbar. Hänge im Moment etwas in der Luft, komme einfsach nicht weiter !!
Gruß
kloti
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Di 28.01.03 18:39
Wenn du es in einer Datenbank machst, dann kannst du eine SQL Abfrage einbauen. Ist die einfachste Art.
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Di 28.01.03 18:46
Hallo Kloti,
zu 1.)
Ja! Gib einmal in der Excel-Hilfe "Datenbank" oder "DBfunktion" als Kriterium ein.
zu 2.)
Einen leichten Weg gibt es nicht
Das hängt von
- Deinem Kenntnisstand bzgl. Datenbanken
- Betriebssystem
- Delphi-Version
- ...
ab.
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Di 28.01.03 18:51
am besten du exportierst die EXCEL Tabelle in eine Textdatei. mit der lässt sich um eineiges einfacher hantieren als mit der excel tabelle
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Di 28.01.03 19:07
Ja, das geht am einfachsten. Aber doch nicht von alleine.  Die gebräuchliste Methode ist, hinter jedes Datenfel einen ; zu setzen. In Excel (bei Datenimport) mußt Du dann festlegen : Keine feste Feldlänge, sondern Trennzeichen ; Lemmy hat hierzu ein gutes Tutorial geschrieben: "Word- und Excel - Automation", lies Dir das mal durch.
Gruß
Hansa
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Di 28.01.03 19:29
Hallo,
Leute irre ich mich oder kann man Exel-Dateien per ADO direckt ansprechen?
Dann müsste es doch auch möglich sein direckt auf der Tabelle ein Query zu fahren. Eine aufwändige Konvertierung währe dann nnicht nötig.
Gruß
Klabautermann
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Di 28.01.03 19:56
Und ohne ADO ? Einfach jedes Feld in eine Zeile schreiben und später auslesen, basta.
Gruß
Hansa
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Di 28.01.03 23:56
Man kann Excel als Datenbak ansprechen, aber es is eine undankbahre Sache. Man investiert da mehr Zeit als in eine normale Datenbank. Deshalb kann man auch gleich es richtig machen.
|
|
lkz633
      
Beiträge: 136
WinXP, Suse Linux 8.2 (unter VMWare)
D7 Prof, K3 Prof
|
Verfasst: Mi 29.01.03 12:12
| Popov hat folgendes geschrieben: | | Man kann Excel als Datenbak ansprechen, aber es is eine undankbahre Sache. . |
| Klabautermann hat folgendes geschrieben: | Leute irre ich mich oder kann man Exel-Dateien per ADO direckt ansprechen?
Dann müsste es doch auch möglich sein direckt auf der Tabelle ein Query zu fahren; |
Wiso undankbar ? Man kann Excel direkt mit ado ansprechen.
1) adokomponenten auf form setzten
2) einfach connectionstring mit dem jetProvider aufbauen (siehe www.connectionstring.com)
3) eine einfache Sql Abfrage mit Name und Vorname
4) Das Ergebiss ausgeben
5) fertig
| Zitat: | | Wenn der Name enthalten ist, sollen alle Einträge dargeszellt werden |
Gibt es bei einem gefunden Namen mehrere Einträge ? Dann sollte die Struktur der Datenbank überdacht werden!!
Hoffe, dir weitergeholfen zu haben
Gruss lkz633
|
|
kloti 
Hält's aus hier
Beiträge: 8
|
Verfasst: Do 30.01.03 18:24
Titel: Danke und Folgefrage
hi @all,
vielen, vielen Dank für eure zahlreichen und kompetenten Antworten.
Ich habe mich dazu entschlossen, die Excel-Liste in eine Datenbank zu exportieren, und so auf die Daten zu zugreifen.
Aber da liegt auch schon das Problem !!
Ich habe unter dem Registerreiter "BDE" eine Table angelegt, und sie mit meiner Datenbank verknüpft.
Über die Methode "FieldByName", kann ich in einer Spalte z.B. den Nachnamen finden !! Da aber in meiner Liste oft zweimal der gleiche Familienname vorkommt (Vater+Sohn), kann ich es nicht direkt zuordnen. Die Suchfunktion dieser Methode geht ja eben nur spaltenweise. Die weiteren Informationen, wie z.B. Straßennamen, Telefonnummer usw. sind ja in einer Zeile untergebracht. Ich komme ja somit gar nicht an diese Daten ran, da ich mit "Next" immer nur in einer Spalte weitergehe.
Könnt ihr mir da weiterhelfen ??
(Ich habe bereits versucht, mit einem Query zu arbeiten, kriege das aber nicht mit meiner Datenbank verknüft)
Bin wie immer für jeden Tipp dankbar !!!
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 30.01.03 18:35
| Zitat: | da ich mit "Next" immer nur in einer Spalte weitergehe.
|
Das stimmt schon, aber die Spalte gibt nur die Reihenfolge vor, in der Deine Datenmenge abgearbeitet wird. An die einzelnen Felder kommst Du schon dran, eben mit FieldByName. Vielleicht hast Du das value übersehen, das gibts auch.
Gruß
Hansa
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 30.01.03 18:36
Titel: Re: Danke und Folgefrage
Hallo,
| kloti hat folgendes geschrieben: | | Da aber in meiner Liste oft zweimal der gleiche Familienname vorkommt (Vater+Sohn), kann ich es nicht direkt zuordnen. Die Suchfunktion dieser Methode geht ja eben nur spaltenweise. Die weiteren Informationen, wie z.B. Straßennamen, Telefonnummer usw. sind ja in einer Zeile untergebracht. Ich komme ja somit gar nicht an diese Daten ran, da ich mit "Next" immer nur in einer Spalte weitergehe. |
Verstehe ich das richtig, die Tabelle sieht so aus:
Quelltext 1: 2:
| Max | Mustermann | Der Weg 12 | 12345 | Die Stadt <zeilenumbruch> 01234/23456 | 01234/9375765 |
Wenn ja ist dieses Design absolut Programmiererunfreundlich. Dann bleibt dir eigentlich nur noch die möglichkeit die Tabelle von oben bis unten durchzugehen und wenn der Eintrag der Suchmaske entspricht (also Spalte 1 & Spalte 2 übereinstimmen) alle Daten dieser und der nächsten Zeile ausgeben.
Gruß
Klabautermann
|
|
kloti 
Hält's aus hier
Beiträge: 8
|
Verfasst: Do 30.01.03 18:49
@ Klabautermann
Die Struktur meine Tabelle ist genau so, wie in deinem Beispiel.
Wenn ich, um bei deinem Beispiel zu bleiben, den Nachnamen Mustermann in der Spalte "Nachname" finde, dann wäre ja der nächste Schritt, in der Spalte "Vorname" Max zu suchen. Es könnte ja aber sein, dass ein anderer Max vorher in der Liste steht. So dass ich diese Variante ja gar nicht wählen kann.
@ hansa,
an value hatte ich auch gedacht, aber um den Wert auszulesen bin ich wieder in dieser "Spaltenstruktur" (Table1vorname.value).
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 30.01.03 19:42
Hallo,
1. Wenn du irgentwie Einfluss auf die Leute hast di diese Tabelle erstellen, versuche sie dazu zu Bringen ihre Daten in einer Zeile Pro Datensatz zu schreiben. Ich gehe aber davon aus, das sie nicht sehr begeistert sind alle bestehenden daten zu ändern.
2. Also dann musst du wie gesagt von Anfang bis zum ende der Tabelle durchlaufen.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| Prodedure FindData(vorname, Nachname : String); VAR Vorname, Nachname, Stasse, PLZ, Ort, Tel, Fax : STRING; Found : Boolean; begin Table1.Filrst; Found := FALSE; WHILE NOT Table1.EOF DO BEGIN IF Found THEN BEGIN // Wenn im vorherigem durchgang etwas gefunden wurde Tel := Table1.FieldByName('Vorname').AsString; Fax := Table1.FieldByName('Nachname').AsString; ShowResult(Vorname, Nachname, Stasse, PLZ, Ort, Tel, Fax); // die musst du schreiben Found := FALSE; END; // Wenn im vorherigem durchgang etwas gefunden wurde IF (Table1.FieldByName('Vorname').AsString = vorname) OR (Table1.FieldByName('Nachname').AsString = nachname) THEN BEGIN Vorname := Table1.FieldByName('Vorname').AsString; Nachname := Table1.FieldByName('Nachname').AsString; Stasse := Table1.FieldByName('Strasse').AsString; PLZ := Table1.FieldByName('PLZ').AsString; Ort := Table1.FieldByName('Ort').AsString; Found := TURE; END; END; // Komplette Tabelle durchlaufen end; |
Nach diesem Schema sollte das Problem zu lösen sein.
Gruß
Klabautermann
PS: Der Code ist im Browser getippt und deshalb warscheinlich auch fehlerhaft. Es geht ums Konzept  .
|
|
kloti 
Hält's aus hier
Beiträge: 8
|
Verfasst: Do 30.01.03 23:04
Titel: DANKE Klabautermann !!!!!
Hi Klabautermann,
ein fettes Dankeschön für deine Hilfe !!
Durch deinen Code, an dem noch ein bißchen arbeiten mußte, habe ich es endlich hinbekommen. DANKE DANKE DANKE
Gruß
kloti
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Fr 31.01.03 10:38
Titel: Re: DANKE Klabautermann !!!!!
Hallo,
| kloti hat folgendes geschrieben: | Durch deinen Code, an dem noch ein bißchen arbeiten mußte, habe ich es endlich hinbekommen. DANKE DANKE DANKE  |
das freud mich, und gern geschehen.
Gruß
Klabautermann
|
|