Zugriff auf Tabellenfelder über DataSet
-
Hallo Zusammen,
ich wusste jetzt nicht wie ich den Tread genau nennen sollte. Ich beschreibe einfach mal mein Problem.
In einer Datenbank habe ich eine Tabelle 'Mitarbeiter' mit mehreren Feldern. Diese können über einen Eingabedialog gefüllt werden. Um zu sehen welche Mitarbeiter schon eingegeben sind oder um einen Mitarbeiter auszuwählen um die gemachten Eingaben zu ändern, werden der Vorname und der Nachname in einem DBGrid angezeigt. Soweit funktioniert alles bestens. Nun wollte ich für den Vor- und den Nachnamen nicht in jeweils einer fixen Spalte im DBGrid anzeigen lassen, sondern in einer Spalte als zusammengesetzten Namen. Dazu habe ich die Abfrage wie folgt fomuliert.SELECT *, (Prename + \" \" + Surname) AS Name FROM Employees
Der Name wird nun wie gewünscht angezeigt, allerdings werden Änderungen an schon bestehenden Namen nicht im BDGrid übernommen. Auch beim Neuanlegen eines Mitarbeiters kommt nur eine Leerzeile im DBGrid. Wenn ich den Dialog schließe und neu öffne sind die Daten dann im DBGrid zu sehen. Habe schon mit DBGrid->Refresh(), bzw. DataSet->Refresh versucht, jedoch ohne Erfolg. Auch mit den DataSet-Ereignissen habe ich es versucht, leider auch ohne Erfolg.
Der Code sieht folgendermaßen aus:
DataSet->Active = false; DataSet->CommandType = cmdText; DataSet->CommandText = "SELECT *, (Prename + \" \" + Surname) AS Name FROM Employees"; DataSet->AutoCalcFields = false; DataSet->Active = true; DataSet->Sort = "Prename"; DataSource->Enabled = true; dbgEmployees->Columns->Clear(); dbgEmployees->Columns->Add(); dbgEmployees->Columns->Items[0]->FieldName = "Name"; dbgEmployees->DataSource = DataSource; dbgEmployees->Enabled = true;
Ich habe auch über Berechnete Felder gelesen und das OnCalcFields-Event des Datasets. Allerdings gehen alle Anleitungen davon aus, das die Felder mit dem Editor in der IDE erstellt werden. Nachdem ich das mal an einem Testprojekt versucht und mir den daraus resultierenden Code angesehen habe, habe ich versucht das sozusagen dynamisch, also zur Laufzeit zu machen mit folgendem Code:
// global TStringField *NameField; // im Konstruktor des Dialogs NameField = new TStringField(DataSet); NameField->FieldKind = fkCalculated; NameField->FieldName = "Name"; DataSet->Active = false; DataSet->CommandType = cmdText; DataSet->CommandText = "SELECT * FROM Employees"; DataSet->OnCalcFields = DataSetCalcFields; DataSet->Fields->Add(NameField); DataSet->AutoCalcFields = false; DataSet->Active = true; DataSet->Sort = "Prename"; DataSource->Enabled = true; dbgEmployees->Columns->Clear(); dbgEmployees->Columns->Add(); dbgEmployees->Columns->Items[0]->FieldName = "Name"; dbgEmployees->DataSource = dmDataSource; dbgEmployees->Enabled = true; //im OnCalcFields-Event void __fastcall TfrmTPOemployees::DataSetCalcFields(TDataSet *DataSet) { DataSet->FieldByName("Name")->AssignValue(DataSet->FieldByName("Prename")->AsString + DataSet->FieldByName("Surname")->AsString); }
Allerdings sind dann die eigentlichen Felder der Tabelle nicht mehr verfügbar.
Würde mich über einen Hinweis freuen, was ich da falsch mache, bzw. wo mein Denkfehler ist. Die erstgenannte Lösung würde rechen, wenn das aktualisieren im DBGrid funktioniert.
Besten Dank im Voraus, Grüße Netzschleicher
-
Beim TADODataSet gibt es Requery um eine Aktualisierung auszuführen oder du setzt Active auf false und dann wieder true.
-
Supi, Danke, das wars. Ich habs mit DataSet->Refresh , DataSet->Update versucht, aber auf DataSet->Requery bin ich nicht gekommen.
Vielen Dank, jetzt läufts so wie ich es wollte.