PDA

Vollständige Version anzeigen : Recordset vom Unterformular in Abhängigkeit vom Hauptformular


ITSAM
02.11.2007, 14:34
Hallo,

im Unterformular greife ich per ADODB.Recordset auf eine SQL-Datenbank zu und möchte nur bestimmte Daten auslesen. Die Abhängigkeit welche Auswahl an Daten auf dem Unterformular erscheinen sollen bestimmt jedoch das Hauptformular in dem auch auf Daten über ADODB.Recordset zugegriffen wird.
Das Problem: Access baut das Unterformular zuerst auf so dass die entsprechenden Werte noch nicht aus dem Hauptformular zur Verfügung stehen.
Gibt es hierfür eine Lösung, z.B. dass das Hauptformular zuerst aufgebaut wird, oder dass ich nach dem Aufbau aus dem Hauptformular wieder Form_Open des Unterformulars aufgerufen werden kann?
Der Aufruf von frmUnterformular.Requery oder frmUnterformular.Form.Recalc in Form_Open des Hauptformulars haben kein Ergebnis gebracht.
Der Code im Unterformular sieht etwa so aus:

Private Sub Form_Open(Cancel As Integer)
Dim rs As ADODB.Recordset
Dim sQry As String
sQry = "SELECT Artikel FROM Artikelstamm WHERE Lieferant = '" & WertAusHauptformular & "'"
Set rs = ...
Set Me.Recordset = rs
txtArtikelnummer.ControlSource = "Artikelnummer"
...
rs.Close
End Sub

Die Public Variable WertAusHauptformular ist jedoch nicht gefüllt weil das Hauptformular erst danach geöffnet wird. Hat jemand eine Lösung?

Ich würde mich freuen
SB
SAM

hcscherzer
02.11.2007, 14:43
Moin,
weil das Hauptformular erst danach geöffnet wirdHuch? Wie geht das denn? Reden wir von einem UFO in einem HF oder reden wir von zwei Formularen, die in einer Abhängigkeit voneinander stehen?
Die Referenz vom (eingebetteten) UFO zum HF sollte problemlos über Me.Parent möglich sein.
Umgekehrt vom HF zum UFO: Me!UFOName.Form
in Form_Open des HauptformularsVielleicht solltest Du es mal im Form_Current() ausprobieren?
Die Public Variable WertAusHauptformular ist jedoch nicht gefülltHier würde ich auch keine Public Variable verwenden sondern direkt auf ein Steuerelement zugreifen.

Josef P.
02.11.2007, 15:07
Stelle das Herkunftsobjekt des UF-Steuerelements erst beim Laden des HF ein.
Oder (meine bevorzugte Variante) lade das UF anfangs ungebunden und steuere per Property/Methode im UF die Datenherkunft vom HF aus.

Ein Beispiel:
UF:
Datenherkunft: SELECT NULL AS Feld1, ... FROM tab1DS where 1=0
'für Endlosformulare:
public sub SetData(sFilter as string, sOrderBy as string)
...
set me.recordset = ...
...
end sub
oder für Filter auf ID:
public property let XyzID(lID as long)
...
set me.recordset = ...
...
end property

HF:
Private Sub Form_Current()
me!sfr.Form.XyzID = ...
End Sub

@Hans-Christian: das UF-Objekt wird vor dem HF-Objekt fertig geladen. Kannst du prüfen, wenn du die Ereignisse verfolgst.

hcscherzer
02.11.2007, 18:55
@Josef: stimmt; hatte ich nur noch nie gemerkt, weil ich im Form_Current() des HF immer ein UF.Form.Requery aufrufe und die Daten immer 'da sind', wenn ich das Ganze zu sehen bekomme ...

ITSAM
04.11.2007, 16:51
Hallo,

danke für die Antworten. Leider benötige ich immer noch etwas Nachhilfe.
Wenn ich das Recordset im HF unter Private Sub Form_Current() setze wird die Prozedur unendlich oft durchlaufen bis Access kein Stabelspeicher mehr hat. Was mache ich falsch? Das Recordset im UF auch mit Form_Current() aufrufen?
Das UF ist ein Endlosformular das sich Zeilenweise im Hauptformular darstellt:
Zeile 1
Zeile 2
Zeile 3

Das UF habe ich im HF mit ca 6 cm Höhe eingebunden. Das HF ist ein einzelnes Formular wo mit den Navigationsschaltflächen zum nächsten Datensatz gegangen werden kann. Durch das Navigieren im HF werden Felder im HF geändert, z.B. 'Lieferantennummer'. Nun soll automatisch im Unterformular angezeit werden welche Werkzeuge gerade bei diesem Lieferant sind. Also, ein Filter vom UF ist die Lieferantennummer aus dem HF.
Da es sich um ein AddIn handelt kann ich die Daten nur wie in meinem ersten Beitrag aufrufen.
Vielleicht hat mir jemand ein kurer kompletter Beispielcode da ich noch ein Starter bin.
Thanx im Voraus.

SB

SAM

Anne Berg
04.11.2007, 17:31
Hallo,

ich würde die Zuweisung der Recordsource aus dem HF heraus vornehmen. Da hast du dann auch immer einen aktuellen Wert, den du zum Filtern benutzen kannst. Das Form_Current-Ereignis halte ich da für weniger günstig und würde das Feld_AfterUpdate vorziehen.

Josef P.
04.11.2007, 20:39
Wenn ich das Recordset im HF unter Private Sub Form_Current() setze wird die Prozedur unendlich oft durchlaufen bis Access kein Stabelspeicher mehr hat.
Wenn du beim current event des HF das Recordset des HF einstellst, kann ich die Endlosschleife verstehen.
Aber du willst doch vom HF aus das Recordset des UF - das nicht mit dem HF verknüpft ist - abändern, oder?

ITSAM
04.11.2007, 21:12
Hallo Josef,

richtig, ich habe im Recordset des Unterformulars das ein WHERE-Clause das ein Wert als Filter aus dem Hauptformular enthält.
Ist das überhaupt lösbar?

petbay
05.11.2007, 07:16
Wie Anne schon sagte:

ich würde die Zuweisung der Recordsource aus dem HF heraus vornehmen. Da hast du dann auch immer einen aktuellen Wert, den du zum Filtern benutzen kannst.

Dem ist eigendlich nichts hinzuzufügen.

Josef P.
05.11.2007, 08:22
Ist das überhaupt lösbar?
Ein mögliches Vorgehen beschrieb ich bereits in #3.

ITSAM
05.11.2007, 12:04
Hallo,

ich würde die Zuweisung der Recordsource aus dem HF heraus vornehmen. Da hast du dann auch immer einen aktuellen Wert, den du zum Filtern benutzen kannst.

Wie mach ich das? Hab' so etwas noch nicht gemacht.

Mit Me.UF.Form.Recordset = rs im HF und txtArtikelnummer.ControlSource = "Artikelnummer" habe ich im UF gelassen, hat aber nicht funktioniert.

Thanx

hcscherzer
05.11.2007, 12:36
Me!UF.Form.Recordsource = "SELECT irgendwas FROM irgendwoher WHERE irgendwas_stimmt"

Anne Berg
05.11.2007, 12:43
Das kann auch nicht funktionieren (auch vorher nicht), wenn das Datenfeld in Wirklichkeit "Artikel" heißt (s. 1. Post von dir).

Der Umweg über einen Recordset ist übrigens nicht nötig, wenn es sich wie gezeigt um ein einfaches Select-Statement handelt.Me!UF.Form.Recordsource = "SELECT Artikel FROM Artikelstamm WHERE Lieferant = '" & Me!ArtikelNr & "'"sollte völlig genügen. Wenn ArtikelNr (oder Artikel oder Artikelnummer) numerisch ist, lass die Hochkommata weg.

petbay
05.11.2007, 12:48
Also:

Im HF

Private Sub txtMeinWertImHF_AfterUpdate()
Call Forms!MeinHF!MeinUF.Form.UpdateUF
End Sub

Im UF

Public Sub UpdateUF()
Me.RecordSource = " SELECT ..... WHERE Lieferant ='" & Me.Parent!txtMeinWertImHF
End Sub

Josef P.
05.11.2007, 12:54
@petbay: kleiner Verbesserungsvorschlag:

HF:
Private Sub txtMeinWertImHF_AfterUpdate()
me!MeinUF.Form.SetData me!txtMeinPK
End Sub

UF:
Public Sub SetData(byval lPK as long)
Me.RecordSource = "SELECT ..... WHERE ID = " & lPK
' oder für ADO-RS:
' checkOpen me.recordset '... prüfen ob geöffnet usw.
' set me.recordset = openAdoRecordset("....")
End Sub

Falls sich jetzt jemand fragt, warum das "besser" sein soll:
Damit ist das UF vom HF unabhängig geworden und kann überall verwendet werden, auch wenn einmal das PK-Feld anders heißt bzw. der Wert anders ermittelt wird.

petbay
05.11.2007, 12:57
@Josef P.: Stimme zu!