PDA

Vollständige Version anzeigen : Eigenschaften verknüpfter Unterformulare


Thomas2705
18.01.2008, 16:01
Es gibt mehrere Unteromulare in einem Hauptform

durch ein Ereignis und SourceObjekt wird den ufo eine Eigenschaft bzw. Datenherkunft zugewiesen basierend auf dem Hauptform

Problem:

Access definiert Herkunftsobjekt, verknüpfen von/nach selbst. Ich meine das Programm "denkt" offensichtlich mit und ergänzt sich von selbst, es macht was es will. :entsetzt: Das soll es nicht!
Die o.g.Eigenschaftsfelder sollen nach beendeter Aktion leer bleiben.

Thomas

Anne Berg
18.01.2008, 16:08
Kannst du den Code mal dazu zeigen?

achtelpetit
18.01.2008, 16:11
Ja ja, Access denkt mit.
Wenn Du den Eigenschaften-Dialog aufrufst (rechte Maus in der Entwurfsansicht) und das UFO markierst, dann siehst Du die Einträge "verknüpfen von" und "verknüpfen nach". Da steht drin, welche Beziehung Access zwischen den Formularen sieht.
Wenn das falsch ist: einfach die Einträge löschen.
Jedoch: Access ist nicht so doof. Wenn Deine Tabellen sauber aufgebaut sind (bezgl. Feldnamen), stimmen diese Beziehungen in aller Regel!

EDIT
Ich hab' nicht gründlich gelesen. Vergiß, was hier steht.

Thomas2705
18.01.2008, 16:15
Ereignis 1:
Eigenschaft ufo2 visible = false

Forms!a!ufo2.Visible = True

Forms!a!ufo2.SourceObject = "cb"
Forms!a!ufo2.LinkChildFields = "d01"
Forms!a!ufo2.LinkMasterFields = "a00"

Ereignis 2:
Eigenschaft ufo2 visible = true weil Ereignis 1 war

Forms!a!ufo2.SourceObject = "na"
Forms!a!ufo2.LinkChildFields = "na01"
Forms!a!ufo2.LinkMasterFields = "a00"


Nur im code sollen die Datenherkunft definiert werden, nicht im Eigenschaftsfeld! Der "Mutant" verselbständigt sich und schreibt bei mehrmaligen Aktionen die Daten in's Eigenschaftsfeld und möchte offensichtlich selber denken.

Thomas2705
18.01.2008, 16:29
Ich spinne nicht! Das Problem greift um sich:

Im Form befinden sich unterfom, Eigenschaft nicht sichtbar. Der Einfachheit halber nebeneinander angeordnet, in Reih und Glied. Die Formate dieser sind im ersten Aufruf unwichtig.

Durch Ereignisse werden dies ufo positioniert und formatiert. z.B

Forms!a!ufo1.Height = 8271
Forms!a!ufo1.left = 568
Forms!a!ufo1.top = 922
Forms!a!ufo1.Width = 13611

Das Programm "merkt" sich die Position und übernimmt sie selbständig als dauerhafte Einstellung.
Es ist wie im Film, unheimlich und das soll es nicht!

Thomas

Josef P.
18.01.2008, 16:33
kann es sein, dass du so vorgehst:
1. Formular öffnen (Formularansicht)
2. Code zum Verknüpfen wird ausgeführt
3. Wechsel der Formularansicht auf Entwurf
4. Speichern.

Anne Berg
18.01.2008, 16:34
Schau dir dazu mal den Abschnitt in der Access-FAQ (http://www.donkarl.com/FAQ/FAQ4Formulare.htm#4.8) an, könnte hilfreich sein!

Thomas2705
18.01.2008, 16:40
Josep, ja ich mache das so wenn ich sehen will warum das Ding mich quält.

Anne, Du bist ein Schatz. Willst Du ein Kind von mir? (Das war ein Witz!)

Thomas

Josef P.
18.01.2008, 16:47
ja ich mache das so wenn ich sehen will warum das Ding mich quält.
Speichern solltest du dann aber nicht, das kann lästig werden. (Anm.: auf diese Art wird auch ein Formular-Filter gespeichert.)
Außerdem kann so ein Vorgehen zu einem Absturz führen, wenn du im Form-Code withevents verwendest.

Für Änderungen in Formularen öffne ich diese immer direkt in der Entwurfsansicht.

Thomas2705
18.01.2008, 16:57
Josef, danke für den Hinweis.

Thomas2705
18.01.2008, 17:13
Das Grauen hat doch noch kein Ende gefunden.

TRotzdem das die Werte wie s.o. auf Null gesetzt werden kommt beim wechsel des ufo eine Parameterabfrage die sich auf den vorangegangenen Inhalt des ufo bezieht?

Anne Berg
18.01.2008, 17:43
(Das war ein Witz!)Was sonst?! Doch wenn ich mir dein Benutzerbild so ansehe, komme ich glatt in Versuchung! :D
(einfach zum Knuddeln!)

Thomas2705
19.01.2008, 12:06
Meine liebe Anne,

bevor ich Dir jetzt einen Heiratsantrag mache und mich aus nicht erwiederter Liebe zu Dir aus dem Fenster stürze, könntest Du mir bitte zum Trost beim Klären der vorangegangenen und einer weitern Frage helfen.
Wie wird generell die Laufzeit einer Prozedur nach einem Ereignis beendet. Gibt es ein universelles Ereignis? Ich meine damit nicht das Schließen der DB.

Thomas

Louisleon
19.01.2008, 12:27
Ich bin zwar nicht Anne (und bereits verheiratet ;))

Gibt es ein universelles Ereignis?
Für welches Objekt? Schau mal in der OH unter Ereignis (Ereigniseigenschaften und Objekte, auf die sie anwendbar sind).

Wie wird generell die Laufzeit einer Prozedur nach einem Ereignis beendet.
Was meinst Du damit?

Gruß


LL

Anne Berg
19.01.2008, 20:20
Hallo Thomas, wo ist denn der nette kleine Knuddelkerl mit den Segelohren geblieben? :eek:

Nun, ich will trotzdem noch mal versuchen, dir zu helfen, auch wenn mir so manches was du beschreibst nicht ganz klar ist. Nur im code sollen die Datenherkunft definiert werden, nicht im Eigenschaftsfeld! Der "Mutant" verselbständigt sich und schreibt bei mehrmaligen Aktionen die Daten in's Eigenschaftsfeld und möchte offensichtlich selber denken.Was du da machst ist aber doch genau das Setzen der Unterformular-Steuerelementeigenschaften!kommt beim wechsel des ufo eine Parameterabfrage die sich auf den vorangegangenen Inhalt des ufo bezieht?Da wird wohl noch irgendetwas hängengbliben sein... :confused:
Ohne den kompletten Code des Klassenmoduls sehen zu können, am besten gleich das ganze Formular, wird man das so aus der Ferne kaum herausfinden können.Wie wird generell die Laufzeit einer Prozedur nach einem Ereignis beendet. Gibt es ein universelles Ereignis? Ich meine damit nicht das Schließen der DB.Das solltest du nochmal ausführlich formulieren.
Wenn du eine Ereignisprozedur an ein Ereignis bindest, läuft sie in der Regel bis zum Ende, bis zum End Sub.
An welche Art von "universellem Ereignis" hast du denn gedacht? Ereignisprozeduren gibt es nur im Zusammenhang mit Formularen und Berichten. Eigene Prozeduren kannst du z.B. über einn Formular-Button anstoßen. Eine Sonderrolle kommt dem AutoExec-Makro zu.
Hilft dir das weiter?

Thomas2705
21.01.2008, 17:13
Beste Anne, die Segelohren sind noch da, Den Knuddelkerl ist älter geworden.

Ich habe folgende Lösung gefunden:

Erstes Ereignis: Beim Laden des Ufo2 mit Daten aus "cb" läuft folgender code:

Forms!a!ufo2.SourceObject = "cb"
Forms!a!ufo2.LinkChildFields = "d01"
Forms!a!ufo2.LinkMasterFields = "a00"

Zweites Ereignis: ufo2 wird mit neuen Daten aus "na" geladen. Die vorangegangenen Daten sollen zuvor "gelöscht" werden:

Private Sub bf4_DblClick(Cancel As Integer)
Me.ufo2.LinkChildFields = ""
Me.ufo2.LinkMasterFields = ""

Me.ufo2.SourceObject = "na"
Me.ufo2.LinkChildFields = "na01"
Me.ufo2.LinkMasterFields = "a00"
End Sub

drittes Ereignis: Es sollen wieder neue Daten in Ufo2 bei Ereignis erscheinen. Die Daten aus "na" müssen wieder "gelöscht" werden:

Me.ufo2.LinkChildFields = ""
Me.ufo2.LinkMasterFields = ""

Im Nachhinein erscheint die Lösung recht simpel.Ich danke Euch und Dir für die Hilfe

Thomas

Anne Berg
21.01.2008, 18:53
Und wenn du nun noch Me!ufo2 schreibst (mit Ausrufezeichen statt Punkt), weil ufo2 ein Steuerelement des Forms ist und keine Eigenschaft oder Methode wie LinkChildFields, dann kann dir auch beim Wechsel auf eine andere/höhere Office-Version so schnell nichts passieren. ;)

Thomas2705
21.01.2008, 20:12
:top:

Thomas2705
30.01.2008, 18:25
Bisher habe ich das ufo folgendermaßen "entladen":

Forms!c!ufo1.LinkChildFields = ""
Forms!c!ufo1.LinkMasterFields = ""

Wenn das ufo allerdings vorher keinen Wert hat erscheint eine Fehlermeldung.
Wie kann ich vor dem o.g. code prüfen ob das betreffende ufo überhaupt mit Daten belegt wurde und erst wenn daten vorhanden sind ein Wechsel erfolgen soll?

Thomas

Josef P.
30.01.2008, 18:38
Komisch. Welche Fehlermeldung erscheint?
Oder meinst du die Fehlermeldung wenn Me!c!ufo1.SourceObject keinen Eintrag hat?

Me!c!ufo1.SourceObject = ""
Me!c!ufo1.LinkChildFields = "" '=> Fehler
Me!c!ufo1.LinkMasterFields = ""

Thomas2705
30.01.2008, 18:49
"Laufzeitfehler 2101 Die von ihnen eingegebene Eigenschaft ist für diese Einstellung nicht zulässig"

Thomas2705
30.01.2008, 18:50
Nachtrag: Ich glaube die Fehlermeldung bezieht sich darauf wenn das ufo keinen Eintrag hat. Z.b. beim erstmaligen Laden.

Josef P.
30.01.2008, 19:08
Du meinst vermutlich keinen Eintrag in SourceObject, oder?
=>
if len(Me!c!ufo1.SourceObject) > 0 then
Me!c!ufo1.LinkChildFields = vbnullstring
Me!c!ufo1.LinkMasterFields = vbnullstring
end if

Thomas2705
30.01.2008, 19:12
Josef, ich weiß es nicht. Ich weiß nur das es mich zur Verzweiflung treibt. Wenn Du willst stelle ich DIr morgen eine DB ins Netz. Vielleicht kannst Du mir helfen.

Bis morgen
Thomas

Josef P.
30.01.2008, 19:14
den Code in #23 hast du ausprobiert?

Thomas2705
30.01.2008, 19:32
Ich habe Dir eine Kopie der DB hochgeladen und nicht einmal den Ansatz einer Ahnung.
Bestimmt wird es eine reihe Fehlermeldungen auf Grund der fehlenden Tabellen geben aber der code der Form läß sich bestimmt lesen.
Ich wäre Dir wirklich sehr lange dankbar wenn Du "mein Erlöser" wärst.:stupid: :smashing:

Thomas

Anne Berg
30.01.2008, 20:00
Hallo Thomas,

wenn ich mir das auch mal anschauen darf, dann sag doch bitte, wie der Fehler zu reproduzieren ist.

PS: meinen Wink mit dem Zaunpfahl So, nachdem ich mich nun eine Weile durch deine Formulare doppelgeklickt habe hattest du wohl nicht verstanden?! ;)

Thomas2705
01.02.2008, 15:12
Hallo Josef und Anne,

den code in 23 habe ich asprobiert und was soll ich sagen, es funktioniert ganz wunderbar.

Ich danke Dir und Euch sehr.

Tschüß

If Len(Forms!a!ufo2.SourceObject) > 0 Then
Forms!a!ufo2.LinkChildFields = vbNullString
Forms!a!ufo2.LinkMasterFields = vbNullString
End If

Forms!a!ufo2.SourceObject = "cc"
Forms!a!ufo2.LinkChildFields = "c01"
Forms!a!ufo2.LinkMasterFields = "a00"

Thomas2705
05.02.2008, 14:10
Durch "Source Objekt" wechseln ufo im Hauptform.

Folgende Frage:

es besteht ein Hauptform mit einem Ufo1 Datenansicht A; als Standardansicht Endlosform; a00 ist Autowert.

Durch Ereignis wechselt im ufo1 Datenansicht A in Standardansicht in Einzelnes Formular; A00 ist Autowert wobei a00 = a00

Bisher nutze ich z.B.folgenden code:

Forms!a!ufo2.SourceObject = "cc"
Forms!a!ufo2.LinkChildFields = "c01"
Forms!a!ufo2.LinkMasterFields = "a00"


Wie sollte der code füro.g. Anweisung aussehen oder gibt es diese Möglichkeit nicht. Wie gesagt der Wechsel der Form- Ansichten soll im ufo erfolgen.

Thomas

Anne Berg
05.02.2008, 14:17
Hallo Thomas.

Kannst du dir das bitte mal selbst laut vorlesen und mir dann erklären, was eigentlich deine Frage ist. :confused:

Thomas2705
05.02.2008, 14:48
Anne, ich freue mich sehr Dich zu lesen und Du hast recht; so geht das nicht.

Gegeben:

- ist ein Hauptformular a mit dem Autowert a00.
- ist ein ufo, Datenherkunft form "b", Autowert b01, Datenherkunft tbl b, Ansicht Endlosform
- ist ein form "c", Autowert b01, Datenherkunft tbl b, Ansicht Einzelform

Datenherkunft der form b und c ist gleich!Der Unterschied besteht nur in der Ansicht.

In Form b sind alle Verträge 1;2;3;... zum Kunden aufgelistet.
Beim Ereignis öffnet sich Form c zum Vertrag 1 oder beim Ereignis öffnet sich form c zum Vertrag 2...

Was kann ich als "LinkMasterFields" nehmen?

Thomas

ebs17
05.02.2008, 15:19
Was hältst Du von einem schlichten
DoCmd.OpenForm "c", , , "b01=" & Me!b01

Thomas2705
05.02.2008, 16:30
Hallo ebs,

die Lösung gefällt mir gut aber es trifft nicht ganz den Kern der Sache.

Der Wechsel von Form b (Endlosform) zu Form c (Einzelform) soll im Ufo erfolgen!

(Leider gibt es diesbezüglich keinen Beitrag zur Synchronisation von Form!?)

Thomas

Anne Berg
05.02.2008, 16:57
Hmmm - eben war noch vom Wechsel der Ansicht die Rede... :confused:

Das ginge durchaus, scheint aber nicht wirklich gewünscht zu sein, oder?

Die Synchronisation von Unterformularen hatten wir aber doch kürzlich erst...
(mal seh'n wer schneller ist)

Thomas2705
05.02.2008, 17:11
Anne, Du bist die einzige Frau in meinem Leben die fast immer versteht was ich meine!:rolleyes:

Die Beiträge zur "Synchronisation von ufo" betreffen immer nur die Variante in der es einen Wechsel des ufo gibt wenn es eine Beziehung von Datenfeldern zwischen Hauptform (LinkMasterFields) und Unterform (LinkChildFields) gibt?.

Jetzt soll es aber sein das im Ufo der Wechsel erfolgt. Mir fehlt der Wert des "LinkMasterFields".

Vielleicht sollte ich ein Modell anhängen? (mit einfachem click)
Thomas

Anne Berg
05.02.2008, 17:29
Modell ist immer gut. ;)

Mit LinkChild- und LinkMasterFields kannst du nur arbeiten, wenn die Formulare voneinander abhängig sind, d.h. ineinander verschachtelt. Wenn sie quasi nebeneinander stehen, musst du selbst dafür sorgen, dass die Daten zusammen passen, z.B. durch Setzen von Bookmarks oder Filtern.

Thomas2705
05.02.2008, 17:38
Anne, Du machst mich nervös!:entsetzt:

Öffne Form "a", Ereignis "Verträge", Ereignis. Es ist nur ein sehr unvollkommenes Modell.

Die Form stehen nicht nebeneinander sondern vielmehr hintereinander/nacheinander/im Wechsel. Ich meine die Ansicht des einen Form wechselt in die andere Ansicht des Form mit gleichem Dateninhalt.

Liebe beste Anne, bitte verstehe mich!?

Anne Berg
05.02.2008, 18:03
...dafür brauchst du aber doch keine zwei Formulare? :confused:

Warte, ich schau's mir an. (Du hast ja jetzt erstmal eine andere Beschäftigung... ;))

(Hilfe, was habe ich getan, um dich nervös zu machen?)

Nachtrag:
Klick ins Ufo und gehe auf den Menüpunkt Ansicht. Dort kannst du die Ansicht des Unterformulars von Detail auf Datenblatt umschalten und umgekehrt. Natürlich geht das auch per VBA<s>, ich find nur grad den richtigen Befehl nicht</s>.

DoCmd.RunCommand acCmdSubformDatasheet

Ist es das, was du willst? :)

Thomas2705
05.02.2008, 18:20
Sollte es so einfach sein. :eek: Ich schaue es mir bis morgen an.

Anne Berg
05.02.2008, 19:47
Hallo Thomas,

ich habe das mal an deinem Modell umgesetzt. Es ist lediglich der Wechsel zwischen Formular- und Datenblattansicht möglich. Vielleicht kannst du dich ja auch mit dieser Lösung anfreunden.

Thomas2705
06.02.2008, 15:44
Vielleicht kannst du dich ja auch mit dieser Lösung anfreunden.


- nicht so richtig. Ich muß mich wohl weiter quälen. Lieber wäre mir eine Lösung gewesen die genau den Datensatz öffnet als Einzelblattansicht der im Endlosform markiert wurde.

Ich danke Dir trotzdem. Bis später.

Thomas

Thomas2705
06.02.2008, 15:46
P.S. Ich hätte auch gern ein grünes Karma nicht so ein blödes Blaues.:( Wo gibt es denn so etwas?

ebs17
06.02.2008, 16:02
Ich hätte auch gern ein grünes Karma ... Wo gibt es denn so etwas?
Über positive Bewertungen, die andere über Dich und Deine Beiträge abgeben.

In Deinem Beispiel wird mir noch nicht klar, warum Du in dem Unterformular eine Unterscheidung zwischen Einzel- und Endlosformular machst (bei den Platzverhältnissen), momentan sieht man bei beiden Varianten nur einen Datensatz.

Thomas2705
06.02.2008, 16:24
Hallo ebs,

bezüglich der Platzverhältnisse gebe ich Dir recht. Die "echte" Datenbank hat natürlich etwas mehr Platz im ufo.
Bisher öffne ich meinen Kunden und sehe in tabellarischer Übersicht die Auflistung aller seiner Verträge bzw. Vorgänge.

Bei Ereignis auf den einzelnen Vorgang wäre es günstig eine "kleine" Detailansicht zu sehen ohne das Hauptform wechseln zu müssen.

Erst bei einem weiteren Ereignis wäre eine umfangreiche Ansicht zum Vertrag zu sehen.

"Warum erst ein Stück des ganzen wenn doch der ganze Kuchen gefressen wird"
Ich finde es für den Sachbearbeiter evtl.verwirrend und unübersichtich wenn er beim ersten Ereignis komplett alle Daten zum Vertrag zu Gesicht bekommt.

(Wie gesagt, es wäre eine Lösung gewesen.)

Trotzdem Danke schön für die bisherige Hilfe.

Anne Berg
06.02.2008, 16:41
... gern ein grünes Karma nicht so ein blödes Blaues.Sei froh, dass es nicht hässlich rot ist. :D

Lieber wäre mir eine Lösung gewesen die genau den Datensatz öffnet als Einzelblattansicht der im Endlosform markiert wurde.OK, dann tauschst du halt die Formulare aus, die zu verknüpfenden Datenfelder ändern sich doch dadurch nicht.

ebs17
06.02.2008, 16:42
Ich nutze vergleichbar ein Unterformular in Datenblattansicht, wo durch Doppelklick auf ein Feld ein PopUp-Formular mit Details (hier aber 1:n-verknüpft) angezeigt wird. Damit kommen auch meine "Anfänger" gut zurecht.

Anderer Hinweis: Für Formulare gibt es einen Seitenwechsel (günstig für Formulare mit fixierter Größe - siehe Nordwind-DB) oder auch Registersteuerelemente.

Anne Berg
06.02.2008, 16:52
Nachtrag:

Hier kommt der Code für das Wechseln zur Detailansicht.Private Sub Befehl3_Click()
Dim tmp_id
tmp_id = Me.b00
Forms!a!ufo.SourceObject = "bb"
Forms!a!ufo.LinkChildFields = "b01"
Forms!a!ufo.LinkMasterFields = "a00"
Forms!a!ufo.Form.Recordset.FindFirst "b00=" & tmp_id
End Sub

Thomas2705
06.02.2008, 16:57
Anne:),

ich weiß, jetzt tausche ich die Formulare aus. Es wäre aber doch schön gewesen wenn der Tausch im ufo hätte erfolgen können. Ich meine "schön gewesen" bevor ich wußte das ein Wert im zu öffnenden Formular nicht an ein Wert vom geöffneten Form übernommen werden kann :upps: . [unter Berücksichtigung das der Vorgang im ufo erfolgen soll!)

ebs,

das mit den Registern habe ich schon mal gemacht aber ich finde die Darstellung vonn Access nicht befriedigend. z.B. läßt sich die Farbe nicht richtig verändern (Ich will ein ein Schöngeist sein:grins: )

(Ich weiß, ein fast lächerlicher Grund und ein Register selber zu basteln ist mir im Moment der Aufwand zu groß. Ich spiele sowieso schon viel zu lange damit rum.)

Thomas

Thomas2705
06.02.2008, 17:01
Anne,

Du wirst mir unheimlich. Ich wüßte gern was Du weißt.:biggrinl:

[Jetzt muß ich mir nur noch ein Grünes besorgen.]

Anne Berg
06.02.2008, 17:03
Jetzt verstehe ich gar nichts mehr. :confused:
Das war doch deine ursprüngliche Idee mit den beiden Unterformularen.
Du hast das doch bloß mit dem Sprung auf den richtigen Datensatz nicht hingekriegt, oder wie meinst du das?

PS:Ich will ein ein Schöngeist sein :DAuf die Idee kann man angesichts deiner Test-DB nun wirklich nicht kommen! :grins:

Thomas2705
06.02.2008, 17:16
Ja, das war mein ursprünglicher Gedanke.

"Schöngeist" bedeutet doch aber nicht immer und offensichtlich "viel-Geist".

Ich nahm an das es nicht geht wie ich wollte nachdem ich sah wie Ihr Euch um mich erfolglos bemüht habt.

Der Abend ist gerettet. Ich brauche jetzt was zu essen.

Thomas2705
06.02.2008, 17:18
Mensch denkt man so etwas , es ist grün.:D

Thomas2705
07.02.2008, 15:23
Ich möchte das Thema doch noch einmal bearbeiten. Dazu habe ich im Anhang ein überarbeitetes Modell angefügt:

Beim Ereignis "rotes Textfeld" öffnet der Vertrag (bzw. öffnet nicht:( ) im ufo den Form a.

Beim Ereignis "befehl4" öffnet der Vertrag (bzw. öffnet nicht:( ) im ufo eines neuen Hauptform (in diesem Fall d)

Startform ins form a

Ich glaube ebs könnte das interessieren weil er das ganze über pop form regelt. s.o.

Thomas

ebs17
07.02.2008, 22:09
Ich glaube ebs könnte das interessieren weil er das ganze über pop form regelt. s.o.

Warum sollte mich das interessieren. Ich öffne (s.o.) ein PopUp-Detailformular (Verknüpfung 1:n) etwa so ...
DoCmd.OpenForm "c", , , "b01=" & Me!b01

Du möchtest ein zweites Formular mit dem gleichen Datensatz wie im aufrufenden Formular öffnen, das hat was mit Synchronisieren (FAQ 4.3, ebenfalls s.o.) zu tun. Die Umsetzung überlasse ich Dir selber.

Dieses zweite Formular soll ein Unterformular sein, das dynamisch im eigenen Hauptformular nachgeladen und verknüpft wird. Warum tust Du Dir das an?

Anne Berg
07.02.2008, 22:41
Hallo Thomas,

ich habe deine Test-DB mal nach meinen Vorstellungen überarbeitet.
Schau es dir bitte an und sag ob du etwas damit anfangen kannst.