Discussion:
Unterformular mehrfach verwenden
(zu alt für eine Antwort)
Frank Massel
2008-08-19 15:43:02 UTC
Permalink
Ein freundliches Hallo an die Newsgroup,

ich bastel an meinem ersten ACCESS 2003 ServicePack 2-adp-Projekt mit
Zugriff auf eine SQL-2005-Datenbank.
Die Darstellung von mehreren 1 : n -Beziehungen in einem Hauptformular mit
mehreren Unterformularen jeweils in der "Datenblattansicht" und auch
"Großmutter->Tochter->Enkel"-Tabellenbeziehungen funktionieren alle prima.
Bisher habe ich als Datenquelle jeweils eine Sicht/View verwendet.

Nun möchte ich gerne ein Unterformular im Hauptformular mehrmals(!) verwenden,
z.B. einmal verknüpft mit der Hauptformular.Die_ID und einmal verknüpft
Hauptformular.Die_ID UND Unterformular.Status = 1.
Meine Frage:
a)
Kann man die in Unterformularen festgelegten Abfragen/Datenherkunft bei den
einzelen Instanzen im Hauptformular (z.B. im Eigenschaftsfenster ?)
einschränken, so was wie "WHERE Status = 1", wie es ja z.B. auch in VBA mit
dem DoCmd.OpenForm(...)-Befehl im vierten Parameter möglich ist ?

Falls nein:
Dann wäre ja als Datenquelle noch eine Gespeicherte Prozedur möglich (hier
im Beispiel mit den zwei Eingabe-Parametern "@Die_ID" und "@Status"), deren
@Status-Parameter dann in den beiden Unterformularinstanzen unterschiedlich
belegt werden müsste (im ersten Fall z.B. mit -1111 worauf die Gespeicherte
Prozedur alle Sätze zur "DieID" zurückliefern würde, im zweiten Fall mit 1).

Oder geht das auch nicht, muss man dann etwa für jede
Variante=unterschiedliche Einschränkung ein neues Unterformular erzeugen und
dann alle optisch hoffentlich identisch einrichten ???

Bin für jeden Tipp/Hinweis/Querverweis dankbar !

Viele Grüße

Frank Massel
Jürgen Volke
2008-08-20 06:11:21 UTC
Permalink
Hallo Frank
Post by Frank Massel
ich bastel an meinem ersten ACCESS 2003 ServicePack 2-adp-Projekt mit
Zugriff auf eine SQL-2005-Datenbank.
Die Darstellung von mehreren 1 : n -Beziehungen in einem Hauptformular mit
mehreren Unterformularen jeweils in der "Datenblattansicht" und auch
"Großmutter->Tochter->Enkel"-Tabellenbeziehungen funktionieren alle prima.
Bisher habe ich als Datenquelle jeweils eine Sicht/View verwendet.
Nun möchte ich gerne ein Unterformular im Hauptformular mehrmals(!) verwenden,
z.B. einmal verknüpft mit der Hauptformular.Die_ID und einmal verknüpft
Hauptformular.Die_ID UND Unterformular.Status = 1.
a)
Kann man die in Unterformularen festgelegten Abfragen/Datenherkunft bei den
einzelen Instanzen im Hauptformular (z.B. im Eigenschaftsfenster ?)
einschränken, so was wie "WHERE Status = 1", wie es ja z.B. auch in VBA mit
dem DoCmd.OpenForm(...)-Befehl im vierten Parameter möglich ist ?
Dann wäre ja als Datenquelle noch eine Gespeicherte Prozedur möglich (hier
@Status-Parameter dann in den beiden Unterformularinstanzen
unterschiedlich
belegt werden müsste (im ersten Fall z.B. mit -1111 worauf die Gespeicherte
Prozedur alle Sätze zur "DieID" zurückliefern würde, im zweiten Fall mit 1).
Oder geht das auch nicht, muss man dann etwa für jede
Variante=unterschiedliche Einschränkung ein neues Unterformular erzeugen und
dann alle optisch hoffentlich identisch einrichten ???
Bin für jeden Tipp/Hinweis/Querverweis dankbar !
es sollte bei beiden Varianten mit entsprechendem Code im Hauptformular
funktionieren.
Bei View mit den Eigenschaften LinkChieldFields + LinkMasterFields
Bei SPs mit InputParameter = ....

HTH Jürgen
Frank Massel
2008-08-20 16:54:05 UTC
Permalink
Hallo Jürgen,

sorry für meine späte Antwort und herzlichen Dank für Deine Antwort !
Post by Jürgen Volke
es sollte bei beiden Varianten mit entsprechendem Code im Hauptformular
funktionieren.
Bei View mit den Eigenschaften LinkChieldFields + LinkMasterFields
Bei SPs mit InputParameter = ....
Stimmt, funktioniert auch für SQL-Tabellenwertfunktionen, bin aber in eine
Anfänger-Falle getappt: Wenn ein Unterformular als Datenquelle eine
Gespeicherte Prozedur mit z.B. zwei Parametern (@Die_ID und @Status) hat, man
dann im Hauptformular dieses Unterformular verwendet und im
Hauptformular-Form_Open-Ereignis (wird vor Form_Load ausgelöst) dann den
VBA-Befehl
Me![Unterformular].Form.InputParameters = "@Die_ID bignint =
[Die_ID],@Status=1"
ergänzt, funktioniert das zwar, ABER beim Aufruf des Hauptformulars
erscheint trotzdem die berühmte Parameter-Eingabe-Inputbox für jeden
Parameter, weil nach dem Start des Hauptformulars offensichtlich erstmal für
alle verwendeten Unterformulare die Daten geladen werden (und dazu braucht
die GP eben die zwei Paramterwerte) und erst dann das Form_Open(...)- und
Form_Load-Ereignis ausgelöst werden. Da hat man so keine Chance vor den
"InputBoxen" per VBA die Hauptformular.Unterformular.InputParameters
rechtzeitig zu belegen, ausser man
a)
entfernt im Unterformular die Datenquelle (hier die Gespeicherte Prozedur)
und weist auch die erst im Hauptformular per VBA zu (dann kann man ja direkt
alles per VBA erledigen...). oder
b)
Belegt die beiden Parameter im Unterformular mit "irgendwelchen Werten".
Damit's beim Öffnen der Unterformular-Instanzen im Hauptformular "flotter"
läuft, kann man diese Standard-Parameterwerte ja so wählen, dass kein Satz
geladen wird...

Viele Grüße

Frank
Stefan Dase
2008-08-20 06:15:47 UTC
Permalink
Hallo Frank!
Post by Frank Massel
Nun möchte ich gerne ein Unterformular im Hauptformular mehrmals(!) verwenden,
z.B. einmal verknüpft mit der Hauptformular.Die_ID und einmal verknüpft
Hauptformular.Die_ID UND Unterformular.Status = 1.
a)
Kann man die in Unterformularen festgelegten Abfragen/Datenherkunft bei den
einzelen Instanzen im Hauptformular (z.B. im Eigenschaftsfenster ?)
einschränken, so was wie "WHERE Status = 1", wie es ja z.B. auch in VBA mit
dem DoCmd.OpenForm(...)-Befehl im vierten Parameter möglich ist ?
Ein Weg wäre, bei den Eigenschaften "Verknüpfen von"/"Verknüpfen nach"
im einen Fall nur die Die_ID anzugeben, im zweiten dann Die_ID und einen
festen Wert für das andere Feld.

Alternativ kannst du jedem Unterformular auch per VBA eine separate
Datenherkunft zuweisen, z.B. "Beim Laden" des Hauptformulars, nach dem
Muster:

Me!Unterformular1.Form.RecordSource = "SELECT ..."
Me!Unterformular2.Form.RecordSource = "SELECT ... WHERE ..."

HTH,
Stefan
Frank Massel
2008-08-20 15:53:08 UTC
Permalink
Hallo Stefan,

sorry für meine späte Antwort und herzlichen Dank für Deine Antwort !
Post by Stefan Dase
Ein Weg wäre, bei den Eigenschaften "Verknüpfen von"/"Verknüpfen nach"
im einen Fall nur die Die_ID anzugeben, im zweiten dann Die_ID und einen
festen Wert für das andere Feld.
Habe dazu im Hauptformular (via Eigenschaftenfenster) bei der zweiten
"Instanz" des Unterformulars die beiden Eigenschaften wie folgt belegt:

Verknüpfen von: Die_ID;Status
Verknüpfen nach: Die_ID;1

Funktioniert NICHT: Beim Starten des Hauptfensters kommt die berühmte
Parameter-Inputbox und möchte einen Wert für den Parameter "1".
"(1)" statt "1" klappt auch nicht.
Post by Stefan Dase
Alternativ kannst du jedem Unterformular auch per VBA eine separate
Datenherkunft zuweisen, z.B. "Beim Laden" des Hauptformulars, nach dem
Me!Unterformular1.Form.RecordSource = "SELECT ..."
Me!Unterformular2.Form.RecordSource = "SELECT ... WHERE ..."
Das funktioniert !

Performancemäßig schlecht ist allerdings, dass beim Öffnen des
Hauptformulars VOR dem Auslösen von "Form_Open(...)" und "Form_Load" erstmal
alle verwendeten Unterformular-Instanzen "ihren Original-SELECT-Befehl"
ausführen (bei mir also den SELECT-Befehl ohne WHERE-Einschränkung), also
erstmal "alle" Datensätze laden um dann im Form_Load-Ereignis speziellen
Unterformularen den jeweils selben SELECT-Befehl, aber mit
WHERE-Einschränkung zuzuordnen, weswegen dann diese "eingeschränkten"
Datensätze unnötigerweise erneut geladen werden.
Klar, man kann die Datenquelle (nach Einrichtung der Felder) im
Unterformular löschen und dann für jede Anwendungs-Instanz des Unterformulars
im Hauptformular im dortigen Form_Load-Ereignis die Datenquelle und die
Verknüpfungen(!) per VBA zuzuweisen, aber ich finde das alles recht
umständlich für dei Berücksichtigung nur einer WHERE-Bedingung. Wie in meiner
ersten Nachricht gesagt: Der vierte Parameter im
VBA-DoCmd.OpenForm(...)-Befehl leistet das ja für zusätzlich zu öffnende
(Unterformular-)Fenster, womit Microsoft ja bewiesen hat. dass sie das
Problem einfach lösen können. Jetzt bräuchte man nur diesen "vierten
Parameter" = die WHERE-Bedingung im Eigenschaftenfenster einer
Unterformular-Instanz des Hauptformulars und fertig. Wäre aber vielleicht zu
einfach...

Viele Grüße

Frank
Stefan Dase
2008-08-20 22:43:23 UTC
Permalink
Hallo Frank!
Post by Frank Massel
Post by Stefan Dase
Ein Weg wäre, bei den Eigenschaften "Verknüpfen von"/"Verknüpfen nach"
im einen Fall nur die Die_ID anzugeben, im zweiten dann Die_ID und einen
festen Wert für das andere Feld.
Habe dazu im Hauptformular (via Eigenschaftenfenster) bei der zweiten
Verknüpfen von: Die_ID;Status
Verknüpfen nach: Die_ID;1
Funktioniert NICHT: Beim Starten des Hauptfensters kommt die berühmte
Parameter-Inputbox und möchte einen Wert für den Parameter "1".
"(1)" statt "1" klappt auch nicht.
Das kannst du umgehen, wenn du ein unsichtbares Textfeld anlegst und
diesem die Datenherkunft ="1" zuweist. Dann ersetzt du in obigem Code
die 1 durch den Namen des Steuerelements und es sollte klappen.
Post by Frank Massel
Klar, man kann die Datenquelle (nach Einrichtung der Felder) im
Unterformular löschen und dann für jede Anwendungs-Instanz des Unterformulars
im Hauptformular im dortigen Form_Load-Ereignis die Datenquelle und die
Verknüpfungen(!) per VBA zuzuweisen, aber ich finde das alles recht
umständlich für dei Berücksichtigung nur einer WHERE-Bedingung.
Diesen Weg halte ich sogar für den besseren und würde sogar noch weiter
gehen, und erst beim Anzeigen eines Datensatzes im Hauptformular (HF)
die Datenquelle im UF zuweisen. Dann werden ganz definiert jeweils nur
die benötigten Daten aus der Quelle geladen.
Post by Frank Massel
Wie in meiner
ersten Nachricht gesagt: Der vierte Parameter im
VBA-DoCmd.OpenForm(...)-Befehl leistet das ja für zusätzlich zu öffnende
(Unterformular-)Fenster (...)
Wie du schon selber erkannt hast, kannst du damit aber nicht
Unterformulare laden. Dafür musst du oben beschriebenen Weg beschreiten.

HTH,
Stefan
Frank Massel
2008-08-21 09:30:02 UTC
Permalink
Hallo Stefan,
danke für Deine Antwort.
Post by Stefan Dase
Hallo Frank!
Post by Frank Massel
Post by Stefan Dase
Ein Weg wäre, bei den Eigenschaften "Verknüpfen von"/"Verknüpfen nach"
im einen Fall nur die Die_ID anzugeben, im zweiten dann Die_ID und einen
festen Wert für das andere Feld.
Habe dazu im Hauptformular (via Eigenschaftenfenster) bei der zweiten
Verknüpfen von: Die_ID;Status
Verknüpfen nach: Die_ID;1
Funktioniert NICHT: Beim Starten des Hauptfensters kommt die berühmte
Parameter-Inputbox und möchte einen Wert für den Parameter "1".
"(1)" statt "1" klappt auch nicht.
Das kannst du umgehen, wenn du ein unsichtbares Textfeld anlegst und
diesem die Datenherkunft ="1" zuweist. Dann ersetzt du in obigem Code
die 1 durch den Namen des Steuerelements und es sollte klappen.
Ja, aber "schön" ist das nicht, könnte Microsoft auch eleganter lösen.
Post by Stefan Dase
Post by Frank Massel
Klar, man kann die Datenquelle (nach Einrichtung der Felder) im
Unterformular löschen und dann für jede Anwendungs-Instanz des Unterformulars
im Hauptformular im dortigen Form_Load-Ereignis die Datenquelle und die
Verknüpfungen(!) per VBA zuzuweisen, aber ich finde das alles recht
umständlich für dei Berücksichtigung nur einer WHERE-Bedingung.
Diesen Weg halte ich sogar für den besseren und würde sogar noch weiter
gehen, und erst beim Anzeigen eines Datensatzes im Hauptformular (HF)
die Datenquelle im UF zuweisen. Dann werden ganz definiert jeweils nur
die benötigten Daten aus der Quelle geladen.
Ja, aber "schön" ist das auch nicht. So müssen "Millionen"
ACCESS-AnwenderINNEN diesen besseren Weg mühselig per VBA umsetzen. Könnte
Microsoft doch für eine künftige Version aufnehmen und per
"Eigenschaften-Fenster" integrieren, damit er auch für Anfänger direkt
verfügbar wäre.

Nochmals danke und viele Grüße

Frank
Gerald Aichholzer
2008-08-21 21:19:21 UTC
Permalink
Hallo Frank,
Post by Frank Massel
ich bastel an meinem ersten ACCESS 2003 ServicePack 2-adp-Projekt mit
Zugriff auf eine SQL-2005-Datenbank.
Die Darstellung von mehreren 1 : n -Beziehungen in einem Hauptformular mit
mehreren Unterformularen jeweils in der "Datenblattansicht" und auch
"Großmutter->Tochter->Enkel"-Tabellenbeziehungen funktionieren alle prima.
Bisher habe ich als Datenquelle jeweils eine Sicht/View verwendet.
Nun möchte ich gerne ein Unterformular im Hauptformular mehrmals(!) verwenden,
z.B. einmal verknüpft mit der Hauptformular.Die_ID und einmal verknüpft
Hauptformular.Die_ID UND Unterformular.Status = 1.
man kann in einem Formular auch "sich selbst" als Unterformular
einbetten (korrektes Setzen von Verknüpfen von/nach erforderlich).
Wenn das Formular in der Datenblatt-Ansicht angezeigt wird, er-
hält man ein "rekursives" Datenblatt, wobei die maximal mögliche
Tiefe von der Access-Version abhängt.

Ich hab das mal vor einiger Zeit implementiert, wobei die maximale
Rekursionstiefe bei mir 3 war. Beim Zuordnen des Unterformulars
zeigt Access (soweit ich mich erinnern kann) eine Fehlermeldung,
die man jedoch ignorieren kann.

Google mal in den mpda nach "rekursives Unterformular", dort sollte
(mindestens) ein Thread zu diesem Thema auftauchen.

lg,
Gerald
Frank Massel
2008-08-22 11:54:00 UTC
Permalink
Hallo Gerald,

danke für Deine Antwort, aber mir scheint, dass hier ein Missverständnis
vorliegt:

Ich möchte in einem Hauptformular HF (mit z.B. mehreren Registerkarten)
Datensätze derselben SQL-Tabelle/-Sicht anzeigen, wobei diese Tabelle/Sicht
eine Mutter-Tochterbeziehung zur Tabelle/Sicht des HFs hat.
Einmal möchte ich alle (Tochter-)Sätze anzeigen, einmal mit z.B. einer
"Where (Status = 1)"-Einschränkung, vielleicht nochmal mit einer "Where
(Status > 5)"-Einschränkung usw.
Was natürlich funktioniert:
Man erstellt jedesmal eigenes Unterformular. Ist aber wenig effizient,
insbesondere bei künftigen Änderungen.

Meine Idee und zugehörige Frage war:
Genügt es nicht EIN Unterformular zu erstellen und dann bei den seinen
Anwendungun im HF dann die evtl. notwendige "WHERE"-Einschränkung "irgendwo"
vorzugeben ? Funktioniert ja genauso, wenn man das Unterformalar z.B. via
Schaltknöpfe und zugehörigen VBA-Click-Ereignisse via DoCmd.OpenForm(...)-mit
entsprechendem vierten Parameter aufrufen würde, daher meine Idee.

Mit den Antworten von Jürgen und Volker konnte ich das Problem (sogar mit
Alternativen) lösen.

Es geht nicht um die rekursive Anwendung eines Unterformulars.

Trotzdem danke !

Viele Grüße

Frank

Loading...