Seite 2 von 2

Re: Satzsperren anzeigen

Verfasst: Fr, 21. Okt 2011 15:23
von Tom
Genau. Who the fuck cares dafür, wer vorher gesperrt hatte? :wink:

Re: Satzsperren anzeigen

Verfasst: Fr, 21. Okt 2011 15:51
von Tom
@Uli: Ach so, das hatte ich übersehen. "nBenutzerId" ist ein interner Wert, der jeden Benutzer im Programm eindeutig identifiziert. GetUserFromId() liefert zu dieser ID den Klarnamen. Beides liegt natürlich in einer Tabelle und wird beim Programmstart oder Benutzerwechsel gesetzt/ausgelesen. Danach ist diese Tabelle zu. :wink:

Re: Satzsperren anzeigen

Verfasst: Fr, 21. Okt 2011 16:14
von brandelh
Hi,

eine zweite Datei ist von der Zeit und Verwaltung problematisch, wenn man es aber so macht wie ich es geschrieben habe
und ein Satz die ganze Bearbeitungszeit gesperrt bleiben soll, kostet es weder Zeit noch ist es unsicher !

1. Jeder Datensatz hat ein Zeichenfeld mit dem Benutzernamen oder der Benutzer-ID, die paar Byte spielen keine Rolle bei Festplatten.
2. Jeder der einen Datensatz bearbeiten will, versucht eine Sperrung (egal ob das Feld ausgefüllt ist oder nicht).
2a. Wenn RLOCK() fehlschlägt, ist der Satz noch in Bearbeitung und der Feldinhalt zeigt den Benutzer an.
2b. Wenn RLOCK() erfolgreich ist, war der Satz nicht in Bearbeitung, die Benutzer-ID wird mit der eigenen überschriebenen und nun kann man arbeiten.
3. Der Satz bleibt gesperrt bis die Änderung durch ist ...
4. Replace der Daten und Löschen der Benutzer-ID
5. Unlock

Keine unnötigen Sperren, sicheres erkennen eines bereits gesperrten Datensatzes, auch nicht zurückgesetzte Sätze können bearbeitet werden.

Natürlich wäre es schön, wenn man eine Funktion wie IsDbLock() hätte, aber man hat sie nicht und jedes unnötige dbrlock() kostet unnötig Zeit.

Re: Satzsperren anzeigen

Verfasst: Fr, 21. Okt 2011 16:26
von Tom
@Hubert: Genau so macht es die Funktion, die ich weiter oben skizziert habe. Und sie funktioniert sogar für Tabellen, denen diese Felder fehlen. Sie ersetzt RLock(). Ein Ersetzen des Infofelds beim Entsperren ist eigentlich überflüssig.

Re: Satzsperren anzeigen

Verfasst: Fr, 21. Okt 2011 16:41
von brandelh
Tom hat geschrieben:Ein Ersetzen des Infofelds beim Entsperren ist eigentlich überflüssig.
Für obige Änderung ja, aber wenn man z.B. eine Meldung anzeigen möchte ("In Bearbeitung durch ...") ist es sinnvoll es zu leeren und es kostet ja nichts, da es noch im LOCK ist.

Code: Alles auswählen

If ! empty(cSperrID)
   Meldung "in Bearbeitung durch ..."
else
   Meldung löschen
endif
PS: außerdem bin ich fürs Aufräumen ;-)

Re: Satzsperren anzeigen

Verfasst: Fr, 21. Okt 2011 16:49
von UliTs
brandelh hat geschrieben:
Tom hat geschrieben:Ein Ersetzen des Infofelds beim Entsperren ist eigentlich überflüssig.
Für obige Änderung ja, aber wenn man z.B. eine Meldung anzeigen möchte ("In Bearbeitung durch ...") ist es sinnvoll es zu leeren und es kostet ja nichts, da es noch im LOCK ist.
Das könntest Du aber relativ einfach durch ein vorsorgliches RLock() durchführen, wenn etwas in GESP_Durch steht:
RLock() erfolgreich: GESP_Durch leeren und nix anzeigen (und UnLock() :wink:
RLock() nicht erfolgreich: GESP_Durch anzeigen
Uli

Re: Satzsperren anzeigen

Verfasst: Fr, 21. Okt 2011 16:56
von brandelh
Hallo Uli,

genau diese unnötigen rlock() möchte ich ja vermeiden, man stelle sich vor wenn 200 Rechner
dauern locken und unlocken nur zu zu erfragen ob eventuell ein Satz gesperrt ist ;-)

Re: Satzsperren anzeigen

Verfasst: Fr, 21. Okt 2011 17:19
von UliTs
brandelh hat geschrieben:genau diese unnötigen rlock() möchte ich ja vermeiden, man stelle sich vor wenn 200 Rechner
dauern locken und unlocken nur zu zu erfragen ob eventuell ein Satz gesperrt ist ;-)
Es muss ja NUR dann ein RLock() aufgerufen werden, wenn tatsächlich etwas in GESP_Durch steht!
Selbst das könnte man noch einschränken, wenn GESP_Durch den Zeitpunkt des Satzsperre enthält. z.B. nur dann prüfen, wenn die Sperre länger als 1 Minute her ist :-) .

Uli

Re: Satzsperren anzeigen

Verfasst: Sa, 22. Okt 2011 1:10
von AUGE_OHR
Eckhard Sallermann hat geschrieben:Noch eine Frage, gibt es Funktionen, um Satzsperren anzuzeigen ?
Es gibt für Clipper die Novlib, damit geht das, allerdings auch nur, wenn die DBF´s auf einem Novellserver liegen.
welche NovLib Function meinst du jetzt ... ? klar im "Monitor" des Server kann ich mir den User ansehen und welche Dateien er geöffnet hat
... aber da steht doch kein "Offset" an welcher Stelle der User den RLock() gemacht hat, oder ?

Systemsteuerung -> Verwaltung -> Computerverwaltung -> Freigegebene Ordner -> geöffnete Dateien
gibt dir die User und Dateien genauso wie im "Monitor" am NW Server.

für die Tasten Freak´s empfehle ich http://technet.microsoft.com/en-us/libr ... 90961.aspx
wenn man dann mittels "Dependency Walker" sich ansieht welche DLL aufgerufen werden kommt man zu dem API Befehlen die verwendet werden.

Re: Satzsperren anzeigen

Verfasst: Di, 25. Okt 2011 16:58
von Markus Walter
Tom hat geschrieben:Technisch läuft das übrigens so ab:

Code: Alles auswählen

FUNCTION MyLock(lShowMessage)
DEFAULT lShowMessage TO .F.
IF RLock()
  IF IsFieldVar('GESP_DURCH')
    FieldPut('GESP_DURCH',nBenutzerId)
  ENDIF
  RETURN .T.
ENDIF
IF lShowMessage
  MsgBox('Datensatz gesperrt'+IF(IsFieldVar('GESP_DURCH').AND.!Empty(GESP_DURCH),' durch '+GetUserFromId(GESP_DURCH),''))
ENDIF
RETURN .F.
Hi Tom,

eine Anmerkung: Du must hinter dem FieldPut aber zumindest ein dbcommit() stehen haben, sonst ist der Schreibvorgang für andere Prozesse nicht lesbar...