AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi IB Komponenten (IBUpdateSql)
Thema durchsuchen
Ansicht
Themen-Optionen

IB Komponenten (IBUpdateSql)

Ein Thema von Honie · begonnen am 10. Okt 2003 · letzter Beitrag vom 20. Okt 2003
Antwort Antwort
Honie

Registriert seit: 27. Sep 2003
Ort: Bielefeld
39 Beiträge
 
Delphi 7 Enterprise
 
#1

IB Komponenten (IBUpdateSql)

  Alt 10. Okt 2003, 09:27
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
  Mit Zitat antworten Zitat
Honie

Registriert seit: 27. Sep 2003
Ort: Bielefeld
39 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: IB Komponenten (IBUpdateSql)

  Alt 12. Okt 2003, 16:20
Beschäftigt sich sonst keiner damit?
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3

Re: IB Komponenten (IBUpdateSql)

  Alt 12. Okt 2003, 17:29
Zitat von Honie:
Beschäftigt sich sonst keiner damit?
Doch, einige schon. 8) Nur, was soll das ganze denn eigentlich machen ? Vor allem, welche Zugriffskomponenten werden verwendet, IBX oder was ? Desweiteren wäre zu überlegen, welche Komponenten, Dataset, Query ??? Also das müßte man schon wissen.
Gruß
Hansa
  Mit Zitat antworten Zitat
Honie

Registriert seit: 27. Sep 2003
Ort: Bielefeld
39 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: IB Komponenten (IBUpdateSql)

  Alt 12. Okt 2003, 18:35
Zitat:
Nur, was soll das ganze denn eigentlich machen ? Vor allem, welche Zugriffskomponenten werden verwendet, IBX oder was ? Desweiteren wäre zu überlegen, welche Komponenten, Dataset, Query ???
??? Das habe ich doch in der Frage alles geschrieben, oder??

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:
  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;
Dies bewirkt, das beide beim join beteiligten Tabellen upgedatet
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ß
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: IB Komponenten (IBUpdateSql)

  Alt 12. Okt 2003, 18:42
Zitat von Honie:
??? Das habe ich doch in der Frage alles geschrieben, oder?? Also, wie der Name schon sagt, benutze ich die Interbase Komponenten.
Da gibt es aber erhebliche Unterschiede. IBX,IBobjects,FIBplus oder was ??? Ein IBupdate-Objekt habe ich noch nie gebraucht. Wo soll das sein ???
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von kiar
kiar

Registriert seit: 2. Aug 2003
Ort: Aschersleben
1.362 Beiträge
 
Delphi 5 Professional
 
#6

Re: IB Komponenten (IBUpdateSql)

  Alt 12. Okt 2003, 19:05
du solltest die ApplyUpdates methode der TIBDataBase aufrufen, damit werden zwischengespeicherte Änderungen in die Datenbank übernommen.

raik
  Mit Zitat antworten Zitat
Honie

Registriert seit: 27. Sep 2003
Ort: Bielefeld
39 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: IB Komponenten (IBUpdateSql)

  Alt 13. Okt 2003, 08:50
@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.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#8

Re: IB Komponenten (IBUpdateSql)

  Alt 19. Okt 2003, 21:26
Hallo Honie,

Zitat:
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?
Prinzipiell erstellst du zwar normale Queries, eber IBUpdateSQL fasst ja mehrere SQL Statements zusammen (Modify, Delete und Insert). IBQuery erwartet in der UpdateObject ein TIBDataSetUpdateObject (also z.B. ein IBUpdateSQL Objekt) und nicht ein einfaches IBSQL Objekt. Prinzipiell könntest du aber das "Modify" natürlich auch direkt über SQLs steuern, wäre aber umständlicher.

Zitat:
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?
ModifySQL muss tatsächlich definiert sein, sonst wird die Datenmenge nicht editierbar. Dort kannst du z.B. die erste Tabelle ändern und dann das OnUpdateRecord Event auslösen.

Zitat:
Werden die SQL Strings (ausser SelectSQL) im IBDataSet ignoriert, sobald ich ein IBUpdateSQL
Objekt zuweise?
Hab ich zwar nicht ausprobiert, aber ich gehe davon aus, dass UpdateObjevt die anderen Eigenschaften ggf. ersetzt.

Zitat:
Wann wird das OnUpdateRecord Event aufgerufen?
Wenn die Daten an den Server geschickt werden sollen.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#9

Re: IB Komponenten (IBUpdateSql)

  Alt 20. Okt 2003, 10:59
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz