Autor Beitrag
gamoes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86



BeitragVerfasst: 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).
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 02.05.06 16:08 
Nein DataSet (TTable, TQuery) mit der du die daten für das Grid bereitstellst.

_________________
Markus Kinzler.
gamoes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86



BeitragVerfasst: Di 02.05.06 16:14 
Aber ne Query hab ich doch genommen und zwar die OraQuery aus den Odac-Komponenten.

Gruß
Gabi
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86



BeitragVerfasst: Di 02.05.06 16:47 
user profile iconmkinzler 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86



BeitragVerfasst: Di 02.05.06 18:50 
Dann hab ich auch folgendes schon probiert:
ausblenden 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 user profile iconraziel: Delphi-Tags hinzugefügt
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86



BeitragVerfasst: Di 02.05.06 22:30 
ich benutze die ODAC-Komponenten.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 109

Windows 10 Professional 64-Bit
VS 215 CE, Delphi 10.1 Berlin Professional
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 109

Windows 10 Professional 64-Bit
VS 215 CE, Delphi 10.1 Berlin Professional
BeitragVerfasst: 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!