Hallo, Albert!
MS Access 2000
egal, funktioniert überall.
Tabelle mit Kundennummer und Kundenname und Kuerzel
Nun soll ein dreistelliges Namenskuerzel ( aus dem Namen des
Kunden)generiert werden, wenn ein neuer Kunde angelegt wird.
Dieses Kuerzel darf aber nur einmal vergeben werden.
Eine fertige Funktion gibt es dafür nicht, das wirst Du selbst programmieren müssen. Dazu gäbe es verschiedene „Algorithmen“, nach denen ein solches Kürzel ausprobiert werden kann. Aussehen könnte das ganze wie folgt:
function GetKuerzel(plngKdNr as long)as string
' Ich gehe davon aus, dass der Datensatz zuerst erzeugt/angelegt
' wird, bevor das Kürzel berechnet wird. Zugriff über eindeutigen
' Schlüssel "Kundennummer"
dim strName as string
dim strKrit as string
dim strKuerzel as string
dim bErgebnisVorhanden as boolean
' Namen auslesen
strName = dlookup("Kundenname","Kundentabelle","Kundennumer="& plngKdNr)
' mal die ersten drei Zeichen probieren
strKuerzel = left$(strName,3)
strKrit="Kuerzel="& replace(strkuerzel,"''","'") \_
& " AND Kundennummer" & plngKdNr
' Ist Kürzel schon vorhanden?
if not bErgebnisVorhanden and \_
dcount("\*","Kundentabelle", strKrit)=0 then
bErgebnisVorhanden=true
endif
if not bErgebnisVorhanden then
' weitere Versuche: z. B. erste zwei und den letzten Buchstaben
strKuerzel=left$(strName,2)& right$(strName,1)
strKrit="Kuerzel="& replace(strkuerzel,"''","'") \_
& " AND Kundennummer" & plngKdNr
' Ist Kürzel schon vorhanden?
if dcount("\*","Kundentabelle", strKrit)=0 then
bErgebnisVorhanden=true
endif
endif
' Diese Versuche kannst Du jetzt beliebig versuchen:
if not bErgebnisVorhanden then
' weitere Versuche: z. B. ersten und den letzten zwei Buchstaben
strKuerzel=left$(strName,1)& right$(strName,2)
strKrit="Kuerzel="& replace(strkuerzel,"''","'") \_
& " AND Kundennummer" & plngKdNr
' Ist Kürzel schon vorhanden?
if dcount("\*","Kundentabelle", strKrit)=0 then
bErgebnisVorhanden=true
endif
endif
' weitere Suchmöglichkeiten: Beliebiges Verwenden der vorhandenen
' Buchstaben; wenn alles nix hilft: Buchstabe + lfd. Nr.
' hängt halt alles von Deinen erwarteten Daten ab.
' Da sich, wie Du siehst, der Code oftmals wiederholt,
' bietet sich die Auslagerung in eine eigene Funktion an.
' Das hätte es m. E. aber eher unübersichlicher gemacht...
' Zum Schluss sollte bErgebnisVorhanden=True sein;
' wenn nicht: kein Kürzel liefern, d. h. Du solltest in jedem Fall
' was anderes machen; z. B. den Benutzer so lange etwas eingeben
' lassen, bis er was gefunden hat.
if not bErgebnisVorhanden then
strKuerzel=""
endif
GetKuerzel=strKuerzel
end function
Hoffe, es half. Lediglich einen Index zu setzen, hilft Dir ja beim Finden nicht weiter, sondern verhindert nur, dass Duplikate eingefügt werden.
Wenn Du aber einen „Schlüssel“ berechnen willst, solltest Du ohne Benutzereingabe auskommen. Problem ist natürlich: Bei drei Stellen und Eindeutigkeit ist die Zahl der möglichen Datensätze (Kombinatoriker: auf wie viel?) natürlich auf alle Kombinationsmöglichkeiten begrenzt. Du wirst auf ein ähnliches Problem wie beim Hashing stossen: bestimmte Bereiche der verfügbaren Schlüssel werden voll sein und schnell überlaufen, andere dagegen gar nicht. (Müllers hast Du viele, XGAFGJA wahrscheinlich nicht.) Aber das ist ein anderes Thema…
Insofern wäre die Frage, ob dieses Kürzel tatsächlich vergeben werden soll/muss und ob die Einschränkung vorhanden sein soll. Zur vereinfachten Eingabe ließe sich ja z. B. eine automatisch ergänzende Kombobox nehmen, bei der Du wohl auch recht schnell auf den gewünschten Datensatz kommst. Oder Du nimmst halt nur die ersten drei Buchstaben und schaltest bei Mehrdeutigkeit einen kleinen Dialog dazwischen, der den Benutzer zwischen den paar getroffenen Firmen auswählen lässt. Denn welcher Müller nun „MÜL“ und welcher „MÜX“ ist, ist ebenfalls nicht wirklich eingängig…
Gruß, Manfred