0

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

null
    • Michi.1
    • vor 2 Monaten
    • Gemeldet - anzeigen
    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

    • Michi.1
    • vor 2 Monaten
    • Gemeldet - anzeigen

    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

      • Rainer_Wulbeck
      • vor 2 Monaten
      • Gemeldet - anzeigen

       Hi Michi, 
      herzlichen Dank vorab fürs Teilen und deine Hilfe. Klasse! Sobald ich das in den nächsten Tagen ausprobieren kann, gebe ich eine Rückmeldung ob das funktioniert. 
      Beste Grüße,
      Rainer

    • mirko3
    • vor 2 Monaten
    • Gemeldet - anzeigen

    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
    
    • Rainer_Wulbeck
    • vor 2 Monaten
    • Gemeldet - anzeigen

    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!