Hallo,
ich bin neu hier im Forum, zumindest schreibend. Die meisten Probleme konnte ich durch andere Beiträge lösen. Hier komme ich aber jetzt nicht mehr weiter.
Ich möchte in einer Abfrage eine Funktion aufrufen, die die gleichen Datensätze durchnummeriert. Also z.B.
A 1
A 2
B 1
usw.
Ziel ist ein "x von Gesamtzahl" Feld in der Abfrage. Die Gesamtzahl habe ich, es geht um den Zähler:
Public Function Test()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("qryC")
Dim Name As String
Dim Zaehler As Integer
If Not Name = rs.Fields("tabName").Value Then
Zaehler = 1
Else
Zaehler = Zaehler + 1
End If
Test = Zaehler
Name = rs.Fields("tabName").Value
Set rs = Nothing
Set db = Nothing
End Function
qryC ist zum Testen eine einfache Abfrage mit den Feldern tabID, tabName und "Zähler: Test()"
Der Fehler liegt bei "Set rs = db.OpenRecordset("qryC")", die Fehlermeldung ist "Laufzeitfehler 28: fehlt"
Wenn ich eine komplett neue Abfrage erstelle und die Funktion das erste Mal aufrufe, wird die entsprechende Spalte mit 1 erzeugt. Nach dem zweiten Mal kommt die Fehlermeldung.
(Edit: Ah, das mit der durchgehenden 1 liegt ws. daran, dass der Zähler jedes mal bei 0 anfängt. Hier müsste ich eine globale Varible definieren, dass das Ergebnis länger gespeichert werden kann)
Hat jemand eine Idee woran das liegen könnte oder was ich besser machen kann?
Grüße,
Stefan
Hallo Stefan,
Hört sich so an, als ob dir dieses weiterhelfen könnte:
http://www.donkarl.com?FAQ3.11 (http://www.donkarl.com?FAQ3.11)
gruss ekkehard
Hallo,
das Übel liegt beim rekursiven Aufruf der Funktion...
Abfrage:
ZitatSelect tabName, Test([tabID]) as Zähler
From Tabelle1
Order by tabName
und Funktion (ohne Errorhandling):
Public Function Test(lngID As Long)
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Select tabName from Tabelle1 where tabid = " & lngID)
Static Zaehler As Long
Static strName As String
If Not strName = rs(0) Then
Zaehler = 1
Else
Zaehler = Zaehler + 1
End If
Test = Zaehler
strName = rs(0)
rs.Close: Set rs = Nothing
Set db = Nothing
End Function
Super, vielen Dank, es funktioniert! Das bringt mich ein gutes Stück weiter!
(VBA ist noch nicht ganz meine Stärke)
Ok, also an sich funktioniert der Zähler. Wenn ich aber eine längere Abfrage habe und darin scrolle, werden die Zahlen komplett durcheinander geworfen, teilweise werden Zahlen übersprungen. Wenn ich in ein einzelnes Feld klicke, dann verändert sich nur die Zahl in der entsprechenden Zeile. Wird die Abfrage für einen Bericht verwendet, verändern sich die Zahlen nicht beim scrollen, dann ist auch die Reihenfolge korrekt, aber immer noch beim Klicken. Hoffe es ist verständlich, was ich meine!
Das hört sich für mich irgendwie nicht ganz normal an, zumindest habe ich davon noch nichts gehört :o
Hallo,
vergiß die Geschichte mit einer eigenen Funktion für einen Zähler, der nicht auf Sortierkriterien aufgebaut ist - Artefakte, die dabei entstehen können, hast Du ja selbst schon erfahren. Halte Dich an Don Karls Laufende Nummer/Summe in Berichten (http://www.donkarl.com/FAQ/FAQ5Berichte.htm#5.16). Oder dient der Zähler noch anderen Zwecken?
Hallo,
Zitatder nicht auf Sortierkriterien aufgebaut ist
--->
ZitatSelect tabName, Test([tabID]) as Zähler
From Tabelle1
Order by tabName
Zitat...eine längere Abfrage habe und darin scrolle, werden die Zahlen komplett durcheinander geworfen..
Das kann immer vorkommen, wenn eine VBA-Routine von der Abfrage aufgerufen wird. Das liegt an der nicht synchronen Aktualisierung der Abfrage-Liste beim Scrollen
ZitatWird die Abfrage für einen Bericht verwendet, verändern sich die Zahlen nicht beim scrollen, dann ist auch die Reihenfolge korrekt, aber immer noch beim Klicken.
Die laufenden Nummen (Laufende Summe) pro Gruppe sind in einem Bericht auch ohne eine solche Funktion allein mit Boardmitteln realisierbar.
Auch die Sortierung hilft Deiner Funktion nicht auf die Beine, weil Access Datensätze beim Navigieren in Abfrage, Formular oder Bericht dynamisch seitenweise nachlädt - fällt vielleicht erst beim Zurücknavigieren auf.
Ausweg: man nehme einen der vielen kostenlos erhältlichen Datenbankserver mit Window-Funktionen als Backend und greife auf die Funktion RowNumber() zurück oder die von ekkehard erwähnte langsame Don Karl-Methode.