In Query neues Feld anlegen und Wert zuweisen
-
Sicherlich weiss jemand eine Lösung f+r folgendes Problem:
Ich habe eine Werkzeug-Datenbank (Access) auf die ich mit ADO Komponenten zugreife.
In der Datenbank-Tabelle (Holders) hat jeder Datensatz ein Feld DMIN und DMAX (bedeutet: minimaler und maximaler Durchmesser).
Ich möchte aber in meinem (Ausgabe)DBGrid-Feld "Durchmesserbereich" die Spannweite angeben, d.h. sowas in der Art: "<DMIN-Wert> bis <DMAX-Wert> mm".Leider klappt schon das Anlegen des neuen Feldes in die Query-DataSet nicht
Quelltext siehe unten (und wo .... weiss ich nicht weiter)// Datenbank:: Verbindung zur Datenbank WideString ConnectString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="; ConnectString += ExtractFilePath(Application->ExeName); ConnectString += "\\data\\access.mdb;Persist Security Info=False"; TADOConnection *DB = new TADOConnection(this); DB->ConnectionString = ConnectString; DB->ConnectOptions = coConnectUnspecified; DB->CursorLocation = clUseClient; DB->IsolationLevel = ilCursorStability; DB->Mode = cmRead; DB->LoginPrompt = false; DB->Connected = true; // Daten:: Tabelle "Holders" TADOTable *Holder = new TADOTable(this); Holder->Connection = DB; Holder->TableName = "Holders"; Holder->Active = true; // Datenquelle:: DataSource dsrHolder fuer DBGrid dbgHolder TDataSource * dsrHolder = new TDataSource(this); dsrHolder->DataSet = Holder; dsrHolder->Name = "dsrHolder"; // Initalisierung ENDE // Beispiel-Query TADOQuery * Query = new TADOQuery(this); Query->Connection = DB; Query->DataSource = dsrHolder; Query->SQL->Clear(); Query->SQL->Add("SELECT * FROM Holders WHERE ID = 1"); Query->Open(); Query->ExecSQL(); // Query-DataSet zur Ausgabe im DBGrid TDataSource * dsrQuery = new TDataSource(this); dsrQuery->DataSet = Query; // Feld in Query einfügen TFieldDef * pFieldDef = dsrQuery->DataSet->FieldDefs->AddFieldDef(); pFieldDef->Name = "DIA"; pFieldDef->DataType = ftString; pFieldDef->Size = 16; dsrQuery->DataSet->FieldByName("DIA")->FieldName; // <------- Compiler Fehler: Feld nicht da -- warum? // Wert eintragen -- wie ? // ....FieldByName("DIA")->Value = ....FieldByName("DMIN")->AsString + " bis " + ....FieldByName("MAX") + "mm"; // anzeigen im DBGrid dbgHolder dbgHolder->DataSource = dsrQuery;
-
Du könntest auch das neue Feld gleich bei der Select Anweisung erstellen lassen.
SELECT *, str(DMIN)+' bis '+str(DMAX)+' mm' as Durchmesserbereich FROM Holders WHERE ID = 1
mfg
VergissEs
-
So gehts natürlich... Danke. Aber wenn ich das so mache, merkert er plötzlich
und das Feld "DIA" scheint doch zu exisitieren:... Query->SQL->Add("SELECT *,str(DMIN)+ 'bis' + str(DMAX) AS DIA FROM Holders WHERE ID = 1"); Query->Open(); Query->ExecSQL(); // Query-DataSet zur Ausgabe im DBGrid TDataSource * dsrQuery = new TDataSource(this); dsrQuery->DataSet = Query; // Feld in Query einfügen TFieldDef * pFieldDef = dsrQuery->DataSet->FieldDefs->AddFieldDef(); pFieldDef->Name = "DIA"; // <--- Compiler: Komponente mit der Bez. exist. bereits --- jetzt ALSO doch?!? Scheissendreck!!
Und was mache ich es, wenn ich Feld "TYP" mit Zahlen 0-3 habe und im DBGrid
0 durch 'rot', 1 durch 'blau', 2 durch 'gelb', 3 durch 'schwarz' ersetzen will?Warum ist eigentlich beim BCB6 Prof. keinerlei Handbuch dabei (bis auf die schäbige Einführungsbroschüre)?
Sogar bei meinem VC++ war ein Buch dabei ...
-
hallo,
TADOQuery * Query = new TADOQuery(this); Query->Connection = DB; Query->DataSource = dsrHolder; Query->SQL->Clear(); Query->SQL->Add("SELECT *,str(DMIN)+ 'bis' + str(DMAX) AS DIA FROM Holders WHERE ID = 1"); Query->Open(); //Query->ExecSQL(); das brauchste nicht wird nur bei INSERT UPDATE .. verwendet // siehe Hilfe // Query-DataSet zur Ausgabe im DBGrid TDataSource * dsrQuery = new TDataSource(this); dsrQuery->DataSet = Query;
und dein Code zum einfügen des Feldes brauchst du nicht,
da es schon in der SELECT Anweisung erzeugt wurde,
deshalb meckert er ja das das Feld existiert.mfg
VergissEs
-
achja zu deiner
Und was mache ich es, wenn ich Feld "TYP" mit Zahlen 0-3 habe und im DBGrid
0 durch 'rot', 1 durch 'blau', 2 durch 'gelb', 3 durch 'schwarz' ersetzen will?Lösung 1:
du erstellt eine zweite Tabelle mit deinen FarbwertenTablle Farbe
idfarbe Farbe
0 rot
1 blau
2 gelb
3 schwarzund bindest diese Tabelle in deine Select Anweisung ein z.B.
SELECT Holders.*, str(Holders.DMIN)+ 'bis' + str(Holders.DMAX) AS DIA,
Farbe.Farbe
FROM Farbe RIGHT JOIN Holders ON Farbe.ID1 = Farbe.idfarbe;
WHERE ID = 1Diese Lösung ist halt schön da du später Farben hinzufügen kannst ohne den
Programmcode ändern zu müssenLösung 2:
Du kümmerst dich selbst darum was in der Spalte des DBGrids im Feld TYP gezeichnet wird z.B.void __fastcall TForm1::DBGrid1DrawColumnCell( TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State) { if (Column->FieldName == "TYP") { //vorhandenes übermalen DBGrid_Adressenliste->Canvas->FillRect(Rect); if (Query->FieldByName("TYP")->AsInteger == 0) { DBGrid1->Canvas->TextOut(Rect.Right+2, Rect.Top+2,"rot"); } } }
mfg
VergissEs
-
Super, genau das wollte ich wissen. Vielen Dank!