0

String Random Generator/Passwörter/doppelte Vergabe ausschliessen

Hallo! 🙂

https://forum.ninox.de/t/q6hra1y

Dieser Post ist schon älter (in der "Goldgrube" gefunden) und meine Suchwörter waren:

String Random Generator, Passwortzahlen, Seriennummer. u.s.w und alles was mit erzeugten einmaligen Nummern / Zahlen erzeugte Liste of Codes mit der Möglichkeit der Überprüfung  hinsichtlich von doppelt vergebenen z.B. Seriennummer bzw Codes die zu Seriennummer passen.

Das habe ich weiter unten in dem Post gefunden:

let chars := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
let l := 26; 
substr(chars, floor(random() * l), 1) 
+ substr(chars, floor(random() * l), 1) 
+ substr(chars, floor(random() * l), 1) 
+ substr(chars, floor(random() * l), 1)

>Beispiel: EEMB

Der Post war von @Frank Böhmer und ist 7 Jahre alt! Voran gegangen war ein Post von @leonid_semik und war ähnlich meiner Fragestellung. Das war dann ein glücklicher Fund. 🎉

Habe das dann verstanden und nach meinen Vorstellungen erweitert

let chars := "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
let l := 35;
substr(chars, floor(random() * l), 1) + substr(chars, floor(random() * l), 1) +
substr(chars, floor(random() * l), 1) +
substr(chars, floor(random() * l), 1) +
substr(chars, floor(random() * l), 1) +
substr(chars, floor(random() * l), 1) +
substr(chars, floor(random() * l), 1)

>Beispiel: 7K74B97

Nun die Frage: Wie vermeide ich Doppelvergabe bzw. wie kann ich das überprüfen lassen? 

🙏

23 Antworten

null
    • mirko3
    • vor 10 Monaten
    • Gemeldet - anzeigen

    Versuche es mal so. Script ist für einen Button. Wenn das Feld frei bleibt, mußt du noch einmal klicken. Mirko

    let chars := "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
    let result := "";
    for i in range(0, 7) do
        let rand := substr(chars, floor(random() * 35), 1);
        result := result + rand
    end;
    if cnt((select TABELLE)[Textfeld = result]) < 1 then
        Textfeld := result
    end
    
      • Thorsten_Cinco
      • vor 10 Monaten
      • Gemeldet - anzeigen

       

      let chars := "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
      let result := "";
      for i in range(0, 7) do
          let rand := substr(chars, floor(random() * 35), 1);
          result := result + rand
      end;
      if cnt((select TABELLE)[Textfeld = result]) < 1 then
          Textfeld := result
      end
       

      Dein Code lief erst nicht, dann habe ich das rot markierte intuitiv entfernt und "zack">Ziffern Buchstaben ohne Doppel in der Zukunft. Wer einen Fehler entdeckt, bitte eine Nachricht, Ich gehe das morgen nochmal durch. Regeneration ist auch ein Programm das laufen muss.

      Großen Dank an   für diesen schönen Code!

      • T_Bartzsch
      • vor 10 Monaten
      • Gemeldet - anzeigen

       wenn das Script in einem Formel-Feld laufen soll, dann ist das rot markierte oben natürlich fehl am Platz, da ein FormelFeld kein anderes Textfeld verändern darf, dir allerdings permanent das Scriptergebnis anzeigt. Also: result, result, result, result, result, result.... Das geht - bei vielen solcher Formel-Felder - natürlich auf die Leistung. 

      Wenn Du allerdings einer neuen Rechnung via Button einmalig bei Neuanlage eine random Rechnungsnummer vergeben willst, dann muss das script im Button dem Textfeld "Rechnungsnummer"  den Wert aus "result" übergeben.

      • Thorsten_Cinco
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Vielen Dank. Ich muss einfach mehr üben. Ich suche noch nach eindeutige nicht veränderbare Nummern in Serie. Bzw. K-Nr. R-Nr. die nicht mehr gelöscht oder verändert werden dürfen. Darüber hinaus suche nach einer Lösung die solche Codes z.B.  7K74B97 ebenfalls nicht doppelt vorkommen.

       said:
      0 und den Buchstaben O

       Eindeutig! Bei kleinen Bildschirmen ist die Lesbarkeit deutlich eingeschränkt. Also das "o" wie auch das "O" als auch die "0" nicht verwenden. 

      • Thorsten_Cinco
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Das habe ich in der Reference gefunden

      let DatFilter := yearmonth(today());
      let LetzteNr := last((select RECHNUNGEN where yearmonth(RECHDATUM) = DatFilter).RECHNR);
      let LaufNr := number(substr(LetzteNr, 9, 3)) + 1;
      let DatWert := format(today(), "YYYYMM");
      RECHNR := "RE" + DatWert + "-" + format(LaufNr, "000");
      RECHDATUM := today()

      Allerdings kann ich im Beispiel Datensätze löschen und duplizieren, dass wiederum zu Irritationen führt. Irgendwie das Feld schützen, eine einmalig vergebene Nummer bleibt im Datensatz erhalten und somit der Datensatz nicht löschbar, eventuell in einer Tabelle abgelegt. Eine Routine, die auch einen unbedarften Anwender keine Ds löscht, dupliziert oder sonst wie manipulieren lässt,

      • T_Bartzsch
      • vor 10 Monaten
      • Gemeldet - anzeigen

       du musst halt schauen, wie dein Anwendungsfall ist. Ninox hat zB. für jeden Datensatz eine eigene interne einmalige ID (das Feld "Nr"). Die wird bei Löschung und Neuanlage auch nicht neu vergeben. Diese könnte man zB. in die Formel zur Berechnung mit einbinden...  Manche wollen fortlaufende Nummern haben, auch, wenn gelöscht wurde... manche wollen eindeutige ID... da muss man sich die Lösung basteln wie man es braucht.

      Bei fortlaufender Nummerierung bietet sich immer an, die Datensätze einer Tabelle zu zählen und damit dann seine Nummernkreise aufzubauen.

      Bei eindeutiger, nicht löschbarer Nummerierung kann man über solche random-Formeln mit Duplikatsabfrage und in den Feldeinstellungen "Schreibbar wenn..." = false ... arbeiten.

      Dann ist noch die Frage wie und wo neue Datensätze erzeugt werden. Und wo die Erstellung der Nummer stattfindet... Durch Buttonklick in einer Untertabelle (zb Rechnung > Untertabelle Position, oder KUNDE > Untertabelle "Neue Anfrage") oder generell bei Neuanlage eines Datensatzes ... 

      • Maurice
      • vor 10 Monaten
      • Gemeldet - anzeigen

       um das wiederholte Klicken zu vermeiden, kannst du statt der if-Schleife eine while-Schleife nehmen, siehe: https://forum.ninox.com/t/q6hrxak#g9hrl9w

      Gruß Maurice 

      • Thorsten_Cinco
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Irgendwie habe ich das Gefühl, am "offenen Herzen" zu operieren. Die ausgegebenen Vorlagen wie z.B. Angebot und Rechnung (sehr schön) sind "open" und lassen die  Löschung und das duplizieren  von Rechnungen samt R-Nr. zu. Wenn man da nicht aufpasst, ist es für eine ordentliche Buchführung nicht verwendbar. Auch in den div.Beispielen in der Ninox-Referenz-Db  kann man das beobachten.

      Vielen Dank für deine Vorschläge. Das wird jetzt eine Übung. Ich komme aus einer Gegend da spricht man so: "FT-"&ZeichenRechts(Jahreszahl(Re_Datum1); 2) &  FT_A_Nummer_Serie u.s.w.. und nun suche ich die Übersetzungen für meine bisher angewandte Sprachen. In den Referenzen ist nichts zu finden, auch nicht im Forum. Eine Tabelle mit "Unberührbaren" vielleicht?> nehme diese Nummer u.s.w. Datensätze werden nicht gelöscht sondern in ein Archiv gespeichert bzw. der Nachweis was mit dem Datensatz passiert ist. Step by Step...

      >>Bei eindeutiger, nicht löschbarer Nummerierung kann man über solche random-Formeln mit Duplikatsabfrage und in den Feldeinstellungen "Schreibbar wenn..." = false ... arbeite<<

      Leider nichts gefunden.

      Das mit der internen Nummer ist klar und ist die "Basis" der erzeugten Ds, die wird nie doppelt und verschwindet höchstens. Ich suche nach einer Formel die eindeutig  Nummern vergibt, die nicht gelöscht oder dupliziert werden dürfen. Also geboren, lebt, darf nicht "geklont" werden und verschwindet im einsehbaren Nirvana und dann ist es 😎.

      • T_Bartzsch
      • vor 10 Monaten
      • Gemeldet - anzeigen

       den Funktions-Überblick kennst Du aber? 

      https://docs.ninox.com/de/skripten/funktionen-ueberblick/funktionen-nach-kategorien

      Im Ninox Dialekt würde dein Satz wörtlich übersetzt 

      "FT" + substring(text(year(Re_Datum1)), 2, 4) + FT_A_Nummer_Serie

      lauten ..... oder kürzer  

      "FT" + format(year(Re_Datum1, "YY") + FT_A_Nummer_Serie

      Und natürlich kann man einen Button erstellen, welcher einen Datensatz aus einer Tabelle löscht und vorher die vergebene Nummer in eine Tabelle schreibt, damit diese nie wieder vergeben wird. Diese Tabelle müsste dann allerdings bei der Vergabe einer neuen Nummer mit abgefragt werden. 

      • Thorsten_Cinco
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Funktionsüberblick habe ich gesehen. Neu für mich sind Konsole und Button/trigger in der Anwendung. Ich gehe nach und nach das Manual durch.

      ...Natürlich kann man einen Button erstellen, welcher einen Datensatz aus einer Tabelle löscht und vorher die vergebene Nummer in eine Tabelle schreibt, damit diese nie wieder vergeben wird. Diese Tabelle müsste dann allerdings bei der Vergabe einer neuen Nummer mit abgefragt werden....

      Eine Schutzfunktion die eine versehentliche Bedienung verhindert.

      Es wäre hilfreich wenn ich das Symbol des Papierkorbs und der "Klon"taste verbergen könnte.Es ist schon sehr nah beieinander (Space).

      Auch eine  Rückfrage, fände ich nicht schlecht. Bevor Du eine "lösch/klon"-Orgie durchziehst: "Möchtest du wirklich die Grundlagen einer ordentlichen Buchführung "ad absurdum" führen? Ich bin erstaunt, dass mich das so aufhält. 

      Da es keinen Sinn macht zu lamentieren, wie das in meiner bisherigen Sprache gelaufen ist, suche und probiere ich weiter und bedanke mich recht herzlich für die angebotenen Hilfen und Unterstützung.  Werde mich auch an den Support noch melden, eventuell schaue ich mal in der Sprechstunde vorbei (Mier ghets nich gud, ich Baruch undbingt codeschnippsel) . 😉 

      • T_Bartzsch
      • vor 10 Monaten
      • Gemeldet - anzeigen

       du hast ja auch in jeder Tabelle in den Einstellungen (Zahnrad oben links, "Felder bearbeiten..." diverse Möglichkeiten z.b. löschen zu verbieten, oder Script bei neuem Datensatz ausführen zu lassen usw. 

      Meistens hilft schon eine große Tasse Javatee. Der script wieder Energie! Oft function()iert dann wieder alles... 

      • Thorsten_Cinco
      • vor 10 Monaten
      • Gemeldet - anzeigen

       

      Das könnte es sein:

      let myYear := year(today());
      let myRN := max((select Rechnungen where year('Datum der Rechnungsstellung') = myYear).substr('ID-Nr', 8));
      'ID-Nr' := "RE-" + myYear + "-" + format(number(myRN) + 1, "0000");
      'Datum der Rechnungsstellung' := today()

      Gefunden in der Referenz (total übersehen) > 003_DE_Rechnungen_19-04.  😬

      Das stand da auch: Automatische Rechnungsnummer - Pro Jahr werden die Rechnungsnummern automatisch eindeutig und aufsteigend vergeben. In den Tabelleneigenschaften wird der Trigger "Bei neuem Datensatz" genutzt um dies auszuführen.

      • Ninox-Professional
      • planoxpro
      • vor 10 Monaten
      • Gemeldet - anzeigen

      Leider lässt sich das Löschen von Datensätzen mit Bordmitteln nicht komplett verhindern, sondern nur auf eine Rolle beschränken, z. B. "admin", was bei mehreren "editor"-Nutzern immerhin schon hilfreich sein kann. Man kann den Spieß aber natürlich auch umdrehen und das Löschen nur der Rolle "editor" erlauben. Dann ist die Funktion für alle Nutzer mit "admin"-Rolle deaktiviert ...

      Bei gemischten Teams mit beiden Rollen hilft das natürlich wenig. Der Wunsch nach einer sicheren und flexibleren Option "Löschbar, wenn" ist seit längerem aktenkundig, hatte bei den Entwicklern bisher aber offenbar nicht dieselbe hohe Priorität wie bei den Nutzern.

      • Thorsten_Cinco
      • vor 10 Monaten
      • Gemeldet - anzeigen

       yep, Danke. Auch dieser Post ist hilfreich. So langsam wird es eingekreist, die "kleinen" Probleme.

    • Josef_Koenig
    • vor 10 Monaten
    • Gemeldet - anzeigen

    Wenn ich einen Vorschlag machen darf:

    Ich nehme an, dass let chars definiert, welche Buchstaben und welche Ziffern für das result verwendet werden sollen. Dann würde ich die Null 0 und den Buchstaben O weglassen. Das führt in der Praxis dann doch immer wieder dazu, dass man nicht weiß, worum es sich handelt.

    • Thorsten_Cinco
    • vor 10 Monaten
    • Gemeldet - anzeigen
     said:
    Wenn ich einen Vorschlag machen darf:

     Immer!

     

     said:
    Das führt in der Praxis dann doch immer wieder dazu, dass man nicht weiß, worum es sich handelt.

     Erwischt, ich kann mich noch erinnern, da gab es noch ein "rtfm". Der Mut soll mich nicht verlassen,

    so schnell gebe ich nicht auf, bin ich gerade doch erst am Anfang. Mein Workoutsystem ist Try &Error,

    angerührt mit so etwas wie Ahnung und davon ist auch noch  nicht so viel da.

    • Thorsten_Cinco
    • vor 10 Monaten
    • Gemeldet - anzeigen

    Das ist mir auch aufgefallen, wenn ich im gleichen Formular Buttons mitlaufen lasse (QR-Code Erzeugung bzw. Die Taste vom oben genannten Code noch mal berühre, kommt es zu diesem Phänomen, dass im Formular die Zahle/codes sich änder aber in der Tabelle nicht. Das ist jetzt nichts ernstes denn das ist meine Test/Lern DB und ich versuche bestimmte Fragen und Lösungen umzusetzen. 

    • Thorsten_Cinco
    • vor 10 Monaten
    • Gemeldet - anzeigen
    • Ninox-Professional
    • planoxpro
    • vor 10 Monaten
    • Gemeldet - anzeigen
     said:
    Bei fortlaufender Nummerierung bietet sich immer an, die Datensätze einer Tabelle zu zählen und damit dann seine Nummernkreise aufzubauen.

    Vielleicht verstehe ich dich falsch, aber der Sicherheit halber: Die Zahl der Datensätze für eindeutige, laufende Nummern zu verwenden, ist prinzipiell keine gute Idee, weil es dabei zu doppelten Nummern kommen kann, wenn Datensätze gelöscht werden (z. B. leere). Das Löschen von Datensätzen gänzlich zu verhindern, macht wiederum nur bei Rechnungen Sinn (GoBD).

    Besser ist es, immer die aktuell höchste Nummer zu ermitteln und um 1 zu erhöhen.

      • T_Bartzsch
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Ja, recht hast Du...  es ging mir darum verschiedene Anwendungsfälle aufzuzeigen. Bei manchen Nummerierungen macht das Zählen der Datensätze Sinn (Rechnungspositionen o.ä.) - bei anderen wiederum nicht. Danke für den Hinweis

    • Thorsten_Cinco
    • vor 10 Monaten
    • Gemeldet - anzeigen
     said:
    (Zahnrad oben links, "Felder bearbeiten..."

     Schon klar, ist einer von den Wegen zur Bearbeitung/Einstellung. Mir fehlt etwas so wie dieser Datensatz dieser Tabelle dürfen nicht gelöscht werden. Sowie Ausschluss von Bearbeitung /Manipulation von bestimmten Datensatzfelder.

    Also ich betätige das Papierkorbsymbol oder das Klonsymbol und die Meldung erscheint: Vergiß es!

    • Jurgen_Wagner
    • vor 10 Monaten
    • Gemeldet - anzeigen
     said:
    Leider lässt sich das Löschen von Datensätzen mit Bordmitteln nicht komplett verhindern, sondern nur auf eine Rolle beschränken, z. B. "admin", was bei mehreren "editor"-Nutzern immerhin schon hilfreich sein kann. Man kann den Spieß aber natürlich auch umdrehen und das Löschen nur der Rolle "editor" erlauben. Dann ist die Funktion für alle Nutzer mit "admin"-Rolle deaktiviert ...

     Du könntest eine Rolle "Delete" erstellen, das Recht zum Löschen auf Tabellenebene nur der Rolle "Delete" zuweisen und allen Nutzern mit Löschrechten zusätzlich zu "Editor" usw. die Rolle "Delete" geben. Nicht perfekt, könnte aber für Deine Zwecke ausreichen. Der Admin kann sich natürlich jederzeit auch die Rolle "Delete" zuweisen, auch wenn er sie nicht hat, aber der Editor kann das z. B. nicht.

      • Ninox-Professional
      • planoxpro
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Ja, ab dem "Professional"-Tarif könnte man auch eine zusätzliche Rolle anlegen (im "Starter"-Abo gibt's halt immer nur "admin" und "editor").

Content aside

  • Status Answered
  • vor 10 MonatenZuletzt aktiv
  • 23Antworten
  • 89Ansichten
  • 7 Folge bereits