Autor Beitrag
DiSchi
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 07.01.03 11:39 
Hallo,

ich habe wieder einmal eine Frage und hoffe, daß mir jemand helfen kann.
Als DB nutze ich Interbase und als Entwicklungsumgebung Delphi 7 Enbterprise.


Beim Öffnen eines Formulars wird die DB geöffnet:
procedure TFrm_Plz.FormShow(Sender : TObject);
begin
inherited;
With dm_plz Do {** dm_plz = Datenmodul**}
begin
IBDB_PLZ.Open; {** DB wird geöffnet **}
IF NOT IBTrans_Plz.INTransaction THEN
IBTrans_Plz.Start;
IBDataSet_Plz.Open; {** Dataset wird geöffnet **}
end;
end;

Die Daten werden im Formular im GRID und in den DBEdit's richtig angezeigt.
Werden die Daten geändert und anschließend wie folgt aktualisiert (mit einem Button), wird die Änderung auch angezeigt.
procedure TFrm_Plz.SpBtn_AktualisierenClick(Sender : TObject);
begin
inherited;
With dm_plz Do {** dm_plz = Datenmodul**}
begin
IBDataSet_Plz.Post; {** Dataset wird aktualisiert**}
end;
end;

Das Formular wird wie folgt geschlossen:
procedure TFrm_Plz.BitBtnForm_Close(Sender : TObject);
begin
inherited;
With dm_plz Do {** dm_plz = Datenmodul**}
begin
IBDB_PLZ.Commit; {** Daten werden übernommen???? **}
IBDB_PLZ.Close; {** DB wird geschlossen**}
IBDataSet_Plz.Close; {** Dataset wird geschlossen**}
end;
end;


Die geänderten Daten werden zwar bei erneutem Anzeigen des Formulars angezeigt, sind also offensichtlich im Arbeitsspeicher, werden aber nicht in die DB geschrieben. Wird das Progr beendet und erneut gestartet, sind die Änderungen nicht sichtbar.

Wo liegt hier der Fehler??

Danke und Gruß
Dieter
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Di 07.01.03 11:59 
Hi
Das sieht eindeutig nach einem Transaktions-Problem aus. Ändere doch mal die Prozedur zum Schliessen so:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TFrm_Plz.BitBtnForm_Close(Sender : TObject); 
begin 
  inherited; 
  With dm_plz Do {** dm_plz = Datenmodul**} 
  begin 
    IF IBTrans_Plz.INTransaction THEN 
        IBTrans_Plz.Commit; 
    IBDB_PLZ.CloseDatasets; //Eigentlich unnötig, aber sicher ist sicher
    IBDB_PLZ.Close; {** DB wird geschlossen**} 
  end; 
end;


Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
DiSchi Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 07.01.03 12:13 
Hallo Lothar,

Danke!

hat leider nicht geklappt.
Gleiches Ergebnis wie vorher.

Dieter
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Di 07.01.03 12:41 
Merkwürdig. Was passiert den beim Schliessen in der ererbten Prozedur, die du per inherited aufrufst?

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
DiSchi Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 07.01.03 12:56 
Hallo Lothar,
die DB wird geschlossen, sonst passiert nichts.
Gruß
Dieter
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Di 07.01.03 13:27 
DiSchi hat folgendes geschrieben:

die DB wird geschlossen, sonst passiert nichts.

Das ist genau das Problem. Du schliesst per inherited die DB und erst anschliessend würdest du die Transaktion abschliessen. Stell den Aufruf von inherited ans Ende.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TFrm_Plz.BitBtnForm_Close(Sender : TObject); 
begin 
  With dm_plz Do {** dm_plz = Datenmodul**} 
  begin 
    IF IBTrans_Plz.INTransaction THEN 
        IBTrans_Plz.Commit; 
    IBDB_PLZ.CloseDatasets; //Eigentlich unnötig, aber sicher ist sicher 
    IBDB_PLZ.Close; {** DB wird geschlossen**} 
  end; 
  inherited; 
end;


Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
DiSchi Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 07.01.03 13:47 
Hat leider ebenfalls nichts gebracht.
Habe auch den Eintrag inherited; weggelassen, die Daten werden in der DB nicht gespeichert.
Gruß
Dieter
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Di 07.01.03 14:05 
Na gut, nächster Versuch. Ändere mal testhalber die Prozedur zum Aktualisieren:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TFrm_Plz.SpBtn_AktualisierenClick(Sender : TObject); 
begin 
  With dm_plz Do {** dm_plz = Datenmodul**} 
  begin 
     IBDataSet_Plz.Post; {** Dataset wird aktualisiert**} 
     IBTrans_Plz.CommitRetaining;
  end; 
end;

Wenn das auch nix bringt, bliebe nur noch das Ganze mal mit dem SQL-Monitor zu verfolgen um rauszufinden, wo hier der Wurm steckt.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
DiSchi Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 07.01.03 14:46 
Die Änderung in:

procedure TFrm_Plz.SpBtn_AktualisierenClick(Sender : TObject);
begin
With dm_plz Do {** dm_plz = Datenmodul**}
begin
IBDataSet_Plz.Post; {** Dataset wird aktualisiert**}
IBTrans_Plz.CommitRetaining;
end;
end;

hat leider auch nichts gebracht.

Den SQL-Monitor habe ich gestartet, die Option "immer im Vordergrund" gesetzt, habe aber nichts gesehen. Habe noch nie mit dem SQL-Monitor gearbeitet -gibt es hier etwas zu beachten?

Gruß
Dieter
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Di 07.01.03 15:03 
Hi
der SQL-Monitor von Delphi bringt dir nur was, wenn du über die BDE zugreifst. Wenn du die IBX-Komponenten verwendest, musst du dir das erst mal selber bauen. user defined image Entweder direkt in deinem Programm, oder als Extra Programm.
Du brauchst dazu nur in Memo-Feld und die IBSQLMonitor-Komponente. Im Ereignis OnSQL der Monitorkomponente fügst du einfach die empfangene Zeile an dein Memo an. Mehr brauchts für den Anfang nicht.
In deiner Datenbankkomponente schaltest du dann die entsprechenden TraceFlags ein. Am besten alle bis auf tfMisc. Damit kannst du dann verfolgen, wie die SQL-Anweisungen vom Server abgearbeitet werden.
Wenn du's nicht selber bauen willst, kannst du mir auch mal deine eMail-Adresse zukommen lassen, dann schick ich dir nen Primitiv-Monitor.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...