Neuigkeiten:

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

Mobiles Hauptmenü

Zugriff per VBA auf Tabelle sperren

Begonnen von wega21, Juni 27, 2010, 14:19:24

⏪ vorheriges - nächstes ⏩

wega21

Hallo,
habe ein großes Problem in einer Mehrbenutzerumgebung.
Mehrere Clients greifen mit Hilfe einer Abfrage auf eine Servertabelle mit einem Nummernblock zu.
(Nummernkreis für lfd. Rechnungsnummern)
Ist eine Nummer abgerufen wird die betreffende Nummer sofort gelöscht.
Funktioniert sehr gut.
Bis (und es kommt vor) zwei "Rechnungsschreiber" gleichzeitig ihre Prozeduren auslösen.
Zwei Kunden haben dann die gleiche Rechnungsnummer.
Meine Frage: Ist es irgendwie möglich diese Nummernkreis-Tabelle durch den "ersten" Benutzer zu sperren?

Vielen Dank für eure Hilfe.

database

#1
Hallo,

du könntest versuchen die Sperreinstellung für den Zeitpunkt der Auswahl zu ändern.

Auslesen der aktuellen Einstellung:
Dim einstellung As Long

einstellung = Application.GetOption ("Standard bei Datensatzsperrung")

Wenn festgestellt ist, welche Einstellung im Standard gültig ist kann man mit:

Application.SetOption "Standard bei Datensatzsperrung", 1
Die bearbeitete Tabelle (alle Datensätze) sperren bevor der Zugriff auf selbige erfolgt
und musst nach der Ermittlung der Rechnungsnummer mit

Application.SetOption "Standard bei Datensatzsperrung", einstellung

die urprüngliche Einstellung wiederherstellen.

(ungetestet!)


HTH
Peter

DF6GL

Hallo,

mir kommt "die betreffende Nummer sofort gelöscht."   etwas fragwürdig vor.   

Wie ist denn der genaue(!) zeitliche Ablauf der Rechnungsnummern-Behandlung und wie lauten die "Prozeduren" ?


database

Hi,
ich würde auch eher das 'Entnehmen' von Rechnungsnummern aus einem Pool verwerfen und die Rechnungsnummern stattdessen bei Bedarf erstellen.
Da die Dinger ja sowieso fortlaufend sein müssen spricht im Prinzip ja nichts dagegen :)

Jede Tabellensperre wirkt sich irgendwie nicht gerade positiv auf die volle Verfügbarkeit der DB aus.

Eventuell wäre die Reihenfolge der Arbeitsschritte bei der Erstellung einer Rechnung im aktuellen Fall auch zu überdenken.
Die Vergabe sollte m.E. am Ende der Erstellung, also beim Speichern (besser direkt davor) erfolgen.

wega21

Vielen Dank für die prompten Antworten.

Die Datensatzsperrung habe ich mit der Optionseinstellung ,,Standard bei Datensatzsperrung" ohne Erfolg getestet.
Ich werde es mal mit der Sperrung bei Zugriff versuchen.

Mein Prozedurablauf ist folgender:

1.   DoCmd.OpenQuery  ,,qryRechnungsnummerziehen", acViewNormal, acEdit
2.   DoCmd.OpenQuery ,,qryRechnungsnummerLöschen", acViewNormal, acEdit
3.   DoCmd.OpenQuery ,,qryRechnungsablage", acViewNormal, acEdit

Anschließend folgt der Druck von Lieferschein und Rechnung über Makro.

Habe die Vergabe der Rechnungsnummer auch am Ende der Prozedur versucht. Das gleiche Ergebnis.
Auch den Zugriff auf einen gemeinsamen Autowert ist gescheitert.
Es ist immer das gleiche Dilemma wenn die Abfrage zum Erstellen einer Nummer von zwei Benutzern gleichzeitig erfolgt, wir die Nummer gedoppelt.

Der Anwender schreibt bis zu 500 Rechnungen auf verschiedenen Rechnern am Tag.

database

#5
Hallo,

ZitatDie Datensatzsperrung habe ich mit der Optionseinstellung ,,Standard bei Datensatzsperrung" ohne Erfolg getestet.

....!   Application.SetOption "Standard bei Datensatzsperrung", 1

Die Sperre wirkt, sobald sich ein Datensatz im Bearbeitungsmodus befindet. Bei der Option 'Alle Datensätze' - also Parameter 1 - können keine Änderungen an den Tabellen vorgenommen werden, ausser vom Aufrufer!
Die Reihenfolge ist schon OK aber was passiert dazwischen? Zwischen Nummerziehen und Löschen z.B. ?
Die Aussage 'gleichzeitig' ist Ermessenssache - Gleichzeitigkeit gibts eigentlich dabei nicht! Das Problem entsteht dadurch, dass ein weiterer Zugriff die Rechnungsnummer liest bevor sic vom vorhergehenden glöscht wurde und die Daten in der Tabelle aktualisiert dargestellt werden.

ZitatAuch den Zugriff auf einen gemeinsamen Autowert ist gescheitert.
???

Ich persönlich würde da ja wirklich eher dazu übergehen die Nummern bei Bedarf zu generieren und in die Tabelle zu schreiben, auf die Rechnungsnummer einen eindeutigen Index legen und den Fehler bei doppeltem Schreibversuch abfangen - wobei dann der Erstellungsvorgang solange wiederholt wird bis die erste freie Nummer fehlerfrei in die Tabelle wandern kann. Hier reden wir aber nicht von Zeiträumen in Minuten sondern in 10tel  Sekunden


wega21

Hallo,
ich glaube ich komme um den Tip "Fehler bei doppeltem Schreibversuch abfangen" nicht umhin.
Danke erstmal. Ich werde testen.