Autor Beitrag
[TP]Hawk274
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Mi 16.10.02 17:10 
Ich bin noch ein absoluter Newbie in Sachen Delphi und versuche zur Zeit ein Zugriff auf Access über ADO.

Folgendes möchte ich realisieren:
Ich habe eine Hauptformular und auf diesem eine Adressmaske. Nun möchte ich z.B. einen Namen eingeben und danach klicke ich auf einen Button Suchen und es soll der Kunde in die Adressmaske geladen werden. Im Moment gehe ich erst einmal davon aus das dieser Kunde aus existiert! Ich werde das erst später abfangen ob ein Kunde in der DB existiert oder nicht.
Des weiteren habe ich ein DataModule wo ich bereits ein ADOConnetion, ADODatasource und eine ADODataset drinnen habe.
Ich muss auch zugeben das ich noch nicht 100% verstanden habe wozu bzw. wann ich ein DataSource und DataSet benötigt wird.
Jedenfalls möchte ich nun die Daten in die Maske laden. Brauche ich dazu ein ADOTable oder ADOQuery? Habe das so verstanden das ich für mehrere Tabellen und DML immer ein ADOQuery brauche.
Außerdem benutze ich TEdit Datenfelder, weil ich nicht weiß wie ich bei DBEdit Datenfelder etwas hinschreiben kann ohne das vorher hineingeladen wurde. Wenn ich nämlich das Programm starte kann ich nichts in die Datenfelder schreiben. Ich muss erst etwas hineinladen dann kann ich erst editieren. Das möchte ich aber nicht! Ich möchte z.B. erst ein neuen Kunden erfassen und dann ist es ziemlich blöd immer erst ein Kunden zu laden.
Kann mir vielleicht jemand die vorgehensweise erklären wie ich Daten aus Access in die Datenfelder bekomme?
Am liebsten wäre es mir per ICQ oder der gleichen.

Ich hoffe ihr habt mich verstanden und falls ich jetzt vergessen habe irgendwelche Daten anzugeben dann verzeiht mir.
Steffer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: Do 17.10.02 16:55 
Das Tutorial hat mir gestern jemand geschickt:
www.faqsen.de/find.jsp?FAQ=4;0465199400;2
Vielleicht hilft es dir.

_________________
Keine Signatur ...
[TP]Hawk274 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Fr 18.10.02 14:14 
Danke für deinen Tip. Dein Link war hilfreich, aber die Sache mit der Connetion habe ich bereits verstanden.
Ich weiß halt noch nicht wann ich eine Table, Query, Command oder DataSet benutzten soll.
Das nächste Problem würde darin bestehen wie ich dann auf die Daten zugreife bzw. in welcher Komponente die Daten gespeichert werden.

thx
Stephan
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 25.10.02 13:41 
Titel: Na da kann ich helfen denk ich
Das Tutorial ist von mir... 8) freut mich wenn du mit der ADOConnection schon mal klar kommst. Der Rest ist dann eigentlich kein größeres Problem mehr. Ich werd mal überlegen das Tutorial eintsprechend zu erweitern.
Also ich geh mal davon aus dass die Verbindung zur Datenbank steht und Du jetzt auf eine Tabelle zugreifen möchtest :o
Zitat:
Das nächste Problem würde darin bestehen wie ich dann auf die Daten zugreife bzw. in welcher Komponente die Daten gespeichert werden.

Grundsätzlich....die Daten werden in der Datenbank gespeichert und nicht in einer Komponente. Die ADO-Komponenten ermöglichen Dir die Daten sichtbar zu machen.
TAdoTable ist wie eine AccessTabelle zu sehen und bildet die Daten in der von Dir gewählten Access Tabelle ab, Eine .mdb Access-Datei kann, wie Du sicher weißt, mehrere Tabellen beinhalten.
Einfach eine AdoTable in dein Dantemodul oder auf dein Formular ziehen,
und im Objekt-Inspektor bei "Connection" deine AdoConnection auswählen und unter "TableName" die gewünschte Tabelle aus deiner Access.mdb auswählen. Wenn jetzt ein Passwort abgefragt wird und du das nicht willst, stellst Du einfach die Eigenschaft "LoginPrompt" der ADOConnection auf "false". Jetzt sollte auch das Fragezeichen in der Baumansicht weg sein. Wenn du jetzt auf die AdoTable doppelt klickst öffnet sich der Feld-Editor, rechte Maus und dann "Alle Felder hinzufügen" wählen. Jetzt sollten alle Felder aus Deiner Tabelle im Feld-Editor der TADOTable stehen. :shock:
Jetzt kannst du schon mal jedes einzelne Feld einfach mit Drag&Drop auf Dein Formular ziehen. Wenn die Tabelle geöffnet ist werden in den DBEdit Felder dann die Daten aus Deiner Datenbank angezeigt.
OnShow-Ereignis des Formulars muss sein:
ausblenden Quelltext
1:
Table1.Open;					

Im Code des Tutorials, das du ja schon kennst, fügst du einfach in das bereits vorhandene OnShow Ereignisses des HauptFormulars ein:
ausblenden Quelltext
1:
2:
3:
if DataModule2.OpenDatabase=true
   then
    DataModule2.ADOTable1.Open;

OnClose-Ereignis entsprechend:
ausblenden Quelltext
1:
Table1.Close;					

Wenn du jetzt z.B. in einer TDBGrid (Registerkarte Datenkontrolle) alle Datensätzte anzeigen und später auch Navigieren willst (vor, zurück...)
solltest du eine TDataSource (Registerkarte Datenzugriff) hinzufügen.
Im Objektinspektor der DataSource bei DataSet deine ADOTable auswählen.
So jetzt kannst du schon mal die TDBGrid ins Formular einfügen und im Objektinspektor bei DataSource deine TDataSource auswählen. Jetzt sollte der DBGrid mit deinen Daten gefüllt sein. Wenn nicht dann schau mal ob die Eigeschaft Active der ADOTable auf true steht und die Eigenschaft Connected der ADOConnection ebenfalls auf true steht. Jetzt sollte es gehen. :shock:
So nun noch die Navigation:
Einen TDBNavigator aus der Registerkarte Datenkontrolle einfügen und unter DataSource eben deine TDataSource auswählen.
So dann versuchs doch mal. Das Thema Query und so weiter dann das nächste mal, ok.

CIOA
Stephan
[TP]Hawk274 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Di 29.10.02 14:53 
Danke für deine ausführliche Information.
Was ist eigentlich, wenn ein Statement habe bei dem ich über mehrere Tabelle joine? Welche Komponente müsste ich eigentlich dann nehmen.
Im Moment habe ich leider nicht so viel Zeit, deshalb werde ich frühstens am WE wieder dazu kommen an meinem Delphi Projekt weiter zu arbeiten.
Werde mich dann hier wir melden.
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Di 29.10.02 17:43 
Hi
Zitat:

Was ist eigentlich, wenn ein Statement habe bei dem ich über mehrere Tabelle joine? Welche Komponente müsste ich eigentlich dann nehmen.

Für SQL-Abfragen verwendest du immer TQuery. Ob du dabei eine Tabelle ansprichst oder mehrere verbindest, spielt dabei keine Rolle.
Wenn du mehrere Tabellen mit JOIN verbindest ist die Ergebnismenge allerdings meist ReadOnly.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
[TP]Hawk274 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Mo 11.11.02 18:20 
Ich habe es nun endlich mal wieder geschafft ein wenig an meinen Projekt weiter zu arbeiten. Leider bin ich nicht sehr weit gekommen.

Zur Zeit kann ich zwar einen Kunden suchen, aber seine Daten nicht editieren. Ich habe dafür die Procedure Edit vom DataSet aufgerufen. Doch dann bekomme ich folgende Fehlermeldung:
"Eine Datenmenge, die nur zum Lesen ist, kann nicht geändert werden."
Aber was muss ich ändern, damit diese Meldung nicht mehr erscheint? :idea:

Das wäre zumindestens ein Problem was ich zur Zeit habe. Ein weiteres Problem welches mir noch eingefallen ist folgenden.
Was ist wenn ich bei Suche nach einem Kunden Merkmale eingebe, welche auf mehrere Kunden zutrifft? Wahrscheinlich werde ich das problem genauso lösen, wie der DBNavigator. In dem ich ein Next und Last Button einbauen werde. Aber für bessere Lösungen bin ich immer offen.
Stephan
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 12.11.02 10:27 
Du kannst die Datenmengene einer TQuery nicht ändern. Sie ist das Ergebnis einer Abfrage, wenn sei so aussieht:
ausblenden Quelltext
1:
SELECT * FROM Tabelle WHERE Feld1=Wert1 ORDER BY Feld2					

Wenn du Daten ändern willst, musste du eine T(ADO)Table nehmen oder eine eigene T(ADO)Query mit UPDATE oder INSERT.
zum Beispiel so:
ausblenden Quelltext
1:
UPDATE Tabelle SET Feld1=Wert1 WHERE Feld2=Wert2					

Aufrufen mit:
ausblenden Quelltext
1:
MeineUpdateQuery.ExecSQL;					

Zu deiner zweiten Frage:
Wenn du eine Abfrage machst die mehrere Ergebnisse hat, würde ich diese in einem TDBGrid anzeigen. der Benutzter entscheidet sich für einen Datensatz, z.B. mit Doppelklick. Dann kannst du den Primärschlüssel dieses Datensatztes in einen Filter (einer TTable) schreiben oder eine erneute Query ausführen um den Detaildatensatzt anzuzeigen.
CIOA
Stephan

_________________
Der Computer hilft uns Probleme zu lösen, die wir vor seiner Erfindung gar nicht hatten.
[TP]Hawk274 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Mo 18.11.02 08:58 
Ich habe jetzt folgendes Problem:
Ich habe ich meiner Tabelle zwei Spalten die beim Hinzufügen eines Kunden bzw. Mitarbeiter gesetzt sein müssen. Diese kann und darf man nicht in der Benutzeroberfläche einstellen dürfen. Die erste Spalte identifiziert jeden Kunden eindeutig. Die zweite Spalte enthält den Status.
Als Datentyp hat die erste Spalte "AutoWert". Die zweite Spalte wird immer abhängig, Kunde oder Mitarbeiter anders gesetzt. Es ist als eine Art Status zu lesen. Es bekommt z.B. jeder Kunde als Status den Wert 2 und jeder Mitarbeiter den Status 1 als Wert. Somit kann ich in der Tabelle eindeutig Kunden und Mitarbeiter unterscheiden!
Das zum Datenmodell. Nun das Problem was ich mit Delphi habe, wenn ich einen neu anlegen will.

1. Ich erfasse einen Kunden und diesem muss zur Identifizierung eine ID
verpasst werden. In der Access Datenbank ist aber diese Spalte nun mal ein AutoWert. Wie kann ich jetzt den Kunden speichern?

2. Des weiteren muss der Status gesetzt werden: Kunden -> Status 2; Mitarbeit -> Status 1
Wie aber realisiere ich das nun in Delphi?

Hoffe ihr habt mich verstanden.
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mo 18.11.02 09:15 
Hi
leider hat Delphi die Angewohnheit, ein Keyfeld als notwendiges Feld zu deklarieren, auch wenn der Wert aus der Datenbank kommt. Lösungsmöglichkeit für dein erstes Problem wäre: Persistente Felder einfügen (rechte Maustaste auf die Tabelle - Feldeditor - Alle Felder hinzufügen), dann das Feld für die Kunden-ID auswählen und die Eigenschaft Requiered auf False setzen. Damit kannst du den Datensatz ohne Eingabe in dieses Feld speichern und den Rest macht die Datenbank.

Für dein zweites Problem kannst du das Ereignise BeforePost der Tabelle verwenden. Vor dem Speichern, prüfst du ob es sich um Kunde oder Mitarbeiter handelt und setzt entsprechend den Status.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
[TP]Hawk274 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Mi 20.11.02 09:38 
Das waren zwei sehr hilfreiche Tipps. thx
[TP]Hawk274 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Sa 30.11.02 20:57 
Ich habe nun das problem das ich werte aus einer Combo Box nicht mit der Maus auswählen kann.
Habe in meiner Tabelle diesen Person Typ als id und referenziere dabei auf eine andere Tabelle in der die Beschreibung steht. Diese wird dann in der Combo Box dargestellt. Doch leider kann ich mit der Maus keinen Wert auswählen, sondern nur mit den Cursor Tasten. Kann mir leider nicht erklären warum? Kann mir das vielleicht jemand erklären? Kann das vielleicht mit irgendeiner ReadOnly Eigenschaft zu tun haben. Wäre jetzt meine einzige Idee,

Wenn ich die Attribute, welche ich geändert habe, auch noch posten soll müsst ihr mir das mitteilen.


Ein weiteres Problem: :)
Ich habe ein DBGrid und die Optionen MultiSelect und RowSelect aktiviert. Wie kann ich jetzt jeweils ein bestimmten Wert aus jeder Zeile auslesen? Wenn eine Zeile selektiert ist das bisher keine Problem, das habe ich herausgefunden.

Hat jemand von euch vielleicht ein kleines Tutorial oder Anleitung zu DBGrid bzw. Grids allgemein?

Ich hoffe ihr habt mich verstanden.