Nummerieren in der Gruppe

Guten Morgen,
folgendes Problem bei Access2013:
Ich habe eine Tabelle tbl_Artikel (ID=Autowert) mit dem Feld ArtikelName.
Nun gibt es mehrere Artikel gleichen Namens, weil diese zusammengehören.
Nun möchte ich mit Hilfe einer Abfrage die Artikel durchnummerieren.
„(ID:5) DGH-2483“ soll zu „(ID:5) DGH-2483 1/5“ und „(ID: 82) DGH-2483“ soll zu „(ID:82) DGH-2483 2/5)“ usw. werden. 
Anzahl der gleiche Artikel Namen iss ja kein Problem, aber Rest…

Vielen Dank schon mal im Vorraus

Guten Morgen,
folgendes Problem bei Access2013:
Ich habe eine Tabelle tbl_Artikel (ID=Autowert) mit dem Feld
ArtikelName.
Nun gibt es mehrere Artikel gleichen Namens, weil diese
zusammengehören.
Nun möchte ich mit Hilfe einer Abfrage die Artikel
durchnummerieren.
„(ID:5) DGH-2483“ soll zu „(ID:5) DGH-2483 1/5“ und „(ID: 82)
DGH-2483“ soll zu „(ID:82) DGH-2483 2/5)“ usw. werden. 
Anzahl der gleiche Artikel Namen iss ja kein Problem, aber
Rest…

Hallo mimich2,
so etwa?
Laufende Nummer fuer kategorisierte Datensaetze vergeben.

Haeufig sollen Datensaetze, die einer gemeinsamen Gruppe angehoeren, in einer Abfrage oder in einem Bericht mit einer laufenden Nummer innerhalb der Gruppe ausgegeben werden. Das Problem in der Abfrage oder dem Bericht zu loesen, erfordert eine VBA-Funktion, durch die die Loesung recht langsam wird.

Einfacher und schneller als mit einer Abfrage gelangt man zum Ziel, wenn die laufende Nummer direkt bei der Anlage eines neuen Datensatzes zugeordnet und in der Tabelle gespeichert wird. Sehe Dir dazu als Beispiel eine auf einer Tabelle „Artikel“ basierende Artikelverwaltung an, bei der alle Artikel mit einer Kategorie versehen sind und in der nun innerhalb der Kategorie fortlaufend nummeriert werden soll. Gehe dazu folgendermassen vor:

  1. Oeffne die Tabelle „Artikel“ im Entwurfsmodus,
    fuege ein Feld „LaufendeNummer“ vom Datentyp „Zahl“
    mit der Feldgroesse „Long Integer“ hinzu, speichere die Aenderungen und verlasse den Tabellenentwurf wieder.

  2. Oeffne das zur Verwaltung der Artikel verwendete
    Formular, also zum Beispiel „Artikelverwaltung“, im
    Entwurfsmodus und fuege das Feld „LaufendeNummer“ an
    passender Stelle im Formular hinzu.

  3. Stelle die Eigenschaft „Vor Aktualisierung“ des
    Formulars auf „[Ereignisprozedur]“ ein, klicke auf
    die Schaltflaeche mit den drei Punkten, um den VBA-Editor
    zu oeffnen und gebe folgende Anweisungen ein:

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim lf As Variant

On Error Resume Next
lf = DMax("[LaufendeNummer]", _
„[Artikel]“, _
"[Kategorie-Nr]= " & Me.KategorieNr)
If IsNull(lf) Then 'Nicht gefunden, Vorgabe „1“
Me.LaufendeNummer = 1
Else 'Hoechste Nummer „+1“ setzen
Me.LaufendeNummer = lf + 1
End If

End Sub

Diese Funktion ermittelt per „DMax()“ die hoechste, im Feld „LaufendeNummer“ der Tabelle „Artikel“ gespeicherte Nummer, wobei die Kategorienummer der aktuellen Kategorienummer im Formular entsprechen muss. Die Feldnamen ersetze ggf.
durch die Namen der in Deinem Formular und der Tabelle verwendeten Felder.

  1. Speichere die Aenderungen.

Wenn Du das Formular anzeigen und testweise einige Datensaetze in der gleichen Kategorie eingibstn, werden diese automatisch fortlaufend nummeriert.

Bitte beachte, dass die fortlaufende Nummerierung natuerlich erst ab dem Zeitpunkt der Integration dieser Erweiterung erfolgt - eventuell vorhandene Datensaetze muessen zunaechst manuell um die laufende Nummer ergaenzt werden! Das laesst sich leider nicht mit einer Aktualisierungsabfrage erledigen, da Aktualisierungsabfragen immer erst eine temporaere Datensatzgruppe verarbeiten, bevor Ergebnisse in die Tabelle geschrieben werden. Die Abfrage der Tabelle per „DMax()“ wuerde also innerhalb der Aktualisierungsabfrage fuer jeden Datensatz das gleiche Ergebnis liefern, obwohl dem Feld „LaufendenNummer“ in der Aktualisierungsabfrage „DMax() +1“ zugewiesen werden wuerde

  • diese Aenderungen spiegeln sich aber erst nach Ausfuehrung der Aktualisierungsabfrage in der Tabelle wieder.

Gruß - Wolfgang

Hallo,

hier frage ich mich auch, welchen Sinn eine solche Durchnummerierung haben soll.

Wenn sie denn für „schöne“ Ansicht erforderlich ist, könnte das am einfachsten in einem Bericht realisiert werden, der nach dem Artikelnamen gruppiert und die Eigenschaft „Laufende Summe“ eines Textfeldes ausnutzt.

Gruß
Franz,DF6GL

Hallo Franz,

Hallo,

hier frage ich mich auch, welchen Sinn eine solche
Durchnummerierung haben soll

das habe ich nicht nachgefragt. Hatte gerade den Code parat.

Wenn sie denn für „schöne“ Ansicht erforderlich ist, könnte
das am einfachsten in einem Bericht realisiert werden, der
nach dem Artikelnamen gruppiert und die Eigenschaft „Laufende
Summe“ eines Textfeldes ausnutzt.

ja klar, hast recht, dass es über eine lfd.-Nr. im Bericht gemacht werden kann. Aber was wird denn nicht alles empfohlen, geschrieben…

Gruß - Wolfgang

Hallo,

„das habe ich nicht nachgefragt …“

Das sollte aber (immer) passieren, denn davon hängt der Lösungsweg und eine brauchbare Lösung ab…

Prinzip ist (natürlich mit Ausnahmen, wo es wirklich sinnvoll ist): alle Werte, die sich aus der Kombination bzw. Berechnung von Grunddaten ergeben, werden nicht in Tabellen gespeichert, sondern dort berechnet, wo sie gebraucht werden.

"Aber was wird denn nicht alles empfohlen, geschrieben… "

Ja, leider… deshalb sollte auch nicht alles kritiklos (d. h. ohne zu hinterfragen) hingenommen werden.

Gruß
Franz,DF6GL

Hallo Franz,
ich habe im Forum einen Code von Dir gefunden, Klasse Sache! Kann man den für einen gesetzten Filter, z.B. einer Abfrage oder für einen Filter im Form anpassen?

Private Sub btnHelferMail_Click()
Dim rs As DAO.Recordset, strAdr As String

Set rs = CurrentDb.OpenRecordset(„select [EMail] from tblKioskhelfer where [EMail] is not Null“, dbOpenSnapshot)

Do Until rs.EOF
strAdr = strAdr & „;“ & rs(0)
rs.MoveNext
Loop

If Len(strAdr) > 0 Then
DoCmd.SendObject , , , Mid(strAdr, 2), , , „Testmail“, „Liebe Helfer,“, True
Else
MsgBox „Keine Mailadressen gefunden“
End If

rs.Close: Set rs = Nothing
End Sub

Gruß-Wolfgang

Hallo,

ich habe im Forum einen Code von Dir gefunden, Klasse Sache!
Kann man den für einen gesetzten Filter, z.B. einer Abfrage
oder für einen Filter im Form anpassen?

Private Sub btnHelferMail_Click()
Dim rs As DAO.Recordset, strAdr As String

Set rs = CurrentDb.OpenRecordset(„select [EMail] from
tblKioskhelfer where [EMail] is not Null“, dbOpenSnapshot)

Diesen Teil durch Dein akt. Kriterium ersetzen, bzw. den gesamten SQL-String anpassen…

Do Until rs.EOF
strAdr = strAdr & „;“ & rs(0)
rs.MoveNext
Loop

If Len(strAdr) > 0 Then
DoCmd.SendObject , , , Mid(strAdr, 2), , , „Testmail“, „Liebe
Helfer,“, True
Else
MsgBox „Keine Mailadressen gefunden“
End If

rs.Close: Set rs = Nothing
End Sub

Gruß
Franz,DF6GL

Servus Franz,
werde es versuchen.

ich habe im Forum einen Code von Dir gefunden, Klasse Sache!
Kann man den für einen gesetzten Filter, z.B. einer Abfrage
oder für einen Filter im Form anpassen?

Private Sub btnHelferMail_Click()
Dim rs As DAO.Recordset, strAdr As String

Set rs = CurrentDb.OpenRecordset("select [EMail] from
tblKioskhelfer where [EMail] is not Null", dbOpenSnapshot)

Diesen Teil durch Dein akt. Kriterium ersetzen, bzw. den
gesamten SQL-String anpassen…

ich habe es im Vorfeld schon mit der Anpassung des SQL’s auf eine Abfrage versucht, hat aber nicht geklappt.
Set rs = CurrentDb.OpenRecordset(„select [EMail] from
qyr Kioskhelfer where [EMail] is not Null“, dbOpenSnapshot)

Do Until rs.EOF
strAdr = strAdr & „;“ & rs(0)
rs.MoveNext
Loop

If Len(strAdr) > 0 Then
DoCmd.SendObject , , , Mid(strAdr, 2), , , „Testmail“, „Liebe
Helfer,“, True
Else
MsgBox „Keine Mailadressen gefunden“
End If

rs.Close: Set rs = Nothing
End Sub

Gruß - Wolfgang
einen guten rutsch!

Hallo,

naja, gibt es denn die Abfrage „qyrKioskhelfer“ und darin das Feld „Email“ ?

Ebenso guten Rutsch ins Neue Jahr und viel Erfolg mit Access…

Gruß
Franz, DF6GL

Hallo Franz,

naja, gibt es denn die Abfrage „qyrKioskhelfer“ und darin das
Feld „Email“ ?

ja es gibt die Query und darin das Feld Email

Ebenso guten Rutsch ins Neue Jahr und viel Erfolg mit Access…

Danke!

Gruß - Wolfgang

Hallo Franz,

naja, gibt es denn die Abfrage „qyrKioskhelfer“ und darin das
Feld „Email“ ?

hast Du noch eine Lösung für mein Problem? Bei meinen Versuchen klappt es nicht, würde mir sehr helfen. Danke!

Gruß - Wolfgang

Hallo,

ich bin nach wie vor der Meinung, dass mit der Abfrage etwas nicht stimmt…

Geh in den Abfrage-Entwurf und dort in die SQL-Ansicht, kopiere den folgenden String:

select [EMail] from qyrKioskhelfer where [EMail] is not Null

dort hinein und führe die Abfrage aus. Wenn Datensätze angezeigt werden, dann setze im Code einen Haltepunkt an den Anfang und fahre mit Einzelschritt durch. Dabei kann dann der Inhalt der einzelnen Variablen überprüft werden.

Wenn nicht, dann baue eine korrekte Abfrage zusammen…

Zudem wichtig: Im Modulkopf
Option Explicit
eintragen. (und nicht nur in diesem einen, sondern in ALLEN)

Gruß
Franz,DF6GL
… mehr auf http://w-w-w.ms/a4fcy2

Hallo Franz,
danke Dir für Deine Mühe, nun funktioniert es. Schönen Sonntag!
Gruß - Wolfgang