Nummernkreise automatisiert. [erledigt]
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21310
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 226 Mal
- Danksagung erhalten: 73 Mal
Nummernkreise automatisiert. [erledigt]
ich habe eine Kundendatei, in der es ein Feld gibt für Kundennummern. Dieses Feld soll jedesmal um 1 hochgezählt werden bei einem Insert. Es muß aber unterschieden werden in verschiedene Kategorien. Ist es die Kundenart "A", dann bitte aus dem Nummernkreis die nächsthöhere nehmen, ist es die Kundenart "B", dann bitte aus dem anderen Nummerkreis die nächsthöhere Nummer nehmen. usw. natürlich darf keine Nummer doppelt vergeben werden. Wie könnte man sowas elegant lösen? Wenn es nur 1 Kreis wäre, wäre es ja mit einem autoincrement zu lösen, aber bei verschiedenen Nummernkreisen? Schön wäre es, wenn der ADS es auch verwalten würde, das bei Parallelerfassungen keine Nummer doppelt vergeben wird.
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!!
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!!
- nightcrawler
- 1000 working lines a day
- Beiträge: 675
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 108 Mal
- Kontaktdaten:
Re: Nummernkreise automatisiert.
Hier aus meinen Trainings der Code zur Erstellung eines Generators. Die Werte für die Nummernkreise werden in einer Tabelle verwaltet. Bei Abruf wird Transaktionssicher der Wert um eins erhöht.
Verwendung:
Das kannst Du entweder direkt verwenden (im Insert) oder in einem Trigger. Als Text gibst Du den Nummernkreis an.
Edit: Falls es Dir bekannt vorkommt. Du hast auch am ADS Workshop in Willingen am 4.5.2017 teilgenommen. Einfach nochmals das Script lesen;)
Code: Alles auswählen
CREATE FUNCTION gen_id(cname cichar(255))
RETURNS integer
BEGIN
declare @numrows integer;
declare @nextid integer;
declare @rv integer;
--create generator table if not exists
if not exists(select * from system.tables where name like 'tb_generator') then
create table tb_generator(id autoinc, name cichar(255), lastid integer, rv rowversion);
endif;
--check if there's already a generator for that name
MERGE tb_generator ON name LIKE cname
WHEN NOT MATCHED THEN INSERT(name,lastid) VALUES(cname,0);
--now update that record until you got it (concurrency!)
@numrows=0;
while @numrows=0 do
@rv=(select rv from tb_generator where name like cname);
@nextid=(select lastid+1 from tb_generator where name like cname);
try
update tb_generator set lastid=@nextid where name like cname and rv=@rv;
--if there's no update, another user already updated that record
@numrows=(select ::stmt.UpdateCount from system.iota);
catch all
@numrows=0;
end try;
end while;
return @nextid;
END;
Code: Alles auswählen
SELECT gen_id('test') FROM SYSTEM.IOTA;
Edit: Falls es Dir bekannt vorkommt. Du hast auch am ADS Workshop in Willingen am 4.5.2017 teilgenommen. Einfach nochmals das Script lesen;)
- Manfred
- Foren-Administrator
- Beiträge: 21310
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 226 Mal
- Danksagung erhalten: 73 Mal
Re: Nummernkreise automatisiert.
auh man,
jetzt hast Du ordentlich Salz in die Wunde gestreut. Meine Erinnerung daran sind etwas dünn. Ich habe auch keine Ahnung, wo das Script sein könnte. Hast Du das noch irgendwo?
jetzt hast Du ordentlich Salz in die Wunde gestreut. Meine Erinnerung daran sind etwas dünn. Ich habe auch keine Ahnung, wo das Script sein könnte. Hast Du das noch irgendwo?
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!!
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!!
- nightcrawler
- 1000 working lines a day
- Beiträge: 675
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 108 Mal
- Kontaktdaten:
Re: Nummernkreise automatisiert.
ja.
- Dateianhänge
-
- 20170415 - Workbook ADS Workshop.pdf
- (292.36 KiB) 64-mal heruntergeladen
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9459
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 374 Mal
- Kontaktdaten:
Re: Nummernkreise automatisiert.
Manfred war in Willingen auch NUR AM FEIERN. Dass er sich überhaupt noch daran erinnert, mal dort gewesen zu sein, grenzt an ein Wunder. Ich hätte ihm das Script aus dem Kopf aufschreiben können.
Herzlich,
Tom
Tom
- Manfred
- Foren-Administrator
- Beiträge: 21310
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 226 Mal
- Danksagung erhalten: 73 Mal
Re: Nummernkreise automatisiert.
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!!
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!!
- Manfred
- Foren-Administrator
- Beiträge: 21310
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 226 Mal
- Danksagung erhalten: 73 Mal
Re: Nummernkreise automatisiert.
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!!
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!!
- Manfred
- Foren-Administrator
- Beiträge: 21310
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 226 Mal
- Danksagung erhalten: 73 Mal
Re: Nummernkreise automatisiert.
Die Funktion habe ich angelegt. Es kommt auch was zurück. Aber was meinst Du mit "als Text". oder meinst Du damit den Wert 'test' ?nightcrawler hat geschrieben: ↑Fr, 02. Jun 2023 12:18 Verwendung:Das kannst Du entweder direkt verwenden (im Insert) oder in einem Trigger. Als Text gibst Du den Nummernkreis an.Code: Alles auswählen
SELECT gen_id('test') FROM SYSTEM.IOTA;
da habe ich folgendes gemacht
Code: Alles auswählen
SELECT gen_id('4000000') from system.iota
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!!
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!!
- nightcrawler
- 1000 working lines a day
- Beiträge: 675
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 108 Mal
- Kontaktdaten:
- Martin Altmann
- Foren-Administrator
- Beiträge: 16609
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 121 Mal
- Danksagung erhalten: 49 Mal
- Kontaktdaten:
Re: Nummernkreise automatisiert. [erledigt]
Manfreds Problem: er möchte eine noch nicht vergebene Nummer - wobei der Generator beginnen soll bei 4.000.000 - also die nächste unbenutzte Nummer ab 4 Millionen liefern soll.
Nur damit ihr nicht wieder aneinander vorbei schreibt...
Viele Grüße
Martin
Nur damit ihr nicht wieder aneinander vorbei schreibt...
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.
- Manfred
- Foren-Administrator
- Beiträge: 21310
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 226 Mal
- Danksagung erhalten: 73 Mal
Re: Nummernkreise automatisiert. [erledigt]
OK,
ich glaube ich habe es kapiert.
ich glaube ich habe es kapiert.
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!!
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!!
- Manfred
- Foren-Administrator
- Beiträge: 21310
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 226 Mal
- Danksagung erhalten: 73 Mal
Re: Nummernkreise automatisiert. [erledigt]
ich hatte den Zusammenhang überhaupt nicht erkannt. Es wird eine weitere Tabelle im DD angelegt, in der die Werte gespeichert werden. Die Function (könnte ja auch eine eigene im programm sein, ist aber dann nicht zählsicher) im DD wird aufgerufen und erzeugt dann immer wieder die benötigten Zahlen. Mir ist trotz mehrmaligen Schauen nicht aufgefallen, das eine neue Tabelle im DD erzeugt wurde. (in dem Falle tb_generator) ich nhabe sie einfach übersehen. Weil nicht erwartet. Jetzt ist alles klar. Die Werte werden einfach in die Tabelle eingetragen und dann macht die Function den Rest. War mal wieder zu einfach um es sofort zu erkennen..... menno.
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!!
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!!
- nightcrawler
- 1000 working lines a day
- Beiträge: 675
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 108 Mal
- Kontaktdaten:
Re: Nummernkreise automatisiert. [erledigt]
wie in meinem ersten Post genannt:
Die Werte für die Nummernkreise werden in einer Tabelle verwaltet.
- Manfred
- Foren-Administrator
- Beiträge: 21310
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 226 Mal
- Danksagung erhalten: 73 Mal
Re: Nummernkreise automatisiert. [erledigt]
Hatte ich total überlesen, bzw. nicht registriert. Ich hatte das Konzept zu dem Zeitpunkt überhaupt nicht verinnerlicht.
Meine Frage wäre aber noch, wie sicher ist das gegen doppelte Vergabe von Nummern? So ein Konzept hatte ich früher ohne ADS auch und da habe ich jedesmal die Nummerntabelle exklusiv geöffnet und somit verhindert, das Nummern doppelt vergeben werden konnten.
Meine Frage wäre aber noch, wie sicher ist das gegen doppelte Vergabe von Nummern? So ein Konzept hatte ich früher ohne ADS auch und da habe ich jedesmal die Nummerntabelle exklusiv geöffnet und somit verhindert, das Nummern doppelt vergeben werden konnten.
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!!
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!!
- nightcrawler
- 1000 working lines a day
- Beiträge: 675
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 108 Mal
- Kontaktdaten:
Re: Nummernkreise automatisiert. [erledigt]
100% sicher bei bei remote server, da rowversion abgefragt wird.
- Manfred
- Foren-Administrator
- Beiträge: 21310
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 226 Mal
- Danksagung erhalten: 73 Mal
Re: Nummernkreise automatisiert. [erledigt]
und wo liegt hier der Denkfehler?
hier wird nicht bei jedem Satz hochgezählt nur beim ersten Mal. Wird das nicht bei jedem Satz erneut aufgerufen, oder nur 1x und dann für alle restlchen so übernommen?
Code: Alles auswählen
UPDATE mandanten SET kundennummer=(SELECT gen_id('Schüler') from system.iota)
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!!
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!!
- nightcrawler
- 1000 working lines a day
- Beiträge: 675
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 108 Mal
- Kontaktdaten:
Re: Nummernkreise automatisiert. [erledigt]
Hallo Manfred,
genauso ist es. Du legst einmal den Wert fest und änderst alle Datensätze auf genau diesen Wert.
Besser: Trigger erstellen und dann bei Nichtvorhandensein der Nummer, diese einfügen:
Dan ein Update über alle Datensätze
genauso ist es. Du legst einmal den Wert fest und änderst alle Datensätze auf genau diesen Wert.
Besser: Trigger erstellen und dann bei Nichtvorhandensein der Nummer, diese einfügen:
Code: Alles auswählen
CREATE TRIGGER upd_mandanten ON mandanten AFTER UPDATE
BEGIN
UPDATE mandanten SET kundennummer=gen_id('Schüler') WHERE kundennummer IS NULL and ROWID=::stmt.TrigRowid;
END
Code: Alles auswählen
UPDATE mandanten SET kundennummer=kundennummer;
- Manfred
- Foren-Administrator
- Beiträge: 21310
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 226 Mal
- Danksagung erhalten: 73 Mal
Re: Nummernkreise automatisiert. [erledigt]
Danke Joachim,
war mal wieder mein Denkfehler. Habe den Ablauf falsch erkannt. Select hat da nichts zu suchen.
war mal wieder mein Denkfehler. Habe den Ablauf falsch erkannt. Select hat da nichts zu suchen.
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!!
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!!