Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Aktuallisieren der ans cxdbGrid gekoppelten Query (https://www.delphipraxis.net/80520-aktuallisieren-der-ans-cxdbgrid-gekoppelten-query.html)

Darkchild 10. Nov 2006 08:28

Datenbank: Firebird • Version: 1.5 • Zugriff über: InterBase

Aktuallisieren der ans cxdbGrid gekoppelten Query
 
Guten Morgen zusammen,

ich nochmals zum Thema Query:

Folgendes, ich habe eine Eingabemaske in der cxdbEdit - und cxdbextlookupComboboxen zum einsatz kommen. Die Eingabedaten aus den cxdbEdit - Feldern sowie die Daten aus den cxdbextlookupComboboxen Schreibe ich in die im hintergrund angebundene TTable (z.B. ibtableZeiterfassung).
Das cxdbGrid erzeugt die dort dargestellten Datensätze mithilfe einer im hintergrund angebundenen IBQuery, die ich mit den passenden SQL-Befehlen gefüttert habe damit die Ansicht im Grid meinen Vorstellungen entspricht.

So, wenn ich jetzt einen neuen Datensatz eingebe und diesen Speichere wird er in die TTable geschrieben, aber ich sehe in dann immer noch nicht im Grid, erst wenn ich die Anwendung komplett schliesse und dann wieder öffne wird dieser dargestellt. Möchte aber das er direkt nach der Speicherung angezeigt wird (ist ja schon mist wenn ich nach jedem Datensatz die Anwendung schliessen und öffnen muss nur damit ich den Datensatz zu Gesicht bekomme).

Jetzt habe ich Gestern rausbekommen das ich die Query natürlich aktuallisieren muss (soweit alles klar bei mir) habe mir dann einen passenden Event ausgesucht auf den ich REagiere und folgende Zeilen in Code Geschrieben:

Delphi-Quellcode:
cxdbGrid.BeginUpdate;
DataModuleMain.ibqueryzeiterfassung.updateRecord;
cxdbGrid.EndUpdate;
Habe gedacht das sollte klappen, tut es aber natürlich nicht, es wird mir dann die Meldung rausgegeben "Datenmenge die nur zum Lesen geöffnet werden kann, kann mit diesem Paramter nicht Aktuallisiert werden".

Meine Frage jetzt :
Was muss ich denn zwischen BeginUpdate und EndUpdate Schreiben damit er mir die Ansicht meines Grids über die Query nach eingabe eines neuen Datensatzes sofort Aktuallisiert ?

Habe auch schon andere Befehle ausprobiert, wie das schliessen und öffnen der Tabellen, klappt aber auch nicht und ist auch nicht gerade elegant, geschweige denn Effektiv.

Hat da jemand vieleicht einen Hinweis oder Tip oder Quellcode-Beispiel für mich, damit ich an dieser Stelle endlich weiter komme ?

Für hilfe wäre ich sehr Dankbar.

Gruss
Darkchild

raiguen 10. Nov 2006 08:39

Re: Aktuallisieren der ans cxdbGrid gekoppelten Query
 
Moin :-)
Ich würde es mal mit folgendem versuchen:
Delphi-Quellcode:
DataModuleMain.ibqueryzeiterfassung.CLOSE;
DataModuleMain.ibqueryzeiterfassung.OPEN;
Hilft eigentlich immer ;)

Darkchild 10. Nov 2006 09:01

Re: Aktuallisieren der ans cxdbGrid gekoppelten Query
 
Das habe ich auch schon gemacht, hatte ich zum Testen auf Form.Show und Form.Create gelegt, damit vieleicht nur das eine Fenster geschlossen werden muss und nicht die ganze Anwendung, aber das Funktioniert leider nicht.

Wäre auch zu einfache gewesen, aber dennoch Danke.

Gruss
Darkchild

alzaimar 10. Nov 2006 09:24

Re: Aktuallisieren der ans cxdbGrid gekoppelten Query
 
Hi Darkchild,

Dein Problem hat aber auch weniger mit einem TcxGrid zu tun, als mit dem allgemeinen Problem, Daten aus einem Server im Client Synchron zu halten.

dataspider 10. Nov 2006 09:43

Re: Aktuallisieren der ans cxdbGrid gekoppelten Query
 
Hi Darkchild,

die Query muss die Daten vom Server anfordern.
Dies macht sie über ein Refresh.

Ich würde auch die Table und die Query mit der selben Transaction verbinden.
Die Transaction sollte auf Read Commited stehen.

Cu, Frank

Darkchild 10. Nov 2006 11:34

Re: Aktuallisieren der ans cxdbGrid gekoppelten Query
 
@dataspider

Auf die Geschichte mit dem Refresh bin ich auch gekommen, nur habe ich den Refresh auf dem SpeicherButton liegen und wenn ich dann Speicher soll er direkt refreshen, macht der aber nicht.

Ich bekomme dann immer die Meldung : "Zeile kann nicht aktuallisiert werden.(Keine Aktuallisierungs-Abfrage)".

So sieht im Augenblick mein SpeicherButton aus:
Delphi-Quellcode:
procedure Tfrmzeiterfassung.cxbtnzeiterfassungspeichernClick(Sender: TObject);
begin
StarteTransaction();
DataModuleMain.ibtablezeiterfassung.post;

  If DataModuleMain.ibtrzeiterfassung.Active then
         DataModuleMain.ibtrzeiterfassung.Commit;

DataModuleMain.ibqueryzeiterfassung.Refresh;
DataModuleMain.ibtablezeiterfassung.Open;

end;
Mit der Fehlermeldung kann ich im moment leider nicht viel Anfangen, habe keinen Plan was der da noch braucht um den Refresh tatsächlich auszuführen.

Gruss
Darkchild

dataspider 10. Nov 2006 12:31

Re: Aktuallisieren der ans cxdbGrid gekoppelten Query
 
Hi,

ich arbeite zwar mit den IBO' s, versuche es aber dennoch:
Delphi-Quellcode:
procedure Tfrmzeiterfassung.cxbtnzeiterfassungspeichernClick(Sender: TObject);
begin
  // was macht das StartTransaction???
  // StarteTransaction();
  with DataModuleMain do
  begin
    ibtablezeiterfassung.post;
    ibtablezeiterfassung.Transaction.Commit;

    if not ibqueryzeiterfassung.Active then
    begin
      ibqueryzeiterfassung.Transaction.Commit;
      ibtablezeiterfassung.Open;
    end
    else
    begin
      if ibqueryzeiterfassung.Transaction = ibtablezeiterfassung.Transaction then
        // bei bleicher Transaktion sollte ein Refresh reichen
        ibqueryzeiterfassung.Refresh
      else
      begin
        // sonst muss auch ein Commit gemacht werden
        ibqueryzeiterfassung.Transaction.CommitRetaining;
        // evtll. noch ein Refresh
        //ibqueryzeiterfassung.Refresh
      end;
    end;
  end;
end;
Wie gesagt, ich arbeite nicht mit den Komponenten, aber du kannst ja mal testen.
Warum ist die Query bei dir zu?

Cu, Frank

Darkchild 10. Nov 2006 12:40

Re: Aktuallisieren der ans cxdbGrid gekoppelten Query
 
Hinter der StarteTransaction() liegt nur dies hinter:

Delphi-Quellcode:
procedure Tfrmzeiterfassung.StarteTransaction();
begin

if not DataModuleMain.ibtrZeiterfassung.active then
       DataModuleMain.ibtrZeiterfassung.StartTransaction;

end;
Habe ich in eine Procedure gesetzt weil bei verschiedenen Schaltflächen immer das selbe gemacht wird und um die ganze sache nicht immer mit dem Selben Code zu füllen und um mir Arbeit zu sparen habe ich halt diese kleine mini Procedure darein gesetzt.

Gruss
Darkchild

dataspider 10. Nov 2006 14:17

Re: Aktuallisieren der ans cxdbGrid gekoppelten Query
 
... und wie sind die Einstellungen der Transaktionen?
Benutzen Table und Query die gleiche Transaction?
Ist Read Commited eingestellt?

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 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