Neuigkeiten:

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

Mobiles Hauptmenü

Zum letzen Datensatz springen beim Öffnen des Formulars

Begonnen von ulli, November 02, 2010, 19:22:03

⏪ vorheriges - nächstes ⏩

ulli

Hallo,

ich habe ein Problem mit einem Formular. Es ist ohne Abfrage, Filter o.ä. an eine Tabelle als Datenherkunft gebunden Beim Öffnen sollte es automatisch zum letzten Datensatz springen. Das hatte ich in einer früheren Version mit einem Makro gemacht, funktionierte problemlos. Jetzt sollte es über VBA-Code passieren. Das Einfügen des Befehls "DoCmd.gotoRecord,, acLast" beim Ereignis form_open führte aber dazu, dass gar nichts mehr ging. Aus der Entwurfsansicht heraus wechselte es nicht in die Formularansicht, vom Datenbankfenster aus liess sich das Formular nicht mehr in Formularansicht öffnen.

Aus anderen Überlegungen heraus habe ich dann die Navigationsleiste vom Formular entfernt und mit eigenen Schaltflächen ersetzt. Jetzt zeigt mir ein Textfeld "Datensatz X von Y" an, und zwar  nach dem Öffnen: Datensatz 1 von 1. Wenn ich dann einmal manuell auf den nächsten Datensatz gehe oder auch auf den letzten, kommt richtigerweise die Anzeige "Datensatz X von 10".

Übrigens, eine MsgBox zeigt nach dem Öffnen das Ergebnis einer DCount-Abfrage mit 10 an.

Zur besseren Übersicht hier die Code-Zeilen, die vor der Anzeie des Formulars stattfinden:

Public Sub Form_Current()
If Me!BestNr = 0 Then Me!BestNr = DCount("[BestNr]", "Bestellung") + 1 'Neue Bestellnummer erzeugen

If Me!erledigt = -1 Then
    Call BestSperren
Else
    Call BestEntsperren
End If
Me!Text439 = "Datensatz " & Me.Recordset.AbsolutePosition + 1 & " von " & Me.Recordset.RecordCount
End Sub

Private Sub Form_Load()

Me!Kombinationsfeld390.BackColor = 16777215

For i = 1 To 30 'Kurztasten einlesen
    Me("Taste" & (i)).Caption = DLookup("Beschriftung", "Kurztasten", "Kurztasten!Taste = i")
Next i

End Sub

Private Sub Form_Open(Cancel As Integer)
Me![Zeit] = Format(Now, "hh:nn")
Me!Text439 = "Datensatz " & Me.Recordset.AbsolutePosition + 1 & " von " & Me.Recordset.RecordCount
End Sub

  •  

DF6GL

Hallo,

am Besten vertauscht Du Load und Open und setzt Docmd.Gotorecord,, aclast in das Load-Ereignis, bzw. benutzt nur das Load-Ereignis...

M. E ist auch die Erzeugung einer neuen Bestellnummer in Form_Current-Ereignis fehlplatziert.

ulli

Hallo Franz,
ich habe die von dir vorgeschlagenen Änderungen gemacht. Nun öffnet sich dasFormular, es wird aber nach wie vor der erste Datensatz anezeigt, und mein Textfeld zeigt "Datensatz 1 von 1".

Private Sub Form_Current()

If Me!erledigt = -1 Then
    Call BestSperren
Else
    Call BestEntsperren
End If
Me!Text439 = "Datensatz " & Me.Recordset.AbsolutePosition + 1 & " von " & Me.Recordset.RecordCount

End Sub

Private Sub Form_Load()

Me!Kombinationsfeld390.BackColor = 16777215

For i = 1 To 30 'Kurztasten einlesen
    Me("Taste" & (i)).Caption = DLookup("Beschriftung", "Kurztasten", "Kurztasten!Taste = i")
Next i
Me![Zeit] = Format(Now, "hh:nn")
Me!Text439 = "Datensatz " & Me.Recordset.AbsolutePosition + 1 & " von " & Me.Recordset.RecordCount
DoCmd.GoToRecord , , acLast

End Sub
  •  

oma

Hallo,

...
DoCmd.GoToRecord , , acLast
Me!439= "Datensatz " & Me.Recordset.AbsolutePosition + 1 & " von " & Me.Recordset.RecordCount
....



sollte richtig anzeigen

Gruß Oma
nichts ist fertig!
  •  

ulli

  •  

lumbumba

#5
evtl
Code (ohne Gewähr) [Auswählen]

....
dim lRet as long
Dim rsc as dao.recordset
set rsc = me.recordset.clone
rsc.movelast
lRet = rsc.recordcount
Set rsc = Nothing
Me!Text439 = "Datensatz " & Me.Recordset.AbsolutePosition + 1 & " von " & lret
...


oder
Code (auch ohne Gewähr) [Auswählen]

....
dim lRet as long
me.Recordset.movelast
lRet = me.Recordset.count
me.recordset.movefirst
Me!Text439 = "Datensatz " & Me.Recordset.AbsolutePosition + 1 & " von " & lret
...


---
  •  

oma

Hallo

ja, dann weiss ich auch nicht, nach Überprüfung zeigt mein dargestellter Code alles richtig an

Gruß Oma

[Anhang gelöscht durch Administrator]
nichts ist fertig!
  •  

ulli

Danke, Oma, ich werde deine letzten beiden Vorschläge heute abend noch ausprobieren. Letztendlich ist es, so hoffe ich zumindest, ein Randproblem, mit dem man wenn es sein muß auch noch leben kann. Allerdings würde mich schon brennend interessieren, war das Formular nach dem Öffnen der Meinung ist, es gäbe nur einen Datensatz. Und manchmal verbergen sich hinter solchen "Kleinigkeiten" ja durchaus ernsthafte Probleme, die im ungünstigsten Moment ihre Tragweite offenbaren...
  •  

ulli

Ich bin jetzt ein wenig schlauer. Durch Rumprobieren habe ich rausgefunden, dass das Problem mit der For-Next-Schleife zusammenhängen muss. Wenn ich nämlich die Anzeige und den Befehl, zum letzten Datensatz zu springen, vor die Schleife setze, wird beides ordnungsgemäß ausgeführt.

  •  

Shai

Ich glaube, die DoCmd.GoToRecord-Zeile muss lediglich vor die Zeile mit dem AbsolutePosition stehen.
DoCmd.GoToRecord , , acLast
Me!Text439 = "Datensatz " & Me.Recordset.AbsolutePosition + 1 & " von " & Me.Recordset.RecordCount

Das ist nämlich so, dass Recordset.Count erst dann die korrekte Zahl enthält, wenn mal einmal kurz an den letzten Datensatz gesprungen ist.

Werden die Tasten eigentlich korrekt eingelesen?
Meiner Meinung nach hat die For-Next-Schleife einen Fehler. Hier die korrigierte Fassung.

For i = 1 To 30 'Kurztasten einlesen
    Me("Taste" & (i)).Caption = DLookup("Beschriftung", "Kurztasten", "Kurztasten.Taste=" & i)
Next i



zu viele Leute denken in Excel.
  •  

oma

Hallo Shai

ZitatIch glaube, die DoCmd.GoToRecord-Zeile muss lediglich vor die Zeile mit dem AbsolutePosition stehen

Schau mal in #3

Gruß Oma
nichts ist fertig!
  •  

Shai

zu viele Leute denken in Excel.
  •  

ulli

#12
Hallo,

vielen Dank für eure Hilfe, insbesondere an Oma & Shai für den entscheidenden Hinweis. Wie gesagt, das Problem lag tatsächlich in der For-Next-Schleife, und mit der vorgeschlagenen Änderung funktioniert alles bestens.

Aufgefallen ist es mir deswegen nicht, weil ich nach dem ersten Einlesen der Kurztasten daran keine Änderungen mehr gemacht habe; es schien einfach zu funktionieren. Das Seltsame daran ist, es hat ja mal funktioniert, soll heißen, die vorhandenen Captions sind aus der entsprechenden Datei eingelesen worden !?! Die einzig logische Erklärung wäre die, dass ich danach den Code geändert bzw. vermurkst habe, und daran kann ich mich beim besten Willen nicht erinnern. Wie auch immer: Danke an alle!
  •