Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Wenn Tabelle verwendet wird, Sepicherung des Datensatzes nachholen

Begonnen von cyberchris, Januar 26, 2012, 12:15:47

⏪ vorheriges - nächstes ⏩

cyberchris

Hallo zusammen,

ich bin mal wieder am optimieren meiner Datenbank und benötige eure Hilfe...

Beim Starten der DB wird im Hintergrund ein Formular geöffnet, der den User in eine Log-Datei schreibt.
Anschließend wird der Vorgang ca. jede Minute wiederholt.

Dies hat zwei Vorteile:
1. Kann ich sehen, wer sich aktuell (max. 1 Minute verfälscht) in der Datenbank befindet
2. Kann ich durch den User bei Bedarf aus der DB schmeißen (kick_user), da er auch jede Minute ein anderes Feld abruft

Nun habe ich immer wieder das Problem, dass ich während der Anwendung (sporadisch) eine Fehlermeldung bekommte, dass wo ein Schreibkonflikt vorhanden ist.
Da das bereits in mehreren Forms vorgekommen ist, gehe ich davon aus, dass in diesem Fall 2 oder mehr User gleichzeitig in die Log-Datei schreiben wollten.

Nun meine Frage: Wie ich diese Fehlermeldung verhindern/unterdrücken kann und vorallem, dass er versucht den Datensatz nachträglich zu speichern.
Könnte man abfragen, ob die Tabelle gerade verwendet wird o.ä. und dann ggf. in eine Schleife geht, bis er schreiben kann?


Hier mal der Code für Form_Load

Private Sub Form_Load()
On Error GoTo Err_Form_Load

'userlog
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("Userprotokoll")
Dim Netzwerk As Object
Set Netzwerk = CreateObject("wscript.network")
With rs
  .AddNew
  !timestamp = Format(Now, "yyyy\-mm\-dd hh:MM:ss")
  !computername = Netzwerk.computername
  !username = Netzwerk.username
  !anmeldename = CurrentUser
  !loginstamp = True
  .Update
End With

Exit_Form_Load:
    Exit Sub

Err_Form_Load:
    'MsgBox Err.Number
    'MsgBox Err.Description
    Resume Exit_Form_Load
End Sub

Vielen Dank
gruß Christoph

DF6GL

Hallo,

ist die Db aufgeteilt in FE und BE, hat jeder User sein lokales FE und liegt das BE auf einem Netzwerk-Verzeichnis , auf/in dem alle User alle Dateirechte besitzen?

btw: richtig deklarieren:  Dim rs As DAO.Recordset


und Recordset schliessen:

rs.Close
Set rs=Nothing




außer, der Recordset wird global deklariert und ist während der gesamten DB-Laufzeit verfügbar (was hier eh zu empfehlen wäre.)

cyberchris

Guten Morgen,

ja, die DB ist in FE (mde, die loakl auch jedem PC ist) und BE (mdb auf dem Netzlaufwerk liegt). Und die User haben auch die Dateirechte.

Das werde ich abändern: "Dim rs As Recordset" in "Dim rs As DAO.Recordset"

Könnte dann das der Fehler sein, da dies am Ende fehlt?
rs.Close
Set rs=Nothing

Falls ich das global deklarieren sollte, wo muss es dann hin, bzw. würde es dann nicht in andere Bereiche evtl. zu Konflikten kommen, falls ähnliche Aktionen ausgeführt werden?

Danke & Gruß Christoph

oma

Hallo Christoph,

Die Bemerkungen von Franz sind schon wichtig, haben aber wahrscheinlich mit deinem Problem nichts zu tun.

Zu deinem Problem:

", gehe ich davon aus, dass in diesem Fall 2 oder mehr User gleichzeitig in die Log-Datei schreiben wollten"

gleichzeitig gibt es praktisch nicht, es gibt immer (ein paar zehntelsekunden) einen zeitlichen Unterschied. So glaube ich, dass dein Fehler nicht daher rührt. Ich wüsste noch keinen anderen Grund, außer dass ich das ganze Sache evt. anders machen würde. Reicht es nicht, dass man die User nur bei Bedarf ermittelt, statt der permanenten minütlichen Ermittlung?. Du wirst ja nicht permanent wissen wollen, wer nun gerade ein der DB arbeitet u. einen User aus der DB schmeißen sollte ja wohl auch eine seltene Angelegenheit sein!!

Gruß Oma
nichts ist fertig!

cyberchris

Hallo,

die User rauszuschmeißen, ist natürlich nur im Ausnahmefall. Ich nutze die Infos für mehrere Zwecke.

- Datenbankprobleme oder Absturz
  --> Entweder User rausschmeißen, oder schauen wer noch online ist und kurz anrufen
- Historie: Um ggf. nachvollziehen zu können, wer und wann in der Datenbank war.

Möglichkeit wäre sicherlich nur beim Login und Logout zu protokollieren.
Wie könnte ich jedoch nur bei Bedarf abrufen? Irgendwo muss doch eine Schleife dafür sein.
Gut, ich könnte das Intervall erhöhen. Wäre ja auch eine Möglichkeit.

Gruß Christoph

bahasu

Zitat von: cyberchris am Januar 28, 2012, 10:34:56
Möglichkeit wäre sicherlich nur beim Login und Logout zu protokollieren.

Hi

Warum nicht beim Datenbank-Start ein Makro "Autoexec" aufrufen und dort dann die log-in Funktion aufrufen?
Damit ersparst Du dir jegliche Zeitschleifen.

Harald
Servus

DF6GL

Hallo,

DAO.Recordset hat tatsächlich wenig mit dem eigentlichen Problem zu tun, eher der Gebrauch des Recordset.

Versuch auch mal:

Set rs = db.OpenRecordset("Userprotokoll",dbOpenDynaset)
.
.

rs.Close
set rs=Nothing


und überprüf zusätzlich die Access-Datensatz-Sperreinstellungen.



Alternativ zm Recordset könntest Du auch Currentdb.Excecute "Insert into Userprotokoll  ......."
benutzen.



bahasu

Hi,

und im Anhang das Beispiel (für Log_in, Log_out ist nicht enthalten) zu meinem obigen Vorschlag.

Harald

[Anhang gelöscht durch Administrator]
Servus