Code-Problem: Sprung zum letzten Datensatz

Hallo liebe Experten,

ich habe wieder ein Problem. Ich habe ein Formular mit einem Registersteuerelement (ca. 15 Reiter). Jeder Reiter enthält ein Unterformular. So weit so gut. In dem Hauptformular habe ich ein Listenfeld mit folgendem Code:

Private Sub Liste71_DblClick(Cancel As Integer)
With Me(Amb.Column(3))
.Form!Diagnose = Me!Liste71.Column(0)
.Form!DiagnoseBeschr = Me!Liste71.Column(1)
.Requery
End With
End Sub

Per Doppelklick wird der Inhalt des Listenfeldes in die Felder Form!Diagnose und Form!DiagnoseBeschr übertragen. Das war die Vorgeschichte :wink: Mein Problem ist: Jedes UFO in dem jeweiligen Reiter hat diverse zu füllende Felder und ein ID Feld. Ich trage bspw. die ID 1.1 ein und führe ein Doppelklick in der Liste71 durch. Dann trage ich eine ID 3.1 ein und führe einen Doppelklick durch. Jetzt trage ich eine ID 2.1 NACH und führe einen Doppelklick durch --> dann springt das UFO auf den letzten Datensatz 3.1 um. Wie kann ich es vermeiden? Das ist lästig wenn man noch andere Eintragungen vornehmen muss. Ich hoffe ich konnte es erklären.

Besten Gruß und vielen Dank
Igor

Hallo Igor,

ich habe wieder ein Problem. Ich habe ein Formular mit einem
Registersteuerelement (ca. 15 Reiter). Jeder Reiter enthält
ein Unterformular. So weit so gut.

nö nicht so gut! bitte ausfüllen:

  • das Hauptformular hat den Namen:________________
  • das Registersteuerelement hat den Namen:________________
  • das Ufo Nr. ___ den Namen:________________
    ggf. für weiter UFOs kopieren…

In dem Hauptformular habe
ich ein Listenfeld (Liste71) mit folgendem Code:

Private Sub Liste71_DblClick(Cancel As Integer)
With Me(Amb.Column(3))
.Form!Diagnose = Me!Liste71.Column(0)
.Form!DiagnoseBeschr = Me!Liste71.Column(1)
.Requery
End With
End Sub

Vorschlag das ganze kürzer zu machen:
Keine Ahnung was Amb ist!?

Private Sub Liste71_DblClick(Cancel As Integer)
me.Form!Diagnose = Me.Liste71.Column(0)
me.Form!DiagnoseBeschr = Me.Liste71.Column(1)
End Sub

Mein Problem ist: Jedes UFO in dem jeweiligen
Reiter hat diverse zu füllende Felder und ein ID Feld.

ID-Felder sollten IMMER automatisch gefüllt werden. Das erreicht man durch z.B. die Definition des Feldtypes als Autowert.

Ich trage bspw. die ID 1.1 ein

wo? warum? was? Eine ID besteht idR. aus einem einzigen mathematischen Wert und nicht mit Dezimalwerten!

und führe ein Doppelklick in der Liste71 durch.

warum?

Dann trage ich eine ID 3.1 ein

wo? warum? was?

und führe einen Doppelklick durch.

wo? warum?

Jetzt trage ich eine ID 2.1 NACH

wo? warum? was?

und führe einen Doppelklick durch

wo? warum?

–> dann springt das UFO auf den

welches der 15 UFOs?

letzten Datensatz 3.1 um.

?? WAS ist der Datensatz 3.1?

Wie kann ich es vermeiden?

konsistentes Datenmanagement

Das ist lästig wenn man noch andere Eintragungen vornehmen muss. Ich
hoffe ich konnte es erklären.

sorry, du hast meine Fragen gelesen. Anhand deiner Beschreibung habe ich leider nichts verstanden :frowning:

vielleicht versuchst du einfach noch mal dein Problem etwas ausführlicher zu beschreiben?

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo,

neben dem, was Netwolf gesagt hat, wird durch .Requery das Form halt neu geladen und die DS entspr. sortiert.

Lt. Code haben alle UFOs dieselben (beiden) Textfelder und greifen vermutlich auf diesselbe(n) Tabelle(n) zu. Das wird Sperr-/Speicherprobleme aufwerfen und deutet auf die genannte Daten-Inkonsistenz (nicht normalisierter Tabellenaufbau) hin.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo Wolfgang, mein Retter :wink:

  • das Hauptformular hat den Namen: Haupt
  • das Registersteuerelement hat den Namen: RegisterStr15
  • Reiterindex: 0 enthält UFO: IM-CIO
  • Reiterindex: 1 enthält UFO: IM-Privat
  • Reiterindex: 2 enthält UFO: IM-HIV
  • Reiterindex: 3 enthält UFO: IM-Onko
  • Reiterindex: 4 enthält UFO: IM-Immun
  • Reiterindex: 5 enthält UFO: IM-KMT
  • Reiterindex: 6 enthält UFO: Augen-Poliklinik
  • Reiterindex: 7 enthält UFO: Augen-Kontakt
  • Reiterindex: 8 enthält UFO: Augen-OP
  • Reiterindex: 9 enthält UFO: Augen-Orthoptik
  • Reiterindex: 10 enthält UFO: Derma-Tumoramb
  • Reiterindex: 11 enthält UFO: Derma-Prokto
  • Reiterindex: 12 enthält UFO: Derma-Paed
  • Reiterindex: 13 enthält UFO: Derma-Privat
  • Reiterindex: 14 enthält UFO: Derma-Allergologie
  • Reiterindex: 15 enthält UFO: Derma-WundPhlebologie
  • Reiterindex: 16 enthält UFO: Derma-Spez
  • Reiterindex: 17 enthält UFO: Derma-Psoriasis
  • Reiterindex: 18 enthält UFO: Derma-Poliklinik
  • Reiterindex: 19 enthält UFO: Derma-Licht
  • Reiterindex: 20 enthält UFO: Derma-Kollagenosen

zu2)
wenn ich es so mach:

Private Sub Liste71_DblClick(Cancel As Integer)
me.Form!Diagnose = Me.Liste71.Column(0)
me.Form!DiagnoseBeschr = Me.Liste71.Column(1)
End Sub

dann bekomme ich beim Klick eine Meldung, dass das Feld „Diagnoe“ nicht gefunden werden konnte.

zu3)
Mit ist bewusst, dass es einen AutoWert gibt, doch es war in dem vorliegenden Fall leider nicht möglich. Die ID muss mind. zweistellig (1.1) und maximal siebenstellig (1111.111) sein. Wenn der Besucher das erste Mal kommt, dann bekommt er stets eine „.1“ nach der fortlaufenden Nummer. Es kann auch passieren, dass der Besucher zum zweiten Mal kommt. Wenn dies der Fall ist, dass muss er die gleiche Nummer bekommen aber mit der „.2“ und beim dritten Besuch mit einer „.3“ am Ende usw.

Wenn der Anwender bspw. bereits eine 5.1 eingetragen hat und der Besucher mit der Nummer 3.1 noch ein Mal kommt, dann trägt der Anwender eine 3.2 in das ID Feld ein. Wenn dies der Fall ist und folgende Aktion ausgeführt wird:

Private Sub Liste71_DblClick(Cancel As Integer)
With Me(Amb.Column(3))
.Form!Diagnose = Me!Liste71.Column(0)
.Form!DiagnoseBeschr = Me!Liste71.Column(1)
.Requery
End With
End Sub

… dann springt das jeweilige UFO nach dem Doppelklick auf den letzten Datensatz. Wenn der Anwender dann noch weitere Eintragungen vornehmen muss, dann muss er händisch zu der ID 3.2 scrollen und dann die Änderungen vorzunehmen. Lästig! Daher meine Frage wie man es unterbinden kann.

zu4)
Per Doppelklick im Listenfeld des Hauptformulares wird dessen Inhalt in die zewei textfelder des jeweiligen UFOs eingetragen.

Ich hoffe ich konnte es diesmal beschreiben.

Vielen Dank im Voraus!!!
Gruß
Igor

Hallo Franz,

–> neben dem, was Netwolf gesagt hat, wird durch .Requery das Form halt neu geladen und die DS entspr. sortiert.

Das habe ich mit bereits gedacht. Was kann ich denn in dem Fall machen, um es zu unterbinden?

Vielen Dank!
Gruß
Igor

Hallo,

halt kein Requery ausführen, oder nach dem Requery auf den vorherigen DS neu positionieren, z. B. mittels
Bookmark mit .Recordsetclone.Findfirst …

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo Franz,

eigentlich supi Ansatz. Requery ist schon sinnvol, da i ch sonst nicht sehe wasn und ob ich in das UFO was einfüge. Wie kann ich denn den DS den ich zuletzt bearbeitet habe ansteuern?

Gruß
Igor

Hallo Franz,

ich habe bei Donkarl einen FAQ 4.5 gefunden, der gleiches Problem beschreibt. Nun stehe ich vor dem Problem meinen Code anzupassen. Ich bräuchte etwas Hilfe. Mein Code:

Private Sub Liste71_DblClick(Cancel As Integer)
On Error GoTo myError
Dim lngStore As Long

With Me(Amb.Column(3))
.Form!Diagnose = Me!Liste71.Column(0)
.Form!DiagnoseBeschr = Me!Liste71.Column(1)
.Requery
End With

lngStore = Me(Amb.Column(3)).Form!ID

'Bildschirmflackern reduzieren
Me.Painting = False

Me.Requery
Me.RecordsetClone.FindFirst "Id = " & lngStore
Me.Bookmark = Me.RecordsetClone.Bookmark

myExit:
Me.Painting = True
Exit Sub

myError:
Select Case Err.Number
Case 3159
'not a valid bookmark
Resume myExit
Case Else
MsgBox "Exception Nr. " & Err.Number & " " & Err.Description
Resume myExit
End Select
End Sub

Ich bekomme einen Fehler 7951 --> unzulässiger Verweis auf RecordsetClone-Eigenschaft.

Gruß
Igor

Hallo,

Du darfst halt nicht Me benutzen, sondern das entspr. UFO:

Me(Amb.Column(3)).Form

Hi Franz,

ich muss Me(Amb.Column(3)).Form benutzen, da es soc gedacht ist, dass der UFO Name flexibel gehandhabt wird. Das heisst je nach dem was im Column (3) drin steht --> um diese Form handelt es sich dann.

Gruß
Igor

sag ich doch !?

entschuldige Franz,

vielleicht habe ich was missverstanden. Ich muss auf den Ausdruck Me(Amb.Column(3)).Form zurückgreifen! Ich bekomme beim Code.

Private Sub Liste71_DblClick(Cancel As Integer)
On Error GoTo myError
Dim lngStore As Long

With Me(Amb.Column(3))
.Form!Diagnose = Me!Liste71.Column(0)
.Form!DiagnoseBeschr = Me!Liste71.Column(1)
.Requery
End With

lngStore = Me(Amb.Column(3)).Form!ID

'Bildschirmflackern reduzieren
Me.Painting = False

Me.Requery
Me.RecordsetClone.FindFirst "Id = " & lngStore
Me.Bookmark = Me.RecordsetClone.Bookmark

myExit:
Me.Painting = True
Exit Sub

myError:
Select Case Err.Number
Case 3159
'not a valid bookmark
Resume myExit
Case Else
MsgBox "Exception Nr. " & Err.Number & " " & Err.Description
Resume myExit
End Select
End Sub

das Problem und steh aufm Schlauch. Ich versteh momentan nicht worauf das „sag ich doch !?“ sich bezieht.

Danke
Igor

Hallo,

" Ich muss auf den Ausdruck Me(Amb.Column(3)).Form zurückgreifen!"

Genau das hab ich Dir schon in einem Posting vorher gesagt…

Darauf bezog sich das. :wink:

ja aber wenn ich das mache, dann funzt es nicht. Ich glaube ich hab ein Brett vorm Kop :wink:

Gruß
Igor

ja ich glaube ich weiß was du meinst :wink:

ich habe jetzt den Code so angepasst:

Private Sub Liste71_DblClick(Cancel As Integer)
On Error GoTo myError
Dim lngStore As Long

With Me(Amb.Column(3))
.Form!Diagnose = Me!Liste71.Column(0)
.Form!DiagnoseBeschr = Me!Liste71.Column(1)
.Requery
End With

lngStore = Me(Amb.Column(3)).Form!ID

'Bildschirmflackern reduzieren
Me(Amb.Column(3)).Form.Painting = False

Me(Amb.Column(3)).Form.Requery
Me(Amb.Column(3)).Form.RecordsetClone.FindFirst "Id = " & lngStore
Me(Amb.Column(3)).Form.Bookmark = Me(Amb.Column(3)).Form.RecordsetClone.Bookmark

myExit:
Me(Amb.Column(3)).Form.Painting = True
Exit Sub

myError:
Select Case Err.Number
Case 3159
'not a valid bookmark
Resume myExit
Case Else
MsgBox "Exception Nr. " & Err.Number & " " & Err.Description
Resume myExit
End Select
End Sub

und bekomme folgende Meldung Nr 3464: Data type mismatch in criteria expression.

Ahhhhh Hilfe :wink:

Gruß
Igor

ich sollte vielleicht noch erwähnen, dass es sich bei ID um einen Text handelt. Deshalb habe ich versucht den Code abzuändern auf:

On Error GoTo myError
Dim lngStore As String

With Me(Amb.Column(3))
.Form!Diagnose = Me!Liste71.Column(0)
.Form!DiagnoseBeschr = Me!Liste71.Column(1)
.Requery
End With

‚pfad = "‘" & Me.txtBild & „’“
lngStore = „’“ & Me(Amb.Column(3)).Form!ID & „’“

'Bildschirmflackern reduzieren
Me(Amb.Column(3)).Form.Painting = False

Me(Amb.Column(3)).Form.Requery
Me(Amb.Column(3)).Form.RecordsetClone.FindFirst "ID = " & lngStore
Me(Amb.Column(3)).Form.Bookmark = Me(Amb.Column(3)).Form.RecordsetClone.Bookmark

aber es passiert nichts. Er springt zum letzten DS.

Gruß
Igor

Hallo Igor,

  • das Hauptformular hat den Namen: Haupt
  • das Registersteuerelement hat den Namen: RegisterStr15
  • Reiterindex: 0 enthält UFO: IM-CIO

ich beschreibe mal, wie man es normaler Weise macht:
Das Hauptformular basiert auf einer Tabelle/Abfrage.
Die UFOs basieren jeweils auf eigenen Tabellen/Abfragen.

Der jeder Kunde bekommt eine eigene ID (Autowert)

Nun hat man noch eine „Bewegungs“ - Tabelle in der ich die Besuche speichere. D.h. aus deiner ID mit dem Wert 1.1 / 1.2 ergibt sich folgende Lösung:

Tabelle „Kunde“: ID_Kunde
Tabelle „Besuche“: ID_Besuche, ID_Kunde, Anzahl_Besuche

Anzahl_Besuche speichert nur ganze Zahlen, gezeigt wird ggf. ein Punkt dazwischen. Beispiel:
Anzeige 1.1
gespeichert: 11

Beide Tabellen sind über ID_Kunde miteinander verknüpft.

Wenn ich dich nun richtig verstanden habe, müssen alle UFOs dann mit „Besuche“_ID_Besuche verknüpft werden.

Rechtsklick auf ein UFO und „Verknüpfen von“, „Verknüpfen nach“ eintragen.

somit wären dann immer alle UFOs synchron mit deinen Basisdaten.

Die Daten solltest du dann nicht in ein UFO schreiben, sondern per SQL direkt in die jeweilige Tabelle.

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo,

bei Text:
Dim str Store as String ’ um Verwirrung zu vermeiden
Me(Amb.Column(3)).Form.RecordsetClone.FindFirst "ID = ‚" & strStore & "‘"

und der Name „ID“ sollte auch passender gewählt werden …

Hallo Franz,

ich habe es jetzt so gelöst. Ich habe die Requery Funktion aus dem Hauptformular entfernt und folgenden Code in die jeweiligen UFOs integriert:

Private Sub Form_AfterUpdate()
Dim rst As DAO.Recordset

With Me
Set rst = .RecordsetClone
rst.FindFirst „ID = '“ & Me!ID & „’“
.Bookmark = rst.Bookmark
'mögliche Alternative zur Bookmark-Variante:
'.Recordset.FindFirst "Id = " & lngID
End With
End Sub

Vielen Dank für eure Mühe und Hilfe.

Gruß
Igor