Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensätze verschieben bzw synchronisieren (https://www.delphipraxis.net/83343-datensaetze-verschieben-bzw-synchronisieren.html)

bandlow 31. Dez 2006 13:58

Datenbank: ACCESS • Version: 2000 • Zugriff über: ADO

Datensätze verschieben bzw synchronisieren
 
Hallo,
ich lese aus einer Datenbank einträge in eine Listview ein. In der Listview können die Einträge beliebig verschoben, hinzugefügt oder gelöscht werden. Die Reihenfolge muss dann wieder zurück in die Datenbank.
Im Augenblick benute ich bookmarks, das scheint mir jedoch ziemlich langsam zu sein. Immerhin ändern sich ja alle Positionen in der Datenbank wenn man nur einen Datensatz verschiebt. Kennt jemand eine schnelle Lösung, evtl im Hintergrund mit Threads speichern, oder eine Datenbankkompo die das kann?

Guten Rutsch

Karsten

Bernhard Geyer 31. Dez 2006 14:42

Re: Datensätze verschieben bzw synchronisieren
 
Du könntest dir eine intelligente SQL-Anweisung überlegen:

SQL-Code:
UPDATE Tabelle1 SET Position = Position + 1 where Position > 123 and Position < 1000

UPDATE Tabelle1 SET Position = 124 where Position = 1000
Sollte genügen wenn ein Datensatz von Position 1000 auf Position 124 verschoben wird.

Sharky 31. Dez 2006 14:45

Re: Datensätze verschieben bzw synchronisieren
 
Zitat:

Zitat von bandlow
.... Die Reihenfolge muss dann wieder zurück in die Datenbank. ...

Hai Karsten,

in einer Datenbank speichert man die Datensätze nicht in einer Reihenfolge. In welcher Reihenfolge sie "kommen" sollte über einen passenden Index festgelegt werden. Du könntest also jedem Datensatz in der Tabelle noch eine Nummer vergeben (bei einem neuen bekommt dieser einfach die nächsthöchste Nummer. Wenn Du nun einen Datensatz verschiebst brauchst Du ja nur die Nummern ändern.

bandlow 1. Jan 2007 10:57

Re: Datensätze verschieben bzw synchronisieren
 
Hallo Sharky,
genauso mache ich das auch. Ich versuche mein Problem etwas genauer zu umschreiben.
Es handelt sich um so eine Art Playliste. Die Datenbank hält ca 5000 Einträge davon werden 30 - 50 über eine Abfrage selektiert.

Tabellenstruktur etwa so

ID Integer Prim Index
Pos Integer Position
Titel Txt Titelanzeige

Das ganze lese ich mit einer Query aus und schreibe das Ergebnis in eine Objektliste, die ich dann wiederum in einer Listview anzeigen lasse.

In der Listview kann man dann die Einträge verschieben, löschen oder halt neue eintragen.

z.B. Pos Titel
1 Vodafone
2 Marlboro
3 Opel
wenn ich z.B. Opel jetzt veschiebe ändert sich die Position der anderen Spots. Das ganze wird dann beim Programmende bzw wenn man auf eine andere Liste wechselt zurückgeschrieben. Im Augenblick setze ich beim einlesen ein Bookmark und springe dann auf den Datensatz, ist kein Bookmark da, dann neuen Datensatz anlegen.
Das ganze dauert jedoch recht lange (ca. 500 ms), obwohl es nur 50 Datensätze sind. Gerade im Netzwerk macht es sich Bemerkbar, weil die Anwendung dann kurz blockiert ist. Es wird zwar eine Progressbar angezeit, aber es sollte schneller gehen.
Ich habe die Vermutung, das die Datenbank einfach zu viel Verkehr erzeugt.

Hat den jemand Erfahrungen mit den Bookmarks, liegt es daran?
Datenbankschnittstelle muss ADO bzw DAO sein, da die Datenbank einmal als Access und einmal als MS SQL Datenbank laufen soll.

Also wer bis jetzt noch keinen Kater hat muss wohl nochmal ein Jahr warten.

Frohes Neues Jahr

Karsten

Bernhard Geyer 1. Jan 2007 13:03

Re: Datensätze verschieben bzw synchronisieren
 
Zitat:

Zitat von bandlow
Das ganze dauert jedoch recht lange (ca. 500 ms), obwohl es nur 50 Datensätze sind. Gerade im Netzwerk macht es sich Bemerkbar, weil die Anwendung dann kurz blockiert ist. Es wird zwar eine Progressbar angezeit, aber es sollte schneller gehen.
Ich habe die Vermutung, das die Datenbank einfach zu viel Verkehr erzeugt.

Ist doch kein schlechter Wert. Im Netzwerk ist vor allem der Round-Trip-Delay ein bremsendes Element.
Du hat folgende Möglichkeiten:

- Verwendung von Threads zum "gleichzeitigen" Schreiben der Datensätze
- Verwendung von Prepared Statements oder Stored Procedures

Zitat:

Zitat von bandlow
Datenbankschnittstelle muss ADO bzw DAO sein, da die Datenbank einmal als Access und einmal als MS SQL Datenbank laufen soll.

Vergiss DAO! Bei Access nimmt man auch ADO und den JET-Provider. AFAIK darfst Du eh den entsprechende DAO-Treiber nur verteilen wenn du mit einer MS-IDE darauf zugreifst (FAKE-Anwendung sollte reichen).


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz