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 Farbwerten

    Tablle Farbe
    idfarbe Farbe
    0 rot
    1 blau
    2 gelb
    3 schwarz

    und 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 = 1

    Diese Lösung ist halt schön da du später Farben hinzufügen kannst ohne den
    Programmcode ändern zu müssen

    Lö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!


Anmelden zum Antworten