AGB  ·  Datenschutz  ·  Impressum  







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

Benutzer aus TObjectlist speichern

Ein Thema von scrat1979 · begonnen am 3. Feb 2018 · letzter Beitrag vom 6. Feb 2018
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#1

Benutzer aus TObjectlist speichern

  Alt 3. Feb 2018, 22:39
Liebe Community,

Ich möchte den Titel mal etwas Sinn verleihen. Ich habe - hier als Beispiel - einige Objecte in einer TObjectlist. Als Beispiel habe ich eine TObjectList (TUserList), welche die verschiedenen Benutzerobjekte (TUserInfo) verwaltet. Dies ist die Ausgangssituation. Nun möchte ich die verschiedenen Objekte in einer Datenbank speichern. Das speichern, laden, editieren etc. ist überhaupt kein Problem. Meine Frage ist eher, wo ich diese Logik nun implementiere. In der ObjectList oder in den einzelnen Objekten - Quasi die best practise.

Meine aktuelle Überlegung:

1.) Eine CustomUserlist, welche die einzelnen Methoden zum Speichern, Löschen etc. abstrakt definiert
2.) Die abgeleiteten Klassen implementieren die Funktionen, so dass ich hier als Ziel eine Datenbank oder ein eigenes Dateiformat nehmen könnte. Desweiteren kann man durch ableiten einer neuen Klasse die Funktionalität schnell um neue Formate erweitern
3.) die einzelnen Objekte kennen ihren Zusand (Neu, Löschen, Editieren, Unchanged)
4.) die Logik wird in der (abgeleiteten) TObjektlist implementiert und geht die einzelnen Objekte durch...

Alternativ könnte ich auch eine eigene Klasse zum Speichern erstellen (quasi als „Adapter“), welche die Logik implementiert (wie würde das gehen?). Ein Problem sehe ich hier, dass sowohl die ObjektList die Klasse kenne muss, die „Logik-Klasse“ aber auch die ObjectList, was ja zirkuläre Referenzen bedeuten würde.

Meine Frage: was haltet ihr von meinem Vorgehen und wie löst ihr das bei euch?

Danke im Voraus für eure Ideen!

P.S.: Etwaige Rechtschreibfehler bitte ich zu entschuldigen, die Rechtschreibkorrektur des Handys treibt mich in den Wahnsinn
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#2

AW: Benutzer aus TObjectlist speichern

  Alt 4. Feb 2018, 07:35
Moin...
Zitat:
Meine Frage ist eher, wo ich diese Logik nun implementiere. In der ObjectList oder in den einzelnen Objekten - Quasi die best practise.
Imho im Objekt ganz falsch... Das Objekt hat die Datenbank nicht zu kennen!

Ich setze noch einen drauf. Die Datenbanklogik steckt in einem Interface. Die Anwendung kennt nur das Interface. Das hat den Vorteil, daß man Mal eben die Datenbank austauschen kann.

Delphi-Quellcode:
IdVA_Database = interface(IdDatabaseUser)
  ['{C1BC6FE3-9586-4D92-8221-A3DD030E80B5}']
  procedure AddToLogServer(DeviceID: Integer; Time: TDateTime; Text: string; MessageState: TdMessageState);
  procedure AddToLogClient(UserID: Integer; Time: TDateTime; Text: string; MessageState: TdMessageState);
  property LogCount: Integer read GetLogCount write SetLogCount;
  function Save(aMasterDevice: TMasterDevice): Integer; overload;
  ...

TDatabaseIB = class(TInterfacedObject, IdVA_Database)
Speichern am Beispiel eines Objektes (TMasterDevice):
Delphi-Quellcode:
TdDataState = (ddsCreated, ddsNormal, ddsNew, ddsEdit, ddsModified, ddsDeleted, ddsNewModified, ddsLocked, ddsUnlocked, ddsUnknown);

function TDatabaseIB.CreateQuery: TUniQuery;
begin
  Result := TUniQuery.Create(nil);
  Result.Connection := FConnection;
end;

function TDatabaseIB.Save(aMasterDevice: TMasterDevice): Integer;
var
  Qry: TUniQuery;
begin
  Result := -1;
  Qry := CreateQuery;
  try
    case aMasterDevice.State of
      ddsNew:
        begin
          Qry.SQL.Text := GetSQLByName('SER_INSERT_MASTERDEVICE');
          Qry.ParamByName('DTI').AsInteger := Ord(aMasterDevice.DeviceType);
          Qry.ParamByName('FNA').AsString := aMasterDevice.Name;
          Qry.ParamByName('FCA').AsString := aMasterDevice.Caption;
          Qry.ParamByName('MOD').AsString := aMasterDevice.Version.Model;
          Qry.ParamByName('APP').AsString := aMasterDevice.Version.AppVersion;
          Qry.ParamByName('SYS').AsString := aMasterDevice.Version.SysVersion;
          Qry.ParamByName('FHO').AsString := aMasterDevice.Host;
          Qry.ParamByName('USN').AsString := aMasterDevice.UserName;
          Qry.ParamByName('PAW').AsString := aMasterDevice.PasswordEncrypted;
          Qry.ParamByName('ACT').AsInteger := Integer(aMasterDevice.Active);
          Qry.ParamByName('ISV').AsInteger := Integer(aMasterDevice.IsValid);
          Qry.ParamByName('CON').AsString := aMasterDevice.ConfigurationName;
          Qry.ParamByName('LRD').AsInteger := aMasterDevice.LastReadDeviceID;
          Qry.ExecSQL;
          aMasterDevice.ID := Qry.ParamByName('RET_ID').AsInteger;
          Result := aMasterDevice.ID;
        end;
      ddsEdit:
        begin
          Qry.SQL.Text := GetSQLByName('SER_EDIT_MASTERDEVICE');
          Qry.ParamByName('ID').AsInteger := aMasterDevice.ID;
          Qry.ParamByName('DTI').AsInteger := Ord(aMasterDevice.DeviceType);
          Qry.ParamByName('FNA').AsString := aMasterDevice.Name;
          Qry.ParamByName('FCA').AsString := aMasterDevice.Caption;
          Qry.ParamByName('MOD').AsString := aMasterDevice.Version.Model;
          Qry.ParamByName('APP').AsString := aMasterDevice.Version.AppVersion;
          Qry.ParamByName('SYS').AsString := aMasterDevice.Version.SysVersion;
          Qry.ParamByName('FHO').AsString := aMasterDevice.Host;
          Qry.ParamByName('USN').AsString := aMasterDevice.UserName;
          Qry.ParamByName('PAW').AsString := aMasterDevice.PasswordEncrypted;
          Qry.ParamByName('ACT').AsInteger := Integer(aMasterDevice.Active);
          Qry.ParamByName('ISV').AsInteger := Integer(aMasterDevice.IsValid);
          Qry.ParamByName('CON').AsString := aMasterDevice.ConfigurationName;
          Qry.ParamByName('LRD').AsInteger := aMasterDevice.LastReadDeviceID;
          Qry.ExecSQL;
          aMasterDevice.State := ddsNormal;
          Result := aMasterDevice.ID;
        end;
      ddsDeleted:
        begin
          Qry.SQL.Text := GetSQLByName('SER_DELETE_MASTERDEVICE');
          Qry.ParamByName('ID').AsInteger := aMasterDevice.ID;
          Qry.ExecSQL;
          Result := aMasterDevice.ID;
        end;
    end;
  finally
    Qry.Free;
  end;
end;
...

FDatabase.Save(MasterDevice); // fertsch
GetSQLByName('SER_EDIT_MASTERDEVICE') gehört zu SQL Speichern in Ressourcen. http://www.delphipraxis.net/190316-d...e-creator.html siehe Handbuch.

Zum Gesamten gehört auch der Aufbau der Connection u.a. dazu. Wenn du deine SQL aber über das ganze Programm verteilt hast, wird es eher schwierig diese Konzept durchzusetzen.

Geändert von haentschman ( 4. Feb 2018 um 07:43 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Benutzer aus TObjectlist speichern

  Alt 4. Feb 2018, 08:11
Für so etwas gibt es Automatismen:
https://de.wikipedia.org/wiki/Objekt...nale_Abbildung (ORM)

Für Delphi gibt es da auch einige, einfallen tun mir spontan
- mORMot
- Spring4D (siehe Interview mit Stevie auf Entwickler.de)

Ausprobiert habe ich selbst keins davon, wir machen das auch wie die letzten Hinterwäldler von Hand
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

AW: Benutzer aus TObjectlist speichern

  Alt 4. Feb 2018, 08:46
Zitat:
Für so etwas gibt es Automatismen
...ob der Aufwand gerechtfertigt ist (eine Objektliste), muß jeder selbst entscheiden. Persönlich denke ich, können die Frameworks einfach zu viel was ich nicht brauche...
Zitat:
wir machen das auch wie die letzten Hinterwäldler von Hand
Da weißt du dann aber auch wo die Probleme liegen wenn mal etwas schief läuft.
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Benutzer aus TObjectlist speichern

  Alt 6. Feb 2018, 23:23
Vielen Dank für die Antworten und sorry für die späte Rückmeldung. Ich war die letzten Tage nicht besonders fit und die Family glich einem Lazerett Aber wieder alles gut.

Die Idee mit den Interfaces klingt gut. Ich habe schon einige Tutorials durchgelesen aber so richtig bin ich noch nicht durchgestiegen. Werde mich noch einmal damit beschäftigen. Bis dahin werde ich es mit einer eigenen Klasse wie in meinem ersten Post lösen. Die Logik implementiere ich dann in der ObjectList, die einzelnen Datensätze kennen ihren jeweiligen Zustand. Analog zum Vorschlag von haetschman.

Was mir auch sehr gut gefällt ist die Idee, die SQL-Anweisungen im Resourcen-Teil zu speichern um diese ggf. Ohne neu compilieren zu müssen anpassen zu können. Sehr nice

Zum Glück habe ich noch keine Logik implementiert und die (wenigen) Daten von Hand in die Datenbank eingegeben. Bisher werden die Datensätze über eine simple SELECT-Anweisung lediglich ausgelesenen. Die Verwaltung im Programm soll - neben dem Lerneffekt - die Verwaltung etwas komfortabler machen.

Nochmals besten Dank für das Feedback! schöne Restwoche euch allen. Man liest sich
Michael Kübler
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:16 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