Entwickler-Ecke
Datenbanken - Inhalte eines DBGrid in Oracle-DB abspeichern
gamoes - Di 02.05.06 14:53
Titel: Inhalte eines DBGrid in Oracle-DB abspeichern
Hallo,
habe mal wieder ein Problem.
Mit folgendem Quelltext möchte ich den Inhalt, den der Anwender in die einzelnen Spalten des DBGrid geschrieben hat in der Oracle-DB abspeichern.
(Ich nutze die ODAC-Komponenten).
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: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| qry_Ausbplan.SQL.Clear; qry_Ausbplan.SQL.Add('INSERT INTO Ausbplan' +'(a_azubinr, amt, amt_beginn, amt_ende, arbeit, fertigkeiten, kenntnisse,' +' m_ausdruck, s_ausdruck, auffassung, urteilsf, transfervermoegen, orga, sorgfalt,' +' lerntempo, ausdauer, zuverlaessig, verantwortung, initiative,' +' i_zusammenarbeit, e_zusammenarbeit, motivation)'); qry_Ausbplan.SQL.Add('VALUES(:AZUBINR, :AMT, :AMT_BEGINN, :AMT_ENDE, :ARBEIT, :FERTIGKEITEN, :KENNTNISSE,' +' :M_AUSDRUCK, :S_AUSDRUCK; :AUFFASSUNG, :URTEILSF, :TRANSFERVERMOEGEN, :ORGA, :SORGFALT,' +' :LERNTEMPO, :AUSDAUER, :ZUVERLAESSIG, :VERANTWORTUNG, :INITIATIVE,' +' :I_ZUSAMMENARBEIT, :E_ZUSAMMENARBEIT, :MOTIVATION)'); qry_Ausbplan.Params.ParamByName('AZUBINR').AsInteger:=StrToInt(Ed_AzubiNr.Text); qry_Ausbplan.Params.ParamByName('AMT').Value:=CRDBGrid1.Columns[0].TotalValue; qry_Ausbplan.Params.ParamByName('AMT_BEGINN').Value:=CRDBGrid1.Columns[1].TotalValue; qry_Ausbplan.Params.ParamByName('AMT_ENDE').Value:=CRDBGrid1.Columns[2].TotalValue; qry_Ausbplan.Params.ParamByName('ARBEIT').Value:=CRDBGrid1.Columns[3].TotalValue; qry_Ausbplan.Params.ParamByName('FERTIGKEITEN').Value:=CRDBGrid1.Columns[4].TotalValue; qry_Ausbplan.Params.ParamByName('KENNTNISSE').Value:=CRDBGrid1.Columns[5].TotalValue; qry_Ausbplan.Params.ParamByName('M_AUSDRUCK').Value:=CRDBGrid1.Columns[6].TotalValue; qry_Ausbplan.Params.ParamByName('S_AUSDRUCK').Value:=CRDBGrid1.Columns[7].TotalValue; qry_Ausbplan.Params.ParamByName('AUFFASSUNG').Value:=CRDBGrid1.Columns[8].TotalValue; qry_Ausbplan.Params.ParamByName('URTEILSF').Value:=CRDBGrid1.Columns[9].TotalValue; qry_Ausbplan.Params.ParamByName('TRANSFERVERMOEGEN').Value:=CRDBGrid1.Columns[10].TotalValue; qry_Ausbplan.Params.ParamByName('ORGA').Value:=CRDBGrid1.Columns[11].TotalValue; qry_Ausbplan.Params.ParamByName('SORGFALT').Value:=CRDBGrid1.Columns[12].TotalValue; qry_Ausbplan.Params.ParamByName('LERNTEMPO').Value:=CRDBGrid1.Columns[13].TotalValue; qry_Ausbplan.Params.ParamByName('AUSDAUER').Value:=CRDBGrid1.Columns[14].TotalValue; qry_Ausbplan.Params.ParamByName('ZUVERLAESSIG').Value:=CRDBGrid1.Columns[15].TotalValue; qry_Ausbplan.Params.ParamByName('VERANTWORTUNG').Value:=CRDBGrid1.Columns[16].TotalValue; qry_Ausbplan.Params.ParamByName('INITIATIVE').Value:=CRDBGrid1.Columns[17].TotalValue; qry_Ausbplan.Params.ParamByName('I_ZUSAMMENARBEIT').Value:=CRDBGrid1.Columns[18].TotalValue; qry_Ausbplan.Params.ParamByName('I_ZUSAMMENARBEIT').Value:=CRDBGrid1.Columns[19].TotalValue; qry_Ausbplan.Params.ParamByName('MOTIVATION').Value:=CRDBGrid1.Columns[20].TotalValue;
qry_Ausbplan.ExecSQL; end; |
Doch ich erhalte lediglich die Fehlermeldung:
Ungültiges Zeichen.
Leider weiß ich nicht wie ich mein Vorhaben sonst realisieren könnte.
Gruß
Gabi
jasocul - Di 02.05.06 15:19
Der Weg ist richtig.
Probleme könntest du aber bekommen, wenn in deinem Grid Null-Values enthalten sind.
Hast du zum Test mal das Statement direkt ausgeführt?
mkinzler - Di 02.05.06 15:42
Laß dir mal den erzeugten Abfragestring anzeigen.
Wobei ich immer über die DS direkt nicht über das Grid gehen würde.
jasocul - Di 02.05.06 15:46
Da Gabi mit Parametern arbeitet, wird da vermutlich nicht viel zu sehen sein. Ich tippe auf fehlerhafte Feldinhalte. Schaden kann es allerdings auch nicht, sich das mal anzusehen. Mit dem Zugriff über das DS hast du aber schon Recht.
gamoes - Di 02.05.06 15:58
Also in meinem Statement hab ich noch ein Semikolon gehabt, wo ein Komma hingehört.
Jetzt bekomme ich zwar keien Fehlermeldung mehr, aber die Inhalte des DBGrid werden nicht in der Datenbank abgespeichert. Nur der Inhalt des Edit-feldes wird gespeichert.
Woran liegt denn das.
Wie müsst ich das denn machen über DS (ist doch sicher DataSource gemeint oder?
Gruß
Gabi
mkinzler - Di 02.05.06 16:08
Nein DataSet (TTable, TQuery) mit der du die daten für das Grid bereitstellst.
gamoes - Di 02.05.06 16:14
Aber ne Query hab ich doch genommen und zwar die OraQuery aus den Odac-Komponenten.
Gruß
Gabi
mkinzler - Di 02.05.06 16:20
Ich würde nicht die daten aus dem grid sondern die Felder des Queries, aus dem Die Daten des Grids stammen benutzen.
Stammen die daten aus der selben DB? Dann ist es u.U. nicht sinnvoll sie nocheinmal zu speichern.
jasocul - Di 02.05.06 16:22
Also, dein DBGrid greift über ein TDataSource auf ein TDataSet zu. Dieses TDataSet, in deinem Fall ein OraQuery, sollte man verwenden. Da gibt es dann so praktische Dinge wie:
Delphi-Quelltext
1:
| Wert := OraQuery1.FieldByName('DeinFeldname').AsInteger; |
Du kannst auch über Fields und den Index auf die einzelnen Felder zugreifen. Es gibt auch AsString, AsDateTime, etc.
gamoes - Di 02.05.06 16:47
mkinzler hat folgendes geschrieben: |
Ich würde nicht die daten aus dem grid sondern die Felder des Queries, aus dem Die Daten des Grids stammen benutzen.
Stammen die daten aus der selben DB? Dann ist es u.U. nicht sinnvoll sie nocheinmal zu speichern. |
Die Daten sollen mit Hilfe des DBGrid erst eingegeben werden und sollen immer fortgeschrieben werden. Also die erste Zeile wird gefüllt vom Anwender, das wird dann gespeichert. Zu einem späteren Zeitpunkt wird dann die nächste Zeile gefüllt und die Daten gespeichert usw.
Wenn man das Fenster öffnet sollen im DBGrid dann immer die Werte angezeigt werden, die schon abgespeichert sind in der Tabelle und unter die letzte Zeile sollen dann die neuen Werte eingetragen werden.
Gruß
Gabi
jasocul - Di 02.05.06 16:55
Das DBGrid visualisiert nur deine Daten. Gespeichert werden die durch dein OraQuery. Du bist mit deinem OraQuery also "näher" an den Daten dran und musst keine Umwege machen.
gamoes - Di 02.05.06 18:05
Sorry, aber ganz versteh ich noch nicht wie ich es anders umsetzen könnte als ich es oben gemacht habe.
Wenn ich schreiben würde:
CRDBGrid1.Columns[0].Field:=qry_Ausbplan.FieldByName('AMT');
erhalte ich die Meldung Feld Amt nicht gefunden.
Gruß
Gabi
gamoes - Di 02.05.06 18:50
Dann hab ich auch folgendes schon probiert:
Delphi-Quelltext
1: 2: 3: 4: 5:
| qry_Ausbplan.Params.ParamByName('AMT').AsString:=CRDBGrid1.Columns[0].TotalValue; qry_Ausbplan.Params.ParamByName('AMT_BEGINN').AsDate:=CRDBGrid1.Columns[1].TotalValue; qry_Ausbplan.Params.ParamByName('AMT_ENDE').AsDate:=CRDBGrid1.Columns[2].TotalValue; qry_Ausbplan.Params.ParamByName('ARBEIT').AsInteger:=CRDBGrid1.Columns[3].TotalValue; ...usw |
aber dann wird in die Spalten 0 und 3 gar nichts geschrieben beim Speichern und in die Spalten 1 und 2 das Datum 30.12.1899 was ich aber nicht eingegeben habe.
Es muss doch eine Möglichkeit geben, wie man die vom Anwender im DBGrid eingetragenen Werte in die Datenbank speichern kann, oder kann man das nur mit Edit-Feldern?
Gabi
Moderiert von
raziel: Delphi-Tags hinzugefügt
mkinzler - Di 02.05.06 19:33
Welche kompoenenten verwendest du? wenn Oracle editable Cursors unterstützt ( was galube ich der Fall ist) dann brauchst du eigentlich nur ein Select-Query, welchen du per DataSource mit dem Grid verbindest, dann mußt du zum Einfügen nur Query.Append/Query.Post ausführen. Wenn Oracle oder doe Kompos das nicht unterstützen, brauchst du ein TUpdateSql, welches dies dann übernimmt.
gamoes - Di 02.05.06 22:30
ich benutze die ODAC-Komponenten.
mkinzler - Di 02.05.06 22:38
Ich hab mir gerade mal die Beschreibung der ODAC-Kompos angesehen. Auf die Schnelle konnte ich nicht erkennen ob eine Select-Abfrage hier "updateable" ist. Es gibt aber mit TSmartQuery ein Gegenstück zu TUpdateSQL. Somit ist dein Lösung ohne Weiteres möglich.
jasocul - Mi 03.05.06 07:44
Ich benutze die ODAC zwar nicht, hatte sie aber mal im Test. afair sind Select-Statements updatable unter den üblichen Voraussetzungen (kein Aggregat, etc.).
mikhal - Mi 03.05.06 08:02
Ich benutze auch die ODAC-Komponenten, verwende aber grundsätzlich nur die TSmartQuery. Wenn du dort einen Doppelklick drauf ausführst, gelangst du in einen hervorragenden Assistenten. Dort kannst du über den Button Builder nicht nur dein Select-Statement generieren, du kannst auch die Statements für Insert, Update, Delete und Refresh auf der Registerseite SQLGenerator erzeugen lassen (wähle dort aber nur die Felder aus, die in deinem Select-Statement existieren, gibt sonst bei der Programmausführung Fehlermeldungen, die einen verzweifeln lassen können).
Wenn du diese Statements angelegt hast, kannst du die SmartQuery wie mit Paradox und BDE gewohnt einsetzen (also Query.Append oder Query.Insert für Insert, Query.edit für Update und Query.Delete zum Löschen eines Datensatzes). Sobald du deine Änderungen im DBGrid vorgenommen hast befindest du dich entweder im Edit- oder Insert-Modus, den du mit Query.Post zum Speichern deiner Änderungen abschließen kannst oder mit Query.Cancel, um deine Änderungen zu verwerfen. Näher an dein DataSet kannst du nicht mehr kommen.
Grüße
Mikhal
gamoes - Mi 03.05.06 17:20
Also der Assistent der TSmartQuery ist genial. Vielen Dank für den Tip.
Aber wenn ich dann hinter den Button Speichern schreibe:
qry_Ausbplan.Insert;
gibt es zwar keine Fehlermeldung, aber es wird auch nichts abgespeichert.
hab dann noch ein
qry_Ausbplan.Post;
angefügt, hat aber überhaupt nichts geholfen.
Die Daten aus dem DBGrid lassen sich einfach nicht abspeichern.
Gruß
Gabi
mikhal - Mi 03.05.06 19:04
Eigentlich solltest du jetzt deine Eingabe im DBGrid tätigen und mit Query.Post selbige speichern.
Und um einen neuen (leeren) Datensatz im Grid anzulegen, verwendest du die Methode Append oder Insert. Dazu solltest du einen eigenen Schalter verwenden. Insert benötigst du nicht, wenn du den neuen Datensatz im Grid bereits angelegt hast (mit dem Cursor unter den letzten Datensatz fahren, dann wird normalerweise automatisch ein neuer Datensatz angelegt).
Halte dir vor Augen, daß das DBGrid immer nur den Datenbestand anzeigt, der bereits in deiner Abfragemenge enthalten ist. Um neue Daten hinzuzufügen mußt du erste einen neuen Datensatz erzeugen, den du dann wieder durch deine Eingabe im DBGrid oder anderen datensensitiven Komponenten mit Daten füllst. Damit diese Daten dann dauerhaft in der Datenbank landen mußt du sie mit der Methode Post speichern, dabei entspricht das Post einem COMMIT auf der Datenbank.
Grüße
Mikhal
gamoes - Mi 03.05.06 21:04
ok, das werde ich mir in Ruhe anschauen.
Hab schon mal probiert, aber die Fehlermeldung erhalten, dass mir ein Feld fehle. Ich muss erst mal beim Öffnen des Fensters einer DBGrid-Spalte den Inhalt eines Edit-Feldes zuordnen, denn sonst fehlt diese Spalte beim Abspeichern. Hab ich ja vorher mit der Zeile:
qry_Ausbplan.Params.ParamByName('AZUBINR').Value:=StrToInt(Ed_AzubiNr.Text);
gemacht. Klappt jetzt natürlich nicht mehr,da mein Edit-Feld nicht mehr angesprochen wird wenn ich mit Post speichere.
Gruß
Gabi
gamoes - Do 04.05.06 11:36
Hallo Mikhal,
erst mal vielen Dank für Deine Hilfe. Jetzt funktioniert es einwandfrei.
Gruß
Gabi
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!