Autor Beitrag
a.ebert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Di 20.06.06 15:43 
Moin!

Hab wieder mal en Problem mit meiner Datenbank! Und zwar werden Änderungen von Datensätzen, die ich während der Laufzeit in das Programm eingebe nicht in meiner Datenbank gespeichert. Ich hab ein Formular,bei dem ich neu Datensätze in die Tabelle schreib. Dann hab ich noch ein Formular mit einem DBGRid bei dem ich mir einen Datensatz auswählen kann und diesen dann mittels Buttonclick zum Formular Anzeigen(Datensatz kann nicht bearbeitet werden) und zum Formular Bearbeiten. Hab die Formulare mittels einem DatenModuls verbunden. Wahrscheinlich auch richtig ,weil es funktioniert auch alles richtig gut,
AUSSER: Wenn ich im entsprechendem Formular Daten bearbeite und diese dann speichern will, funktioniert das nicht. Sie werden zwar in dem DBGrid geändert, wenn ich aber Delphi beende und dann neu starte sind die geänderten Daten weg und die alten Daten stehen wieder da. Sie werden quasi nicht in der Datenbank gespeichert. wenn ich mir die Datenbank anschaue, sind auch nur die alten Werte vorhanden.
Ich nutze folgenden Quelltext:
ausblenden Delphi-Quelltext
1:
2:
DataModuleKfZ.TblKfz.Edit;
DataModuleKfZ.TblKfz.Post;

Hab aber irgendwo hier im Forum mal gelesen, dass es nicht sinnvoll ist die Datenbank in den Editier-Modus zu setzen und danach Post anzuwenden.
Kann mir irgendjemand eine Möglichkeit nennen, wie ich die geänderten Daten auch in die Datenbank speichere,so dass sie nicht nur im "Zwischenspeicher" liegen und nach beendigung des Programms verlohren gehen?
Hoffe ich konnte mein Anliegen einigermaßen verständlich erklären und ihr könnt mir etwas helfen.

Mfg
Andy
crowley
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 406

Win XP, Win Vista, Mandriva, Ubuntu
Delphi 4-8, Delphi 2006, Delphi 2007
BeitragVerfasst: Mi 21.06.06 11:27 
nun jaaa... es gibt da noch etwas, woran es scheitern könnte

je nach verwendeter datenbank und datenbankkomponenten, musst du noch ein "Commit" machen... oder ApplyUpdates ...
a.ebert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Mi 21.06.06 15:14 
Moin!
Danke erstmal für deine Antwort. Also ich nutze eine BDE mit dem Datenbankformat Paradox7. Alles weitere ist wie gesagt bereits über ein DatenModul und den entsprechenden DataSource auf den einzelnen Formularen verknüpft. DIe Tabelle ist auch aktiviert.
Wenn ich CommitUpdate benutze, bekomm ich de fehlermeldung:
TabelleXXX:Nicht im Cahed-Update-Modus
Woran könnte das liegen. hat da jemand eine Idee?
MfG
Andy
raiguen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Mi 21.06.06 15:52 
user profile icona.ebert hat folgendes geschrieben:
..
Wenn ich CommitUpdate benutze, bekomm ich de fehlermeldung:
TabelleXXX:Nicht im Cahed-Update-Modus
Woran könnte das liegen. hat da jemand eine Idee?
MfG
Andy

Die Eigenschaft CachedUpdates ist auf False gesetzt (StandardVorgabewert)

Mir scheint Dein Problem irgendwo in den Tabellen der einzelnen Forms / DatenModule zu liegen :gruebel: ich erinnere mich da an einen anderen Thread von Dir...
a.ebert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Do 22.06.06 13:27 
Danke erstmal, aber das mit dem Cached Update hab ich doch noch selbst rausbekommen. Hab es also auf true gesetzt. Funktioniert auch beim ersten Durchlauf. Wenn ich Delphi aber mal schließe und die entsprechende Form wieder öffne(In dem Fall das Datenmodul, dann erhalte ich die Meldung "Tabell besitzt keinen Primärindex". Daraufhin wurde die Eigenschaft Active automatisch auf false gesetzt und lässt sich nicht mehr auf true setzen. Es kommt immer wieder diese komisch Meldung und Active wird wieder false. Dementsprechend hab ich versucht über die Tabelle einen Primärindex zu erzeugen. Und das wie folgt:
ausblenden Delphi-Quelltext
1:
2:
3:
DataModuleKfZ.TblKfZ.Open;
DataModuleKfZ.TblKfZ.AddIndex('KennzeichenIx''Kennzeichen', [ixPrimary,ixNonMaintained]);
DataModuleKfZ.TblKfZ.Close;

Allerdings bekomm ich die selbe Nachricht wie vorher.
Hab ich irgend nen Fehler gemacht bzw. gibt es noch ne andere Möglichkeit einen Primärindex zu setzen?

MfG
Andy
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 23.06.06 14:02 
hi,

wenn es nicht viel ist, kannst du deinen code mal hier posten? da ist bestimmt nur ne kleine sache übersehen worden...

gruß rd3
a.ebert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Mo 26.06.06 09:14 
Moin!
Hab mal eines der Formulare gepackt und hochgeladen, bei dem dieser Fehler auftaucht. Hab noch versucht die Eigenschaften CachedUpdates und Active nacheinander während der Laufzeit zu aktivieren,um den Fehler zu umgehen. Hat auch nicht geklappt. Hoffe es findet irgendjemand meinen Fehler...
Wenn es weiterhilft kann ich auch mal das gesamte programm packen und ins Netz stellen.
Danke schon mal für eure Bemühungen
MfG
Andy
Einloggen, um Attachments anzusehen!
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 26.06.06 09:51 
Hi,

Das CommitUpdates brauchst Du gar nicht! Benutze stattdessen ApplyUpdates. Und danach(!) CancelUpdates. Bei Abbrechen nur CancelUpdates. Arbeite lieber über eine TDataBase-Komponente und verlink die TTables damit. Wenn Du dann CachedUpdates überall zur DesignZeit auf true machst, sollte das reichen.

Hoffe, das hilft weiter.

Gruß rd3

noch was. Vor dem Posten die TTable-Komp. Active := true setzen würde ich auch nicht machen...
Die war ja schon active, da die DBControls benutzbar waren...
Bei onShow() würde reichen und dann vor dem Posten so vielleicht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if myTable.Active then begin
  if myTable.State in [dsInsert, dsEdit] then begin
    myTable.Post;
    myTable.ApplyUpdates;
    myTable.CancelUpdates
  end;
end;


ach ja und: vor dem bearbeiten/einfügen edit oder insert aufrufen! nicht erst kurz vorm speichern!
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 26.06.06 10:07 
user profile iconrd3 hat folgendes geschrieben:
noch was. Vor dem Posten die TTable-Komp. Active := true setzen würde ich auch nicht machen...
Die war ja schon active, da die DBControls benutzbar waren...

"Würde" ist gut. Das darf man nicht machen, da dadurch implizit ein Close der Tabelle erfolgt. Die Folge dürfte sein, dass alle Änderungen verworfen werden. Oder anders ausgedrückt:
Zitat:
Änderung während Laufzeit nicht in Datenbank gespeichert
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 26.06.06 10:11 
scheiß konjunktiv... immer missversteht man mich ;)
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 26.06.06 10:19 
War auch nicht so ernst gemeint.
Ich "würde" es ja auch nicht machen, aus oben genanntem Grund. :wink:
Auf jeden Fall dürfte das die Fehlerursache sein.
a.ebert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Mo 26.06.06 11:58 
Danke erstmal für die Tips. Ich steh aber grad bisschen auf der Leitung, ausserdem bin ich ein ziemlicher Amateur was Datenbanken betrifft. Ich versuchs mal:
Also ich soll erstmal die Tabelle eher in den Editiermodus versetzen. Mach ich jetzt sobald die Form geöffnet wird. Dabei wird auch Active auf true gesetzt. Hoffe das ist soweit richtig. Danach soll ich die TDataSource aus meinem DataModule entfernen und statt dessen die TDataBase Komponente einfügen. Dieser hab ich dann den entsprechenden Alias der Tabelle zugewiesen und den DataBaseName wie meine gespeicherte Tabelle(FahrerDB) genannt.
Hoffe auch das war soweit richtig. Jetzt hängt es allerdings etwas an den weiteren Schritten um den gewünschten Erfolg zu erlangen. :gruebel:
rd3 hat geschrieben, dass das Ganze noch mit ner TTable verknüpft werden muss. Aber wie mach ich das?
Der Rest war dann wieder einigermaßen verständlich und einleuchtend für mich. Hoffe ihr könnt mir nochmal ein bisschen auf die Sprünge helfen. :flehan:

MfG
Andy
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 26.06.06 12:56 
Hi,

Grundsätzlich habe ich immer ein Eingabeformular und ein Formular, wo du die Daten in einem Grid siehst (Browsefenster nenn ich das mal). Auf dem Browsefenster hast du folgende Buttons: Hinzufügen, editieren, löschen usw.
z.B. ins onClick vonm Hinzufügen-Button kommt sowas (Kopie aus meinem Quellcode):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
screen.cursor := crHourglass;
application.createform (TfrmCustomer,frmCustomer);
frmCustomer.tblCustomer.Insert;
frmCustomer.Show;
screen.cursor := crDefault;

vom Edit-Button z.B. so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  if tblCustomerCustomerID.AsVariant = null then mnuNewClick(sender)   
  else begin
    screen.cursor := crHourglass;
    application.createform (TfrmCustomer,frmCustomer);  // im onCreate des Editierfesters die Tabelle im onCreate-Event öffnen, passiert dann HIER*
    frmCustomer.tblCustomer.Locate('CustomerID', tblCustomerCustomerID.value, []);
    frmCustomer.Show;
    screen.cursor := crDefault;
  end;

ausblenden Delphi-Quelltext
1:
2:
  // bei onCreate des Editierfensters...
  tblCustomer.Active := true;  // passiert durch "application.createform (TfrmCustomer,frmCustomer);" s. oben

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  // OK-Button Click
  if tblCustomer.State in [dsInsert, dsEdit] then
    try tblCustomer.post; tblCustomer.FlushBuffers;
    except
      on E: EDBISAMEngineError do
        if E.ErrorCode = 9729 then begin
          with editCustomerNo do begin Show; SetFocus; end;
          raise(exception.create('Kundennummer existiert bereits'));
        end else raise;
    end;
  Close;

wie gesagt, es gibt da bestimmt 1000000 Möglichkeiten...
Ich benutze gerne DBISAM-Datenbanken und fahr damit ganz gut!

Im onAfterPost vom Editierfenster-Table mach ich dann noch sowas:
ausblenden Delphi-Quelltext
1:
2:
3:
  try   //Refresht sozusagen, usw.
    frmCustomers.tblCustomer.Locate('CustomerID', tblCustomerCustomerID.value, []);
  exceptend;


Mehr Infos im Demoverzeichnis von Delphi z.B. "Delph\Demos\DB\Mastapp"

Gruß rd3
a.ebert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Di 27.06.06 12:59 
...langsam, langsam!!!
ich bin doch totaler Datenbank-Anfänger.
Ich hab mal versucht deine Formulierungen nachzuvollziehen. Und ich muss leider zugeben es ist mir nicht richtig gelungen.:cry:
Also ich hab jetzt eine Form mit einem DBGrid und den Buttons Hinzufügen,Anzeigen,Bearbeiten und Löschen. Das Löschen geschieht direkt in dem DBGrid. Die anderen Buttons bringen mich auf jeweils ein Formular, auf dem sich die Eingabmaske befindet. Desweiteren Nutz ich noch ein Datenmodul, mit ner TTable- und ner DataSource-Komponente. Auf den einzelnen Formularen befinden sich dann jeweils eine DataSource-Komponente, mit der ich auf das Datenmodul zugreife und damit auf die Datenbank (Paradox7/BDE).
Wenn ich es einigermaßen verstanden habe, ersetze ich die DataSource vom DatenModul mit ner TDataBase...soweit richtig? Dieser weis ich nen ALIAS zu und verpass ihr einen Namen.
Und jetzt? :nixweiss:
Muss ich das ganze noch mit ner TTable verknüpfen und dann mit der DataSource der Formulare verbinden? Oder wie bau ich die Verbindung zu meiner Datenbank auf?
Ich hab auch schon versucht mich durch verschiedenste Tutorials zu kämpfen und hab zwei ziemlich dicke Bücher vor mir liegen. Aber beides hat mir nicht wirklich geholfen, sonst würd ich ja nicht schon wieder nachfragen. Ich hoffe ich kann weiter auf eure Hilfe zählen.

P.S.: wenn es nötig ist stelle ich auch mal das ganze Projekt ins Forum. Wenn euch das weiter helfen würde...

MfG
Andy
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 27.06.06 13:19 
Versuch das folgende Beispiel nachzuvollziehen, sofern Du die Beispielprogramme nicht installiert hast. MastApp ist gut durchkommentiert. Mir hat es damals auch gut geholfen, mich durch den Datenbankkram kämpfen...
Einloggen, um Attachments anzusehen!