Autor |
Beitrag |
Fliegerbenny
      
Beiträge: 23
|
Verfasst: Sa 01.03.08 17:51
Hallo
ich wollte mir fragen ob mir eventuell mal jemand helfen kann.
Ich habe eine Access Datenbank dir ich über ADO in einer Grid anzeigen lasse.
Nun habe ich es geschafft, dass ich einen neuen Eintrag (über DBEdit) einfügen kann.
Ich möchte die sache aber ein bisschen ausbauen. Bevor ich auf speichern drücke, soll er prüfen ob der eintrag bereits vorhanden ist und eine Fehlermeldung anzeigen, Ist das nicht der Fall, soll er den Eintrag abspeichern.
Außerdem wollte ich fragen, wie ich in der Datenbank suchen kann? Geht das ohne Query bzw. SQL?
Hier mal der Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TForm2.SpeedButton3Click(Sender: TObject); begin begin with ADOTable1 do begin
SpeedButton1.Enabled := true; Speedbutton2.Enabled := true; Speedbutton3.Enabled := false; Speedbutton4.Enabled := false; If Locate('Bezeichnung',DBEdit1.text,[]) then begin MessageDlg('Satz bereits vorhanden',mtWarning,[mbOK],0); end else Insert; FieldByName('Bezeichnung').AsString := DBEdit1.Text; Post; ADOTable1.Delete; end; end; end; |
Was läuft da falsch?
Moderiert von jasocul: Delphi-Tags hinzugefügt
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 02.03.08 16:21
(1) Mit DBEdits kannst du ganz schlecht vorher abfragen machen. Mein Tipp: Normale Edits verwenden
(2) Du kannst im Table unter Filter einen Filter einstellen. z.B. "ID=50" oder "(Feld1='blub')and(Feld2='bla')'. Allerdings ist ein Query mit SQL besser geeignet.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Fliegerbenny 
      
Beiträge: 23
|
Verfasst: So 02.03.08 17:37
Danke für die Antwort,
wenn ich aber einen Edit verwende, kann ich in diesem kein DAtenbankwert anzeigen lassen....
Kann man das umgehen?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 07.03.08 15:22
du musst deinen Datenbankwert selbst ins Edit schreiben. Etwa beim klicken aufs DBGrid:
Delphi-Quelltext 1:
| Edit.Text:=Table.FieldByName('Blub').AsString; |
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Fliegerbenny 
      
Beiträge: 23
|
Verfasst: Fr 07.03.08 20:38
DAnke für die super Antworten, bin schon sehr weit gekommen
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 07.03.08 21:34
Natürlich geht das mit TDBEdits und ADO. Bevor Du in den Edit bzw. Insert-Modus wechselst, erstellst Du eine Kopie der ADO-Tabelle. Das geht sehr einfach mit der clone-Methode. Und im OnUpdateData-Methode der TDatasource prüfst Du einfach, ob der Eintrag schon vorhanden ist. Alles in Allem ca. 6 Zeilen Code.
_________________ Na denn, dann. Bis dann, denn.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 09.03.08 14:22
Es geht, ja. Aber durch meine Lösung hast man jede Freiheit der Welt das noch auszubauen. Etwa druch einen Speichern-Button. Oder man jagt vorher noch eine Datumsüberprüfung drüber und sagt dem User dann, er soll doch bitteschön ein echtes Datum eingeben
//Edit: und die Clone-Methode für eine große Datenbank stelle ich mir ziemlich langsam vor
Die DB-Komponenten sind Klasse für die Einführung, mit 5 klicks kann man da eine eigene Datenbank zusammenbauen. Aber je mehr man verändern will, desto mehr MUSS man auch selbst machen 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 09.03.08 17:57
Xion hat folgendes geschrieben: | Es geht, ja. Aber durch meine Lösung hast man jede Freiheit der Welt das noch auszubauen. Etwa druch einen Speichern-Button. |
Dazu dient die der Batch-Update-Modus (Locktype = ltBatchOptimistic und ApplyUpdates. Alles in ADO eingebaut.
Xion hat folgendes geschrieben: | Oder man jagt vorher noch eine Datumsüberprüfung drüber und sagt dem User dann, er soll doch bitteschön ein echtes Datum eingeben  |
Auch das erledigt man im BeforePost oder OnUpdate-Data-Event. Oder im OnSetText des Datenfeldes. Oder Oder Oder. Schon fix und fertig.
Xion hat folgendes geschrieben: | Aber je mehr man verändern will, desto mehr MUSS man auch selbst machen  |
Nö. "Kann". "Muss" aber nicht. Denn es ist (fast) alles bereits eingebaut.
Xion hat folgendes geschrieben: | //Edit: und die Clone-Methode für eine große Datenbank stelle ich mir ziemlich langsam vor |
Erstens wird keine Datenbank geklont, sondern das _Recordset der ADO-Datenmenge. Zweitens gilt: Wer 100.000 Datensätze einliest hat ein grundsätzliches Problem, nämlich wenig Ahnung von der Erstellung von Datenbankanwendungen.
Ich glaube, man sollte die Möglichkeiten von ADO kennen und verwenden und erst dann entscheiden, ob man das so lösen will oder nicht. Grundsätzlich zu sagen:"Ich mach alles selbst" ist nur was für Leute, die zu viel Zeit haben. Letztendlich wollen wir alle jeweils das optimale Ergebnis und hier wäre das auf jeden Fall das Klonen, weil man mit weniger als 6 Zeilen Code nicht ans Ziel kommt. Und mit dem Klon-Trick kann man zudem noch die veränderten, eingefügten und gelöschten Datensätze anzeigen und sonst noch einiges anstellen. Wenn Du das selbst programmieren möchtest, viel Spass.
Allerdings ist ADO nicht das Gelbe vom Ei, da der Provider zumindest für MSSQL nur suboptimal umgesetzt wurde. Für Standardanwendungen reicht es jedoch allemal.
Optimal ist im Übrigen eine Objektpersistenz für einzelne logische Records sowie die Verwendung von Datenmengen (TDataSet) für die Visualisierung z.B. in TDBGrids o.ä.
_________________ Na denn, dann. Bis dann, denn.
|
|
|