Entwickler-Ecke
Datenbanken - update zu lang/cursorprobleme
bkgmjo - So 16.09.07 02:01
Titel: update zu lang/cursorprobleme
hallo, bin änfänger in delphi und habe folgendes problem:
ich versuche eine desktop datenbank anzulegen, die als timer, geburtstagsplaner usw. funktionieren soll. soweit funktioniert das ganze auch schon aber ich fürchte meine lösung zur anzeige der restzeit bis zu einem event ist unbrauchbar. bei folgendem timeraufruf dauert es ca. 1 sekunde nur 20 werte zu aktualisieren, ausserdem springt der cursor lustig durch die gegend. hätte gerne, dass man die verschiedenen einträge über rechtsklick oder evtl. linksklick und dann löschen button auch wieder entfernen kann. für hilfe wäre ich sehr dankbar!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Timer1Timer(Sender: TObject); var AZeit,Rest : TDateTime; begin ClientDataSet1.IndexFieldNames := 'Alarmzeit'; ClientDataSet1.First; while not ClientDataSet1.Eof do begin AZeit := ClientDataSet1.FieldByName('Alarmzeit').AsDateTime; Rest := AZeit-Now; ClientDataSet1.Edit; ClientDataSet1.FieldByName('Restzeit').Value := Rest; ClientDataSet1.Next; end; end; |
Moderiert von
jasocul: Code- durch Delphi-Tags ersetzt
BenBE - So 16.09.07 02:37
2 Möglichkeiten:
1. Du sagst dem ClientDataset bescheid, dass sich jetzt was ändert
2. Du nutzt eine TQuery, der Du den Auftrag gibst, die Restzeit-Spalte Serverseitig zu ändern.
Bei 2. ginge da z.B.
SQL-Anweisung
1:
| UPDATE DeineTable SET Restzeit = Alarmzeit - :now |
Dann noch ein
Query1.Params.Clear; und ein
Query1.Params.Add('Now', Now); gefolgt von einem
Query1.Execute; und die neuen Restzeiten sollten augenblicklich erscheinen ;-)
Ansonsten noch ein paar allgemeine Hinweise:
1. Nutz für Updates immer den DB-Cache der Datenbank-Komponenten (CachedUpdates). Damit wird das ehschon mal etwas schneller, weil die Anzahl der Server-Anfragen reduziert wird. Ferner solltest Du IMMER bei der VCL bescheidgeben, wenn Du etwas änderst OHNE die Anzeige aktualisiert bekommen zu wollen. Das spart Zeit, weil nicht neu gezeichnet wird nach jedem Schritt.
HTH.
bkgmjo - So 16.09.07 07:00
hmmm, ich hätte erwähnen sollen, dass ich im sinn hatte, das ganze evtl. weiterzugeben. da wäre doch die installation einer sql datenbank etwas übertrieben oder? hatte an diverse downloadprogramme gedacht, die ja auch laufend restzeiten aktualisieren. hab bis jetzt alles in einer xml datei gespeichert. kann auch sein, dass ich hier was falsch mitbekomme und sql befehle trotzdem funktionieren?!
BenBE - So 16.09.07 13:10
Das ist doch ein hilfreiches Detail, was Du hättest erwähnen sollen ;-)
Zwecks DB beim Anwender: Da würde sich ADO anbieten, da das eh meist installiert ist.
Wie das beim ClientDataset speziell aussieht zwecks Datenanbindung via XML weiß ich nicht (dazu habsch damit zu lang nix mehr zu tun gehabt).
Es bliebe Dir aber immer noch die Möglichkeit, kurz die visuelle Verbindung zu kappen während des Updates.
bkgmjo - So 16.09.07 17:09
hm, wie wäre denn dann ein lösungsvorschlag zum kappen der visuellen verbindung? ich wäre auch offen für eine ganz neue lösung der sache. es soll nur endlich funktionieren ;)
BenBE - So 16.09.07 17:18
Siehe TDataset in der DOH bzgl. ControlsDisabled, DisableControl und EnableControls. HTH.
bkgmjo - Mo 24.09.07 06:29
leider ohne erfolg versucht, es passiert im prinzip dasselbe, nur dass man jetzt nicht sieht, dass er von datensatz zu datensatz kriecht, sondern es einfach ewig läd und dann die steuerung für eine halbe sekunde wieder zulässt. kann es evtl. daran liegen, dass ich die daten über ein dbgrid anzeigen lasse und dieses für die automatische aktualisierung sehr lang braucht?
alzaimar - Mo 24.09.07 06:35
Wenn Du in einer Datenmenge (TDataset) etws änderst, werden alle angeschlossenen visuellen Elemente benachrichtigt. Umd das dauert.
Versuch mal:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| Procedure DoUpdate; Var B : TBookmark;
Begin MyDataset.DisableControls; B := MyDataset.GetBookmark; Try MyDataset.first; While not MyDataset.Eof do begin MyDataset.Edit; MyDataset['Field1'] := Foobar; MyDataset.Post; MyDataset.Next; End Finally MyDataset.GotoBookmark (B); MyDataset.FreeBookmark (B); MyDataset.EnableControls; End; End; |
Das sollte viel schneller gehen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!