Speichern diverser Benutzereinstellungen

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Speichern diverser Benutzereinstellungen

Beitrag von satmax »

Bisher arbeite ich einfach mit einem einfachen *.ini File (mit Huberts Routinen) und das funktioniert soweit auch ganz gut.

Aber: die (Benutzer) Einstellungen werden immer mehr und ich überlege daher alles in der SQL-Datenbank zu speichern und das INI-File auf einen einzigen Eintrag zu reduzieren, den Connection String.

Meine Überlegung wäre nun, in der Tabelle Benutzer ein Memofeld (Textfeld) anzulegen und die ganzen Benutzer INI Werte in diesem Textfeld zu speichern. Analog dazu lege ich auch ein Memofeld in meiner Systemtable an, dort kommen alle Firmenspezifischen Werte rein die für alle Benutzer gelten.

Warum? Naja, INI Files sind nicht mehr ganz zeitgemäß (Rechte, Datensicherheit,...), Registry will ich nicht nehmen weil:

zu wenig flexibel
90-95% meiner Kunden arbeiten im Netzwerk (am Server kann ich mich überall aufschalten und das INI File kontrollieren)
Probleme bei Rechnertausch
Verschiedene Terminalserver (man müsste auf jeden wieder die Registry übernehmen). So kann jederzeit der Terminalserver getauscht werden und alles bleibt erhalten
...

Was möchte ich speichern:
Letzten Suchbegriffe
Farbeinstellungen
Schriftgröße
Schriftart
Sortierfolge
AutoOpen verschiedener Dialoge
verschiedene Standarddrucker für verschiedene Ausdrucke
...

Wie gesagt, mein Plan wäre die Huberts INI-Funktionen so anzupassen (erweitern) das Sie direkt mit der SQL DB arbeiten. XML erscheint mir dann für diesen Anwendungsfall als zu Aufwendig (habe noch keine Routinen dafür).

Mich würde Eure Meinung dazu interessieren.
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Speichern diverser Benutzereinstellungen

Beitrag von georg »

Hallo, Markus -


warum setzt Du dann nicht ganz auf ein anderes Pferd?

Dein Ansatz bedeutet doch, weiterhin am INI-Konzept festzuhalten.

Was spricht dagegen, für jeden zu speichendem Wert eine entsprechende Spalte anzulegen und zu befüllen?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Speichern diverser Benutzereinstellungen

Beitrag von satmax »

Hallo Georg,

der erste Gedanke war, geht nicht weil: die SQL DB von einem anderen Programm / Programmierer erstellt beziehungsweise upgedatete wird (mit Versionskontrolle und so). Das bedeutet aber, mal eben so auf die schnelle ein neues Feld geht nicht, da brauche ich immer meinen Kollegen. Dann zu viele Felder uns so, altes dbf denken... : :wink:

Ich habe das jetzt aufgrund Deines Postings nochmals überdacht. Ich erstelle mir selbst eine eigene Tabelle innerhalb unserer SQL-DB und verwalte diese eine Tabelle selbst. Somit kann ich jederzeit ein Feld hinzufügen.

Aber auch hier gibt es wieder eine unzählige Anzahl an Möglichkeiten, hier ein paar Beispiele, aktuell bin ich für Variante 3.

Code: Alles auswählen

Beispiel INI
[Formulare]
RechnungPfad=Rechnung
Variante 1

Code: Alles auswählen

Tabelle mit folgenden Felder:
Tabelle useroption
_ID      PS, int
USERID   varchar  20
KEY      varchar 50
WERT     varchar 255

Immer bei Bedarf hole oder schreibe ich einen Wert mit 
SELECT _ID, KEY, WERT from useropt WHERE USERID="USER" AND KEY = "RechnungPfad"
lesen
:fieldGet("KEY")
schreiben
:fieldSet("KEY","Rechnung")
Es gibt für alle Werte nur einen Datentyp

Variante 2 (mit Abschnitt):

Code: Alles auswählen

Tabelle useroption
_ID      PS, int
USERID   varchar  20
KEY      varchar 70    
WERT     varchar 255

Immer bei Bedarf hole oder schreibe ich einen Wert mit 
SELECT _ID, KEY, WERT from useropt WHERE USERID = "USER" AND "KEY = "Formulare.RechnungPfad" 
lesen
:fieldGet("KEY")
schreiben
:fieldSet("KEY","Rechnung")
Meine bevorzugte Variante 3 (mit Abschnitt) :

Code: Alles auswählen

Tabelle mit folgenden Felder:
Tabelle useroption
_ID      PS, int
USERID   varchar  20
SECTION  varchar 50    
KEY      varchar 50    
WERT     varchar 255

Immer bei Bedarf hole oder schreibe ich einen Wert mit 
SELECT _ID, KEY, WERT from useropt WHERE USERID = "USER" AND SECTION="Formulare" AND KEY = "Formulare.RechnungPfad" 
lesen
:fieldGet("KEY")
schreiben
:fieldSet("KEY","Rechnung")
Kann einfach eine Gruppe (Section) von Records einlesen oder bearbeiten

Variante 4 alle Werte eines Users in einem Record:
Vorteil: Recordset braucht nur einmal beim Programmstart eingelesen werden.
Nachteil: Jeder neue INI Eintrag braucht ein neues Datenbankfeld

Code: Alles auswählen

Tabelle useroption
_ID                    PS, int
USERID                 varchar  20
Formulare_RechnungPfad varchar 70
...100er weitere Felder

SELECT _ID, KEY, WERT from useropt WHERE USERID = "USER 
lesen
:fieldGet("Formulare_RechnungPfad")
schreiben
:fieldSet("Formulare_RechnungPfad","Rechnung")
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Speichern diverser Benutzereinstellungen

Beitrag von satmax »

Ich habe mich für Variante 3 entschieden, jeder INI Eintrag ein eigener Datensatz. Das ganze ist seit Montag bei einigen Kunden im Einsatz und funktioniert prächtig.

Ich habe mir eine simple Klasse angelegt:

Code: Alles auswählen

CLASS cSqlUserIni 
        VAR oConn 
        VAR oCurs
        VAR nIDUser      // User ID
        VAR cProgrammID  // ProgrammID als TEXT

EXPORTED:
        // class method initClass
        
        METHOD getIni           // Liest einen INI Wert und setzt wenn notwendig den default wert
        METHOD setIni           // Setzt einen Wert unabhängig ob vorahnden oder nicht
        METHOD setDefaults      // Setzt alle wichtigen Default Werte wenn db leer
        METHOD setDefaultsInit  // Reset alles auf default
        METHOD getCursor
        METHOD init
        METHOD destroy

ENDCLASS

Die Klasse Initialisieren:

Code: Alles auswählen

oUsrSetting:=cSqlUserIni():new(nIDUser,"MEINPROGRAMM")     
oUsrSetting:setDefaultsInit()

Im Programm verwenden:

Code: Alles auswählen

FarbeWaehlen(oMenu, oUsrSetting:GetIni("Programm","Menüfarbe","Himmel"),.f.)
IF UPPER(oUsrSetting:GetIni("Client", "ToolTippZeigen","JA",))= "JA"
	tdSetToolTip2(.T.,0)
ENDIF	
Wahrscheinlich ist das ganze schneller als ein INI-File. Über einen einfachen Browser kann man die INI-Einträge bequem verwalten.

Danke an Georg der mich auf diese Idee gebracht hat! (jaja, Think SQL) :D
Gruß
Markus
Antworten