Neuigkeiten:

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

Mobiles Hauptmenü

Datensatzzeiger per VBA bewegen, wie geht das?

Begonnen von JonnyMM, April 12, 2014, 18:05:08

⏪ vorheriges - nächstes ⏩

JonnyMM

Liebe Access-Experten,
erstmals melde ich mich in diesem Forum. Ich bin noch blutiger Access-Anfänger und deshalb bitte ich über "dumme" Fragen großzügig hinwegzusehen. Früher habe ich einiges mit Ms Visual Foxpro gemacht, so dass mir Datenbankprogrammierung nicht völlig fremd ist. Hier nun mein erstes Ersuchen um Unterstützung:
Ausgangslage:
Hauptformular mit Dropdownfeld cmb_ArtAuswahl (Vogelarten).
Enthält Registersteuerelement (RegisterStr12).
Erstes Registerblatt (Karte_chronolog_Sort) enthält eine als Formular namens Frm_Qry_Gesamtdaten_Tbl (Datenquelle Qry_Gesamtdaten) gespeicherte Abfrage (Tabellenansicht). Verknüpfung nach cmb_Artauswahl, so dass nur die betreffende Vogelart herausgefiltert wird.
Zweites Registerblatt (einzel_chrono) enthält Textboxen, in denen die Inhalte einzelner Datenfelder des im ersten Registerblatt ausgewählten Datensatzes dargestellt werden. Steuerelementinhalt z.B. =[Frm_Qry_GesamtDaten_Tbl].[Formular]![Datum].
Ich möchte jetzt in diesem Registerblatt per Buttons durch die Datensätze navigieren können, d.h. den Datensatzzeiger im ersten Registerblatt verschieben und das zweite Registerblatt anschließend refreshen. Die aktuelle Datensatznummer (entsprechend der gefilterten Abfrage) auslesen kann ich, aber ich habe trotz langwieriger Suche nicht herausgefunden, wie ich den Datensatzzeiger per z.B. MoveNext verschiebe. Vermutlich gelingt es mir nicht, die Abfrage richtig zu referenzieren.
Die Ausgabe der aktuellen Datensatznr. von Frm_Qury_Gesamtdaten_Tbl in Registerblatt Zwei gelingt so:
Private Sub cmd_next_Click()
    Dim n As Long
    n = Frm_Qry_GesamtDaten_Tbl.Form.CurrentRecord  'funktioniert !
    MsgBox ("Datensatz " & Str(n))

' hier in Frm_Qury_GesamtDaten_Tbl den Datensatzzeiger eins weiter (MoveNext) aber wie ??

    Me.Refresh
End Sub
(dass ich BOF/EOF bei der Datensatznavigation abfangen muss, ist mir klar).
Könnte mir bitte jemand auf die Sprünge helfen. Vielen Dank Voraus!


bahasu

Hi,

vermutlich hilft:
Me.Recordset.MoveNext

bzw. Me.DeinFormular.Form.Recordset.MoveNext

je nachdem wo der Button ist.

Harald
Servus

JonnyMM

Hallo Harald, vielen Dank, das hat schon deutlich weitergeholfen, aber leider mit einem mir nicht erklärlichen Ergebnis. Nachdem ich meine Prozedur folgendermaßen umgestaltet:

Private Sub cmd_next_Click()
    Dim n As Long
     n = Me.Frm_Qry_GesamtDaten_Tbl.Form.CurrentRecord
    MsgBox ("Datensatz " & Str(n))
   
    Me.Frm_Qry_GesamtDaten_Tbl.Form.Recordset.MoveNext 'funktioniert nur 1x
   
    n = Me.Frm_Qry_GesamtDaten_Tbl.Form.CurrentRecord
    MsgBox ("Datensatz " & Str(n))
    Me.Refresh

End Sub
Das funktioniert genau einmal. Datensatzzeiger wird im ersten Formular verschoben, Messagebox zeigt das an und nach dem Refresh stehen die richtigen Daten auch im zweiten Formular. Beim nächsten Klick auf den Button springt der Datensatzzeiger immer auf 1, egal ob ich vorher beim 2., 5. oder 100. war. Im ersten Formular ist das auch sichtbar - immer erste Zeile. Was kann das denn sein??
Danke für die Unterstützung.
Johannes

bahasu

Hi Jonny,

was passiert, wenn Du das me.refresh weglässt?

Harald
Servus

JonnyMM

Das war DER Tipp, es funktioniert einwandfrei. Warum das Refresh nicht notwendig und sogar schädlich ist, verstehe ich zwar nicht, aber egal. Es geht.
Vielen Dank Harald, das hat mir sehr geholfen.
Johannes

MzKlMu

Hallo,
obwahl es geholfen hat, noch einige Anmerkungen.
Der Datensatzzeiger ist als Identifikationsmerkmal völlig ungeeignet.
Ein Datensatz wird ausschließlich über dessen Primärschlüssel identifiziert.
Daher wäre der PS auszulesen und auf den PS im anderen Formular zu verweisen.

Obwohl mir einige unklar ist, würde ich behaupen, das ganze Vorhaben lässt sich bei korrektem Aufbau der Tabellen und der Formulare völlig ohne VBA mit den Grundfunktionen von Access realisieren.

ZitatZweites Registerblatt (einzel_chrono) enthält Textboxen, in denen die Inhalte einzelner Datenfelder des im ersten Registerblatt ausgewählten Datensatzes dargestellt werden. Steuerelementinhalt z.B. =[Frm_Qry_GesamtDaten_Tbl].[Formular]![Datum].
Wenn das zweite Registerblatt Felder des 1. Registerblattes enthält, musst Du doch einfach nur ein 2. Unterformular verwenden das die gewünschten Felder enthält.

Irgendwie scheint mir der ganze Aufwand überflüssig.
Gruß Klaus

JonnyMM

Zunächst hatte ich auch versucht, für die Tabelle ein zweites Registerblatt anzulegen, in dem die normale Formularansicht mit den Datenfeldern eines Datensatzes angezeigt werden, aber das ist mir irgendwie nicht gelungen. Ich konnte nicht die Formularansicht einstellen. Bin eben Anfänger  :-\
p.s. schon wieder die Abfrage, wo der Weihnachtsmann angeblich lebt. Könnte mir das netterweise mal jemand verraten. Jedesmal muss ich etliche Fehleingaben machen, bis ich eine beantwortbare Frage bekomme >:(

bahasu

Hi,

vielleicht kann Dir besser geholfen werden, wenn Du eine komprimierte und gezippte Datenbank (aber bitte im accesss 2003-Format) hier zur Verfügung stellst.

Harald
Servus

JonnyMM

Ganz herzlichen Dank für das Hilfsangebot. Vielleicht komme ich morgen dazu, die accdb in das mdb-Format umzuwandeln (arbeite mit Access 2010) und vorher noch die Datensatzmenge zu reduzieren.
Gute Nacht!