Hallo,
<br>D5, IBX 4.6, IB 5.xx
<br>
<br>ich suche die "Ultimative Methode" Transaktionen für IBX zu implementieren, ohne für jedes IBDataSet eine separate Procedure zu implementieren.
<br>Folgendes habe ich mir überlegt:
<br>-bei jedem IBDataSet wird bei AfterPost folgendes gemacht:
<br>GCommit := True
<br>COMMIT; <b>//1) hier sollten doch jetzt zuerst die Ereignisse Before Close und AfterClose aller DataSets verarbeitet werden oder?</b>
<br>GCommit := False
<br>darauf hin werden alle DataSets geschlossen mit folgender Eigenschaft:
<br>-BeforeClose
<br>if GCommit then
<br> Zwischenspeicher[x] := GetDataSetID <b>//2) wie kann man das herausfinden?</b>
<br>-AfterClose
<br>if GCommit then
<br> DataSet.Open
<br> locate(..Zwischenspeicher[x] // die zuvor zwischen gespeicherte ID
<br>
<br>Wieso das ganze?
<br>Nachdem ich mir hier (und in einigen Büchern) einiges durchgelesen habe
mußte ich Feststellen, das immer für ein bestimmtes DataSet eine Procedure geschrieben wurde, um das mit den Commits zu regeln. Das ist jedoch sehr aufwendig vor allem bei sehr vielen Datasets und die Gefahr durch Unachsamkeit einen Fehler zu produzieren ist auch groß. Wer sich schonmal das Beispiel Projekt RedSys2 angesehen hat wird bei der Procedure TDM.DoOpenBeitrag feststellen, das sich hier doch permanent der Code zum Positionieren "wiederholt". Das muß man doch auch zusammenfassen können oder (siehe obigen Ansatz)?
<br>
<br>Das Ziel ist es ein AfterPost, BeforeClose und ein AfterClose für alle DataSets zu entwickeln.
<br>
<br>Zu 2)
<br>Wie kann man aus einem IBDataSet Objekt die ID und deren Wert herausfinden?
<br>
<br>Das ganze ist beim Posten ja auch gar nicht mal so schlimm. Hier könnte man ja noch CommitRetaining nehmen. Jedoch der Client2 <b>muß</B> ein Commit machen, damit er die Änderungen von Client1 lesen kann. ein Simples Close und Open hat bei mir leider nicht geholfen. Das heißt um einen vernünftigen refresh zu machen z.B. wenn ein Form geöffnet wird muß man ein Commit machen. Nur dummer weise wirkt sich dieses Commit ja auch auf die DataSets in anderen offene Forms aus und da wäre eine Simple Methode, die für alle DataSet Gültigkeit hat ideal.
<br>
<br>Wenn jemand eine bessere Idee hat bitte melden!
<br>Geht das (Transaktionen) vieleicht mit IBO Komponenten besser?
<br>Danke!
<br>
<br>mfg
<br>PS
<br>D5, IBX 4.6, IB 5.xx
<br>
<br>ich suche die "Ultimative Methode" Transaktionen für IBX zu implementieren, ohne für jedes IBDataSet eine separate Procedure zu implementieren.
<br>Folgendes habe ich mir überlegt:
<br>-bei jedem IBDataSet wird bei AfterPost folgendes gemacht:
<br>GCommit := True
<br>COMMIT; <b>//1) hier sollten doch jetzt zuerst die Ereignisse Before Close und AfterClose aller DataSets verarbeitet werden oder?</b>
<br>GCommit := False
<br>darauf hin werden alle DataSets geschlossen mit folgender Eigenschaft:
<br>-BeforeClose
<br>if GCommit then
<br> Zwischenspeicher[x] := GetDataSetID <b>//2) wie kann man das herausfinden?</b>
<br>-AfterClose
<br>if GCommit then
<br> DataSet.Open
<br> locate(..Zwischenspeicher[x] // die zuvor zwischen gespeicherte ID
<br>
<br>Wieso das ganze?
<br>Nachdem ich mir hier (und in einigen Büchern) einiges durchgelesen habe
mußte ich Feststellen, das immer für ein bestimmtes DataSet eine Procedure geschrieben wurde, um das mit den Commits zu regeln. Das ist jedoch sehr aufwendig vor allem bei sehr vielen Datasets und die Gefahr durch Unachsamkeit einen Fehler zu produzieren ist auch groß. Wer sich schonmal das Beispiel Projekt RedSys2 angesehen hat wird bei der Procedure TDM.DoOpenBeitrag feststellen, das sich hier doch permanent der Code zum Positionieren "wiederholt". Das muß man doch auch zusammenfassen können oder (siehe obigen Ansatz)?
<br>
<br>Das Ziel ist es ein AfterPost, BeforeClose und ein AfterClose für alle DataSets zu entwickeln.
<br>
<br>Zu 2)
<br>Wie kann man aus einem IBDataSet Objekt die ID und deren Wert herausfinden?
<br>
<br>Das ganze ist beim Posten ja auch gar nicht mal so schlimm. Hier könnte man ja noch CommitRetaining nehmen. Jedoch der Client2 <b>muß</B> ein Commit machen, damit er die Änderungen von Client1 lesen kann. ein Simples Close und Open hat bei mir leider nicht geholfen. Das heißt um einen vernünftigen refresh zu machen z.B. wenn ein Form geöffnet wird muß man ein Commit machen. Nur dummer weise wirkt sich dieses Commit ja auch auf die DataSets in anderen offene Forms aus und da wäre eine Simple Methode, die für alle DataSet Gültigkeit hat ideal.
<br>
<br>Wenn jemand eine bessere Idee hat bitte melden!
<br>Geht das (Transaktionen) vieleicht mit IBO Komponenten besser?
<br>Danke!
<br>
<br>mfg
<br>PS
Comment