AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objecte / Datensatz(record)

Offene Frage von "EarlyBird"
Ein Thema von EarlyBird · begonnen am 5. Mai 2007 · letzter Beitrag vom 8. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#1

Objecte / Datensatz(record)

  Alt 5. Mai 2007, 14:51
Hallo,

ich erstelle beim öffnen einer Datenbanktabelle je Datensatz ein Objekt.
In diesem Objekt erstelle ich ein Bitmap aus dem Inhalt des Datensatzes.
Das funktioniert soweit auch alles schon ganz gut.

Nun möchte ich aber auch auf Änderungen in der Tabelle oder auch auf Änderungen des Objektes reagieren.
Und zwar soll das Bitmap des Objekts das zu einem bestimmten Datensatz gehört, neu gezeichnet werden wenn sich Werte ändern.
bzw. soll der Datensatz aktualisiert werden wenn sich ein Objektwert ändert.

Wie binde ich aber das Objekt an einen Datensatz aus der Tabelle.
Es muss doch eine bessere Lösung geben wie Dataset.locate(...)
und wie finde ich das Passende Objekt zu einem Datensatz???

Ich hoffe ich habe es einigermaßen verständlich beschrieben.

Gruß
EarlyBird
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Objecte / Datensatz(record)

  Alt 5. Mai 2007, 14:59
Du hast doch sicher einen Primary Key in der Tabelle. Also lade den PK ebenfalls in ein Feld deines Objektes (z.B. Id).
Dann verpasst du noch eine Save Methode in deine Klasse, und führst dort ein Update des Datensatzes aus. Gegebenfalls kannst Du dir sogar überlegen, auch ein Insert-Befehl zu implementieren, der dann ausgeführt wird falls Id z.B. den Wert 0 hat.
So etwa:
Delphi-Quellcode:
procedure TMyClass.Save ;
begin
     sql := format('update tabelle set %s = :f1, %s = :f2 where id = %d',[Feldname1, Feldname2, id]) ;
     ds := TADOQuery.Create (nil) ;
     try
         ds.Connection := DeineAdoConnection ;
         ds.ParamByName (Feldname1).AsString := Wert1 ;
         ds.ParamByName (Feldname2).AsInteger := Wert 2 ;
         // ...
         ds.ExecSQL ;
     finally
         ds.free
     end ;

end ;
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#3

Re: Objecte / Datensatz(record)

  Alt 7. Mai 2007, 11:35
Danke für den Tipp,
ist aber so nicht gewollt!!
Dann hätte ich zwar die Tabelle in der Datenbank aktuell müsste aber ein refresh der Tabelle machen.
Der geschwindigkeitsvorteil wäre wieder dahin.

Außerdem ist mir immer noch nicht klar wie ich am schnellsten auf ein Objekt zugreife das einem bestimmten Datensatz entspricht!?!?
Und umgekehrt.

Wie kann ich sozusagen ein Objekt mit einem Datensatz verknüpfen??

Gruß
EarlyBird
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#4

Re: Objecte / Datensatz(record)

  Alt 7. Mai 2007, 14:55
Kann ich in der Tabelle einen Pointer auf das Objekt speichern??
(Wie speichert man einen Pointer??)
Wie wirken sich filtern und sortieren der Tabelle auf die Pointer aus??
wäre so ein zugriff auf die Objekte sicher??
Wenn ich die Objekte sortiere oder "move" , sind die Pointer in der Tabelle dann noch richtig zugeordnet?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Objecte / Datensatz(record)

  Alt 7. Mai 2007, 15:06
Hallo,

wie jelly schon gesagt hatte,
führt der Weg über den primary key und natürlich auch
den Tabellennamen.

Ändert sich der Objekt-Wert,
machst du ein Update des Datenbank-Eintrages,
ändert sich der DB-Eintrag, aktualisierst du das Objekt.

Locate würde ich weglassen,
mache das direkt mit einer Query.

Das Dataset würde ich durch eine TClientDataset ersetzen,
oder eine eigene Datenstruktur.

Dein Problem ist eher "wenn sich in der Datenbank was ändert".
Je nach DB gibt es da verschiedene Möglichkeiten (FB hat z.B. Events).

Zur Not musst du Pollen (immer wieder abfragen, ob sich was geändert hat).

Du könntest z.B. Änderungen in eine zusätzliche Protokolltabelle schreiben
id, dbid, tablename, changedatetime

Dann merkst du dir das aktuelle Datum/Uhrzeit
und machst nen select * from protolol_table where changdatetime>=:deine_gemerkte_zeit


Mit Pointern ? -> Kannst du vergessen.


Heiko
Heiko
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#6

Re: Objecte / Datensatz(record)

  Alt 7. Mai 2007, 15:35
Danke für den Beitrag.

Genau das UPDATE möchte ich halt nicht machen da ich nach jeder Änderung ein Refresh bräuchte.

Ich will also die Daten direkt im Dataset ändern.
(es gibt noch ein paar andere Gründe dafür)

Und dazu muss ich möglichst schnell auf den entsprechenden Datensatz zugreifen.
Es muss doch eine schnellere möglichkeit wie Locate geben.

"Änderungen die in der Datenbank passieren" kann ich für meinen "speziellen Fall" erstmal unberücksichtigt lassen.

Ausserdem ist mir immer noch nicht klar wie ich dann am schnellsten auf das Objekt zugreife.
Wenn ich den primary Key im objekt speichere muss ich das Objekt immer noch suchen.
Oder wie kann ich direkt darauf zugreifen??

with TmyObject(Table.FieldValue['PrimaryField']) .... geht ja leider nicht

aber Table.bookmark := myObject.bookmark sollte doch funktionieren oder??

Gruß
EarlyBird
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Objecte / Datensatz(record)

  Alt 7. Mai 2007, 15:44
Brauchst Du denn wirklich alle Datensätze auch in Form eines Delphi Objektes, oder brauchst Du nur das aktuell markierte im DBGrid. Bei letzterem brauchst du nicht suchen und auch keine Liste verwalten, sondern lediglich im AfterScroll Event deines Datasets dein Objekt des aktuellen Datensatzes erstellen.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Objecte / Datensatz(record)

  Alt 7. Mai 2007, 16:02
Hallo,

solange du direkt mit einem Dataset (TQuery, TTable) arbeitest,
geht es doch gar nicht anders, als dass der Wert in der DB gespeichert wird.

Mit könnte aber "CachedUpdates" was machen, also erst lokal speichern,
dann mit einem Rutsch (ApplyUpdates) die Daten in die DB.

Ich würde hier (weil von TClientDataSet keine Ahnung),
eine eigene Datenstruktur nehmen.

Wo sollen die Daten denn angezeigt werden?
Falls DBGrid, kann man dann auch nen normales Grid nehmen,
falls nicht, umso besser.

Zum Objekt finden:
- Objekte in einer eigenen Liste (TList) halten
- sortieren nach dem primkey (quickssort)
- und dann per BinSearch suchen


Heiko
Heiko
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#9

Re: Objecte / Datensatz(record)

  Alt 7. Mai 2007, 17:43
Die Daten werden nicht in einem Grid oder DBGrid dargestellt.

Ich werde mal kurz darstellen wofür das ganze gut ist.

Ich muss Datensätze in einer vertikalen Ansicht darstellen.
Ich nutze aus diversen Gründen kein Stringgrid unter anderem ist das scrollen durch die Datensätze zu langsam.
Ein schnelles scrollen durch die Datensätze ist äußerst wichtig.

Ich zeichne die Daten selbst in ein TBitmap und bin dabei so flexibel wie ich es benötige.
Das scrollen funktioniert dann auch wesendlich schneller.

Nun muss ich aber Änderungen in meinem "VerticalGridBild" machen können und das möglichst schnell.
Dazu speichere pro Datensatz ein Bitmap mit Koordinaten in einem Objekt.
ändern sich nun die Daten in der Tabelle kann ich dieses Bitmap einfach auf das "VerticalBild" kopieren.
Auch eine mehrfachselection kann ich so gut darstellen.
Auch das verschieben klappt schon ganz gut.

"Nur" die Geschwindigkeit will ich halt noch optimieren.
Ich hoffe die Darstellung macht das ganze etwas transparenter.

Zitat:
solange du direkt mit einem Dataset (TQuery, TTable) arbeitest,
geht es doch gar nicht anders, als dass der Wert in der DB gespeichert wird.
Doch das geht mit SDAC komponents
(offline modus)

Zitat:
Zum Objekt finden:
- Objekte in einer eigenen Liste (TList) halten
- sortieren nach dem primkey (quickssort)
- und dann per BinSearch suchen
ist das tatsächlich schneller wie eine einfache Schleife durch TList?

Gruß
EarlyBird
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Objecte / Datensatz(record)

  Alt 7. Mai 2007, 18:00
Hallo,

BinSearch sucht logarithmisch,
das ist ein "bissel" schneller als nen FullTable Scan,
umd es mal mit nem Datenbank-Begriff auszdrücken.
Die Suche ähnelt hier einem Baum (binärbaum),
nur das halt alle Einträge in einer Liste stehen.


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:12 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