Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

AutoWert in Access 2007 bestimmen

Begonnen von Mercator, März 23, 2011, 07:55:50

⏪ vorheriges - nächstes ⏩

Mercator

Hallo Forum,

ich bitte um Support zum folgenden Problem:

ich hatte in Access 2007 eine Datenbank u.a. mit den Feldern:
Auftrag-Nr., Bestell-Nr., etc. erstellt.

Dem Feld "Auftrag-Nr." hatte ich in der Entwurfsansicht den Primärschlüssel zugeordnet und als Felddatentyp "AutoWert" definiert.
Da die Auftrags-Nr. mit 43001 beginnen sollten, hatte ich ebenfalls in der Entwurfsansicht unter dem Feldnamen "Auftrag-Nr." unter Format "43"000 eingetragen gehabt. Es hat soweit alles funktioniert gehabt und die Auftrags-Nr. wurde jedesmal beim neuen Eintrag automatisch fortlaufend vergeben.
Nun habe ich das Problem, dass nach 43999 nicht 44000 sondern die Zahl 431016 erscheint.

Wie kann ich das Problem beheben, sodass die Auftrags-Nr. auch nach 43999 fortlaufend automatisch um 1 erhöht eingetragen werden.
Bitte um Beachtung, dass ich mich nicht mit VBA auskenne, vielleicht läßt sich das Problem anderweitig beheben.

Vilen Dank im Voraus.

Mercator

Hondo

Hallo,
der Autowert eignet sich nicht als aussagekräftige Benummerung von Datensätzen da er lücken aufweissen kann.
D.H. zusätzlich zum Autowert Primärschlüssel solltest du ein extra-Feld für die Auftragsnummer haben. Das Autowert-Feld würde ich dann AuftragsID benennen.
Dateneingabe entweder als Handeingabe oder mittels einer kleinen Funktion die die letzte Auftragsnummer sucht und um 1 erhöht.

Gruß Andreas

Mercator

Hallo Andreas,

vielen Dank für deine Antwort.

Wenn ich das Extra-Feld für die Auftragsnummern nachträglich hinzugefügt habe, wie kann ich dann die von dir genannte "kleine Funktion" generieren, damit die bereits vorhandenen Datensätze mit der Nummer 43001 beginnen und die Nummer fortlaufend um 1 erhöhrt wird.

Bin leider nicht mit VBA vertraut.

Gruß
Alexander

Hondo

#3
Hallo,
die könnte z.B. so aussehen:
In ein Modul schreibst du folgendes:

Public Function neueAuftragsNummer() As Long
    Dim db As Database
    Dim rs As Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Select Top 1 Auftragsnummer as lastNumber From TabelleAuftraege Order By Auftragsnummer Desc")
    If rs.EOF Or nz(rs!lastNumber,0) < 43001 Then
        neueAuftragsNummer = 43001
    Else
        neueAuftragsNummer = rs!lastNumber + 1
    End If
    rs.close
    Set rs = Nothing
    Set db = Nothing
End Function


Der Aufruf der Funktion erfolgt im Ereignis "vor Aktualisierung" des Formulars.
Darin schreibst du:

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Me.NewRecord Then
        Me!FeldAuftragsnummer = neueAuftragsNummer()
    End If
End Sub


Dann wird im Moment wo der Datensatz gespeichert wird die Auftragsnummer geholt.
Eine andere alternative wäre ein Button neben dem Feld Auftragnummer plazieren und beim Klicken die Prozedur ausführen wie oben.

Gruß Andreas

Mercator

Hallo Andreas,

vielen Dank für deine Mühe.

Könntest mir noch bitte erklären, wie ich diese Funktionen umsetzen / einfügen kann;
folgender Versuch ist leider gescheitert:

bin auf den Button "Erstellen" gegangen und dann auf "Modul", dort habe ich zuerst die erste Funktion eingefügt und danach die zweite. Die beiden Funktionen wurden durch eine duchgehende Linie getrennt.
Wenn ich auf die zweite Funktion klicke, erscheint oben rechts in der Spalte der Begriff: Form_BeforeUpdate. (das hast du auch wahrscheinlich gemeint mit dem Satz: "Der Aufruf der Funktion erfolgt im Ereignis "vor Aktualisierung" des Formulars").

Nur wird leider beim neuen Eintrag in der Tabelle gar keine Auftrags-Nummer angezeigt.
Wäre wirklich super, wenn du mir hierbei auch noch helfen könntest.

Gruß
Alexander

database

Hallo,

so wird das nicht gehen...

Zitatbin auf den Button "Erstellen" gegangen und dann auf "Modul", dort habe ich zuerst die erste Funktion eingefügt
bis hierher stimmts - die Prozedur 'Private Sub Form_BeforeUpdate ....' musst du komplett aus dem Modul entfernen! Dann das Modul speichern.

Der 2. Codeteil ist ein Formularereignis und dieses musst du im Formularmodul deklarieren.
Schließe das Modul und öffne das betreffende Formular im Entwurfsmodus.
Dann gehe auf die Formulareigenschaften und zeige die Registerkarte 'Ereignisse' an.
Gehe zu 'Vor Aktualisierung', wähle aus dem Dropdown [Ereignisprozedur] aus und klicke dann auf die 3 Punkte ganz rechts aussen.
Du befindest dich nun im Formularmodul und der Cursor steht im Ereignis 'BeforeUpdate'
Zwischen 'Private Sub Form_BeforeUpdate.... ' und 'End Sub' fügst du diese Zeilen ein:


If Me.NewRecord Then
       Me!FeldAuftragsnummer = neueAuftragsNummer()  
End If


Formular speichern!

Nun hast du im Ereignis 'Vor Aktualisierung' den Aufruf der Funktion 'neueAuftragsNummer' eingebunden, der dann ausgeführt wird, wenn es sich bei der anstehenden Formularaktualisierung um einen neuen Datensatz handelt.

HTH

Hondo

Äh - hab ich das oben nicht genau so beschrieben?

database

Tja,

@Andreas
...ich hätt' es aus deinem Vorschlag auch SO interpretiert - aber vielleicht geht's jetzt  :D ;) ;D

Doppelt hält besser  ::)

Mercator

Hallo zusammen,

euere Erklärung ist zwar verständlich, nur wenn ich auf den Button "Entwurf" gehe und dann das Feld "Eigenschaftenblatt" anklicke, öffnet sich das Fenster "Eigenschaftenblatt", jedoch wird nur die Registerkarte "Allgemein" angezeigt und keine "Ereignis" etc.
Ich habe bereits "gegoogelt" und fand keinen alternativen Weg um die Registerkarte "Ereignis" anzeigen zu lassen.
Habt Ihre vielleicht auch dafür eine Erklärung? ???

Vielen Dank im Voraus.

Gruß
Alexander

database

#9
Hallo,

... die Registerkarten sind wie Karteikartenreiter angeordnet!
Deren Namen sind Format, Daten, Ereignis, Andere und Alle - von Allgemein sehe ich da nichts!

Rechtsklick auf das kleine Quadrat ganz links oben im Formularentwurf und dann Eigenschaften auswählen ...  
KEINEN Button - und da was änderen, da bist du dann in einem falschen Ereignis!


siehe Anhang!

HTH

EDIT: Formularmarkierung und Bild

[Anhang gelöscht durch Administrator]