eine 9-stellige Seriennummer generieren...

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: eine 9-stellige Seriennummer generieren...

Beitrag von Stephan »

würde ich per Makro machen:

Code: Alles auswählen

Sub Seriennummer()
	Do
		tmp = nummer_erzeugen
		i = 1
		Do
			If ThisComponent.Sheets(0).getCellByPosition(0, i).String = "" Then 
				Exit Do
			End If
			i = i + 1
		Loop
		letzte = i - 1
		doppel = 0
		For i = 1 to letzte
			If ThisComponent.Sheets(0).getCellByPosition(0, i).String = tmp Then
				doppel = 1
				Exit For
			End If
		Next i
	Loop While doppel = 1
	ThisComponent.Sheets(0).getCellByPosition(0, letzte+1).String = tmp
	InputBox("Die aktuell ermittelte Seriennummer ist:", "Seriennummer", tmp)
End Sub


Function nummer_erzeugen()
	ne = ""
	For i = 0 To 8
		var = Int((36 * Rnd)+1)
		Select Case var
			Case 1 To 10
				erg = var - 1
			Case 11 To 36
				erg = CHR(var + 54)
			Case Else
				Msgbox "Fehler"
		End Select
		ne = ne & erg
	Next i
	nummer_erzeugen = ne
End Function
Gruß
Stephan
Dateianhänge
Seriennummer.ods
(10.29 KiB) 189-mal heruntergeladen
Karolus
********
Beiträge: 7524
Registriert: Mo, 02.01.2006 19:48

Re: eine 9-stellige Seriennummer generieren...

Beitrag von Karolus »

Hallo

Na gut...
pastbin

Code: Alles auswählen

from string import ascii_uppercase as abc, digits
from random import choice
POOL = abc + digits

def id9():
    return ''.join(choice(POOL) for _ in range(9))

def main(*_):
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.Sheets.Tabelle1
    colum_a = sheet.Columns.A
    cursor = sheet.createCursorByRange(colum_a)
    cursor.gotoEndOfUsedArea(1)
    used_ids = cursor.DataArray
    pool = abc + digits
    id_num = id9()
    while (id_num,) in used_ids:
        id_num = id9()
    colum_a.getCellByPosition(0,len(used_ids)).setString(id_num)    
Seriennummer2.ods
(11.81 KiB) 182-mal heruntergeladen
Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
IRATA
Beiträge: 6
Registriert: Fr, 22.01.2016 21:11

Re: eine 9-stellige Seriennummer generieren...

Beitrag von IRATA »

Da bedanke ich mich schon mal ganz brav bei euch Beiden.
Werde es morgen, wenn ich dazu komme, mal versuchen irgendwie zu testen...

Rückmeldung folgt dann umgehend

Ein schönes Restwochenende noch
paljass
******
Beiträge: 802
Registriert: Do, 25.10.2012 07:25

Re: eine 9-stellige Seriennummer generieren...

Beitrag von paljass »

Hi,
Gibt es eine elegante Möglichkeit, jeden Teil dieser 9-stellige Seriennummer in je eine Zellen zu legen?

Code: Alles auswählen

=TEIL(A1;{1;2;3;4;5;6;7;8;9};1)
]als Matrixformel mit Strg-Umschalt-Enter abschließen.

Gruß
paljass
EDV ist wie U-Boot fahren - machst du ein Fenster auf, fangen die Probleme an.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: eine 9-stellige Seriennummer generieren...

Beitrag von Stephan »

Allerdings sind die Seriennummern sehr Buchstabenlastig, was aber wohl daraus resultiert, daß es 26 Buchstaben, aber nur 10 Ziffern gibt
naja, man kann doch trotzdem das Verhältnis von Buchstaben zu Zahlen beliebig einstellen. Die folgende Änderung sollte ein Verhältnis von 50:50 (Zahlen:Buchstaben) erzeugen:

Code: Alles auswählen

Function nummer_erzeugen()
	ne = ""
	For i = 0 To 8
		x1 = Rnd
		If x1 <= 0.5 Then
				'Zahl
				var = Int(10 * Rnd)
				erg = var
			Else
				'Buchstabe
				var = Int((26 * Rnd)+1)
				erg = CHR(var + 64)
		End if
		ne = ne & erg
		nummer_erzeugen = ne
	Next i
End Function
Seriennummer_50-50.ods
(9.64 KiB) 122-mal heruntergeladen
(d.h. natürlich nicht das nur Kombinationen von jeweils 4:5 (Buchstaben:Zahl) bzw. 5:4 (Buchstaben:Zahl) vorkommen, sondern nur das bei z.B. 100 Seriennummern im Mittel insgesamt 450 Zahlen und 450 Buchstaben enthalten sein sollten)

Gibt es eine elegante Möglichkeit, jeden Teil dieser 9-stellige Seriennummer in je eine Zellen zu legen?
Hat paljass schon beantwortet, hier eine Variante des Makros als Alternativlösung:
Seriennummer_50-50_einzel.ods
(10.32 KiB) 103-mal heruntergeladen
Wie bekomme ich für eine zusätzliche Berechnung den Zahlenwert eines jeden Buchstaben (A=1, B=2 usw.) in eine Zelle?
Wenn A in A1 steht, dann mit:

=CODE(A1)-64


Gruß
Stephan
Karolus
********
Beiträge: 7524
Registriert: Mo, 02.01.2006 19:48

Re: eine 9-stellige Seriennummer generieren...

Beitrag von Karolus »

Hallo

Zum Verhältniss Buchstaben:Zahlen

Code: Alles auswählen

POOL = abc + digits # ergibt 26:10
POOL = abc + digits*2 # ergibt 26:20 
Gibt es eine elegante Möglichkeit, jeden Teil dieser 9-stellige Seriennummer in je eine Zellen zu legen?
Für 2- und 3-stellige fand ich etwas, aber der Rest...

Dann wäre da noch eine "Kleinigkeit...
Wie bekomme ich für eine zusätzliche Berechnung den Zahlenwert eines jeden Buchstaben (A=1, B=2 usw.) in eine Zelle?
Spätestens hier stellt sich die Frage nach dem eigentlichen Zweck des Manövers??
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
IRATA
Beiträge: 6
Registriert: Fr, 22.01.2016 21:11

Re: eine 9-stellige Seriennummer generieren...

Beitrag von IRATA »

Hallo
Erst einmal ein großes Dankeschön für die Hilfe.
Es klappt nun ganz gut, obwohl mir ein paar Dinge schleierhaft sind und Einiges wiederum konnte ich sogar nachvollziehen und anpassen.

Warum auch immer funktionierte das Einfügen in meine Tabelle nicht, dann aktivierte es z.B. vom Generieren-Knopf bloß die Grafik zum Ändern oder Verschieben.
Das Problem löste ich, indem ich meine Tabellenblätter einfach in die neue einfügte. Da fiel mir ein gravierender Unterschied zu dem "gehaßten" MS-Produkt auf. Keine Verknüpfungen waren mehr vorhanden, aber das war schnell korrigiert...

Die Sache mit den Buchstaben in Zahlen funktioniert soweit, allerdings weiß ich ja zuvor nicht, an welcher Stelle ein Buchstabe sein wird. Nun sind ja die Zahlen Minuswerte und die Buchstaben korrekte positive Zahlenwerte.
Minuswerte könnte ich zwar ausblenden, aber geschickter wäre es, wenn an Stelle der Minuswerte einfach die vorherige positive Zahl dort erscheinen würde und nur die Buchstaben entsprechend umgerechnet wären.

Da hab ich wohl gerade etwas gefunden... - =WENN(P2<0;B2)+WENN(P2>0;P2)+WENN(P2=0;P2) P2, Q2, R2 usw. wären die Zellen, in denen evtl. der Wert für den Buchstaben steht, oder eben der Ursprungswert übernommen wird.
Mit =RECHTS(P5;1) ziehe ich dann in den jeweiligen Zellen den Einerwert raus.

Nun zu der Frage, wozu das Ganze. Es geht um Seriennummern und die zu jedem Block gewollte Kontrollzahl, so ähnlich wie es bei Ausweisen der Fall ist. Dazu benötige ich für die anschließende Multiplikation eben diese einstelligen Zahlen je Zelle, wobei bei Buchstaben dann immer der "Einer" verwendet wird. X wäre als Zahlenwert die 24, wovon dann die 4 als Faktor für die folgende Multiplikation genutzt wird... Es ergeben sich also 9 Multiplikationen, deren Ergebnis dann zur Berechnung der Kontrollzahl genutzt wird...

Wäre es sehr aufwendig, diesen "Knopf" Seriennummer generieren in ein anderes Tabellenblatt zu verlagern?
Ich bin so schon nicht die Leuchte, was Tabellenkalkulation angeht, aber Makros und Scripte sind für mich ganz weit weg...

Einen schönen Sonntag noch
IRATA
Beiträge: 6
Registriert: Fr, 22.01.2016 21:11

Re: eine 9-stellige Seriennummer generieren...

Beitrag von IRATA »

Hallo

Etwas anderes kurioses ist mir gerade aufgefallen, wofür ich keine Erklärung finde...

Aus welchem Grund auch immer, wird manchmal die "0" als Wert angezeigt und manchmal nicht. Das ändert zwar am Ergebnis nichts, ist aber recht verwirrend. Noch dazu, wenn ich mir die Formatierung der Zellen ansehe und keinen Unterschied finden kann...

Ich schiebe das mal auf Windows...

MfG
IRATA
Beiträge: 6
Registriert: Fr, 22.01.2016 21:11

Re: eine 9-stellige Seriennummer generieren...

Beitrag von IRATA »

Hallo noch mal

Eine Frage hätte ich noch bezüglich der generierten Seriennummer und der Aufteilung in die 9 Einzelfelder...

So wie es jetzt ist, funktioniert alles tadellos, aber das Speichern der aufgeteilten Seriennummer wäre nicht notwendig und ist für die weitere Nutzung eher hinderlich...
Schöner wäre es, wenn wie bisher in der ersten Spalte die Seriennummern stehen bleiben und die in 9 Einzelzellen aufgeteilte Nummer immer die gleichen Zellen nutzt.

Ich hab da etwas versucht, was sicher mit einer sauberen Lösung NICHTS zu tun hat, funktioniert aber bis auf einen kleinen, einmaligen Fehler.
Diese Original-Zeilen:

With ThisComponent.Sheets(3)
For i = 1 To 9
.getCellByPosition(i, letzte+1).String = tmp(i-1)
Next i
.getCellByPosition(0, letzte+1).String = tmp2 (i-1)

End With

habe ich noch einmal in dieser Form angehangen:

With ThisComponent.Sheets(4)
For i= 1 To 9
.getCellByPosition(i, letzte=0).String = tmp(i-1)
Next i
.getCellByPosition(0, letzte+1).String = tmp2
End With

und nun wird auf einem Tabellenblatt weiter, noch einmal eine Liste mit den Seriennummern in der ersten Spalte angelegt, aber die gerade generierte Seriennummer wird nur in der ersten Zeile ab Spalte 2 in je eine Zelle aufgeteilt und dann bei der nächsten generierten SN überschrieben.
Der einmalige Fehler ist reproduzierbar und kommt immer dann, wenn ich die erste SN generiere.
Da ich im Vorfeld schon 2 per Hand vergeben hatte, ist dieser Fehler zu vernachlässigen...

Warum das aber nun so funktioniert, hab ich keine Ahnung, außer daß die Zahl in Klammern hinter Sheets das entsprechende Tabellenblatt meint.

Nun bliebe nur noch den "Neue Seriennummer-Knopf" an einen mir genehmeren Ort zu kopieren, ohne daß es die Funktion beeinträchtigt.

Ich versuche mich da etwas einzulesen und so Manches zu verstehen, aber viel kommt noch nicht dabei heraus...

MfG
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: eine 9-stellige Seriennummer generieren...

Beitrag von Stephan »

Schöner wäre es, wenn wie bisher in der ersten Spalte die Seriennummern stehen bleiben und die in 9 Einzelzellen aufgeteilte Nummer immer die gleichen Zellen nutzt.
Dann ändere das im Makro nach Beliebeniundem Du fixe Werte für die Zelladressen einsetzt, z.B.:

Code: Alles auswählen

With ThisComponent.Sheets(0)
	For i = 1 To 9
		.getCellByPosition(i+1, 0).String = tmp(i-1)
	Next i
	.getCellByPosition(0, letzte+1).String = tmp2
End With
damit stehen die Einzelteile immer in C1 bis K1 und werdfen bei jeder neuen Zahlenermittlung überschrieben.
und nun wird auf einem Tabellenblatt weiter, noch einmal eine Liste mit den Seriennummern in der ersten Spalte angelegt, aber die gerade generierte Seriennummer wird nur in der ersten Zeile ab Spalte 2 in je eine Zelle aufgeteilt und dann bei der nächsten generierten SN überschrieben.
Der einmalige Fehler ist reproduzierbar und kommt immer dann, wenn ich die erste SN generiere.
Wenn ich raten müsste dann doch wohl wegen:

Code: Alles auswählen

.getCellByPosition(i, letzte=0).String = tmp(i-1)
denn dass Dortige "letzte=0" ist ein Wahrheitsvergleich und wird immer zu 0 wenn "letzte" ungleich 0 ist und zu 1 wenn "letzte" gleich 0 ist.
Nun bliebe nur noch den "Neue Seriennummer-Knopf" an einen mir genehmeren Ort zu kopieren, ohne daß es die Funktion beeinträchtigt.
-mit Ansicht-Symbolleisten-Formularsteuerelemente die entsprechende Symbolleiste anzeigen
-dort auf das Icon für den Entwurfsmodus klicken (Dreieck plus Bleistift)
-die Schaltfläche markieren und ausschneiden
-an anderer Stelle wieder einfügen
-Entwurfmodus in Symbolleiste Abschalten
-Symbolleiste über Ansicht-Symbolleisten-Formularsteuerelemente abschalten (NICHT über das x der Leiste, das funktiniert nur bis zu nächsten Start, ist ein gewolltes Feature)



Gruß
Stephan
IRATA
Beiträge: 6
Registriert: Fr, 22.01.2016 21:11

Re: eine 9-stellige Seriennummer generieren...

Beitrag von IRATA »

Hallo und ein riesiges Dankeschön an ALLE Helfer

Es ist jetzt perfekt, so wie ich es mir vorgestellt hatte.

Warum nach der Änderung plötzlich von C1 bis K1 die einzelnen Ziffern der Seriennummer eingetragen werden, erschließt sich mir immernoch nicht, aber egal, es funktioniert.

Sollte Jemand den Drang verspüren, meine Unwissenheit zu beenden, wäre ich da nicht abgeneigt, im Gegenteil, man wird ja nicht dümmer dadurch.

MfG
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: eine 9-stellige Seriennummer generieren...

Beitrag von Stephan »

Warum nach der Änderung plötzlich von C1 bis K1 die einzelnen Ziffern der Seriennummer eingetragen werden, erschließt sich mir immernoch nicht, aber egal, es funktioniert.
mein Gott ... die Adressierung einer Zelle per Positionsangabe erfolgt per Angabe von Spalte und Zeile, also:

.getCellByPosition(<Spalte>, <Zeile>)

und wenn ich darim die Zeile konstant lasse:

.getCellByPosition(<Spalte>, 0)

schreibe ich in eine unveränderliche Zeile.

Wenn ich hingegen die Zeile variiere, z.B.:

.getCellByPosition(<Spalte>, letzte+1)

natürlich in unterschiedliche Zeilen.


Gleiches gilt für Spalten, ist hier aber nicht relevant, weil diese zwar von 2 bis 10 (1 bis 9 plus jeweils 1) variiert werden, das aber in beiden Fällen gleich variiert werden:

For i = 1 To 9
.getCellByPosition(i+1, letzte+1). ...
Next i

For i = 1 To 9
.getCellByPosition(i+1, 0). ...
Next i



Gruß
Stephan
IRATA
Beiträge: 6
Registriert: Fr, 22.01.2016 21:11

Re: eine 9-stellige Seriennummer generieren...

Beitrag von IRATA »

Hallo

Der Anfang mit Zeile und Spalte ist sogar mir nun verständlich, wobei ich noch nicht erkennen kann, woher die Definition C1 - K1 kommt.
Schon klar, daß er immer in Zeile 1 überschreibt, aber wenn er in A1, A2 usw. die Seriennummern schreibet, woher die Info, Spalte B leer zu lassen?
Von 1 - 9 sind 10 Zellen, also eine für die Seriennummer, die generiert wurde, welche Zeile für Zeile eingetragen werden und die 9 Einzelzellen, welche von jeder neuen Seriennummer überschrieben werden. Da aber B1 nicht genutzt wird, wären es doch 11 Zellen...?

Wie gesagt, ich bin mit der Funktion mehr als zufrieden, aber der Punkt bleibt mir auch nach Deiner Erklärung unverständlich.

Ich gehe mal davon aus, daß man da ähnlich Excel eine Fehlerprüfung beim erstellen hat, damit keine ungültigen Werte und Funktionen gemischt werden können, oder merkt man den Fehler erst beim ersten Start?

MfG
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: eine 9-stellige Seriennummer generieren...

Beitrag von Stephan »

Ich kann hier keinen Programmiergrundkurs geben und es ist natürlich schwer bestimmte Allgemeindinge der Programmierung (z.B. Schleifen) zu benutzen ohne sie zu verstehen, aber in Kürze:
Der Anfang mit Zeile und Spalte ist sogar mir nun verständlich, wobei ich noch nicht erkennen kann, woher die Definition C1 - K1 kommt.
aus dem INhalt des Codes kommt das, denn das hier:

Code: Alles auswählen

For i = 1 To 9
 .getCellByPosition(i+1, 0). ...
Next i
ist/tut nichts Anderes als diese (relativ vielen) Zeilen tun würden:

Code: Alles auswählen

.getCellByPosition(2, 0). ...
.getCellByPosition(3, 0). ...
.getCellByPosition(4, 0). ...
.getCellByPosition(5, 0). ...
.getCellByPosition(6, 0). ...
.getCellByPosition(7, 0). ...
.getCellByPosition(8, 0). ...
.getCellByPosition(9, 0). ...
.getCellByPosition(10, 0). ...
wobei .getCellByPosition(2, 0). ... C1 entspricht und .getCellByPosition(10, 0). ... K1, denn z.B. A1 entspricht 0,0, B1 1,0 und A2 0,1
aber wenn er in A1, A2 usw. die Seriennummern schreibet, woher die Info, Spalte B leer zu lassen?
also an der Stelle denke doch einmal nach, wenn Du in der Kneipe ein Bier bestellst weiß der Kellner ja auch das Du nicht zusätzlich einen Kaffee willst, weil man i.A. ja nur sagt was man will und nicht zusätzlich sagt was man nicht will und eine Angabe wie:

Code: Alles auswählen

.getCellByPosition(0, letzte+1). ...
entspricht immer nur einer bestimmten Zelle (0 und letzte+1 sind zum Zeitpunkt wo diese Zeile abgearbeitet wird KONKRETE Werte) in ausschliesslich Spalte A (weil weil die Spaltenkoordinate hier fest mit 0 angegeben ist)
Ich gehe mal davon aus, daß man da ähnlich Excel eine Fehlerprüfung beim erstellen hat, damit keine ungültigen Werte und Funktionen gemischt werden können, oder merkt man den Fehler erst beim ersten Start?
StarBasic ist nach üblicher Betrachtung eine interpretierte Programmiersprache:
https://de.wikipedia.org/wiki/Interpreter

und keine compillerte Sprache:
https://de.wikipedia.org/wiki/Compiler

so wie VBA auch.

Fehler in StarBasic werden aber normalerweise nicht vor dem Ablauf des Programmes angezeigt, wie das bei VBA in den meisten Fällen üblich ist, das ist aber weniger eine FRage der jeweiligen Programmiersprache sondern der Entwicklungsumgebung, der IDE, des 'FEnsters' wo man den Code eintippt.
(Bitte das "normalerweise" beachten, denn man kann ein Makro auch vorab (testweise) Übersetzen ohne es direkt laufen zu lassen, nur darum dürfte es hier bei Deiner Frage nicht gegangen sein.)


Gruß
Stephan
Antworten