Supportnet / Forum / Datenbanken
Bestimmten Datensatz aus Formular identifizieren und öffnen
Frage
Hallo Zusammen,
In einem Listenfeld auf einem Formular gebe ich Datensätze aus, welche u.A. aus den Feldern Nr (AutoWert), Titel, Umfang etc. bestehen. Nach Doppelklick auf einen Datensatz (aus dem Listenfeld) öffnet sich ein neues Formular, mit näheren Beschreibungen. Dies habe ich folgendermaßen programmiert (bzw. aus der Access Hilfe entnommen):
Dim ctlListe As Control 'Control-Objektvariable, welche auf das Listenfeld zeigt
Dim varElement As Variant 'Element in der Control-Liste
Dim oeffnen As String 'Objektvariable, um ein Fenster zu öffnen
'die Zahl der ersten Spalte des ausgewählten Listenfeldeintrages zurückgeben:
Set ctlListe = Forms!Startfenster!lAnzeigeP 'Control-Objektvariable zurückgeben, die auf das Listenfeld zeigt
For Each varElement In ctlListe.ItemsSelected 'Ausgewählte Elemente durchlaufen
Next varElement
oeffnen = "Weitere_Infos"
DoCmd.OpenForm oeffnen
DoCmd.GoToRecord acDataForm, oeffnen, acGoTo, ctlListe 'zu ausgewähltem Datensatz springen
Problem an der Sache ist, dass wenn ich einen Datensatz LÖSCHE, die Nr (welche durch einen AutoWert vergeben wird und die ich zum identifizieren des Datensatzes verwende) nicht mehr mit der internen Nr des Datensatzes übereinstimmt und mir dann den entsprechend falschen Datensatz liefert! Sprich, anstatt Datensatz Nr 12 öffnet sich in dem neuen Formular der Datensatz Nr 13.
Hat da jemand ein Bugfix oder eine andere Programmiermöglichkeit parat? Ich wäre super dankbar!
Antwort 1 von .struppi
Hallo,
Der Programmcode ist nicht unbedingt optimal. Eigentlich spricht man ein Listenfeld nur so an, wenn eine Mehrfachauswahl getroffen werden soll.
Ich verstehe aber auch das Problem noch nicht.....
Sag doch nochmal mit einfachen Worten was passieren soll wenn Du einen Listeneintrag doppelkickst...
gruß struppi
Der Programmcode ist nicht unbedingt optimal. Eigentlich spricht man ein Listenfeld nur so an, wenn eine Mehrfachauswahl getroffen werden soll.
Ich verstehe aber auch das Problem noch nicht.....
Sag doch nochmal mit einfachen Worten was passieren soll wenn Du einen Listeneintrag doppelkickst...
gruß struppi
Antwort 2 von Phantom_Fies
Das wird so auch nicht funktionieren.
Bei GoToRecord gibst du die Anzahl der DS an, um die nach vorne geblättert wird, als Kriterium verwendest du aber den AutoWert. Sobald du einen DS löschst, stimmt das natürlich nicht mehr. Du musst daher eine Abfrage verwenden.
Den aktuellen Wert des Listenfeldes (in dem Fall die DS-Nummer) liest du einfach
mit
im Doppelklick-Ereignis aus und schreibst ihn in eine Variable. Diese übergibst du an das zu öffnende Formular mit den weiteren Infos. Im Öffnen-Ereignis des Formulars baust du dir dann die Datenquelle des Formulars als SQL-Anweisung zusammen. In dieser SQL-Anweisung musst du dann als Kriterium die Variable mit der DS-Nummer angeben.
Beispielsweise so:
Da ich nicht weiß, wie du das in deinem Formular geregelt hast, hab ich einfach diese Lösung genommen. Probier es einfach aus.
Bei GoToRecord gibst du die Anzahl der DS an, um die nach vorne geblättert wird, als Kriterium verwendest du aber den AutoWert. Sobald du einen DS löschst, stimmt das natürlich nicht mehr. Du musst daher eine Abfrage verwenden.
Den aktuellen Wert des Listenfeldes (in dem Fall die DS-Nummer) liest du einfach
mit
Me.Listenfeld.Value
im Doppelklick-Ereignis aus und schreibst ihn in eine Variable. Diese übergibst du an das zu öffnende Formular mit den weiteren Infos. Im Öffnen-Ereignis des Formulars baust du dir dann die Datenquelle des Formulars als SQL-Anweisung zusammen. In dieser SQL-Anweisung musst du dann als Kriterium die Variable mit der DS-Nummer angeben.
Beispielsweise so:
Dim SQL As String
SQL = "SELECT Tabelle.* FROM Tabelle
WHERE (Nr = " & Variable & ")"
Me.Recordsource = SQL
Da ich nicht weiß, wie du das in deinem Formular geregelt hast, hab ich einfach diese Lösung genommen. Probier es einfach aus.
Antwort 3 von Phantom_Fies
Mir ist gerade noch eine Alternativ-Lösung eingefallen. Bei Access 2002 (wie es bei den anderen Versionen ist, weiß ich nicht) gibt es beim Öffnen eines Formulars die Möglichkeit, ein Kriterium anzugeben. Das sieht dann so aus:
Die DS-Nummer musst du genau so auslesen wie oben beschrieben.
Das setzt aber voraus, dass das zu öffnende Formular bereits seine Datenquelle hat. Bei genauerer Betrachtung ist das für dich sogar die bessere Lösung, wenn ich deine Beschreibung richtig verstanden habe.
DoCmd.OpenForm "Formularname", , , "[Nr] = " & Variable
Die DS-Nummer musst du genau so auslesen wie oben beschrieben.
Das setzt aber voraus, dass das zu öffnende Formular bereits seine Datenquelle hat. Bei genauerer Betrachtung ist das für dich sogar die bessere Lösung, wenn ich deine Beschreibung richtig verstanden habe.
Antwort 4 von frokzee
Hi Phantom_Fies,
erstmal Vielen Dank für die Hilfe.
Ich habe das gerade genau so probiert. Jedoch weiß ich nicht, wie ich die Varibale von der einen Klasse in die andere übergebe (in Java könnte ich es ;-)), deshalb hab ich es so problert:
Dim SQL As String
SQL = "SELECT * FROM Tabelle WHERE ((Tabelle.Nr) = 'Form_Startfenster.lAnzeige_DblClick.Variable')"
Me.RecordSource = SQL
Das funktioniert jedoch nicht!
Gruß frokzee
P.S. Ich verwende Access 97!
erstmal Vielen Dank für die Hilfe.
Ich habe das gerade genau so probiert. Jedoch weiß ich nicht, wie ich die Varibale von der einen Klasse in die andere übergebe (in Java könnte ich es ;-)), deshalb hab ich es so problert:
Dim SQL As String
SQL = "SELECT * FROM Tabelle WHERE ((Tabelle.Nr) = 'Form_Startfenster.lAnzeige_DblClick.Variable')"
Me.RecordSource = SQL
Das funktioniert jedoch nicht!
Gruß frokzee
P.S. Ich verwende Access 97!
Antwort 5 von frokzee
Sorry, ich hab ich SQL-Anweisung falsch geschrieben... Es sollte heißen:
SQL = "SELECT * FROM Tabelle WHERE ((Tabelle.Nr) = " & Form_Startfenster.lAnzeige_DblClick.Variable & ")"
So gehts!
Vielen Dank für den Tip.
Gruß frokzee
SQL = "SELECT * FROM Tabelle WHERE ((Tabelle.Nr) = " & Form_Startfenster.lAnzeige_DblClick.Variable & ")"
So gehts!
Vielen Dank für den Tip.
Gruß frokzee
Antwort 6 von Phantom_Fies
Und so funktioniert es? Ich verstehe den Ausdruck im SQL-String nicht so recht. Den Umweg über die Variable kann man sich auch sparen, das stimmt.
Aber normalerweise müsste es doch dann heißen:
Forms!Formularname.Listenfeldname.Value
Oder hast du's doch so gemacht?
Egal, wenn's funktioniert...
Aber normalerweise müsste es doch dann heißen:
Forms!Formularname.Listenfeldname.Value
Oder hast du's doch so gemacht?
Egal, wenn's funktioniert...
Antwort 7 von frokzee
Stimmt, das mit der Variable ist ein Umweg. Einfach Listenfeldname.Value dann gehts!
Besten Dank nochmal :-)
Besten Dank nochmal :-)

