Datensatz kann nicht in DBGrid mittels DBNavigator aus einer Menge von zwei Tabellen gespeichert werden
-
Wenn ich auf die OraQuery-Komponente einen Doppelklick durchführe gibt es da einen Reiter
UpdateSQL
.Kann der mir weiterhelfen?
Sprich ist es möglich in dem Fenster selber Update-Sql-Anweisung durchzuführen?
Ich habe auch den Event
OraQuery->Post()
gefunden.
Kann ich hiermit was anfangen, das mir hilft meine zusammengesetztes DBGrid
zu maipulieren?
-
Wenn ich das richtig verstanden habe, löst
Post
dasOnUpdateData
Event aus. Ich habe keine Ahnung, welche Eigenschaften dieOraDataSource
hat und was dir da weiterhelfen könnte. Ich habe nur Vermutungen angestellt und gehofft, dass der db-Handling-Mechanismus irgendwas in der Form hergibt.
-
Also langsam bin ich echt am verzweifen !!!
Meine (Anfänger)Kenntnisse haben ihr Limit erreicht.
Hat vielleicht irgendjemand noch eine Idee?
Ich habe mir mit meine spärlichen Wissen folgende Lösungsmöglichkeit überlegt...
Ich lege eine temporäre Tabelle an. Diese soll exakt die gleichen Daten wie das DBGrid enthalten bzw den Join darstellen.
- Worauf ich nicht komme ist jetzt, wie bekomme ich diese temp-Tabelle realisiert (mit den jeweiligen Daten des Join)?
- Wenn ich die Tabelle erstellt habe wie schaffe ich es das die beiden anderen Tabelle den neuen Datensatz bzw. der veränderten Datensatz speichern?
- Und wie schaffe ich es, dass das Grid sich ständig aktualieseiert?
Ich weiß Fragen über Fragen, die ich hier stelle. Und vielleicht ist auch dieser Ansatz flasch!
Doch leider bin ich mit dem C++ Builder nicht so vertraut, dass mir ein anderer Lösnungsweg einfällt.Für euren Rat wäre ich sehr dankbar.
-
Hallo,
dir sollte die Klasse TUpdateSQL dabei helfen, s. Datenmenge mit TUpdateSQL aktualisieren - damit kannst du individuelle SQL-Anweisungen ausführen.
Bei deinen jetzigen beiden Test-Tabellen wäre jedoch ein JOIN überflüssig, da du doch alle Informatione direkt aus der Tabelle MELDUNGEN holen könntest (aber ich nehme an, daß deine echten Tabellen einen JOIN benötigen würden ;-).
-
Danke für den Tip!
doch leider bekomme ich beim ModifySQL immer die Fehlermeldung
"Die Feldnamen für MELDUNGEN konnten nicht erkannt werden"Was mach ich falsch?
So wie ich jetzt die Komponente UPDATESQL verstanden habe, gebe ich folgendes im
Modify an.UPDATE MELDUNGEN (<- dies bezieht sich doch auf die zu aktualiesierende Tabelle)
SET FehlerMeldung = :FehlerMeldung (<- die Spalte die den neuen Wert bekommt)
WHERE IFEHLERNR = :OLD_IFEHLERNR (<- Schlüsselfeld zur Identifizeirung des Feldes)Leider bekomme ich immer die obige Fehlermeldung!
-
Sollte es nicht "FEHLERNR" (statt "IFEHLERNR") als Spaltenname sein?
-
Da hast du vollkommen Recht.
Habe mich leider verschrieben.
Nichtsdestotrozt ist der Fehler da.
-
Es handelts sich bei meinen DB-Komponenten um eine OraSession, mit der ich die Konnektivität zur DB aufgebaut habe.
Diese steht auch.Dazu habe ich ein OraQuery die das SQL-Statment mit dem JOIN beinhaltet und ein
DataSource, das als Bindegleid zum DBGrid fungiert.Jetzt habe ich versucht, die UpdateSQL-Komponente zu nutzen.
Doch leider erhalte ich die genannte Fehlermeldung.Zudem kann ich im Feld UpdateOject der OraQuery-Komponente die UpdateSQL-Komponente nicht auswählen.
Und wenn ich CachedUpdet beim Query auf true setzte sind alle Daten aus dem Grid verschwunden.
Habt ihr vllt eine Idee woran das leigen könnte?
Können die besagten Komponenten nicht miteinader kommunizieren?
-
Kann mir keiner der komponenten Fachleute helfen?
Bin für jeden Hilfe und Hinweis dankbar!!!
-
Für Oracle gibt es wohl die spezielle TOraUpdateSQL-Komponente.
Und dann noch Updating Data with ODAC Dataset Components...
-
Danke vielmals !!!
Das war der Hinweis den ich gebraucht habe.
Habe anscheinend den Wald vor lauter Bäumen nicht gesehen.Ich hätte da nur eine kleine Frage noch also
OraUpdateSQL->->ExecSQL(ukModify); funktioniert jetzt perfekt.Wenn ich aber einen els Teil anbette z.B
if ( Button == nbPost ) { OraUpdateSQL1->ExecSQL(ukModify); } else if (Button == nbDelete) { OraUpdateSQL1->ExecSQL(ukModify);
Meldet mir der Compiler...
[BCC32 Fehler] Unit3.cpp(34): E2015 Mehrdeutigkeit zwischen 'ukDelete' und 'Db::ukDelete'
[BCC32 Warnung] Unit3.cpp(34): W8006 TUpdateKind wird mit TUpdateRecKind initialisiert
Habe nachgeschaut. Sehe keine Mehrdeutigkeit bspw. in der Header.cpp
Habe aber leider auch keine Ahnung wo sonst eine Mehrdeutigkeit zuz suchen wäre.
-
Josip Broz schrieb:
Meldet mir der Compiler...
[BCC32 Fehler] Unit3.cpp(34): E2015 Mehrdeutigkeit zwischen 'ukDelete' und 'Db::ukDelete'
[BCC32 Warnung] Unit3.cpp(34): W8006 TUpdateKind wird mit TUpdateRecKind initialisiert
Habe nachgeschaut. Sehe keine Mehrdeutigkeit bspw. in der Header.cpp...
Das liegt an der absoluten C++ Builder-Abart das bei den Komponenten zwar Namensräume vorgesehen sind, diese aber global in den entsprechenden Headern mittels using namespace ausgeleert werden. Du musst dort den richtigen Namensraum vorstellen, welches das ist sollte indirekt über die Hilfe ermittelbar sein (Wenn man den Header ausfindig macht)...
Zum TUpdateKind-Fehler kann ich dir aber nichts sagen.
-
Die Mehrdeutigkeit resultiert auch wieder aus einem Namespace-Problem.
TUpdateRecKind ist der Name des Enums (mit ukModify etc.) der OracleDB Komponente und TUpdateKind heißt das Enum bei der IDB Komponente von Embarcadero (auch hier gibts ein ukModify). Du musst halt den richtigen Namespace verwenden. Zur Not schau einfach mal in die dazugehörige Headerdatei wo die Definitionen drin sind.