Autor |
Beitrag |
gamoes
      
Beiträge: 86
|
Verfasst: Di 02.05.06 14:53
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).
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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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.
_________________ Markus Kinzler.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 86
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Di 02.05.06 16:08
Nein DataSet (TTable, TQuery) mit der du die daten für das Grid bereitstellst.
_________________ Markus Kinzler.
|
|
gamoes 
      
Beiträge: 86
|
Verfasst: Di 02.05.06 16:14
Aber ne Query hab ich doch genommen und zwar die OraQuery aus den Odac-Komponenten.
Gruß
Gabi
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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.
_________________ Markus Kinzler.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 86
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 86
|
Verfasst: 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 
      
Beiträge: 86
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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.
_________________ Markus Kinzler.
|
|
gamoes 
      
Beiträge: 86
|
Verfasst: Di 02.05.06 22:30
ich benutze die ODAC-Komponenten.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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.
_________________ Markus Kinzler.
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
      
Beiträge: 109
Windows 10 Professional 64-Bit
VS 215 CE, Delphi 10.1 Berlin Professional
|
Verfasst: 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
_________________ Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
|
|
gamoes 
      
Beiträge: 86
|
Verfasst: 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
      
Beiträge: 109
Windows 10 Professional 64-Bit
VS 215 CE, Delphi 10.1 Berlin Professional
|
Verfasst: 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
_________________ Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
|
|