Seite 1 von 1

Fortlaufende Nummer mit Prüfziffer

Verfasst: Do, 27.11.2014 19:21
von FingMark
Hallo,
ich möchte gerne in einer Tabelle eine ID für Mitglieder einführen und diese soll, damit man sich nicht mal vertippt, auch eine Prüfziffer erhalten.
Da ich jedoch keine Ahnung habe, ob das überhaupt machbar ist, möchte ich an dieser Stelle mal Fragen, ob jemand sowas schon realisiert hat, oder ich ggf. nur den "Knopf" dafür nicht finde.

Gewünscht ist eine 3 x 3 stellige Nummer (z.B. 523 122 549)
Hier habe ich einen Algorithmus gefunden, den ich gerne nutzen würde. Dort steht auch der Code für einige Sprachen.

Der Wert soll pro Datensatz dann als Autowert festgelegt werden.

Danke im voraus!

Re: Fortlaufende Nummer mit Prüfziffer

Verfasst: Do, 27.11.2014 19:45
von F3K Total
Moin,
das eine solche ID mit Prüfziffer als Autowert erzeugt wird, geht mit der von Haus aus mit BASE ausgelieferten HSQLDB 1.8.10 nicht. Es ginge sicher mit der Version 2.3.2 per Trigger, dazu müsstest Du dich aber eingehend mit dem Trennen von Frontend und Backend befassen, einen entsprechenden Trigger schreiben und zum Laufen bringen.
Da dein Link ja schon verschiedene Codes zeigt, u.a. den Python-Code

Code: Alles auswählen

    def checkLuhn(purportedCC=''):
        sum = 0
        parity = len(purportedCC) % 2
        for i, digit in enumerate([int(x) for x in purportedCC]):
            if i % 2 == parity:
                digit *= 2
            if digit > 9:
                digit -= 9
            sum += digit
        return sum % 10 == 0
kannst Du das Ganze auch Script machen, denn OpenOffice kann Python-Scripte ausführen.
Gruß R

Re: Fortlaufende Nummer mit Prüfziffer

Verfasst: Do, 27.11.2014 22:24
von FingMark
Hallo,
danke für die Informationen.

So wie ich das sehe ist das immer nur zum "Kontrollieren" von bestehenden Codes, ob diese denn nach dem Muster aufgebaut sind.
Ich weiß jedoch nicht, wie ich ihm sage er soll eine fortlaufende Liste erstellen und dann immer beim Einfügen eines neuen Datensatzes eine unbenutzte davon für den neuen Datensatz nehmen.

Prinzipiell würde es ja reichen, wenn ich eben diese Liste generiere, als Tabelle abspeichere mit einem zusätzlichen Feld "USED", das er dann markiert, wenn er die bereits einmal vergeben hat.

Re: Fortlaufende Nummer mit Prüfziffer

Verfasst: Do, 27.11.2014 22:38
von F3K Total
Ich habe keine Ahnung, wie wichtig die Datenbank ist, aber üblicherweise definiert man die Mitgliedsnummer als Primärschlüssel. Und wenn sie bei 1 beginnt, egal, sie kann niemals doppelt vergeben werden, denn der Primärschlüssel ist einzigartig.
Die Datenbank gibt eine Fehlermeldung aus, wenn versucht wird ihn ein zweites mal zu verwenden.
Gruß R

Re: Fortlaufende Nummer mit Prüfziffer

Verfasst: Do, 27.11.2014 22:47
von FingMark
Wichtig ist die Datenbank nicht, ich habe nur überlegt, dass es sinnvoll wäre eine Nummer zu wählen, die etwas gegen falsches "Abschreiben" schützt.
Dabei ist mit dann der Luhn-Algorithmus aufgefallen, der ja soweit interessant aussieht.
Es ist eher die Neugier, ob man das umsetzten kann, als der wirkliche Nutzen.

Falls es noch eine Möglichkeit gibt das gewünschte mit einfachen Mitteln umzusetzen, dann würde ich mich freuen, ansonsten bastele ich mit der Standardfunktion unter AutoInteger +1 weiter.

Eventuell ist es für andere Zwecke auch interessant...

Mir fällt leider nur ein Weg über Umwege ein, indem man alle Zahlen, sagen wir zwischen 111 111 und 999 999 generiert und dann in oocalc die Quersumme daraus bildet, diese dann an die Zahl anhängt und die Liste als Tabelle wie oben beschrieben speichert. Dann jedes Mal eine Nummer aus dem "Pool" holt und ein USED=1 schreibt.
Ich vermute mal es gibt da auch einen besseren, schlaueren und eleganteren Weg.

Re: Fortlaufende Nummer mit Prüfziffer

Verfasst: Fr, 28.11.2014 07:39
von ghostman
Moin allerseits
FingMark hat geschrieben: Mir fällt leider nur ein Weg über Umwege ein, indem man alle Zahlen, sagen wir zwischen 111 111 und 999 999 generiert und dann in oocalc die Quersumme daraus bildet, diese dann an die Zahl anhängt und die Liste als Tabelle wie oben beschrieben speichert. Dann jedes Mal eine Nummer aus dem "Pool" holt und ein USED=1 schreibt.
Ich vermute mal es gibt da auch einen besseren, schlaueren und eleganteren Weg.
Mit Base habe ich es zwar noch nicht ausprobiert, aber funktionieren müsste es und ich löse dieses Problem üblicherweise so:
1. Feld "Index" als Autointeger +1 anlegen und als Primärschlüssel festlegen.
2. Feld "NummerTeilA" als Integer, nicht eindeutig anlegen.
3. Feld "NummerTeilB" als Integer, nicht eindeutig anlegen.
4. Feld "NummerTeilC" als Integer, nicht eindeutig anlegen.
5. Weitere Felder nach Bedarf anlegen.
6. Unter "Extras" den "Indexentwurf" wählen und einen neuen Index "Nummer" anlegen.
7. Die drei Felder "NummerTeilA", "NummerTeilB", "NummerTeilC" auswählen und den Hacken bei "Eindeutig" setzen.

Nun hast Du zwei "Primärschlüssel", den Index aus Schritt 1 und der wichtigere:
Die Kombination von NummerTeilA, -TeilB und -TeilC muss ebenfalls eindeutig sein. Heisst:
001 001 001 ok.
001 002 001 ok.
002 002 001 ok.
002 002 001 UNGÜLTIG
usw.

Hoffentlich konnte ich helfen.
PS: Den Index aus Schritt 1 nutze ich auch für die Tabellenbeziehungen. In Formularen, Berichten oder Dialogen zeige ich dieses Feld jedoch dem Benutzer nicht.

Lg
Alex

Re: Fortlaufende Nummer mit Prüfziffer

Verfasst: Fr, 28.11.2014 17:19
von RobertG
Hallo *,

ich würde immer darauf schauen, wie weit ich denn eine bestimmte Anzahl an Nummerierungen bereits durch eine Tabellenkalkulation vordefinieren kann, die dann entsprechend passend sind. Für einen einfachen Barcode habe ich so etwas einmal gemacht, weil ich mit einem Barcodescanner entsprechende Nummern übertragen wollte und das natürlich auch mit einer Prüfziffer geht. Da so ein Scanner aber die Prüfroutine ja intern laufen hat bin ich statt des ganzen Umstandes dazu über gegangen, zwar die Barcodes entsprechend zu schreiben, für die Datenbank aber die letzte Ziffer außer acht zu lassen. Dann habe ich wieder meinen Autowert und kann damit arbeiten.

Ich würde, wenn es unbedingt 9 Stellen sein sollen, auch die entsprechende Zahl in ein Feld schreiben und nicht irgendwie splitten. Im Formular wäre dann zur Neuaufnahme ein Listenfeld für die Auswahl der Zahl notwendig, das nur die Felder aus der (über Calc importierten) Tabelle liest, die noch nicht vergeben sind. Dieses Listenfeld müsste dann per Makro vor der Neueingabe eines Datensatzes aktualisiert werden, damit eine Nummer nicht zur doppelten Vergabe scheinbar zur Verfügung steht.

Die Darstellung der Zahl in einem Listenfeld kann natürlich so erfolgen, dass sie auch hübsch in 3er-Gruppen erscheint.

Gruß

Robert