Im numerischen Index freie Werte finden

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Im numerischen Index freie Werte finden

Beitrag von Werner_Bayern »

Servus,

wir haben einen numerischen Index, der Lücken enthalten kann:

.
.
.
301
302
304
305
306
307
311
312

Jetzt soll die nächste freie Nummer gesucht werden, jedoch nur innerhalb der letzten x Einträge. Gibt’s da eine schnellere Lösung außer ein

Code: Alles auswählen

DbGoBottom()
do while …

  dbSkip(1)
  if …
enddo
es grüßt

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von georg »

Guten Morgen, Werner -


mir fällt da kein Lösungsweg ein, der auf der Schiene besser wäre - vielleicht kommt ja ein Vorschlag, ich denke, da gibt es vielleicht die eine oder andere Möglichkeit.

Wenn die Lücken entstehen, da Datensätze gelöscht werden, würde ich (so habe ich das in einer Applikation gelöst) eine Schlüsseldatei führen. Wird ein Satz gelöscht, wird dessen ID in die Schlüsseldatei geschrieben. Wird ein neuer Satz geschrieben, wird erst in der Schlüsseldatei nachgesehen, ob ein freier Platz vorhanden ist, und die ID verwendet und aus der Schlüsseldatei gelöscht, ansonsten wird der neue Satz mit dem höchsten Schlüsselwert + 1 angelegt.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Im numerischen Index freie Werte finden

Beitrag von Marcus Herz »

Geht auch eine SQL Lösung?
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Im numerischen Index freie Werte finden

Beitrag von Tom »

Ich würde das auch gesondert verwalten (und ggf. durch Servicefunktionen überprüfen, etwa im Rahmen der Datenwartung), denn ein solches System hat zur Folge, dass man im Zweifelsfall jedes Mal ergebnislos sucht, weil es tatsächlich keine freien Plätze gibt.
Es sind zwei Informationen von Interesse: a) Die höchste vergebene Nummer - das ist leicht. Und b) die höchste recycelte. Da es einen Prozess geben muss, der Nummern für das Recycling freigibt, würde ich dort ansetzen, also diese Nummern wegspeichern (und im Fall des Recyclings von dort entfernen).
Herzlich,
Tom
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von Werner_Bayern »

Servus Georg,

danke, interessanter Ansatz. Da aber an versch. Stellen gelöscht werden kann - manuell oder durch die Anwendung - ist mir das zu triggy / aufwändig, bzw. kann Folgefehler erzeugen, die ich mir nicht leisten kann und will.

Dann muss der Kunde die max. 0,5 Sekunden Wartezeit in Kauf nehmen.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von Werner_Bayern »

Marcus Herz hat geschrieben: Mo, 07. Jun 2021 8:49 Geht auch eine SQL Lösung?
Dann wärs ja einfach :)
Nein, alter Code mit dbf.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von Werner_Bayern »

Servus Tom,

genau so ist es. Siehe meine Antwort an Georg: Aufwand und Risiko sind mir da zu hoch.
Da mach ich lieber eine neue Systemeinstellung, in der der Kunde die Anzahl angegeben kann, die maximal rückwärts durchsucht wird.

Meine Hoffnung war, dass es evtl. eine geniale Lösung über dbseek mit lLast oder über den Indexausdruck gibt...
es grüßt

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von georg »

Hallo, Werner -


eine SQL-Variante könnte etwa so aussehen:

Code: Alles auswählen

SELECT kdnr + 1 AS kdnrnew FROM KUNDEN WHERE kdnr + 1 NOT IN (SELECT kdnr FROM KUNDEN)
Du greifst also mit der nächsten Nummer zu und prüfst, ob dieser Wert nicht vorhanden ist. Wird er nicht gefunden, kommt er in die Ergebnismenge.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von Werner_Bayern »

es grüßt

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von georg »

Sorry, Werner -


da hatte ich Deinen Beitrag missverstanden. Aber vielleicht geht's mit UNIVERSAL SQL? Alaska hat da ja einiges möglich gemacht.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von Werner_Bayern »

Servus Georg,

kein Thema. An Universal-SQL hab ich auch schon gedacht, aber ich wette 1:100, dass das nicht oder nicht schneller funktioniert.

Danke, aber ich machs jetzt wie oben geschrieben über eine Systemeinstellung und do while.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Im numerischen Index freie Werte finden

Beitrag von Herbert »

Werner,
Warum auch immer keine Lücken sein sollen...

Du kannst z.B. nach dem Programmstart eine Routine laufen lassen, die im Hintergrund die (ev. nur letzten 20) freien Nummern sucht und festhält.
Bei der nächsten Verwendung holst aus diesem Antwort-Array das erste Element, checkst und verwendest dieses. Anschliessend wird es dort gelöschs.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von Werner_Bayern »

Servus Herbert,

auch ein interessanter Ansatz, jedoch im Multi-User-Betrieb nicht konsistent...
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Im numerischen Index freie Werte finden

Beitrag von nightcrawler »

Hallo Werner,
und wenn Du eine Tabelle mit den freien führst und mit Triggern automatisch befüllst? Dann geht es auch im Multiuser.
Bei ADS ungefähr so:

Code: Alles auswählen

create trigger trig_del on mytable after delete
begin
  insert into num_cache(nummer) select nummer from __old;
end;

create trigger trig_ins on mytable after insert
begin
  delete from num_cache where nummer = select nummer from __new;
end;
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 75
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 5 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von komnick »

Hallo Werner,

du könntest auch die fehlenden Nummern in Form von gelöschten Datensätzen in der Datenbank behalten.

Wenn die Datenbank die gelöschten Sätze noch enthält (also nicht gepackt wurde), könntest du das DELETED-Kennzeichen in einen Index einbauen und über diesen Index schnell den ersten (oder nächsten) gelöschten Satz suchen.

Allerdings musst du trotzdem prüfen, ob es zu dem gelöschten Satz nicht außerdem noch einen ungelöschten Satz mit gleicher Nummer gibt (und ggf. den nächsten gelöschten Satz suchen).

Außerdem musst du beim Packen aufpassen, denn nach dem Packen müsstest du dann eine Routine laufen lassen, die dir zu jeder fehlenden Nummer wieder einen gelöschten Satz anlegt. Und dieser "erweiterte" Packvorgang muss auch regelmäßig stattfinden, damit du nicht immer wieder dieselben gelöschten Datensätze durchsuchst, deren Nummern inzwischen schon wiederverwendet wurden.

Liebe Grüße
Martin
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Im numerischen Index freie Werte finden

Beitrag von brandelh »

Die Frage bleibt, warum das Ganze ?

Ich verwende nie eine alte ID für einen neuen Satz.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Im numerischen Index freie Werte finden

Beitrag von Tom »

Die Frage habe ich mir auch gestellt, Hubert. Gelegentlich hört man diese Anforderung von Kunden, die sich die Wiederverwendung von Beleg- und Rechnungsnummern wünschen, weil das einfacher ist, als dem FA ein Storno zu erklären und es zu belegen. Zulässig wäre es in diesem Fall allerdings nicht.

Wenn es um Nummern geht, die für interne Referenzen verwendet werden, sei immer wieder darauf verwiesen, dass die Verwendung von (U)UIDs viel komfortabler und sogar interoperabel ist. Wir verwenden echte, fortlaufende Nummern nur noch dort, wo es tatsächlich nötig ist, wo also die Nummern nach außen sichtbar sind und ggf. sogar von Dritten verwendet werden, also Kunden- und Rechnungsnummern und ähnliches. Aber auch die werden nicht mehr für Verknüpfungen verwendet.
Herzlich,
Tom
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 75
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 5 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von komnick »

Tom hat geschrieben: Do, 10. Jun 2021 9:40 Gelegentlich hört man diese Anforderung von Kunden, die sich die Wiederverwendung von Beleg- und Rechnungsnummern wünschen, weil das einfacher ist, als dem FA ein Storno zu erklären und es zu belegen. Zulässig wäre es in diesem Fall allerdings nicht.
Ich könnte mir vorstellen, dass Rechnungsnummern reserviert wurden in der Absicht, Rechnungen zu schreiben, die dann tatsächlich nicht geschrieben wurden. Dann gibt es keine Buchung und kein Storno, und man muss die Reservierung wieder entfernen.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Im numerischen Index freie Werte finden

Beitrag von Tom »

Ich habe gerade mal ein bisschen die Rechtslage studiert. Die Finanzämter wünschen sich fortlaufende, lückenlose Rechnungsnummern, aber mehrere Finanz- und Verwaltungsgerichtsentscheidungen haben klargestellt, dass es genügt, einmalige Rechnungsnummern zu vergeben, ganz egal, ob das lückenlos oder mit wilden Sprüngen zwischen den Zahlen geschieht (die den Kunden suggerieren sollen, man würde wie der Teufel Rechnungen schreiben) - oder wie die Nomenklatur überhaupt ist (Buchstaben, Sonderzeichen usw.).

Eine Rechnungsnummer, die nach draußen gegangen ist, darf man nicht wiederverwenden. Eine, mit der das nicht geschehen ist, kann auch verwendet werden, obwohl es bereits eine höhere Folgenummer gibt.

Aus dem täglichen Erleben bei Kunden: Wenn mit fortlaufenden und scheinbar konsistenten Nummernkreisen gearbeitet wird und es kommt zur Prüfung, wird energisch erfragt, was mit den vermeintlich fehlenden Nummern geschehen ist. Die Prüfer vermuten sofort Betrug.
Herzlich,
Tom
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von Werner_Bayern »

Tom hat geschrieben: Do, 10. Jun 2021 11:19 Eine Rechnungsnummer, die nach draußen gegangen ist, darf man nicht wiederverwenden. Eine, mit der das nicht geschehen ist, kann auch verwendet werden, obwohl es bereits eine höhere Folgenummer gibt.

Aus dem täglichen Erleben bei Kunden: Wenn mit fortlaufenden und scheinbar konsistenten Nummernkreisen gearbeitet wird und es kommt zur Prüfung, wird energisch erfragt, was mit den vermeintlich fehlenden Nummern geschehen ist. Die Prüfer vermuten sofort Betrug.
Darum geht's bei diesem Kunden. Lücken entstehen, das ist normal, Martin hats beschrieben.

Letzten Satz hören wir auch immer wieder mal, den können wir aber mit Martins Aussage immer zu 100% entkräften - da gabs noch nie ein Problem. Klar, der Prüfer schnauft dann, aber das ist ja gut für ihn :)
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von Werner_Bayern »

nightcrawler hat geschrieben: Do, 10. Jun 2021 8:53 Hallo Werner,
und wenn Du eine Tabelle mit den freien führst und mit Triggern automatisch befüllst? Dann geht es auch im Multiuser.
Servus Joachim,

wie schon geschrieben, in diesem Fall geht's um DBF, kein SQL.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Im numerischen Index freie Werte finden

Beitrag von brandelh »

Ich frage mich was ein Prüfer sagt, wenn die kleinere Rechnungsnummer ein späteres Datum hat ?

Aber zum Glück muss ich mich damit nicht rum schlagen ;-)
Gruß
Hubert
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Im numerischen Index freie Werte finden

Beitrag von ramses »

Tom hat geschrieben: Do, 10. Jun 2021 11:19 Aus dem täglichen Erleben bei Kunden: Wenn mit fortlaufenden und scheinbar konsistenten Nummernkreisen gearbeitet wird und es kommt zur Prüfung, wird energisch erfragt, was mit den vermeintlich fehlenden Nummern geschehen ist. Die Prüfer vermuten sofort Betrug.
Deshalb stellen wir die Rechnungsnummer schon lange aus dem Datum und einer pro Tag einmaligen Zufallszahl zusammen.

zB. 210610452 eine Rechnungsnummer von heute.

So sind über die Nummern ausser dem Datum keine Rückschlüsse auf irgendwas mehr möglich.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Im numerischen Index freie Werte finden

Beitrag von Marcus Herz »

Auf der Rechnung muss eine fortlaufende Nummer vermerkt sein. Als Rechnungsnummern sind nicht nur Ziffern, sondern auch Kombinationen mit Buchstaben zulässig, z. B. B-007-KR-2004. Solange die Rechnungsnummern eindeutig sind, dürfen auch mehrere Nummernkreise, z. B. nach Inland, Ausland, Filialen, gebildet werden.

Damit ist grundsätzlich eine durchgehende lückenlose Nummerierung gefordert.
Das sind die deutschen Regeln
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Im numerischen Index freie Werte finden

Beitrag von Tom »

Das ist "gefordert" bzw. "gewünscht", Marcus, aber - wie ich weiter oben geschrieben habe - Gerichte haben entschieden, dass die Finanzämter damit nicht durchkommen. Rechnungsnummern können tatsächlich beliebige Identifikatoren sein, und die einzige rechtlich haltbare Vorschrift ist die, dass keine Doppelvergabe erfolgen darf. Auch die Reihenfolge ist im Prinzip frei wählbar.

Was der einzelne Finanzbeamte Wirtschaftsprüfer dann erklärt, ist leider wieder eine andere Sache.
Herzlich,
Tom
Antworten