Lücken in einer Reihenfolge füllen
Hallo
in einer Tabelle "Dossier" habe ich eine fortlaufende Buchungsnummer (NOI), die automatisch per script bei einem neuen Datensatz vergeben wird mit max select.....
Jetzt sind aber durch umfangreiche Tests und auch durch Stornos Lücken in der Reihenfolge entstanden, die ich gerne bei neuen Datensätzen auffüllen möchte ohne die bereits vergebenen Nummer zu verändern. In der Theeorie ist das einfach: nehme einen Counter, checke Counter gegen NOI und wenn die entsprehende NOI nicht gefunden wird, benutze sie.
In der Praxis scheitere ich am entsprechenden Script, weder per while-do noch per for-Schleife.
Für hilfreiche Tipps bin ich sehr dankbar.
lg
Arsène
8 Antworten
-
Hallo Arsène,
wenn die NOIs einfache natürliche Zahlen (1,2,3 usw.) dann kann man es als trigger bei neu so versuchen:
---
let myTab:=select Dossier;
let myArr:=for i in range (max(myTab.NOI)) do
if cnt (myTab[NOI=i+1])=0 then i
end;
NOI := if cnt(myArr)>0 then first (myArr) else max (myTab.NOI)+1
---
Es kann sein, dass diese Berechnung je nach Anzahl der Datensätze in der Tabelle nicht besonders performant ist. Es empfiehlt sich dann myArr-Berechnung beim Öffnen der Datenbank zu durchführen und in ein Textfeld als globale Variable zu speichern.
Leo
-
Hallo Leo
vielen Dank, das werde ich ausprobieren und wie ich dich kenne, wird das auch auf Anhieb funktionieren :-)
Puncto Performance: es sind weniger als 200 Einträge, das dürfte die Performance nicht nachhaltig beeinflussen.
schönes WE
lg
Arsène
-
Hallo Leo
deine Formel ergab eine Fehlermeldung in der letzten Zeile: myArr nicht gefunden. Ich habe daher mit Hilfe deines Prinzips die Formel in eine while-Schleife verpackt und das funktioniert einwandfrei:
let flip := 0;
let cc := 1;
let rr := (select Dossier);
while flip = 0 do
if cnt(rr[NOI = cc + 1]) = 0 then
NOI := cc + 1;
flip := 1
else
cc := cc + 1
end
endDanke für die Anregung
lg
Arsène
-
Moin,
ich habe das gleiche Problem mit Kundennummern und hab es mit folgendem Code über eine Schaltfläche versucht:
for i in select '2 Kunden' do
if i.'Kd. Nr.' = null then
i.('Kd. Nr.' := max((select '2 Kunden').'Kd. Nr.') + 1)
end
endGeht das so garnicht oder wo ist da der Fehler?
LG Jan
-
Hallo Jan, wenn ich es richtig sehe, dann suchst du mit deinem Skript in der Kundentabelle nach einem Datensatz ohne Kundennummer ("= null") und weist diesem dann im Nachhinein die nächste höchste Nummer zu ("max(...) + 1"). Das kann man natürlich machen, aber bei Arsènes Anliegen oben ging es wohl um etwas anderes. Er wollte Nummern, die durch das Löschen(!) von Datensätzen frei geworden sind, für neue Datensätze nutzen.
Wobei ich als Klugscheißer ja nicht müde werde, bei solchen Gelegenheiten auch immer wieder gerne auf die generelle Problematik neu vergebener Identifikationsnummern hinzuweisen. Wenn man bspw. dem Kunden "Müller" mit der Nummer 101 irgendwann mal ein Angebot oder eine Rechnung geschrieben hatte, und später dem Kunden "Meier" die Nummer 101 zuordnet, dann entstehen falsche Bezüge, die sich im Nachhinein kaum entwirren lassen. Deshalb gilt im kaufmännischen Bereich die Regel, einmal vergebene Identifikationsnummern jeglicher Art niemals neu zu belegen. Auch wenn der ursprüngliche Datensatz (Kunde, Lieferant, Artikel, Angebot ...) nicht mehr relevant ist.
-
Hallo Copytexter
du hast natürlich recht mit deiner Klugscheissernummer, aber hier war ich mit meinen Tests selbst der Verursacher der Lücken. Sämtliche Buchungen mit einer NOI werden per script gelöscht (zumindest als Admin, andere haben kein Zugriff auf die Löschfunktion ) ;-). Rechnungsnummern werden auch automatisch vergeben, und diese taste ich natürlich nicht an.
-
Moin Copytexter,
das dies durch Löschen o.ä. geschehen ist, habe ich tatsächlich nicht realisiert. :D
Normalerweise wird bei neuem Datensatz eine neue Kd.Nr. vergeben. Jetzt habe ich allerdings eine .csv Datei mit neuen Kunden bekommen, die ich importiert habe. Durch den Import werden die Nummern nicht vergeben und so wollte ich diese nachträglich mit Kd.Nr. ausstatten. Die Formel funktioniert aber nicht und ich sehe den Fehler nicht. Kann mir jemand den Fehler sagen?
LG Jan
-
Hi Jan, okay, wenn da so ist ... Dann versuch's mal damit (davon ausgehen, dass 'Kd. Nr.' ein Feld vom Typ "Zahl" ist):
let myMax := max((select '2 Kunden').'Kd. Nr.');
for i in select '2 Kunden' do
if i.'Kd. Nr.' = null then
myMax := myMax + 1;
i.('Kd. Nr.' := myMax)
end
end
Content aside
- vor 3 JahrenZuletzt aktiv
- 8Antworten
- 530Ansichten
-
1
Folge bereits