Doppelte Nummervergabe.
Moderator: Moderatoren
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Doppelte Nummervergabe.
Hallo,
ich habe ein Problem, dass trotz aller meiner Versuche immer wieder auftritt.
Ich habe eine DBF-Datei im FOXCDX-Format, die für die vergabe eindeutiger Nummern verwendet wird. Die Datei liegt auf dem MS Windows 2003 Server mit abgeschalteten Caching. Die Clients haben Win98, Win2000 und WinXP.
Bei der Nummernvergabe wird die Datei Exclusive geöffnet. Trotzdem kommt es ab und zu, dass doppelte Nummern auftauchen.
Früher habe ich nur den Datensatz gesperrt, wo das Problem aber öfters kam. Mit dem Exclusiven Öffnen sollte das überhaupt nicht mehr vorkommen, passiert aber trotzdem.
Was kann das überhaupt sein. Ich habe keine Ideen mehr.
ich habe ein Problem, dass trotz aller meiner Versuche immer wieder auftritt.
Ich habe eine DBF-Datei im FOXCDX-Format, die für die vergabe eindeutiger Nummern verwendet wird. Die Datei liegt auf dem MS Windows 2003 Server mit abgeschalteten Caching. Die Clients haben Win98, Win2000 und WinXP.
Bei der Nummernvergabe wird die Datei Exclusive geöffnet. Trotzdem kommt es ab und zu, dass doppelte Nummern auftauchen.
Früher habe ich nur den Datensatz gesperrt, wo das Problem aber öfters kam. Mit dem Exclusiven Öffnen sollte das überhaupt nicht mehr vorkommen, passiert aber trotzdem.
Was kann das überhaupt sein. Ich habe keine Ideen mehr.
- Markus Walter
- Programmier-Gott
- Beiträge: 1018
- Registriert: Di, 24. Jan 2006 10:22
- Wohnort: Saarland
Hallo Andreas,
ich kenne das Problem nicht. In meiner Applikation gibt es praktisch das gleiche System und zusätzlich ein System ohne exclusives Öffnen.
Meine Vorgehensweise A:
Alle Instanzen haben die Datei geöffnet, Satzsperre, Wert lesen, erhöhen, reinschreiben, Sperre aufheben, Commit
Meine Vorgehensweise B:
Datei wird exlusiv geöffnet, Wert lesen, erhöhen, reinschreiben, Datei schliessen.
Doppelte IDs hatte ich bei beiden Systemen noch nicht. Allerdings gibt es in meiner Applikation auch keinen wirklich starken "Load" bei der Sache (es geht z. B. um Auftragsnummern), d. h. es werden pro Tag vielleicht 100-200 IDs erzeugt...
Ich verwende FOXCDX und nehme an allen Anlagen die "einschlägig bekannten" Registry-Einstellungen bzgl. Opportunistic Locking vor).
Anlagengrößen: 1-Platz bis 20 Arbeitsplätze, alles Win2000, Win2003 oder XP, KEIN Win9x
ich kenne das Problem nicht. In meiner Applikation gibt es praktisch das gleiche System und zusätzlich ein System ohne exclusives Öffnen.
Meine Vorgehensweise A:
Alle Instanzen haben die Datei geöffnet, Satzsperre, Wert lesen, erhöhen, reinschreiben, Sperre aufheben, Commit
Meine Vorgehensweise B:
Datei wird exlusiv geöffnet, Wert lesen, erhöhen, reinschreiben, Datei schliessen.
Doppelte IDs hatte ich bei beiden Systemen noch nicht. Allerdings gibt es in meiner Applikation auch keinen wirklich starken "Load" bei der Sache (es geht z. B. um Auftragsnummern), d. h. es werden pro Tag vielleicht 100-200 IDs erzeugt...
Ich verwende FOXCDX und nehme an allen Anlagen die "einschlägig bekannten" Registry-Einstellungen bzgl. Opportunistic Locking vor).
Anlagengrößen: 1-Platz bis 20 Arbeitsplätze, alles Win2000, Win2003 oder XP, KEIN Win9x
Gruß
Markus
Mitglied der XUG Saarland-Pfalz
Markus
Mitglied der XUG Saarland-Pfalz
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Markus,
deine Vorgehensweise A hatte ich am Anfang. Als das Problem aufgetreten ist, hatte ich auf die Vorgehensweise B umgestellt. Jetzt kommt es sehr selten aber trotzdem vor, dass die doppelten Nummern auftauchen.
Ich vermute, dass es von Win98 kommen könnte und dass es irgendwie mit den Dateisperren an dieser Stelle nicht richtig funktioniert. Ich kann aber Win98 nicht abschalten, da es kleine Clients ohne Festplatte sind und da immer die Fertigungsdaten erfasst werden. Es sind auch nur ca. 6-8 Plätze.
deine Vorgehensweise A hatte ich am Anfang. Als das Problem aufgetreten ist, hatte ich auf die Vorgehensweise B umgestellt. Jetzt kommt es sehr selten aber trotzdem vor, dass die doppelten Nummern auftauchen.
Ich vermute, dass es von Win98 kommen könnte und dass es irgendwie mit den Dateisperren an dieser Stelle nicht richtig funktioniert. Ich kann aber Win98 nicht abschalten, da es kleine Clients ohne Festplatte sind und da immer die Fertigungsdaten erfasst werden. Es sind auch nur ca. 6-8 Plätze.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Andreas.
Ich kenne das Problem auch, und zwar unter allen möglichen Topologien. Deshalb gibt es bei uns seit Jahren schon gesonderte Tabellen für die Nummernverwaltung, die jeweils nur einen Datensatz haben. Diese Tabellen werden im Bedarfsfall geöffnet, der Datensatz wird gesperrt, die Nummer wird inkrementiert und die Tabelle wird wieder geschlossen. Seitdem ist das Problem nicht mehr aufgetreten. Hilfsweise geht das auch mit XPF-, INI- oder XML-Dateien, wobei man sich hier noch gesonderte Sperrmechanismen ausdenken muß.
Ich kenne das Problem auch, und zwar unter allen möglichen Topologien. Deshalb gibt es bei uns seit Jahren schon gesonderte Tabellen für die Nummernverwaltung, die jeweils nur einen Datensatz haben. Diese Tabellen werden im Bedarfsfall geöffnet, der Datensatz wird gesperrt, die Nummer wird inkrementiert und die Tabelle wird wieder geschlossen. Seitdem ist das Problem nicht mehr aufgetreten. Hilfsweise geht das auch mit XPF-, INI- oder XML-Dateien, wobei man sich hier noch gesonderte Sperrmechanismen ausdenken muß.
Herzlich,
Tom
Tom
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Tom,
genau so habe ich es auch gemacht. Ich habe eine Extra-Datei mit einem Datensatz. Diese wird erst dann geöffnet, wenn ich die Nummer brauche. Die Satzsperre habe ich damals durch die Dateisperre (exclusives Öffnen) abgelöst. Das Problem ist immer noch da.
Hier ist mein Code:
Wie ich es sehe, darf mit diesem Code keine doppelte Nummer auftauchen.
genau so habe ich es auch gemacht. Ich habe eine Extra-Datei mit einem Datensatz. Diese wird erst dann geöffnet, wenn ich die Nummer brauche. Die Satzsperre habe ich damals durch die Dateisperre (exclusives Öffnen) abgelöst. Das Problem ist immer noch da.
Hier ist mein Code:
Code: Alles auswählen
FUNCTION GetNummer(cAuswahl)
local nAuftragNeu:=0, cAuftragNeu:="", db:=select(), nJahr:=YEAR(date())
/*
Local aStruckt:={;
{"Jahr","N",2,0},;
{"Auftrag","N",7,0},;
{"LaufKarte","N",7,0},;
{"Behaelter","N",9,0},;
{"Liefersch","N",8,0};
}
*/
Default cAuswahl to "AUFTRAG"
/*
IF ! file("Nummern.dbf")
dbcreate("Nummern", aStruckt, "FOXCDX")
ENDIF
*/
IF len(alltrim(str(nJahr)))==4
nJahr:= val(substr(alltrim(str(nJahr)),3))
ENDIF
*use Nummern alias Nummern via "FOXCDX" new exclusive
do while ! DBNummerOpen()
sleep(5)
enddo
*IF ! neterr()
IF lastrec()==0
dbappend()
replace nummern->jahr with nJahr
*dbrunlock()
ENDIF
go 1
*do while ! dbrlock()
*enddo
IF nJahr > nummern->jahr
**zurücksetzen der Werte, wenn das Jahr sich gewechselt hat
replace nummern->jahr with nJahr
replace nummern->auftrag with 0
replace nummern->LaufKarte with 0
replace nummern->Behaelter with 0
replace nummern->Liefersch with 0
ENDIF
IF upper(cAuswahl)=="AUFTRAG"
nAuftragNeu:=nummern->auftrag+1
replace nummern->auftrag with nAuftragNeu
cAuftragNeu:="A"+strzero(nJahr,2)+strzero(nAuftragNeu,7)
elseIF upper(cAuswahl)=="LAUFKARTE"
nAuftragNeu:=nummern->LaufKarte+1
replace nummern->LaufKarte with nAuftragNeu
cAuftragNeu:="LK"+strzero(nJahr,2)+strzero(nAuftragNeu,7)
elseIF upper(cAuswahl)=="BEHAELTER"
nAuftragNeu:=nummern->Behaelter+1
replace nummern->Behaelter with nAuftragNeu
cAuftragNeu:="B"+strzero(nJahr,2)+strzero(nAuftragNeu,9)
elseIF upper(cAuswahl)=="LIEFERSCHEIN"
nAuftragNeu:=nummern->Liefersch+1
replace nummern->Liefersch with nAuftragNeu
cAuftragNeu:="HL"+strzero(nJahr,2)+strzero(nAuftragNeu,8)
elseIF upper(cAuswahl)=="RLIEFERSCHEIN"
nAuftragNeu:=nummern->RLief+1
replace nummern->RLief with nAuftragNeu
cAuftragNeu:="RL"+strzero(nJahr,2)+strzero(nAuftragNeu,8)
ENDIF
*dbrunlock()
nummern->(dbcommit())
close Nummern
*ENDIF
IF db>0
select (db)
ENDIF
RETURN cAuftragNeu
FUNCTION DBNummerOpen()
local lOk := .f.
Local aStruckt:={;
{"Jahr","N",2,0},;
{"Auftrag","N",7,0},;
{"LaufKarte","N",7,0},;
{"Behaelter","N",9,0},;
{"Liefersch","N",8,0},;
{"RLief","N",8,0};
}
IF ! file("Nummern.dbf")
dbcreate("Nummern", aStruckt, "FOXCDX")
ENDIF
bSaveError := ErrorBlock()
ErrorBlock( {|e| Break(e)} )
BEGIN SEQUENCE
use Nummern alias Nummern via "FOXCDX" new exclusive
IF ! neterr()
lOk := .t.
else
lOk := .f.
endif
RECOVER
ErrorBlock( bSaveError )
lOk := .f.
END SEQUENCE
ErrorBlock( bSaveError )
RETURN lOk
- Bertram Hansen
- Foren-Moderator
- Beiträge: 1015
- Registriert: Di, 27. Sep 2005 8:55
- Wohnort: 51379 Leverkusen
- Hat sich bedankt: 28 Mal
- Danksagung erhalten: 20 Mal
- Kontaktdaten:
Hallo Andreas,
ich verwende folgende Methode um die Belegnummer eindeutig zu erstellen:
- Datensatz suchen.
- Datensatz sperren. Die anderen User stehen in der Zwischenzeit in einer Warteschleife und warten solange bis der erste User den Datensatz wieder freigibt.
- alias->(dbskip(0))
- über eine Varaible die Belegnummer erhöhen.
- die neue Belegnummer in die Tabelle schreiben.
- dbcommitall()
- alias->dbunlock()
Damit haben wir seit Jahren keine doppelten Belegnummern mehr. Den alias->(dbskip(0)) haben wir nachträglich eingefügt, ohne den Zusatz hatten wir auch Probleme gehabt. Vielleicht hilft Dir das weiter.
ich verwende folgende Methode um die Belegnummer eindeutig zu erstellen:
- Datensatz suchen.
- Datensatz sperren. Die anderen User stehen in der Zwischenzeit in einer Warteschleife und warten solange bis der erste User den Datensatz wieder freigibt.
- alias->(dbskip(0))
- über eine Varaible die Belegnummer erhöhen.
- die neue Belegnummer in die Tabelle schreiben.
- dbcommitall()
- alias->dbunlock()
Damit haben wir seit Jahren keine doppelten Belegnummern mehr. Den alias->(dbskip(0)) haben wir nachträglich eingefügt, ohne den Zusatz hatten wir auch Probleme gehabt. Vielleicht hilft Dir das weiter.
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.
Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
hi,
geöffnet ? Ich hatte es schon (unter Xbase++) das verschiedene
Workstationen EXCLUSIVE die selbe DBF in verschiedenen SELECT()
geöffnet hatten ... nimm mal das NEW raus.
was mir bei deiner Routine fehlt ist die Prüfung der Nummer sobald
du die vergeben hast ob die nicht schon exitiert. Ich prüfe das auch
noch bevor ich die "neuen" Datensätze APPENDe ob nicht in der Zwischen-
zeit jemand anderes die Nummer verwendet (warum/wieso auch immer)
grundsätzlich hab ich deine W98 Workstationen in Verdacht den ähnliche
Phänomäne hab ich auch mit dem W2003 Server und den W98 Stationen
gehabt welche ich nun auf W2K umgestellt habe.
gruss by OHR
Jimmy
hm ... wird bei NEW nicht jedesmals eine neuer SELECT() Bereichandreas hat geschrieben:Code: Alles auswählen
use Nummern alias Nummern via "FOXCDX" new exclusive
geöffnet ? Ich hatte es schon (unter Xbase++) das verschiedene
Workstationen EXCLUSIVE die selbe DBF in verschiedenen SELECT()
geöffnet hatten ... nimm mal das NEW raus.
was mir bei deiner Routine fehlt ist die Prüfung der Nummer sobald
du die vergeben hast ob die nicht schon exitiert. Ich prüfe das auch
noch bevor ich die "neuen" Datensätze APPENDe ob nicht in der Zwischen-
zeit jemand anderes die Nummer verwendet (warum/wieso auch immer)
grundsätzlich hab ich deine W98 Workstationen in Verdacht den ähnliche
Phänomäne hab ich auch mit dem W2003 Server und den W98 Stationen
gehabt welche ich nun auf W2K umgestellt habe.
gruss by OHR
Jimmy
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Hallo Andreas,
als der Hinweis von Jimmy den NEW rauszunehmen würde ich nicht machen, weil du sonst in den Select-Bereich von einer anderen Datenbank kommst.
Aber sonst ist die vorgehensweise schon richtig. DBF öffnen - sperren -
Nummern erhöhen - schreiben - closen.
Aber das Sperren von Win98-Rechnern hatte ich auch schon mal. Aber die Lösung weiß ich nicht mehr. Was für ein Netzwerk wird denn eingesetzt. Vielleicht hat es ja auch damit zu tun, daß das sperren nicht sauber funktioniert - karten, treiber ect.
als der Hinweis von Jimmy den NEW rauszunehmen würde ich nicht machen, weil du sonst in den Select-Bereich von einer anderen Datenbank kommst.
Aber sonst ist die vorgehensweise schon richtig. DBF öffnen - sperren -
Nummern erhöhen - schreiben - closen.
Aber das Sperren von Win98-Rechnern hatte ich auch schon mal. Aber die Lösung weiß ich nicht mehr. Was für ein Netzwerk wird denn eingesetzt. Vielleicht hat es ja auch damit zu tun, daß das sperren nicht sauber funktioniert - karten, treiber ect.
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Rolf,Rolf Ramacher hat geschrieben:Hallo Andreas,
als der Hinweis von Jimmy den NEW rauszunehmen würde ich nicht machen, weil du sonst in den Select-Bereich von einer anderen Datenbank kommst.
Aber sonst ist die vorgehensweise schon richtig. DBF öffnen - sperren -
Nummern erhöhen - schreiben - closen.
Aber das Sperren von Win98-Rechnern hatte ich auch schon mal. Aber die Lösung weiß ich nicht mehr. Was für ein Netzwerk wird denn eingesetzt. Vielleicht hat es ja auch damit zu tun, daß das sperren nicht sauber funktioniert - karten, treiber ect.
mit dem Rausnehmen von NEW kann ich dir nur zustimmen - das bring nur Probleme und keine Lösung.
Bei dem Netzwerk ist es wie bei allen: RJ45 Verkabelung, Windows-Domäne mit den Clients, die sich in der Domäne anmelden.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Hallo, Andreas.
Ich würde Dir empfehlen, Deine Funktion DBNummerOpen() dahingehend zu ändern, daß Sie die Tabelle öffnet, die Nummern inkrementiert, die Datei wieder schließt und ein Array mit den (nächsten) Nummern retourniert.
Und in der eigentlichen Vergaberoutine:
Ich würde Dir empfehlen, Deine Funktion DBNummerOpen() dahingehend zu ändern, daß Sie die Tabelle öffnet, die Nummern inkrementiert, die Datei wieder schließt und ein Array mit den (nächsten) Nummern retourniert.
Code: Alles auswählen
FUNCTION DbNummernOpen()
LOCAL aNummern := {}
* ... öffnen, sperren, Nummern inkrementieren
aAdd(aNummern,Db->Auftrag)
aAdd(aNummern,Db->Laufkarte) // usw.
* ...
DbCloseArea()
* reselektieren
RETURN aNummern
Code: Alles auswählen
LOCAL aNummern := DbNummernOpen()
* ...
Auf->Auftrag := aNummern[1] // usw.
Herzlich,
Tom
Tom
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Hallo Andreas,
ist es ein HUB oder eine Ringverteilung - also peer to peer.
Läßt sich denn der Fehler bei einer bestimmten vorgehensweise reproduzieren ? Oder treten beim kopieren von Dateien übers Netzwerk
Fehler auf ? Läßt sich feststellen, ob dies von einem bestimmten Client
abhängt ??
Ich denke mal dieses zu prüfen wird schwierig sein. Aber in punkto Netzwerkkarten, Verkabelung, Treibern ect. habe ich einiges erlebt was
passieren kann.
ist es ein HUB oder eine Ringverteilung - also peer to peer.
Läßt sich denn der Fehler bei einer bestimmten vorgehensweise reproduzieren ? Oder treten beim kopieren von Dateien übers Netzwerk
Fehler auf ? Läßt sich feststellen, ob dies von einem bestimmten Client
abhängt ??
Ich denke mal dieses zu prüfen wird schwierig sein. Aber in punkto Netzwerkkarten, Verkabelung, Treibern ect. habe ich einiges erlebt was
passieren kann.
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
hi,
Ein NEW öffnet ja die DBF im nächsten möglichen SELECT(). Ich
verwende aber grundsächlich "festes" SELECT() zusammen mit
dem ALIAS(). So ist "SELECT 28" immer KDNUMMER und kann
nicht "nochmal" in der selben WorkArea vorkommen, auch nicht
mit andem ALIAS().
Dazu verwende ich meine NET_USE() wo ich zunächst den SELECT()
einstelle, dann die DBF öffne und auch die Index Datei(n) alles in
dem selben Modul. Das hat mir bei NTX Index Datein auch geholfen
immer alle dazugehörigen NTX Datein in der selben Reihenfolge zu
öffnen und keine zu "vergessen"
Die Vorgehensweise würde ich grundsätzlich jedem raten und nicht
"irgendwo" im Source verteilt die DBF/Index öffnen. Will man nun
z.b. von NTX nach CDX "umstellen" so muss man nur an der NET_USE()
die Anpassung vornehmen (DBESYS setzt ich vorraus ...)
selbstverständlich muss man sich dann "manuelle" und die SELECT()
Bereiche kümmern, aber das Wissen darum hab ich vorrausgesetzt
den wir sind ja keine Newbie´s mehr.
gruss by OHR
Jimmy
hätte mich wohl genauer ausdrücken sollen was ich damit meine.Rolf Ramacher hat geschrieben: als der Hinweis von Jimmy den NEW rauszunehmen würde ich nicht machen, weil du sonst in den Select-Bereich von einer anderen Datenbank kommst.
Ein NEW öffnet ja die DBF im nächsten möglichen SELECT(). Ich
verwende aber grundsächlich "festes" SELECT() zusammen mit
dem ALIAS(). So ist "SELECT 28" immer KDNUMMER und kann
nicht "nochmal" in der selben WorkArea vorkommen, auch nicht
mit andem ALIAS().
Dazu verwende ich meine NET_USE() wo ich zunächst den SELECT()
einstelle, dann die DBF öffne und auch die Index Datei(n) alles in
dem selben Modul. Das hat mir bei NTX Index Datein auch geholfen
immer alle dazugehörigen NTX Datein in der selben Reihenfolge zu
öffnen und keine zu "vergessen"
Die Vorgehensweise würde ich grundsätzlich jedem raten und nicht
"irgendwo" im Source verteilt die DBF/Index öffnen. Will man nun
z.b. von NTX nach CDX "umstellen" so muss man nur an der NET_USE()
die Anpassung vornehmen (DBESYS setzt ich vorraus ...)
selbstverständlich muss man sich dann "manuelle" und die SELECT()
Bereiche kümmern, aber das Wissen darum hab ich vorrausgesetzt
den wir sind ja keine Newbie´s mehr.
gruss by OHR
Jimmy
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo jimmy,
ich denke, dass dein Vorschlag mit dem Rausnehmen von NEW in meinem Fall nichts bringen wird, da ich die Datenbank Exclusive öffne, was nach XBase weiteres Öffnen der Datenbank (zumindest mit Schreibrechten) nicht mehr möglich macht. Das funktioniert ja auch, aber wohl nicht immer in zusammenarbeit mit Win98.
ich denke, dass dein Vorschlag mit dem Rausnehmen von NEW in meinem Fall nichts bringen wird, da ich die Datenbank Exclusive öffne, was nach XBase weiteres Öffnen der Datenbank (zumindest mit Schreibrechten) nicht mehr möglich macht. Das funktioniert ja auch, aber wohl nicht immer in zusammenarbeit mit Win98.
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
hi,
Im Alaska Forum hatte jemand unter dem Title "File handle limit in XP"
gerade ein ähnliches Problem mit exlusiven öffnen ...
gruss by OHR
Jimmy
aber schaden würde es auch nicht und evtl. findest du dann denFehler.andreas hat geschrieben:ich denke, dass dein Vorschlag mit dem Rausnehmen von NEW in meinem Fall nichts bringen wird, da ich die Datenbank Exclusive öffne, was nach XBase weiteres Öffnen der Datenbank (zumindest mit Schreibrechten) nicht mehr möglich macht. Das funktioniert ja auch, aber wohl nicht immer in zusammenarbeit mit Win98.
Im Alaska Forum hatte jemand unter dem Title "File handle limit in XP"
gerade ein ähnliches Problem mit exlusiven öffnen ...
gruss by OHR
Jimmy
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Hubert,brandelh hat geschrieben:Hi,
ich kann mich ja täuschen, aber ich sehe keine Abfrage nach ! NetErr() !
Diese muss auch bei exclusive immer abgefragt werden, da alle möglichen Fehler dazu führen können. Wird der Fehler ignoriert, müsste das zwar später bemerkt werden, aber besser gleich blocken.
wenn du die Funktion DBNummerOpen ansiehst, findest du da folgenden Block:
Code: Alles auswählen
...
BEGIN SEQUENCE
use Nummern alias Nummern via "FOXCDX" new exclusive
IF ! neterr()
lOk := .t.
else
lOk := .f.
endif
RECOVER
...
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
hi,
hängen bleiben.
nur TCP/IP oder noch ein Protokoll ? wenn mehrere welches "first" ?
verwendes du "mapped drive letter" oder UNC Bezeichnung ?
waren die vielleicht vorher an einen Novell Server angeschlossen und
haben den NW-Client verwendet ?
Power Management oder Screen Saver ?
zu Xbase++
wird GetNummer() per Thread aufgerufen ?
wird GetNummer() direkt aus dem Menue oder "tiefer" im Programm ?
weiterer Vorschlag : die vergebene Nummer nochmals gegenprüfen ob
z.bb eine solche Auftragsnummer schonj im Bestand vorhanden ist.
gruss by OHR
Jimmy
ja aber theoretisch könnte er in der Schleife :andreas hat geschrieben: wenn du die Funktion DBNummerOpen ansiehst, findest du da
Code: Alles auswählen
do while ! DBNummerOpen()
sleep(5)
enddo
hm ... Win98se TCP/IP ? ... VREDIR.VXD ... da war doch was ...andreas hat geschrieben: Das funktioniert ja auch, aber wohl nicht immer in zusammenarbeit mit Win98.
nur TCP/IP oder noch ein Protokoll ? wenn mehrere welches "first" ?
verwendes du "mapped drive letter" oder UNC Bezeichnung ?
waren die vielleicht vorher an einen Novell Server angeschlossen und
haben den NW-Client verwendet ?
Power Management oder Screen Saver ?
zu Xbase++
wird GetNummer() per Thread aufgerufen ?
wird GetNummer() direkt aus dem Menue oder "tiefer" im Programm ?
weiterer Vorschlag : die vergebene Nummer nochmals gegenprüfen ob
z.bb eine solche Auftragsnummer schonj im Bestand vorhanden ist.
gruss by OHR
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
War wohl doch schon zu spätandreas hat geschrieben:Hallo Hubert,brandelh hat geschrieben:Hi,
ich kann mich ja täuschen...
wenn du die Funktion DBNummerOpen ansiehst, findest du da folgenden Block:Ich habe schon alle Möglichkeiten eingeschlossen, die ich kenne.Code: Alles auswählen
... BEGIN SEQUENCE use Nummern alias Nummern via "FOXCDX" new exclusive IF ! neterr() lOk := .t. else lOk := .f. endif RECOVER ...
Gruß
Hubert
Hubert
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Jimmy,
Das ist auch so gewollt. Das Programm darf nicht weiter kommen, so lange die Nummer nicht ermittelt wurde.AUGE_OHR hat geschrieben:ja aber theoretisch könnte er in der Schleife :andreas hat geschrieben: wenn du die Funktion DBNummerOpen ansiehst, findest du dahängen bleiben.Code: Alles auswählen
do while ! DBNummerOpen() sleep(5) enddo
nur TCP/IPAUGE_OHR hat geschrieben: nur TCP/IP oder noch ein Protokoll ? wenn mehrere welches "first" ?
mapped drive letterAUGE_OHR hat geschrieben: verwendes du "mapped drive letter" oder UNC Bezeichnung ?
Es war nie ein Novell-Client drauf.AUGE_OHR hat geschrieben: waren die vielleicht vorher an einen Novell Server angeschlossen und
haben den NW-Client verwendet ?
Kann ich jetzt nicht sagen, aber bestimmt keiner während der Eingabe.AUGE_OHR hat geschrieben: Power Management oder Screen Saver ?
Die Funktion wird aus der Speichern-Funktion im gleichen Thread aufgerufen.AUGE_OHR hat geschrieben: zu Xbase++
wird GetNummer() per Thread aufgerufen ?
wird GetNummer() direkt aus dem Menue oder "tiefer" im Programm ?
Anscheinend bleibt mir nichts über, als deinem Vorschlag nachzugehen und die zus. Prüfung einzubauen.AUGE_OHR hat geschrieben: weiterer Vorschlag : die vergebene Nummer nochmals gegenprüfen ob
z.bb eine solche Auftragsnummer schonj im Bestand vorhanden ist.
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Jimmy,
ich wollte gerade die Speichern-Funktion um die Überprüfung der Nummer erweitern und habe festgestellt, dass ich das schon mal gemacht habe:
D.h. dass das Problem wirklich irgendwo mit dem gleichzeitigem Zugreifen von mehreren PCs zusammenhängt.
ich wollte gerade die Speichern-Funktion um die Überprüfung der Nummer erweitern und habe festgestellt, dass ich das schon mal gemacht habe:
Code: Alles auswählen
**neue Behälternummer ermitteln und dabei prüfen, ob die schon vorhanden ist.
select Behaelter
set order to tag "behaeltnr"
do while .t.
cBehaelterNr := GetNummer("BEHAELTER")
sleep(2)
select Behaelter
IF ! dbseek( cBehaelterNr )
exit
ENDIF
enddo
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Andreas,
wie Bertram bereits schrieb:
Nicht nur Commit() nach dem Ersetzen des Feldes, sondern auch ein DbSkip(0), um den Buffer zu refreshen...
Viele Grüße,
Martin
wie Bertram bereits schrieb:
Nicht nur Commit() nach dem Ersetzen des Feldes, sondern auch ein DbSkip(0), um den Buffer zu refreshen...
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Bertram Hansen
- Foren-Moderator
- Beiträge: 1015
- Registriert: Di, 27. Sep 2005 8:55
- Wohnort: 51379 Leverkusen
- Hat sich bedankt: 28 Mal
- Danksagung erhalten: 20 Mal
- Kontaktdaten:
Hallo Martin,
es ist ein schöööönes Gefühl auch mal etwas zur Problemlösung beigetragen zu haben. Bisher habe ich von diesem hervoragendem Forum nur profitiert.
es ist ein schöööönes Gefühl auch mal etwas zur Problemlösung beigetragen zu haben. Bisher habe ich von diesem hervoragendem Forum nur profitiert.
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.
Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Bertram,
ob es Andreas wirklich geholfen hat, weiß ich ja noch nicht!
Aber ich auch mal davon aus, dass es helfen wird
Viele Grüße,
Martin
ob es Andreas wirklich geholfen hat, weiß ich ja noch nicht!
Aber ich auch mal davon aus, dass es helfen wird
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.