Eineindeutigen Schlüssel generieren - wie?

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Tom,
im Prinzip ja - nur:
  • Zum einen will ich eigentlich an das Archiv erst ran, wenn die Session beendet ist und der Kunde seinen Ausdruck hat - dazu brauche ich aber die Nummer!
  • Zum anderen werde ich regelmässig (zumindest aber manuell) alle Hunde aus dem Archiv löschen, die älter als 15 Jahre sind!
Manfred, sorry - war nicht bewußt geschehen!

Viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi Martin,

also bei meinem alten Arbeitgeber hatten wir eine Datenbank in der alle maßgebenden Schlüssel für die verschiedenen Bereiche enthalten waren.

Wurde ein Datensatz im entsprechenden Bereich neu angelegt, so wurde in der Sammeldatenbank der Wert erhöht und die Nummer in der Datenbank des entsprechendes Bereiches abgespeichert. Hinzu kam noch
daß davor eine Versionsnummer gesetzt wurde.

Dies war ein Versicherungsprogramm. Also Kundendb, vertragsdb, schadendb -- ect.-

Wie wäre das denn ?
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Rolf,
ich habe halt das Problem, dass mehrere Threads parallel laufen können und demnach auch mehrere Zugriffe parallel erfolgen können.
Und dabei darf nichts aus dem Tritt geraten...

Viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Manfred hat geschrieben:deshalb "frugte" ich ob
oh Manfred, ich hoffe TOM schickt jetzt nicht seine Anwälte los wegen der missbräuchlichen Verwendung seiner Wortschöpfung :D

PS: Bei Künstlern nennt man Wortschöpfung, was die Lehrer früher als Fehler deklariert haben 8)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

da sehe ich beruhigt in die Zukunft. Leider Gottes gibt es dieses "frug" schon länger als es Tom und mich gibt. (sogar addiert)

:lol:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Martin.

Das Problem mit den Threads verstehe ich nicht. Du schreibst eine Funktion, die eine Tabelle so lange zu öffnen versucht, bis es geht (also NetErr() nicht mehr feuert - ich erinnere mich, daß Du alle Tabellen exclusiv öffnest), dann das einzige Feld des Datensatzes um 1 inkrementiert und diesen inkrementierten Wert zurückliefert. Zackbummaus. Wo ist das Problem?

Code: Alles auswählen

FUNCTION NaechsterWert()
LOCAL nNWert := 0, cMeinAlias := Alias()
Select 0
USE naechsterwert ALIAS nw
DO WHILE NetErr()
  Sleep(5) // um nicht zu viel Traffic zu erzeugen
  USE naechsterwert ALIAS nw
ENDDO
DbGoTop()
nNwert := nw->wert + 1
nw->wert := nNwert
CLOSE
DbSelectArea(cMeinAlias)
RETURN nNWert
Oder ähnlich, sicher auch eleganter.
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Tom,
es geht dabei um meinen Webserver, nicht um meine lokale Applikation!
Da habe ich natürlich keinen exklusiven Zugriff (wäre fatal, weil langwierig) und natürlich auch beliebig viele Threads parallel...
Insofern habe ich mir überlegt, nicht aus jedem Thread direkt auf das Archiv zuzugreifen, sondern das über eine zentrale Funktion abzufackeln, die aber nicht mehrmals zeitgleich laufen darf, also die Zugriffe immer schön seriell abarbeitet.
Beim Starten des Servers wird dann das Archiv geöffnet und dauerhaft offen gehalten, sowie der Index neu aufgebaut.
In dieser Funktion wird dann der Schlüsselbegriff verwaltet - geht das mit Static wie oben von mir skizziert?
Wie macht man denn dann das ganze mit dem Synchronisieren - hat da einer schon Erfahrungen gesammelt? In der Hilfe steht da ja was zu mit SYNC...

Viele Grüße,
Martin
:grommit:
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.
jbertram
Rookie
Rookie
Beiträge: 12
Registriert: Mo, 02. Okt 2006 17:22
Wohnort: Kelkheim

windows-guuid benutzen

Beitrag von jbertram »

Wie unten aufgeführt, kann man auch die Basisfunktion von Windows dafür benutzen
UUID Werte sind "guaranteed unique in space and time"
( es gibt viel für die Theorie zu dem Thema )

muuid ist eine binary Zahl, cuuid macht daraus 36 Byte breite lesbare und transportierbaren String


Jörg Bertram













function muuid16(xnot)
local cbin,lret,xuct:=0,xret:=0
&& hier wird eine uuid-Nr ohne chr(0) geholt (kann als 16 byte String abgespeichert werden)
do while (xuct:=xuct+1)<1000
cBin := space(16)
xret:=DllCall("rpcrt4.DLL", DLL_STDCALL, "UuidCreate",@cbin,,,0)
if xret#0
loop
endif
if xnot#nil
if chr(xnot) $ cbin
loop
endif
endif
exit
enddo
if xret#0 .or. (xnot#nil .and. chr(xnot) $ cbin)
&& Errorausgang weil keine brauchbare uuid-Nummer generiert werden konnte!
if xret="X"
endif
endif
return cbin

function cuuid(xuid)
local mcuid
mcuid:=strtohex(xuid)
return substr(mcuid,1,8)+"-"+substr(mcuid,9,4)+"-"+substr(mcuid,13,4)+"-"+substr(mcuid,17,4)+"-"+substr(mcuid,21,12)
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jörg,
auch ein interessanter Ansatz - vielen Dank!
Nur traue ich dem nicht so ganz, da ich da nicht so den Einfluss drauf habe.
Abgesehen davon will ich ja einen kürzeren Schlüssel haben, aber interessant ist das sicherlich für andere Situationen, insofern vielen Dank!

Viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
Martin Altmann hat geschrieben: es geht dabei um meinen Webserver, nicht um meine lokale Applikation!
hm ... mit einem Browser (IE & Co.) als Client ?
wenn Ja : und was machst du wenn der User mit "zurück/vorwärtz"
im Browser "blättert" ?

vielleicht sollte man die ID_KEY erst am "Ende", wenn der User "Ok"
klickt, verteilen ?

Dabei ist die Lösung von Tom , mit einem kurzfristigem "exclusiven"
zugriff von jedem Thread, die die auch ich nehmen würde.

"erweitern" könnte man Tom´s Lösung noch um einen Errorblock(),
damit man ein fehlgeschlagenes "commit" per "DbRRollback()" durch-
führen kann um den "Zähler" zu "restore"n.

Dabei finde ich es völlig egal wie der ID_KEY nun aussieht, wobei ein
nummerischer wohl der einfachste ist.

gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jimmy,
wenn der User die Backtaste drückt, ist die Session weg und er muss von vorne anfangen.
Dass ich die ID ganz am Ende generieren will, hatte ich ja auch am Anfang geschrieben.
Exklusiver Zugriff ja, aber kanalisiert durch eine Funktion. Ich kann nicht das Archiv permanent Öffnen und schließen - das bedeutet bei mehreren 1000 Einträgen einen Riesenzeitaufwand!! Darum will ich das Archiv beim Starten des Servers Öffnen und aufhalten und die Indexdatei neu anlegen. Der Zugriff auf das Archiv soll dann von allen Threads aus durch genau eine Function erfolgen. In dieser Function wird der Zähler per static vorgehalten und immer erhöht um eins - durch das static sollte der alte Wert bei jedem erneuten Aufruf innerhalb der Function ja weiterhin bekannt sein, oder?
Mir geht es jetzt nur darum, zu verhindern, dass diese Function von zwei Threads (A+B) zeitgleich parallel aufgerufen wird! Ich muss also irgendwie dafür sorgen, dass Thread B in den Wartezustand geht, sobald die Function durch Thread A genutzt wird...
Geht sowas mit SYNC? Und wenn ja, wie?

Viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Moin Martin,
das Problem der Synchronisation von konkurrienden Threads löse ich durch eine Public-Variable.
In meinem Fall führt jeweils ein Thread ein Daten-Upload durch, ein anderer ein Daten-Download. Beide Threads werden jeweils periodisch ausgeführt. Der jeweilige Thread prüft über eine Varibale ( z.B. lAktiv = .T. ) zunächst, ob der konkurriende Thread noch aktiv ist und wartet ggf. auf die Freigabe der Variable:

Code: Alles auswählen

WHILE ( m->lActive == .T. )
      Sleep(200) // Warte 2 sec.
ENDDO
m->lActive := .T.
Gruß, Olaf
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Olaf,
auch eine Idee....

Vielen Dank und viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Martin,

wenn du es mit einem Thread lösen möchtest, solltest du diesen als eine Klasse schreiben, die eine SYNC Methode zum Vergeben der Nummern hat. Da diese Methode dann nur nacheinander aufgerufen werden kann, solltest du auch keine Probleme damit haben. Mit ThreadWait() oder Signal() könntest du diesen Thread auch einfrieren oder wieder freigeben.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Martin,

kannst du denn in deinem Web-Server-Programm eine Public-Variable setzen. Dann könntest du es vielleicht darüber mit der Klasse lösen, ohne extra Thread aufzumachen.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Andreas,
Public ist kein Problem, das geht.
Die Threads, die die einzelnen Anfragen an den Server darstellen, werden durch Xb2.NET generiert - da habe ich keinen direkten Einfluß drauf. Soll heißen: es sind nur Prozeduren, die einander aufrufen.

Viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Martin,

hier habe ich auf die Schnelle ein Programm gebastellt.

Ergebniss:
Thread1; 12:05:39;43539.48 ;20070001
Thread2; 12:05:39;43539.48 ;20070002
Thread3; 12:05:39;43539.48 ;20070003
Thread3; 12:05:39;43539.51 ;20070004
Thread2; 12:05:39;43539.51 ;20070005
Thread1; 12:05:39;43539.51 ;20070006
Thread2; 12:05:39;43539.55 ;20070007
Thread3; 12:05:39;43539.55 ;20070008
Thread1; 12:05:39;43539.55 ;20070009
Thread1; 12:05:39;43539.58 ;20070010
Thread3; 12:05:39;43539.58 ;20070011
Thread2; 12:05:39;43539.58 ;20070012
Wie du sehen kannst, gibt es auvh zur gleichen Zeit eindeitige Nummer.
Die Nummerlänge kannst dann selber festlegen.

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "dll.ch"

PROCEDURE DBESYS()

	IF ! DbeLoad( "FOXDBE", .T.)
		msgbox( "Database-Engine FOXDBE nicht geladen", {"OK"} )
	ENDIF

	IF ! DbeLoad( "CDXDBE", .T.)
		msgbox( "Database-Engine CDXDBE nicht geladen", {"OK"} )
	ENDIF

	IF ! DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" )
		msgbox( "FOXCDX Database-Engine;" + ;
			"konnte nicht erzeugt werden" , {"OK"} )
	ENDIF

RETURN

PROCEDURE Main()
	Public oThread1 := Thread():New()
	Public oThread2 := Thread():New()
	Public oThread3 := Thread():New()
	Public cIdDatei := "id.dbf"
	Public oNummer

	oThread1:setInterval( 2 )
	oThread2:setInterval( 2 )
	oThread3:setInterval( 2 )

	oThread1:cargo := "Thread1"
	oThread2:cargo := "Thread2"
	oThread3:cargo := "Thread3"

	Datei( cIdDatei )

	oNummer := IDClass():New( cIdDatei )

	oThread1:start( {|| Prozess() } )
	oThread2:start( {|| Prozess() } )
	oThread3:start( {|| Prozess() } )

	? "Hauptprozess angehalten"
	sleep(5*100)
	oThread1:setInterval( NIL )
	oThread2:setInterval( NIL )
	oThread3:setInterval( NIL )
	oNummer:destroy()
	quit

RETURN

FUNCTION Datei( cDatei )
	local aStruckt := {;
		{"Jahr", "N", 4, 0},;
		{"lastID", "N", 4, 0};
		}

	IF ! file( (cDatei) )
		dbcreate( (cDatei), aStruckt, "FOXCDX" )
	ENDIF

RETURN nil


FUNCTION Prozess()
	local cProzess := ThreadObject():cargo

	oNummer:GetID( cProzess )

RETURN nil



CLASS IDClass
	EXPORTED:
	METHOD Init
	METHOD Destroy
	SYNC METHOD GetID
	SYNC METHOD SetMeldung

	Var cMeldungen
	Var cDatei
	Var nDB
	Var lOk

ENDCLASS

METHOD IDClass:Init( cDatei )

	::cMeldungen := ""
	::cDatei := cDatei

RETURN self

METHOD IDClass:SetMeldung( xWert )
	? var2char(xWert)
	::cMeldungen += var2char(xWert) + chr(13)+chr(10)
RETURN self

METHOD IDClass:Destroy()
	memowrit("log.txt", ::cMeldungen )

RETURN self

METHOD IDClass:GetID( cThread )
	local nID := 0
	local nZurueck := 0
	local nJahr := 0

	use (::cDatei) alias id new exclusive via "FOXCDX"
	IF ! neterr()
		::nDB := alias()
		::lOK := .t.
		IF reccount()==0
			(::nDB)->(dbappend())
			replace (::nDB)->jahr with year(date())
			replace (::nDB)->lastID with 0
			(::nDB)->(dbcommit())
		ENDIF

		(::nDB)->(dbgoto(1))

		IF (::nDB)->jahr < year(date())
			replace (::nDB)->jahr with year(date())
			replace (::nDB)->lastID with 0
			(::nDB)->(dbcommit())
		ENDIF
		nJahr := (::nDB)->jahr
		nID := (::nDB)->lastID + 1
		replace (::nDB)->lastID with nID
		(::nDB)->(dbcommit())
		nZurueck := val(alltrim(str(nJahr)) + strzero(nID,4))
		::SetMeldung( cThread + "; " + time() + ";" + var2char(seconds()) + " ;" + alltrim(var2char(nZurueck)) )
		close (::nDB)
	else
		::lOK := .f.
		::SetMeldung( "Datenbank konnte nicht geöffnet werden!" )
	ENDIF


RETURN nZurueck
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Andreas,
vielen Dank! Da habe ich ja dann mal was zum rumspielen.
Du hast das ja über eine eigene DB gelöst, ich werde nächste Woche mal versuchen, das intern über eine Klassenvariable zu realisieren...

Viele Grüße,
Martin
:grommit:
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.
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Martin,

Klassenvariable sorgt vielleicht für die Geschwindigkeit aber nich für die Sicherheit. Du muss ja beim Programmstart deinen letzten ID-Wert irgendwoher bekommen und am Ende auch wieder ablegen. Beim Programmabsturz bzw. Abbruch vierlierst du den Wert.
Du könntest dann auch in meiner Klasse den Wert in Init auslesen und in Destroy wieder speichern. Die IDs dann in GetID hochzählen.
Aber wieder keine Sicherheit.

Um die Nummer zu verkürzen könntest du z.B. auch die erzeugte Nummer je 2 Stellen aufteilen und durch Buchstaben ersetzen, wenn der Code im Buchstabenbereich liegt, damit der Kunde diese in so einem Zusand bekommt. Wenn du die Nummer dann zurückbekommst, kannst du diese durch das Programm in den Ausgangszustand bringen und erst dann weiterverarbeiten. An dieser Stelle kann man bestimmt viel ausdenken.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Andreas,
bei Start der Servers öffne ich das Archiv und lege den Index neu an.
Dabei kann ich dann auch völlig problemlos den momentan höchsten, vergebenen Schlüssel bestimmen.

Viele Grüße,
Martin
:grommit:
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.
Michael
Rookie
Rookie
Beiträge: 18
Registriert: Mo, 27. Feb 2006 12:15
Wohnort: Schweiz

Beitrag von Michael »

Ich kenn mich nicht so aus bei Internet Programmierungen aber....

SYNC METHOD <MethodName>
Wenn ein Objekt in mehreren Threads gleichzeitig sichtbar ist, so stellt das SYNC Attribut sicher, daß der Programmcode einer Methode vollständig in einem Thread abläuft, bevor eine andere SYNC Methode des Objekts in einem anderen Thread ausgeführt werden kann.
geht SYNC auch in WebApplicationen? Wäre das Problem mit dem Loc gelöst (?)
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michael,
vielen Dank - das wollte ich diese Woche mal ausprobieren. Ich will mal das Beispiel von Andreas nehmen und umstricken auf eine Klase mit einer internen Schlüssel-Variablen.
Mal sehen, ob es so klappt.

Viele Grüße,
Martin
:grommit:
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.
Antworten