Nächste Nummer suchen[ERLEDIGT]

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

Moderator: Moderatoren

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: Nächste Nummer suchen

Beitrag von Herbert »

Lösbar ist alles.
Aber Gefahren vermeiden, wenn möglich und einfach bleiben.
Darum:
1. Kein Auffüllen fehlender Nummern (tut nicht weh)
2. Zähler in der Grösse verändern
3. wenn Thomas' Situation mit mangeldem Platz auftaucht,
finde ich die do while Schlaufe das einfachste. Keine Kontrollen, keine Blanks setzen, keine zusätzlichen Felder und Einträge.
Grüsse Herbert
Immer in Bewegung...
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: Nächste Nummer suchen

Beitrag von Tom »

Kein Auffüllen fehlender Nummern (tut nicht weh)
Zumal hier auch noch die Gefahr besteht, dass in weiteren Tabellen freigewordene Nummern referenziert sind, so dass mit Wiederverwendung alter Nummern plötzlich Daten auftauchen, die keiner mehr benötigt. :wink:

Ich würde das auch grundsätzlich empfehlen. Ich kenne allerdings auch das vermutlich dazugehörige strukturelle Problem: Da hat ein Feld irgendeine feste Länge und an zig Stellen im Code und in Dutzenden anderer Tabellen wird genau das beachtet, möglicherweise noch in anderen Programmen. Die Arbeit, die man sich nun machen muss, um das zu ändern, scheint sehr groß. Aber sie ist weitaus geringer als die Suche nach Fehlern, die sich durch vermeintliches Recycling ergeben könnten, zumal selbst die Suche nach der vermeintlich freien Nummer nicht unbedingt verlässlich ist (Caching, Netzwerk, SMB2 & Co.). Ich weiß immer noch nicht, um was für eine Nummer es sich handelt, aber bei solchen, die beispielsweise buchhalterisch relevant sein können (Kundennummern, Rechnungsnummern) würde ich niemals mit Recycling arbeiten. Zumal auch das nicht gewährleisten würde, dass der Nummernkreis ausreicht. Dann lieber zwei, drei Stellen mehr - und der Drops ist gelutscht.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nächste Nummer suchen

Beitrag von brandelh »

Muecke hat geschrieben: Wie kann ich die nächste Nummern finden die nicht vorhanden ist:
100004
Die DB hat etwa 500000 Datensätze
Sorry, das habe ich überlesen ... schnell geht da gar nichts.
Aber woher kommen die Löcher ?
Wenn du die selbst erzeugst (z.b. durch Löschen) kannst du die aktuelle Nummer in eine Art von Depot Datei schieben (also merken)
und von dem Depot immer die nötige Nummer zurück holen (und wieder löschen), das sollten deutlich weniger Sätze sein.

Ich würde sowas aber nie tun, entweder eine "Nummer" hat eine Bedeutung (z.B. Artikel-Nr.) dann muss diese eindeutig sein !
Oder sie hat keine, dann kann man auch die Feldlänge ändern ;-)
Natürlich könnte man auch alle "Nummern" in abhängigen Dateien gleich mit löschen, aber irgendwer schreibt sie sich auf ;-)
Gruß
Hubert
DelUser01

Re: Nächste Nummer suchen

Beitrag von DelUser01 »

Ich finde das Thema sehr interessant, da manche wie ich - welche Applikationen Jahrzehnte am Laufen haben irgendwann - so einen Engpass bekommen können.
Ab sofort eine Zusatztechnik einzubauen und sich gelöschte merken wäre ein Schritt für zukünftige Löschungen. Was mache ich aber mit den ganzen früheren nicht-gemerkten Nummern?
Zudem kann es viele Gründe geben warum teilweise große Lücken entstanden sind - und da wurde nichts gelöscht, nur übersprungen.
Deshalb geht es doch darum sehr schnell Freistellen zu finden bzw. eine Lücken-Nr. bereitzustellen.
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Re: Nächste Nummer suchen

Beitrag von Muecke »

Hallo zusammen

Mal besten Dank für Alles

Zur Erklärung:
Es sind Artikel die ich Nummern vergebe.
Es werden pro Lieferanten Artikel eingelesen unter dem Jahr ca.300-500 Tausend.

Wenn diese Artikel kein umschlag haben im laufendem Jahr werden die wieder gelöscht.

Darum haben wir diese Löcher.
Um nun dies wieder zu füllen, will ich diese Löcher wieder stopfen.
Dies passiert nur beim einlesen über Schnittstelle.

Ich könnte auch die Nummer auf 9Stellig aufbohren, nur das kostet Zeit.

Mit der Do While Schlaufe geht es auch.

Mit dbEval geht es auch, nur verstehe ich nicht ganz, wie ich aus dem CodeBlock rauskomme, wenn ich die Nummer habe.
Es gibt ja die <bWhileCondition> . Damit sollte man ja dbeval abrechen können. Bringe es leider nicht Fertig, dass dies funktioniert.

Schöne Grüsse
Thomas
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Nächste Nummer suchen

Beitrag von Koverhage »

Also wenn ich das richtig verstehe, Du vergibst die Nummern, die die keinen Umschlag haben fallen raus.
Wie fallen die raus ?
Ich würde mir die Nummer vom "rausfallen" merken (in einer Tabelle, die nur die freien Nummern enthält).
Der Zeitaufwand um diese Tabelle einmalig zu erstellen, kann man wohl vernachlässigen.
Wenn diese Tabelle Sätze enthält, von da nehmen sonst letzter Key (Artikelnummer+1).
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nächste Nummer suchen

Beitrag von brandelh »

Muecke hat geschrieben: Ich könnte auch die Nummer auf 9Stellig aufbohren, nur das kostet Zeit.

Mit der Do While Schlaufe geht es auch.

Mit dbEval geht es auch, nur verstehe ich nicht ganz, wie ich aus dem CodeBlock rauskomme
wenn der for codeblock .f. zurück gibt, wird der Satz ignoriert,
wenn der while codeblock .f. zurück gibt müßte die Schleife beendet werden.
Gruß
Hubert
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Re: Nächste Nummer suchen[ERLEDIGT]

Beitrag von Muecke »

Ok habs geschnallt

Zur Info noch.
Habe es mit DO while Schlaufe wie es Tom und Herbert vorgeschlagen haben.
Somit erledigt für mich.

Besten Dank an Alle

Gruss Thomas
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Nächste Nummer suchen

Beitrag von AUGE_OHR »

Muecke hat geschrieben:Gibt es eine schönere Lösung als SQL ??
sprechen wir denn von SQL ?

überlegung zu SQL :
per default ist increment / offset am Anfang = 1

Code: Alles auswählen

auto-increment-increment 1
auto-increment-offset 1
sicherlich könnte man per

Code: Alles auswählen

 --set-autoincrement[=value]
einen neuen Startwert zuweisen aber was dann ?

nun kann/darf ein Auto-Increment Wert aber nicht doppelt sein ... das wird "abgelehnt"
man könnte also so lange eine Query abschicken bis es "passt" ... viel länger als eine SEEK-Schleife dauert das auch nicht.

die Frage ist ob man das nicht mit "einer" Abfrage in SQL hin bekommt

Code: Alles auswählen

INSERT ...
ON DUPLICATE KEY UPDATE x=x+1;
UPDATE table SET x=x+1 WHERE ... ;
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Nächste Nummer suchen[ERLEDIGT]

Beitrag von brandelh »

Muecke hat geschrieben:Ok habs geschnallt
Habe es mit DO while Schlaufe wie es Tom und Herbert vorgeschlagen haben.
Gruss Thomas
dbEval ist im meist so 20% schneller, aber bei Ausnahmen etc. schwerer zu kontrollieren. DO WHILE ist auf jeden Fall OK.

Aber ich hoffe du machst das nicht für JEDEN neuen Datensatz, sonst wird das Übel von der Zeit. ;-)

Ich habe dich so verstanden, dass dies bei großen Imports erfolgen soll, somit würde ich zuerst die Datei sperren (exclusive wäre noch besser),
dann die Lücken suchen und sammeln (Array etc.) und danach nur noch im Array nachsehen, ob es freie Nummern gibt.
Gruß
Hubert
Antworten