Eine Zelle im DBGrid ändern



  • Hallo, ich habe ein DBGrid, welches über eine DataSource mit einer Accesstabelle verbunden ist. Da ich aber noch Informationen aus einer zweiten Tabelle ins Grid hinzufügen muss, wollte ich diese in einigen Zellen manuell ändern. Leider bekomme ich jedesmal die Fehlermeldung

    ... EDatabaseError mit Meldung 'qry_auftrag_search_2: Datenmenge weder im Editier- noch im Einfügemodus'. (5396)

    Da ich aber nicht die Tabelle an sich ändern möchte, sondern nur das Grid, wollte ich euch fragen, ob ihr vielleicht nen Tipp habt.

    Mein Code:

    AuftraegeGrid->DataSource = src_auftrag_search_2 ;
    // Die Aufträge aus der Tabelle selektieren und in Grid einfügen
    	qry_auftrag_search_2->Close() ;
    	qry_auftrag_search_2->SQL->Clear() ;
    	qry_auftrag_search_2->SQL->Add("SELECT * FROM tbl_auftraege WHERE at_snr LIKE :snr ;") ;
    	qry_auftrag_search_2->Parameters->ParamByName("snr")->Value = SuchString ;
    // Das Einfügen ins Grid geschieht mit Open(), da Grid mit DataSource verbunden ist
    	qry_auftrag_search_2->Open() ;
    
    // Relevante Daten aus 2. Tabelle selektieren
    	qry_auftrag_search_schadennr->Close() ;
    	qry_auftrag_search_schadennr->SQL->Clear() ;
    	qry_auftrag_search_schadennr->SQL->Add("SELECT * FROM tbl_auftraege_beteiligte_parteien WHERE at_bet_part_id = :at_id AND at_bet_part_typ = 5 ;") ;
    	qry_auftrag_search_schadennr->Open() ;
    	qry_auftrag_search_schadennr->Close() ;
    // und das bestimmte Feld ins Grid kopieren
    	qry_auftrag_search_schadennr->Open() ;
    	qry_auftrag_search_schadennr->First() ;
    // hier geschieht der Fehler ... ?
    	AuftraegeGrid->Fields[2]->Value = qry_auftrag_search_schadennr->FieldByName("at_bet_part_name")->AsString ;
    


  • du hast wahrscheinlich 2 Möglichkeiten:

    1. pack alles in ein Query, was natürlich nur geht wenn eine Verbindung (z.B. über eine ID) zwischen den beiden Tabellen besteht. Das geht dann per (left/right outer) join im SQL-Kommando
    2. verwende das Ereignis OnDrawColumnCell vom Grid und verwende dort das 2. Query zum Finden und Eintragen der Daten



  • Ich glaube, das zusammenpacken der 2 Tabellen ist eher nicht so clever. Das hatte ich schonmal versucht, aber irgendwie sind dann viel mehr Zeilen rausgekommen, als ich wollte.



  • MichelM schrieb:

    Ich glaube, das zusammenpacken der 2 Tabellen ist eher nicht so clever. Das hatte ich schonmal versucht, aber irgendwie sind dann viel mehr Zeilen rausgekommen, als ich wollte.

    eigentlich ist es schon die bessere Lösung, allerdings muß man dazu natürlich das SQL-Kommando entsprechend zusammenstellen. Was hast du den versucht und welches Ergebnis ergab das? Welches Ergebnis wolltest du haben?

    MichelM schrieb:

    der Zugriff auf die einzelnen Felder ist nicht so einfach, da ja das verbundene Query auch noch da ist und du versuchst die Datenmenge zu ändern, was dann zum Fehler führt

    außerdem ist doch die Frage: willst du ein Feld (Zelle), eine Spalte oder eine Reihe ändern?

    hier mal ein Beispiel für OnDrawColumnCell, dabei muß DefaultDrawing des DBGrid auf false stehen:

    if ( (DataCol == 2) && (!State.Contains(gdFixed)) )
      {
      qry_auftrag_search_schadennr->Close();
      qry_auftrag_search_schadennr->SQL->Clear();
      qry_auftrag_search_schadennr->SQL->Add("SELECT * FROM tbl_auftraege_beteiligte_parteien WHERE at_bet_part_id = :at_id AND at_bet_part_typ = 5 ");
      qry_auftrag_search_schadennr->Parameters->ParamByName("at_id")->Value = ???;
      qry_auftrag_search_schadennr->Open();
      DBGrid1->Canvas->TextOut(Rect.Left + 2, Rect.top + 2,qry_auftrag_search_schadennr->FieldByName("at_bet_part_name")->AsString);
      }
    else
      DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);
    


  • Ja also ich habe zwei Tabellen. Eine Tabelle hat eine ID (at_id), und eine Erkennungsnummer, bestehend aus Buchstaben und Zahlen, (at_snr), nach der auch gesucht wird. In der zweiten Tabelle gibt es auch die Auftrags-Id (at_id), aber immer mehrmals. Somit muss hier nach einem Typ (at_bet_part_typ) gesucht werden. Es sollen dann aus dieser zweiten Tabelle Ein Ort, Name aus einer, durch Auftrags-ID und Typ eindeutig, bestimmten Zeile herausgesucht werden.

    Im DBGrid sollen dann Auftrags-ID, Erkennungsnummer, Name und Ort zu allen gesuchten Erkennungsnummern gefunden werden.

    (Ein Problem gibts noch, Es kann sein, dass es zu einer Erkennungsnummer zwei Zeilen gibt; und zwar, wenn einmal der Typ = 5 und einmal der Typ = 6 ist. (aber nur in 2. Tabelle)



  • das sollte eigentlich auch als ein SQL-Kommando gehn
    liste mal die Spalten von Tabelle 1 und 2 auf die du haben willst, die nach denen du suchst bzw. die bestimmte Kriterien erfüllen sollen (z.B. at_bet_part_typ = 5) und die die voneinander abhängig sind



  • Also

    Tabelle 1, Spalten:

    at_id, at_snr, at_termin, at_..., ...

    Tabelle 2, Spalten:

    at_bet_part_id, at_bet_part_at_id, at_bet_part_typ, at_bet_part_name, at_bet_part_ort, at_bet_part_..., ...

    Weitere Spalten (bezeichnet mit ...) können gerne weggelassen werden, die sollen nicht im DBGrid angezeigt werden (ich weiß, dass man die Felder auch über Visible-Eigenschaft ausschalten)

    Die am Ende zu bekommende Tabelle soll dann folgendermaßen aussehen (Spalten):

    at_id, at_snr, at_bet_part_name, at_bet_part_name, at_bet_part_ort

    at_bet_part_name ist doppelt, da er einmal aus der 2. Tabelle kommt aus der Zeile, wo at_bet_part_typ = 5, und das zweite mal aus der Zeile at_bet_part_typ = 6

    sozusagen aus zwei Zeilen mach eine ^^

    nach der at_snr wird gesucht in der 1. Tabelle. Diese 1. und 2. Tabelle kann man über die at_id finden. In der 2. Tabelle ist at_id logischweise mehrmals vergeben, um so nach at_bet_part_typ zu unterscheiden. In der 1. Tabelle ist at_id eindeutig!



  • MichelM schrieb:

    at_bet_part_name ist doppelt, da er einmal aus der 2. Tabelle kommt aus der Zeile, wo at_bet_part_typ = 5, und das zweite mal aus der Zeile at_bet_part_typ = 6

    sozusagen aus zwei Zeilen mach eine ^^

    das müßte doch dann auch für den Ort gelten oder nicht?

    hier mal ein Lösungsvorschlag (mit beiden Orten):

    select tabelle1.at_id, tabelle1.at_snr, tabelle2.name1, tabelle3.name2, tabelle2.ort1, tabelle3.ort2 from tbl_auftraege tabelle1 
    full outer join
    (select at_bet_part_at_id, at_bet_part_name as name1, at_bet_part_ort as ort1
    from tbl_auftraege_beteiligte_parteien where at_bet_part_typ = 5) as tabelle2 
    on (tabelle1.at_id = tabelle2.at_bet_part_at_id)
    full outer join
    (select at_bet_part_at_id, at_bet_part_name as name2, at_bet_part_ort as ort2
    from tbl_auftraege_beteiligte_parteien where at_bet_part_typ = 6) as tabelle3 
    on (tabelle1.at_id=tabelle3.at_bet_part_at_id)
    

    hierbei ist zu beachten: wenn Name und/oder Ort für den einen Typ nicht vorhanden sind werden die Felder dann auch leer zurückgeliefert

    wenn du nur die haben willst wo für beide Typen die Namen da sind, mußt du beides mal das "full outer" wegnehmen



  • irgendwie bekomme ich hier jetzt einen 'Unbekannten Fehler' 😕
    (Exceptionklasse EOleExcception)



  • wo genau im Quellcode taucht der Fehler auf? verwende den Debugger um die Stelle zu finden

    was ich noch vergessen hatte: die Suche nach at_snr

    select tabelle1.at_id, tabelle1.at_snr, tabelle2.name1, tabelle3.name2, tabelle2.ort1, tabelle3.ort2 from tbl_auftraege tabelle1 
    full outer join
    (select at_bet_part_at_id, at_bet_part_name as name1, at_bet_part_ort as ort1
    from tbl_auftraege_beteiligte_parteien where at_bet_part_typ = 5) as tabelle2 
    on (tabelle1.at_id = tabelle2.at_bet_part_at_id)
    full outer join
    (select at_bet_part_at_id, at_bet_part_name as name2, at_bet_part_ort as ort2
    from tbl_auftraege_beteiligte_parteien where at_bet_part_typ = 6) as tabelle3 
    on (tabelle1.at_id=tabelle3.at_bet_part_at_id)
    [b]where tabelle1.at_snr = :snr[/b]
    


  • ah danke, stimmt, das hatte noch gefehlt. ich glaube, der fehler könnte daran liegen, dass die spalten des grids ja ganz andere sind, als jetzt in der neu angelegten tabelle sind. ich werd das mal testen.



  • also ich habe die Spalten des DBGrids über den Feldeditor erstellt:

    at_id, at_snr, name1, name2, ort1, ort2

    leider bekomme ich noch ne Fehlermeldung mit inkonsistenen Parametern ...



  • Ich bekomme leider immernoch diesen Fehler:

    Erste Gelegenheit für Exception bei $7627F328. Exception-Klasse EOleException mit Meldung 'Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben'. Prozess Projekt.exe (7468)

    Ich weiß nicht, was ich falsch mache ...



  • du hast irgendwo vergessen einen Parameter zu setzen der im SQL-Kommando steht, also zeig einfach mal nochmal den aktuellen Quellcode wo der Fehler auftritt, denn da muß es ja irgendwo sein



  • {
    	AuftraegeGrid->DataSource = src_auftrag_search_schadennr ;
    
    	qry_auftrag_search_schadennr->Close() ;
    	qry_auftrag_search_schadennr->SQL->Clear() ;
    	qry_auftrag_search_schadennr->SQL->Add("select tabelle1.at_id, tabelle1.at_snr, tabelle2.name1, tabelle3.name2, tabelle2.ort1, tabelle3.ort2 from tbl_auftraege tabelle1 ") ;
    	qry_auftrag_search_schadennr->SQL->Add("full outer join ") ;
    	qry_auftrag_search_schadennr->SQL->Add("(select at_bet_part_at_id, at_bet_part_name as name1, at_bet_part_ort as ort1 ") ;
    	qry_auftrag_search_schadennr->SQL->Add("from tbl_auftraege_beteiligte_parteien where at_bet_part_typ = 5) as tabelle2 ") ;
    	qry_auftrag_search_schadennr->SQL->Add("on (tabelle1.at_id = tabelle2.at_bet_part_at_id) ") ;
    	qry_auftrag_search_schadennr->SQL->Add("full outer join ") ;
    	qry_auftrag_search_schadennr->SQL->Add("(select at_bet_part_at_id, at_bet_part_name as name2, at_bet_part_ort as ort2 ") ;
    	qry_auftrag_search_schadennr->SQL->Add("from tbl_auftraege_beteiligte_parteien where at_bet_part_typ = 6) as tabelle3 ") ;
    	qry_auftrag_search_schadennr->SQL->Add("on (tabelle1.at_id = tabelle3.at_bet_part_at_id) ") ;
    	qry_auftrag_search_schadennr->SQL->Add("where tabelle1.at_snr = :snr ;") ;
    	qry_auftrag_search_schadennr->Open() ;
    }
    

    Im Feldeditor habe ich folgende Felder erstellt:

    at_id
    at_snr
    name1
    name2
    ort1
    ort2



  • und wo bitte definierts du deinen Parameter snr? 😮



  • ja da hast du wohl recht, das ist dämlich, dass ich den vergessen habe ...

    hab das jetzt eingefügt,

    qry_auftrag_search_schadennr->Parameters->ParamByName("snr")->Value = SuchString ;
    

    bekomme aber jetzt wieder nen "unbekannten Fehler" 😕

    Ich seh da nicht durch ... Kann es sein, dass Access mit dem SQL-Befehl nicht klar kommt? Also mit dem 'full outer join' ?

    Erste Gelegenheit für Exception bei $76F7F328. Exception-Klasse EOleException mit Meldung 'Unbekannter Fehler'. Prozess Projekt.exe (2600)



  • ich wußte schon immer daß Access keine richtige Datenbank kann 👎
    hab leider auch kein Access zum Testen

    dann mußt du wohl doch die Variante mit dem OnDrawColumnCell nehmen



  • Ich habe mal im Internet ein wenig nachgeforscht und herausgefunden, dass Jet-SQL kein FULL OUTER JOIN kennt.
    Gibt es da noch einen anderen weg, den SQL Befehl irgendwie umzuschreiben? Oder eine andere Einstellung in der ADOConnection vorzunehmen?

    Mal zur Info: Also erstmal soll es ja nur auf dem einen PC laufen, aber später soll die Datenbank auf einen MySQL-Server gepackt werden.
    Kennt denn MySQL FULL OUTER JOIN? Wenn nicht, brauche ich es ja jetzt auch nicht anwenden, da ich sonst später alles wieder umschreiben muss ...



  • Ja, der MS-SQL Server beherrscht FULL OUTER JOINS, zumindest laut Dokumentation.

    Aber warum verwendest Du Access und nicht den kostenlosen MS-SQL Server Express? Der ist doch genau dafür da.


Log in to reply