Schleife bei Vergabe einer neuen Seriennummer
Hallo zusammen!
Ich finde keine gute Lösung für folgendes Thema und hoffe auf eure Unterstützung.
Wir vergeben Seriennummern für produzierte Musikinstrumente. Es kommt aber aus verschiedenen Gründen vor, dass beliebige Nummern manuell vergeben werden, deshalb gibt es ein Flag "SerNr wurde manuell vergeben" (ja/nein). Per Button wird für eine Neuvergabe der Seriennummer im Auftrag immer die letzte gesucht bei der Bedingung "SerNr wurde manuell vergeben" nicht zutrifft und + 1 vergeben. Soweit easy.
Problem: Es soll auch geprüft werden, ob die nächste Nummer durch manuelle Vergabe bereits vorhanden ist und dann soll diese übersprungen werden. Ist diese ebenfalls bereits vorhanden, soll diese auch übersprungen werden und so weiter
Bsp. LastNr = 4910, 4911 ist frei, NewNr = 4911
Bsp. LastNr = 4910, 4911 ist manuell vergeben, NewNr = 4912,
Bsp. LastNr = 4910, 4911 und 4912 sind vergeben, NewNr = 4913
u.s.w.
Mein bisheriges Script ist dieses, prüft aber nur per if/then, ob die erst-nächste bereits vergeben ist.
let LastNr := max((select 'Aufträge' where 'SerNr wurde manuell vergeben' != true).'Seriennummer lfd');
let NewNr := if contains((select 'Aufträge').'Seriennummer lfd', LastNr + 1) then
LastNr + 2
else
LastNr + 1
end;
'Seriennummer lfd' := NewNr
Würde mich über eine Idee dazu sehr freuen. Viele Grüße
5 Antworten
-
let vArray1 := [{}][null]; let vArrayObj1 := []; let vObj1 := {}; let jahrArray := sort(unique((select Tabelle1).substr(Textnummer, 4, 0))); let result := for j in jahrArray do let allNr := concat((select Tabelle1)[substr(Textnummer, 4, 0) = j].substr(Textnummer, 0, 4)); let maxNr := max((select Tabelle1)[substr(Textnummer, 4, 0) = j].number(substr(Textnummer, 0, 4))); let minNr := min((select Tabelle1)[substr(Textnummer, 4, 0) = j].number(substr(Textnummer, 0, 4))); let reihe := for i in range(minNr, maxNr + 1) do text(i) end; concat(for i in reihe do if not contains(allNr, text(i)) then vObj1 := { value: i }; vArrayObj1 := [vObj1]; vArray1 := array(vArray1, vArrayObj1) end end) end; Text := item(vArray1, 0).value
Das Script prüft auf fehlende Seriennummern, wenn eine fehlt, wird die niedrigste Nummer in ein Textfeld geschrieben. (habe hier eine 4 stellige Zahl in einem Textfeld angenommen)
(Hatte mal für mich geschrieben, danke dafür nochmal)
Mit max() prüfst du ja sowieso auf den höchsten Eintrag
-
Warum hier mit einem Textfeld mit substr() gearbeitet wurde, liegt an der Nummer. Diese war bei mir eine Rechnungsnummer, welche einem Format unterlag, in meinem fall : 000/YY
Hier wurde dann nur die Nummer vor dem "/" berücksichtigt und natürlich die Jahreszahl.
Anbei der Beitrag: https://forum.ninox.de/t/g9h2hz2
So kannst du die Seriennummer gestalten wie du möchtest, trotzdem wird die Nummer geprüft.
let reihe := for i in range(1, maxNr + 1) do
lpad(text(i), 3, "0") = das zählt die ersten 3 Ziffern hoch
end;
concat(for i in reihe do
if not contains(allNr, text(i)) then
i + "/" + j = das setzt dir die Zahl wieder mit format zusammen
-
Hi Rainer. Wenn Deine Seriennummer nur aus Zahlen besteht, dann könnte folgendes einfache Script funktionieren. Hierbei werden auch die Lücken getestet, falls eine manuelle Seriennummer nicht fortlaufend vergeben wurde. Mirko
let tab := (select Auftraege); let all := range(1, max(tab.'Seriennummer lfd') + 1); let existNr := tab.'Seriennummer lfd'; let newNo := for i in all do if not contains(existNr, i) then i end end; let result := if cnt(newNo) > 0 then min(newNo) else max(tab.'Seriennummer lfd') + 1 end; 'Seriennummer lfd' := res
-
Hallo Michi, hallo Mirko!
Ganz herzlichen Dank für eure Lösungen! Ich bin erst jetzt wieder dazu gekommen zu testen und beides funktioniert perfekt. Ich habe mich für den Ansatz von Mirko entschieden und diesen eingebaut, weil ich eh zwei Felder für die Seriennummern benötige. Eins für eine simple fortlaufende Nummerierung (dafür das Script) und ein weiteres mit Pre- und Post-Anzeigen der laufenden Nummer.
Klasse!
Content aside
- vor 2 MonatenZuletzt aktiv
- 5Antworten
- 46Ansichten
-
3
Folge bereits