![]() |
IB Komponenten (IBUpdateSql)
Hi,
folgende Fragen, die für mich nicht eindeutig aus der Doku hervorgehen. Situation: Ich habe ein IBDataSet mit einer JOIN Klausel. Diese Datenmenge ist per Def. nicht aktualisierbar. Wenn ich diese aktualisierbar machen möchte, brauche ich ein IBUpdateSQL Objekt, dass mir die Updates auf die verschiedenen Tabellen aufteilt. Da es eine variable Anzahl von Tabellen sein können, helfen mir die SQL Strings im IBUpdateSQL Objekt nicht wirklich weiter, sondern ich muß diese in dem UpdateRecord Event des IBDataSet Objektes erzeugen und ausführen. Unklarheiten: Ist es richtig, dass das IBUpdateSQL Objekt im wesentlichen per Apply die Paramterzuordnung erledigt und ich ansonsten auch mit normalen IBSQL Objekten arbeiten könnte, wenn ich selbst gewährleiste, dass die Parameter richtig gesetzt werden? Erst wenn ich der ModifySQL Eigenschaft des IBUpdateSQL Objektes einen Eintrag (leerzeile) hinzufüge akzeptiert das IBDataSet Objekt ein Edit. Aber, da ich die Modify Anweisung ja im OnUpdateRecord Event erst erzeugen werde (per Schleife über alle "gejointen" Tabellen) müßte IBDataSet aufgrund der Zuweisung einer Methode zum OnUpdateRecord Event ja schon ein editieren des IBDataSets ermöglichen. Ist dies ein Bug oder denke ich falsch? Fragen: Werden die SQL Strings (ausser SelectSQL) im IBDataSet ignoriert, sobald ich ein IBUpdateSQL Objekt zuweise? Wie ist die Reihenfolge der Aufrufe? Wann wird das OnUpdateRecord Event aufgerufen? Werden die SQL Strings ausgeführt auch wenn ein OnupdateRecord Event ausgelöst wird, oder wird das über den Var-Parameter UpdateAction der OnUpdateRecord Methode bestimmt. Für Anworten (auch zu Teilbereichen) wäre ich dankbar. Gruß Holger |
Re: IB Komponenten (IBUpdateSql)
Beschäftigt sich sonst keiner damit?
|
Re: IB Komponenten (IBUpdateSql)
Zitat:
|
Re: IB Komponenten (IBUpdateSql)
Zitat:
Also, wie der Name schon sagt, benutze ich die Interbase Komponenten. In der SelectSQL Eigenschaft des IBDataset Objektes steht in etwa folgende Anweisung: SELECT t1.id,t1.name,t1.plz,t2.id,t2.ort FROM adresse t1 LEFT OUTER JOIN ort t2 on t1.plz = t2.id Dieses liefert mir eine nicht aktualisierbare Datenmenge. Um diese Datenmenge aktualisierbar zu machen, gibt es (und aus anderen Gründen) ein IBUpdateSQL Objekt, dass über die UpdateObject Eigenschaft von IBDataSet verbunden ist. Dieses Objekt kann nun bei einem Edit die Änderungen in eigene SQL Statements kapseln, so dass ein Edit oder Insert auf IBDataSet erlaubt ist. Hierzu kann zum Beispiel zur Laufzeit die ModifySQL EIgenschaft des IBUpdateSQL Objektes innerhalb des OnUpdateRecordEvents des IBDataSet Objektes angepasst werden. z.B:
Delphi-Quellcode:
Dies bewirkt, das beide beim join beteiligten Tabellen upgedatet
if UpdateKind = ukModify then begin
with IBUpdateSQL1.ModifySQl do begin clear; add(' UPDATE adresse'); add(' SET NAME = :NAME'); add(' WHERE ID = :ID'); end; Apply(updateKind) with IBUpdateSQL1.ModifySQl do begin clear; add(' UPDATE ort'); add(' SET ORT = :ORT'); add(' WHERE ID = :ID1'); end; Apply(updateKind) end; werden können. Ich hoffe, es ist jetzt etwas klarer geworden. Also bitte, gebt mir ein paar Infos. Oder wie realisiert Ihr die dargestellte Problematik? Gruß |
Re: IB Komponenten (IBUpdateSql)
Zitat:
|
Re: IB Komponenten (IBUpdateSql)
du solltest die ApplyUpdates methode der TIBDataBase aufrufen, damit werden zwischengespeicherte Änderungen in die Datenbank übernommen.
raik |
Re: IB Komponenten (IBUpdateSql)
@Hansa
Habe D7 Enterprise. Ich benutze die Interbase Express 6 Komponenten. Das IBUpdateSQL Objekt steht direkt bei den Interbase Komponenten. (Ist aber bei D7 neu geordnet worden - bei D5 war es auf jedenfall woanders, falls es überhaupt schon existierte. @kiar Muß ich die ApplyUpdates Methode von TIBDatabase aufrufen? Ich rufe commitretaining des IBDataSets auf, damit ich den Transaktionskontext nicht verliere. Dadurch werden m.E. auch die Daten zurückgeschrieben. Status: Ich hab es weitestgehend zum laufen bekommen, aber ein paar Sachen sind mit noch unklar (obwohl sie funktionieren - soetwas hasse ich). 1. Wie kann ich vermeiden, dass ich im ModifySQL der IBUpdateKomponente eine Leerzeile einfügen muss, damit IBDataset in dsEditmodes geht? Ich erzeuge ModifySQL dynamisch erst innerhalb des OnUpdateRecord Events der IBDataSet Komponente. 2.Sind die SQL-Strings innerhalb der IBDataSet Komponente überflüssig, wenn ich ein IBUpdateSQL Objekt benutze? Bei Modify,Delete und Insert wäre es mir ja klar - aber warum existiert ein RefreshSQL innerhalb des IBUpdateSQL Objektes? 3. Wenn ich per IBUpdateSQL eine IBDataSet einfüge und dies innerhalb des OnUpdateRecord Events erzeuge, brauche ich dann ja kein OnNewRecord Event, da ich per UpdateKind = ukInsert innerhalb des OnUpdateRecord Events ja schon das Hinzufügen erledige. Oder? 4. Wenn ich per IBDataSet1.Post die Änderungen eintrage, ist es dann richtig, das dann als erstes ein OnUpdateRecord Event erzeugt wird und dann abhängig vom Wert des Parameters UpdateAction auch noch die ModifySQL Anweisung des IBUpdateSQL Objektes ausgeführt wird? Oder wird diese immer ignoriert, wenn eine Methode dem OnUpdateRecord Event zugeordnet ist? Mich würde auch interessieren, wie Ihr prinzipiell das Problem löst, wenn Ihr Änderungen auf nicht aktualisierbare Datenmengen ausführen wollt. Gruß und Danke für die Antworten. |
Re: IB Komponenten (IBUpdateSql)
Hallo Honie,
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: IB Komponenten (IBUpdateSql)
Hallo Honie,
hier noch ein Nachtrag: Wenn du mit IBUpdateSQL ist nur dazu gedacht, die Umstellung von BDE nach IBX zu erleichtern. Ansonsten solltest du bei der IBDataSet Komponente die Eigenschaften DeleteSQL, InsertSQL, ModifySQL und RefreshSQL verwenden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz