Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Automatische Nummernvergabe

Begonnen von mad, Januar 28, 2017, 17:22:08

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,
bisher habe ich in meiner Inventarliste bei Neuanlage eines Gegenstands dies direkt in der Tabelle tblTypen bemacht. Da die Inventarliste jetzt von mehr Personen benutzt wir möchte ich das jetzt über ein Formular erledigen.

So hätte ich mir das gedacht:
durch drücken auf neuen Datensatz springt das Formular (Datengrundlage qyr_NeuTypen) in einen neuen leeren DS. Soweit i.O..
Nun möchte ich erreichen das nach Auswahl der "Arten" im Formular die letzte Nummer der "TypNr" dieser Art "ArtenNr" ausgelesen wird und im Feld "TypNr" +1 eine neue Nummer angelegt wird. Dann wird noch der "Typ"-Name eingetragen und das ganze wird in der "tblTypen" abgelegt.

Ich habe was ähnliches im Internet gefunden. Habe versucht es anzupassen:
Private Sub Arten_AfterUpdate()
Me.TypNr = Nz(DMax("TypNr", "qyrNeuTypen"), 0) + 1
End Sub

Funktioniert aber nicht, bin wahrscheinlich auf dem Holzweg.

Könnt mir jemand dazu Unterstützung geben.
Ich habe mal eine kleine DB angehängt.

Gruss
mad

DF6GL

Hallo,

die Abfrage heißt "qyr_NeuTypen"  und nicht "qyrNeuTypen"..

Allerdings bist Du beim Tabellenaufbau und damit beim DB-Konzept auf dem Holzweg.

Beachte, bzw. lies die u st. Links 1 und 1a und setze das Prinzip um.

mad

Hallo,
ich wähle die Arten als Auswahlfeld bei tblTypen aus, beim rauskopieren der Tabellen und Abfrage sind scheinbar die Beziehungen zwischen den beiden Tabellen verloren gegangen. Die Beziehung habe ich jetzt wieder eingefügt, sh. Bild.
Ansonsten habe ich zuwenig Erfahrung was ich beim DB-Konzept anders machen soll.
Den Abfragenamen habe ich im Code geändert, funktioniert noch nicht.

Gruss
mad

DF6GL

Hallo,

anbei die DB.

Die Abfrage brauchst Du nicht... 

Die "Berechnung" der TypNr ist recht fragwürdig/falsch..  Einen TEXT um 1 zu erhöhen ist mathematischer Unsinn. Zudem hat TEXT als Primärschlüssel einige Nachteile.  Wenn eine solche sprechende Bezeichnung "berechnet" werden soll, so hat das in einer separaten Funktion mit entsprechend umgesetzten Algorithmus (Berechnungsvorschrift) zu erfolgen.


In jedem(!) Modulkopf sollte

Option Compare Database
Option Explicit

eingebaut werden, damit nicht deklarierte Variablen vom Kompiler erkannt werden.

(VBA-Optionen checken!)





mad

Hallo,

danke vorab, aber das ist nicht das was ich erreichen wollte.
Jetzt wir immer die letzte Zeile erweitert, dies ist in dem Fall die 3.27.021 +1; 3.27.022 +1, und so weiter.
Ich versuche es nochmals etwas detailierter zu erklären, Bild-1 im Anhang.

In der tblArten gibt es 52 verschiedene Arten die sich wie folgt aufteilen, 1.01, 1.02., usw. für Fahrzeuge, 2.01, 2.02, usw. für Geräte und 3.01, 3.02, usw. für Material. Unter jedem dieser Arten in der tblTypen gibt es eine unterschiedliche Anzahl an Typen, siehe ein Beispielbild (Bild1).

Wenn man das Beispielbild-1 nimmt und man würde im frmTypenanlage unter Arten (Auswahl) z.B. Gerätewagen auswählen, dann sollte als nächste Nummer die 1.06.007 angelegt werden. Wenn ein weiteres mal ein neues Löschgerät angelegt werden soll dann wäre die nächste Nummer die 2.02.017.

Ich hoffe es wird nun etwas verständlicher.

Gruss
mad

MzKlMu

#5
Hallo,
nach meiner Auffassung wurde das ganze Vorhaben falsch aufgesetzt.
Es ist falsch, diese zusammengesetzten Schlüssel in der Tabelle zu speichern.
Außerdem sind solche zusammengesetzten Felder als Primärschlüssel ungeeignet, da Text und keine Zahl. In die Tabelle selbst, kommt nur die reine Zählnummer (1, 2, 3 usw.) die man beim Zusammensetzen mit führenden 0en formatiert.
Diese zusammengesetzten Schlüsselwerte legt man in einer Abfrage an als zusammengesetztes Feld an. Es gibt keine Einschränkung gegenüber der Speicherung in der Tabelle. Im Gegenteil, die Fehlermöglichkeit ist geringer, da ein solches zusammengesetztes Feld automatisch immer stimmt.
Als Primärschlüssel nimmt man einen Autowert.
Und für die Kategorie legt man auch eine Tabelle an, damit man beim Zusammensetzen die Zahl (1,2,3) hat.

Die Tabellen sollten so aussehen wie im Bild. Nur das was noch zu sehen ist, sollte in der Tabelle stehen.

Hast Du im Moment nur diese 2 Tabelle aus dem Beziehungsbild weiter oben ?
Und noch eine Frage, verwendest Du Nachschlagefelder in Tabellen direkt ?
Die + zum Klicken vor den Datensätzen deutet darauf hin.
Von den Nachschlagefeldern in Tabelle ist dringend abzuraten. Und die Aufklappfunktion ist auch eher überflüssig.



Gruß Klaus

mad

#6
Hallo,
das mit den Primärschlüsseln und den führenden 0en habe ich soweit verstanden. Nur ob ich das ganze so einfach umstellen kann muss ich mir erst ansehen. Die DB ist doch schon einige Jahre im Einsatz und es haben sich doch schon viele Datensätze angesammelt. Ich weis natürliuch nicht was ich bei einer Umstellung alles zerschiessen werde.
Zur ersten Frage, ja es gibt vor der tblArten noch eine tblKategorien in der die erste Nummer (1=Fahrzeuge, 2=Geräte, 3=Material) angelegt sind.
Zur nächsten Frage, ja ich verwende Textfelder als Nachschlagefelder, kann man in der tblTypen unter Arten sehen.

Gibt es trotzdem mit der heutigen Art der DB, zugegebermassen vielleicht nicht optimal, eine Lösung?
Über weitere Unterstützung würde ich mich freuen.

Gruss
mad

DF6GL

Hallo,


wenn Du es unbedingt so weiterführen willst:

(Ohne Rücksicht auf evtl. Überläufe !)

Private Sub Arten_AfterUpdate()
On Error GoTo myErr
Dim rs As DAO.Recordset

If Me.NewRecord Then

Set rs = CurrentDb.OpenRecordset("select  max(val(Mid(TypNr,4))) as MaxTyp from tblTypen " & _
" where Arten ='" & Me!Arten & "' ", dbOpenSnapshot)
If rs.RecordCount > 0 Then
  Me!TypNr = Me!Arten & Format(rs(0) + 1, "000")
    End If
Exit_Sub:

rs.Close: Set rs = Nothing
Exit Sub

myErr:

MsgBox Err.Number & ":  " & Err.Description

Resume Exit_Sub
End If
End Sub


Lachtaube

Nebenbei: für eine Mehrbenutzerumgebung ist die gezeigte Vorgehensweise IMHO ungeeignet.
Grüße von der (⌒▽⌒)

DF6GL

Hallo,

auf die ungeeignete DB-Konstruktion wurde schon mehrfach hingewiesen.....

mad

Funktioniert,
vielen Dank nochmals.

Ich bin bereits am umbauen, wird aber dauern.


Danke
mad