Hallo,
ich habe eine Tabelle in welcher der Schlüssel per Zufall erstellt wird. Leider werden hier auch negative Schlüssel vergeben, also mit einem Minuszeichen vorher.
Ist es möglich dies so zu konfigurieren, dass ausschließlich positive Schlüssel erstellt werden?
Hallo,
der Schlüssel ist doch eigentlich egal, im Regelfall ist der doch gar nicht zusehen, weil ausgeblendet.
Wenn Du Autowert (Counter) statt Zufallswert verwendest, hättest Du ein paar Versuche im positiven Bereich frei (bis etwa 2,14 Mrd.), ehe der Wertebereich in den gleich großen negativen Bereich geht.
ok. vielen Dank an Euch. Wie ist es dann z.B. Möglich, Auftragsnummern nach einem gewissen Schema zu erstellen? Z.B. 2014-00010 welche fortlaufend vergeben werden?
Ja, erstelle dazu in einem Modul eine öffentliche Funktion die dir den Auftragsnummer liefert.
Beispiel:
Public function getAuftragsnummer() As String
' Todo:
' 1. letzte Nummer aus Tabelle holen => DLOOKUP()
' 2. Zählnummer extrahieren => clng(right(LetzteNummer,len(letzteNummer)-5))
' 3. Zählnummer um 1 erhöhen => Zählnummer = Zählnummer + 1
' 4. Jahr + Bindestrich + Nullen vorhängen => getAuftragsnummer = Year(Now()) & "-" & left("00000",5-len(Zählnummer)) & Zählnummer
End Function
Gruß Andreas
Atomare Informationen (Jahr + lfd. Nummer) würde man besser in getrennten Tabellenfeldern ablegen. Das hat etliche positive Effekte.
Siehe auch fortlaufende Nr in Abfrage erzeugen (http://www.access-o-mania.de/forum/index.php?topic=19051.0)
Vielleicht verstehst Du schneller das, womit sich dort der TE schwer tut.
vielen Dank für die Antworten
@ hondo:
Ich habe das Modul erstellt. Nur wie benutze ich es? Die Auftragsnummer soll ja fest zum Datensatz gespeichert werden - also in einer Tabelle. Wenn ich jetzt in der Tabelle ein berechnetes Feld einfüge, dann kann ich den Ausdruck "=getauftragsnummer()" nicht benutzen. Wie ist es also gemeint?
Hallo,
schreib den Funktionsaufruf in die Eigenschaft "Standardwert" des entspr. gebundenen Textfeldes...
Besser wäre aber, die Nummer vor den akt. Speichern des (neuen) Datensatzes zu berechnen und zuzuweisen.
Sub Form_BeforeUpdate(Cancel as Integer)
If Me.Newrecord Then Me!AuftrgNr= getauftragsnummer()
End Sub
Vorsicht ist geboten, wenn die DB in einer Mehrbenutzer-Umgebung benutzt werden soll.
Ok... Ich erhalte eine Fehlermeldung: Fehler beim Kompilieren: Syntaxfehler. Der Debugger öffnet sich. DLOOKUP() ist markiert.
Die Zeile clng(right(LetzteNummer,len(letzteNummer)-5))
ist rot geschrieben....
Mein vollständiges Modul sieht so aus:
Option Compare Database
Public Function getAuftragsnummer() As String
DLookup ()
CLng(Right(letzteNummer, Len(letzteNummer) - 5)))
Zählnummer = Zählnummer + 1
getAuftragsnummer = Year(Now()) & "-" & Left("00000", 5 - Len(Zählnummer)) & Zählnummer
End Function
Schon bei der Eingabe von DLookup () erhalte ich die Fehlermeldung "Fehler beim Kompilieren: Erwartet:="
HAllo,
und was sagt Dir jetzt die Codezeile
DLookup ()
??
Dlookup() ist eine Funktion, die einen Wert zurückliefert, dessen Position (Feld in der Tabelle) durch die anzugebenden (und hier fehlenden) Funktions-Parameter definiert wird.
Zudem muss der zurückgelieferte Wert an eine Variable oder auch ein Textfeld übergeben werden...
(Abschreiben allein genügt doch nicht....Solche Codevorschläge müssen schon an die akt. Situation angepasst werden.)
Um ehrlich zu sein, mir sagt das gar nix. Ich habe keinen Plan davon. :)
Kannst Du mir ein Beispiel geben, damit ich die Funktion verstehe und auf meine Bedürfnisse anpassen kann?
Hallo,
stelle den Cursor auf DLookup und drücke F1.
In der Hilfe findest Du eine genaue Beschreibung und Beispiele.
Sorry, das ist ja wirklich ausführlich beschrieben, aber ich habe keine Ahnung was ich da eingeben muss. DLookUp soll die letzte Nummer (ID?) aus meiner Tabelle "AngebotAuftrag" holen. Bitte gebt mir eine Hilfestellung...
Wenn die letzte ID gemeint ist, dann wird das bei mir auch nicht gehen, da die IDs zufällige Nummern sind. Mal 1000000 mal -250045....
Hallo,
wenn Du einen Autowert für die ID ( oder Auftragsnummer) hast und dieses Feld zur eigenen Manipulation hernehmen willst, so geht das schlicht und einfach nicht (mehr).
Es bleibt dann nur , ein weiteres Feld für diesen Zweck hinzuzufügen und den Wert für dieses Feld entspr. der Berechnungsvorgabe (z. B. mit einer eigengeschriebenen Funktion) für alle Datensätze zu ermitteln ....
Inwieweit das Ganze sinnvoll im Hinblick auf schon vorhandene Daten ist, ist weiter zu hinterfragen.
Das ganze Problem ist unter "Designfehler" einzuordnen...
Ok. Das konnte ich mir schon vorstellen. In meiner Tabelle "Angebote" habe ich ein Feld Namens "Auftragsnummer" erstellt. In dieses Feld soll die Nummer im Format 2014-12345 fortlaufend (oder auch gern per Zufall errechnet) gespeichert werden. Weitere Datensätze sind nicht betroffen. Es ist alles neu. Designfehler sind ausgeschlossen.
Wie wird nun diese Lookup Funktion aufgebaut?
Hallo,
als eine Möglichkeit und beispielhaft:
Schreib in die Eigenschaft "Standardwert" des gebundenen Textfeldes "Auftragsnummer" Folgendes hinein:
="" & Jahr(Datum()) & "-" & Format(Nz(DomMax("Val(Right(nz([AuftragsNummer],0),5))";"Angebote");0)+1;"00000")
Schade, wieder keinen Erfolg zu vermelden... Fehlermeldung:
"Der von Ihnen eingegebene Ausdruck ist syntaktisch falsch.
Sie haben einen Operanden oder Operator nicht angegeben, Sie haben ein ungültiges Zeichen oder Komma eingegeben, oder Sie haben einen Text eingegeben, ohne diesen in Anführungszeichen zu setzten."
::)
Hallo,
prüf mal, ob der Ausdruck wirklich korrekt und ohne zusätzliche Zeichen (Zeilenschaltungen) in die Eigenschaft-Zeile kopiert wurde....Evtl. markiere und kopiere den Ausdruck mit dem Kontextmenü (rechte Maustaste)...
Ja, bereits mehrfach nachgesehen... Als Beweis hier die Zeile, welche ich diesmal aus dem Codegenerator rauskopiert habe:
="" & Jahr(Datum()) & "-" & Format(Nz(DomMax("Val(Right(nz([AuftragsNummer],0),5))";"Angebote");0)+1;"00000")
Da muss sich ein Fehler eingeschlichen haben.
Hallo,
schau nochmal nach, ich bin mir sicher, dass in der Eigenschaftenzeile noch Zeichen drinstehen, auch wenn es nur (unsichtbare) Zeilenschaltungen sind....
Das Verhalten konnte ich hier nachvollziehen, und das Kopieren und Einfügen Deines geposteten Ausdrucks hat bei mir (nach Anpassung an meine Feldnamen) den gewünschten Effekt gezeigt.
Nix, es geht nicht... Welchen Typ muss das Tabellenfeld "Auftragsnummer" haben? Bei mir ist es aktuell "kurzer Text"... ggf. liegt es daran?...
Hallo,
lad mal die DB (evtl. nur neue DB mit dem Formular und der Tabelle) hier hoch (repariert/komprimiert, gezippt).
Das Feld muss den Datentyp "Text" haben.
Hallo Franz,
Du hast eine PM von mir erhalten.
LG
Die Frage ist gelöst. Es waren einfach nur Semikolons statt Kommas in der genannten Formel. Hier die richtige Schreibweise:
="" & Jahr(Datum()) & "-" & Format(Nz(DomMax("Val(Right(nz([AuftragsNummer],0),5))","Angebote");0)+1;"00000")
Also 1000 Dank für Deine Hilfe DF6GL.
Daumen Hoch für so einen Einsatz hier :)