PDA

Vollständige Version anzeigen : UFo's und Registerkarten


Storch
18.01.2008, 19:29
Aloa an alle,

ich habe das Problem, 4 Formulare auf einer Seite darstellen zu müssen o. besser zu sollen. Da kam mir in den Sinn die UFos in Registerkarten unter zu bringen. Nun sind die UFos aber nicht gleichberechtigt, sondern:

HFo > 1.UFo > 2. Ufo > 3. UFo

Wichtig ist auch das alle UFos endlos dargestellt werden. Was ja auch funzt. Das 1. Ufo auf die 1. Registerkarte zu ziehen hat ja noch gefunkt. Aber 2. u. 3. UFo in die anderen beiden Register zu bekommen hab ich noch nicht geschafft. Hab auch schon diverses nachgelesen aber nirgends was gefunden. Hat jemand nen Tip für mich????

Marcys
18.01.2008, 19:46
Hmmm,
irgendwie verstehe ich deine Frage nicht, oder es ist schon zu spät ;-)

DAs was ich jedoch verstanden habe, du möchtest Ufos auf Registerkarten verteilen, oder?
Dann erstellt doch 4 Karten. für jedes Formular eine Registerkarte

Storch
18.01.2008, 20:06
ja sicher das, aber mein Problem ist: wie bekomme ich die entsprechenden Verknüpfungen hin?

Marcys
18.01.2008, 20:08
Ach so,

du meinst nicht die Visualisierung sondern die Datenverknüpfung von Formular zu Formular, oder?
Wenn das der Fall ist, dann müsstest du schon mehr Infos geben, was verknüpft werden soll

ebs17
18.01.2008, 20:42
Ein Unterformular ist Steuerelement des Hauptformulars und muss sich meiner Meinung nach deswegen auch innerhalb des Haupformulars befinden. Daher kann ich den Gedankengang mit der Verteilung auf verschiedene Registerkarten nicht nachvollziehen.

UFo3 ist doch UF von UFo2 usw. ?

Ansonsten bin ich gespannt auf eine gegenteilige Lösung.

Storch
18.01.2008, 20:46
ich hab eine bestehendes HFo Produkte. Im Formularfuss (wegen Endlosdarstellung) befindet sich das 1. UFo Rohstoffe. In dessen Fuss das 2. UFo Lenkungspunkte und da reinverschachtelt dann das 3. UFo Lenkungspunktbedingungen. Als verschachteltes Formular funzt alles nur sieht das alles sehr chaotisch aus. Ausserdem isses mit Ac2000 nich so einfach, von einer 4-fach verschachtelung nen vernünftiges Layout hinzubekommen. (Hoffe das wird mit Ac 2007 besser)

Nun soll in HFo Produkte die 3 UFo auf 3 Registerkarten dargestellt werden. Alle UFos habe ich vorher extra als eigenständiges Formular entworfen. Ziehe ich die UFos auf die einzelnen Register kann ich die Verknüpfungen wunderbar mit dem HFo herstellen. Das nutzt aber nur für 1. Register/1.UFo.
In UFo1 hab ich dann UFO 2+3 eingebaut. Anschließend habe ich versucht. mittels Ausschneiden + EInfügen die UFos auf die anderen Register zu verteilen. Das klappt nicht zufriednestellend. Bevor ich nun tagelang rumbastel dachte ich , es wäre besser zu fragen

Storch
18.01.2008, 20:52
Ein Unterformular ist Steuerelement des Hauptformulars und muss sich meiner Meinung nach deswegen auch innerhalb des Haupformulars befinden. Daher kann ich den Gedankengang mit der Verteilung auf verschiedene Registerkarten nicht nachvollziehen.

UFo3 ist doch UF von UFo2 usw. ?

Ansonsten bin ich gespannt auf eine gegenteilige Lösung.

Hallo Eberhard,

ja genau so.... aber bin mir selbst auch nciht 100% sicher das das geht, aber , wenn es auch nirgends so eindeutig geschrieben stand, so liessen mich diverse Beiträge im Forum darauf schließen, das das geht. Der Tenor war so in der Richtung..... Der Formularcontainer, also der Bereich der die Verknüpfungs enthält bleibt im Form, man kopiert nur die Steuerelemente auf di eentsprechenden Register. Aber ich hab echt nicht den schimmer, ob das wirklich geht. Aber wenn nicht, bleibt einem wirklich nur die Hierarchische Form?

Anne Berg
18.01.2008, 21:25
Ein Unterformular ist Steuerelement des Hauptformulars und muss sich meiner Meinung nach deswegen auch innerhalb des Haupformulars befinden. Daher kann ich den Gedankengang mit der Verteilung auf verschiedene Registerkarten nicht nachvollziehen.Autsch! :eek: Selbstverständlich kann man Unterformulare als Steuerelemente des Hauptformulars auf den Seiten eines Registerkarten-Steuerelements innerhalb des Hauptformulars anordnen.

Das Problem ist doch einerseits, dass Ufos nicht beliebig tief verschachtelt werden können, und andrerseits der Platzbedarf (der durch Registerkarten hervorragend gelöst werden kann), wenn man eigentlich voneinander abhängige Ufos nebeneinander (d.h. auf gleicher Ebene) darstellt. Hier entsteht die Frage der "Synchronisation von (Unter)Formularen", zu der eine Lösung in der Access-FAQ zu finden ist. Als auslösendes Ereignis könnte das Change-Ereignis des Registers verwendet werden oder das Current-Ereignis des jeweiligen (also jedes) Unterformulars.

achtelpetit
18.01.2008, 22:07
Selbst wenn das technisch befriedigend hinzukriegen ist so könnte die Performance fies in die Knie gehen. Außerdem mußt Du damit rechnen, daß Access verstärkt rumzickt.
Rumzicken hieß bei mir, daß sich häufiger mal merkwürdig riesengroße Zahlen in Feldern zeigten in denen eigentlich ein 5-stellige Id übertragen werden sollte. Dann ging gar nix mehr und ich war gezwungen die Riesenzahl zu Fuß in der Tabelle zu löschen.
Meine Erfahrung beruht auf einer Konstruktion von 3 ineinander verschachtelten Formularen. Allerdings lagen allen 3 Formularen auch recht große Tabellen zugrunde (jeweils 30 - 40 tsd. DS).

Anne Berg
18.01.2008, 22:12
@achtelpetit: deine Äußerungen finde ich recht merkwürdig.

Ich habe mit derartigen Konstruktionen nur gute Erfahrungen gemacht, zeige aber in meinen Formularen mit vergleichbarem Aufbau immer nur die Datensätze zu einem Haupteintrag an, d.h. hinter dem HF und den UFos steckt jeweils eine gefilterte Abfrage.

Storch
19.01.2008, 08:09
danke für die Anregungen

@anne, ist es den generell empfehlenswert, die Formulardaten IMMER über eine Abfrage anzuzeigen? oder nur unter bestimmten Bedingungen???

achtelpetit
19.01.2008, 13:30
@ Anne Berg
Nu ja, ich sag' auch schon mal was Merkwürdiges, leider ist es dann häufig nicht würdig, gemorken zu werden.
Das beschriebene Problem kann ich leider nicht mehr genau nachvollziehen, weil ich die Konstruktion inzwischen geändert habe. Es ist durchaus möglich. daß die Ursache des Fehlers nicht in der Verschachtelung lag.
d.h. hinter dem HF und den UFos steckt jeweils eine gefilterte Abfrage
Ich hatte die "verknüpfen von / nach" Eigenschaft genommen. Offenbar gibt es da etwas Intelligenteres?

Storch
19.01.2008, 13:58
Hallo Anne,
meinst Du die FAQ 4.3, Formulare synchronisieren ???? Abgesehen davon das ich nicht glaube, das mir das Beispiel wirklich weiterhilft, bekomme ich an der Rotmarkierten Stelle die Fehlermeldung: Methode oder Datenobjekt nicht gefunden.

Private Sub Form_Current()

Dim rs As Recordset
Set rs = Forms!frm_Produktion2_Rohstoffe.RecordsetClone

'im RecordsetClone von Formular2 die Id aus dem aktuellen Formular finden
rs.FindFirst "PI = " & Me!PI
If Not rs.NoMatch Then
'Anzeige im Formular2 mit dessen RecordsetClone synchronisieren
Forms!frm_Produktion2_Rohstoffe.Bookmark = rs.Bookmark
End If

Set rs = Nothing

End Sub

Die Basisdaten werden bei mir im HFo ausserhalb der Register angezeigt. Das 1. UFo = 1. Register, 2. UFo = 2. Register etc. Obiger Code wird vom HFo aufgerufen, damit kann ich dann doch maximal das 1. Register ansprechen.

Anne Berg
19.01.2008, 20:55
Hallo Uwe,
nein, das kann man nicht generell sagen, ob die Datenherkunft eines Formulars besser eine Abfrage oder Tabelle sein soll. Das würde ich stets so machen wie es gebraucht wird, also Abfragen eigentlich nur, wenn mehrere Tabellen benötigt werden oder wenn es sonstige Gründe (z.B. Berechnungen) gibt.

Zu deinem Fehler kann ich nicht viel sagen, vermutlich hat das Formular kein Steuerelement namens PI. Aber der Ansatz mit dem Current-Ereignis scheint mir eh nicht ganz glücklich.

Was die Synchronisation betrifft, so kannst du das erste Ufo doch ganz normal mit dem HF verknüpfen, nur wenn du das 2., 3. oder 4. anspringen willst, musst du es mit dem jeweils "höheren" in Einklang bringen. Hierzu folgendes Beispiel:Private Sub Register_Change()
Select Case Register
Case 0 ' 1. Seite
Case 1 ' 2. Seite
Me.RecordsetClone.FindFirst "ID=" & Me.Parent!ufo1.Form!IdentNr
.
.
.
End Select
End Sub
Das wäre mein Vorschlag. Ich hoffe, das hilft dir weiter.

Storch
19.01.2008, 21:36
Hallo Anne,

vielen lieben Dank.

Hallo Uwe,
nein, das kann man nicht generell sagen, ob die Datenherkunft eines Formulars besser eine Abfrage oder Tabelle sein soll. Das würde ich stets so machen wie es gebraucht wird, also Abfragen eigentlich nur, wenn mehrere Tabellen benötigt werden oder wenn es sonstige Gründe (z.B. Berechnungen) gibt.

In diesm Punkt stimmen wir also überein. Ich meine eine Abfrage tut frühestens dann not, wenn Daten gefiltert oder in irgendeiner Form nach bestimmten Kriterien auszugeben sind.

Zu deinem Fehler kann ich nicht viel sagen, vermutlich hat das Formular kein Steuerelement namens PI. Aber der Ansatz mit dem Current-Ereignis scheint mir eh nicht ganz glücklich.


Das PI gibt es definitiv, von daher verstehe ich es nicht. Das Current-Ereignis war erstmal ein Versuch. Als Dauerlösung ungeeignet, weil es ja nicht jedesmal eintritt wenn es gebraucht wird.

Werde Deinen Vorschlag morgen mal umzusetzen versuchen. Habe allerdings das Ereignis Change im Register noch nicht finden können. GGf. melde ich mich nochmal.

Ich würd ja gern hier ein paar Rosen als Dankeschön reinstellen, aber solch Smilie gibbet es hier nicht.

Anne Berg
19.01.2008, 22:04
Das Change-Ereignis (Bei Änderung) betrifft das Register-Steuerelement, nicht die einzelnen Registerkarten.

Was den Fehler betrifft, wieso hast du PI rot markiert?
Setzt du vielleicht ADO ein und es fehlt der Verweis auf DAO bzw. du musst einen DAO.Recordset deklarieren?
(auf Me!PI kann die Fehlermeldung sich nicht beziehen!)

Storch
19.01.2008, 22:26
mag sein das es an DAO liegt. aber wenn ich DAO deklariere findet er mein Formlar nicht, obwohl alles korrekt geschrieben ist. Findet man diese fernöstlichen Techniken (DAO, ADO etc) irgendwo mal verständlich erklärt? Hab das eh noch nicht begriffen.

Rot markiert weil der Debugger das Teil markiert bei der Fehlermeldung

Anne Berg
19.01.2008, 23:04
Kann es sein, dass "frm_Produktion2_Rohstoffe" eines deiner Unterformulare ist? So kannst du das nicht ansprechen! Ein Unterformular ist ein Steuerelement des Hauptformulars, kein eigenständiges Formular.

Hier noch einmal eine Korrektur zu meinem obigen Beispiel: Me!ufo2.Form.RecordsetClone.FindFirst "ID=" & Me!ufo1.Form!IdentNrDamit wird im Recordset des 2. Ufos nach dem zum 1. Ufo passenden Datensatz gesucht.
Oder du setzt einen Filter:Me!ufo2.Form.Filter = "ID=" & Me!ufo1.Form!IdentNr
Me!ufo2.Form.FilterOn = True


Nachtrag:
Leider hatte ich eben knapp den Änderungszeitraum verpasst, habe leider zu spät gemerkt, dass die ZeileMe.RecordsetClone.FindFirst "ID=" & Me.Parent!ufo1.Form!IdentNrin #14 ziemlicher Unfug ist. Das Ereignis findet ja im HF statt, mein Code setzt aber die Ausführung im Ufo2 voraus.

Storch
20.01.2008, 09:05
Kann es sein, dass "frm_Produktion2_Rohstoffe" eines deiner Unterformulare ist? So kannst du das nicht ansprechen! Ein Unterformular ist ein Steuerelement des Hauptformulars, kein eigenständiges Formular.

NUn weiss ich endlich warum ich in anderen Formularen schon solche Probleme hatte.

Storch
20.01.2008, 10:40
Liebe Anne,

Deine Tipps sind wiedermal Goldes wert. Wenn Du mal in meiner Nähe bist, dann sag bescheid. Ich lad Dich zum Essen ein.

Habe bisher folgenden Code:
Private Sub RegisterProduktion_Change()

Select Case RegisterProduktion

Case 0 '1.Seite
MsgBox ("PI = " & Forms!frm_Produktion1_Produkte!PI)

If IsNull(Forms!frm_Produktion1_Produkte!PI) Then
MsgBox ("IsNUll-Fehler")
Exit Sub
Else
Me!frm_Produktion2_Rohstoffe.Form.Filter = "PI =" & Forms!frm_Produktion1_Produkte!PI
Me!frm_Produktion2_Rohstoffe.Form.FilterOn = True
Me!frm_Produktion2_Rohstoffe!PI!.DefaultValue _
= Forms!frm_Produktion1_Produkte!PI
End If

Case 1 '2.Seite
MsgBox ("PSI = " & Me!frm_Produktion2_Rohstoffe!PSI)

If IsNull(Me!frm_Produktion2_Rohstoffe!PSI) Then
MsgBox ("IsNUll-Fehler")
Exit Sub
Else
Me!frm_Produktion3_Lenkungspunkte.Form.Filter = "PSI =" & Me!frm_Produktion2_Rohstoffe!PSI
Me!frm_Produktion3_Lenkungspunkte.Form.FilterOn = True
Me!frm_Produktion3_Lenkungspunkte!PSI!.DefaultValue _
= Me!frm_Produktion2_Rohstoffe!PSI
End If
End Select

End Sub

Es fehlt noch Case2 aber da sis im grunde das gleiche.

Habe mich für die Filtervariante entschieden, weil ja mehrere DS zum Haupt-DS stehen. Um auch DS hinzufügen zu können setze ich jeweils die DefaultValue des entsprechenden Verknüpfungsfeldes auf den Wert des "übergeordneten"Formulars. Die erste MSgBox is nur für mich, kommt später weg. Die IsNull - Behandlung muss ich mir noch überlegen. Aber interessant das man Forms auch verknüpfen kann, ohne das sie ineinandergeschachtelt sind. Aber nun beschäftige ich mich mal mit TreeView. Würde das ganze gerne noch wesentlich übersichtlicher gestalten.

Arne Dieckmann
20.01.2008, 10:48
Auch, wenn das hier
Me!frm_Produktion2_Rohstoffe!PI!.DefaultValue = ...funktionieren sollte, ändere es lieber in:
Me!frm_Produktion2_Rohstoffe!PI.DefaultValue = ..., denn Eigenschaften sollten nur mit "." angesprochen werden.

Storch
20.01.2008, 11:43
Auch, wenn das hier
Me!frm_Produktion2_Rohstoffe!PI!.DefaultValue = ...funktionieren sollte, ändere es lieber in:
Me!frm_Produktion2_Rohstoffe!PI.DefaultValue = ..., denn Eigenschaften sollten nur mit "." angesprochen werden.

Danke Arne,

aber warum steht sowas dann in der Onlinehilfe???

Arne Dieckmann
20.01.2008, 11:52
Ich hab hier gerade kein Access 2000, aber auch sonst könnte ich dir den Grund nicht verraten. ;)

Storch
20.01.2008, 14:03
Ich hab hier gerade kein Access 2000, aber auch sonst könnte ich dir den Grund nicht verraten. ;)

Die Frage war auch eher rethorisch!

Storch
24.01.2008, 10:38
Hallochen,

nun bin ich wieder auf ein Problemchen gestossen wo mir keine Lösung einfällt:

Private Sub Form_Current()

If IsNull(Me!PI) Then
MsgBox ("Sie müssen ein Produkt definieren!")
Me!Produktname.SetFocus
Exit Sub
Else
Forms!frm_Produktion!Titel = "Null"

Forms!frm_Produktion!Titel = _
Forms!frm_Produktion!frm_Produktion1!Produktname _
& " / " & Forms!frm_Produktion!frm_Produktion1!Namenszusatz

Forms!frm_Produktion!frm_Produktion2.Form.Filter = "PI =" & Me!PI
'& Forms!frm_Produktion!frm_Produktion1_Produkte!PI ==== geht auch nicht
Forms!frm_Produktion!frm_Produktion2.Form.FilterOn = True
Forms!frm_Produktion!frm_Produktion2!PI.DefaultValue = Me!PI
'Forms!frm_Produktion!frm_Produktion1_Produkte!PI ==== geht auch nicht
End If

End Sub

Der Degugger markiert die rote Zeile und gibt mir aus:

Laufzeitfehler 2455....Sie haben einen Ausdruck eingegeben, der einen ungültigen Verweis auf die Form/Report Eigenschaft enthält.

Dieser Fehler entsteht aber nur, wenn ich das Form erstmals öffne. Wenn ich den Debugger zurücksetze und das Ereigniss Anzeigen durch DS-wechsel einmal auslöse, dann funktioniert alles. Sowohl der Filter als auch das Festlegen des Defaultwertes.

Noch zum Verständnis: Es handelt sich um 2 UFos auf einer Registerkarte, die gegenüber dem HFo eigentlich gleichrangig sind aber unter sich durch den Code ab der roten Zeile hierarchisch verknüpft werden.

ZUm einen werden die Daten im 2. UFo nach dem Feld PI (Primär) im 1. UFo gefilter. zum anderen wird der default-wert vom PI (Fremdschlüssel) im 2. UFo auf den Wert vom aktuellen PI im 1. UFo gesetzt, so das auch Daten korrekt eingegeben werden können.

Wo könnte das Problem liegen, das beim öffen des Forms entsteht???

Anne Berg
24.01.2008, 10:43
Hallo,

beim Öffnen werden die Daten erst geladen, und zwar zunächst im Ufo dann im HF, das könnte die Ursache sein. Wenn es anschließend funktioniert, könntest du dir evtl. mit On Error Resume Next das Leben erleichtern.

BTW: Du solltest die Syntax Forms!frmName!ufoName.Form!feldname konsequent einhalten.

Storch
24.01.2008, 11:28
Hallo Anne,

ich weiss zwar grad nich so genau, ob ich die Fehlerbehandlung richtig eingebaut habe, jedenfalls funzt sie nicht, der Fehler entsteht trotzdem. Und selbst wenn er umgangen wird, dann habe ich ein unsortiertes Formular am Start.

Forms!frmName!ufoName.Form!feldname

ufoName is der Name des Formular-Steuerelementes????

und Form is der Name des Formulars?????

Anne Berg
24.01.2008, 11:54
Nein, frmname ist der Name des Hauptformulars, ufoName der Name des Unterformulars, feldname der Name des Steuerelements.
Was ich meine ist folgendes:Forms!frm_Produktion!frm_Produktion2.Form.FilterOn = True
Forms!frm_Produktion!frm_Produktion2.Form!PI.DefaultValue = Me!PIEinmal schreibst du .Form hin und ein anderes Mal nicht.

Wenn du dir nicht sicher bist, ob du die Fehlerbehandlung richtig eingebaut hast, zeige doch den Code.
Was das aber jetzt mit der Sortierung zu tun haben soll, sehe ich nicht. :confused:

Storch
24.01.2008, 13:19
Nein, frmname ist der Name des Hauptformulars, ufoName der Name des Unterformulars, feldname der Name des Steuerelements.
Was ich meine ist folgendes:Forms!frm_Produktion!frm_Produktion2.Form.FilterOn = True
Forms!frm_Produktion!frm_Produktion2.Form!PI.DefaultValue = Me!PIEinmal schreibst du .Form hin und ein anderes Mal nicht.

also sollte dort generell FORM stehen. nur hab ich noch nicht verstanden warum. ich übernehme immer noch gerne codebeispiele und wenns funktioniert? aber ich weiss das es in die Hose gehen kann.

Wenn du dir nicht sicher bist, ob du die Fehlerbehandlung richtig eingebaut hast, zeige doch den Code.
Was das aber jetzt mit der Sortierung zu tun haben soll, sehe ich nicht. :confused:

Sortierung war falsch ausgedrückt, sondern das 2. UFo ist dann nicht gefiltert und zeigt alle vorkommenden Ds an, nicht nur die die dem Feld PI im 1. UFo entsprechen. Also muss ich ne andere Lösung finden.

Nochmal der Code mit Error:

Private Sub Form_Current()
On Error GoTo Form_Current_Error

If IsNull(Me!PI) Then
MsgBox ("Sie müssen ein Produkt definieren!")
Me!Produktname.SetFocus
Exit Sub
Else
Forms!frm_Produktion!Titel = "Null"

Forms!frm_Produktion.Form!Titel = _
Forms!frm_Produktion!frm_Produktion1.Form!Produktname _
& " / " & Forms!frm_Produktion!frm_Produktion1.Form!Namenszusatz

Forms!frm_Produktion!frm_Produktion2.Form.Filter = "PI =" & _
Forms!frm_Produktion!frm_Produktion1.Form!PI
'& Forms!frm_Produktion!frm_Produktion1_Produkte!PI ==== geht auch nicht
Forms!frm_Produktion!frm_Produktion2.Form.FilterOn = True
Forms!frm_Produktion!frm_Produktion2!PI.DefaultValue = Me!PI
'Forms!frm_Produktion!frm_Produktion1_Produkte!PI ==== geht auch nicht
End If

Form_Current_Error:
On Error Resume Next

End Sub

Ich hab versucht, mir mal über MsgBox in diesem Code, Daten aus dem 2. UFo ausgeben zu lassen. Offensichtlich ist das 2. UFo da noch garnicht geladen. Hat man irgendwie Einfluss darauf, wie die geladen werden?

Ich hab jetzt auch schon in Betracht gezogen, das sich die UFo's beim Anzeigen selbst filtern, dann sollte es diese Probleme nicht geben.

Anne Berg
24.01.2008, 13:22
das sich die UFo's beim Anzeigen selbst filtern,Ja, das wollte ich auch gerade vorschlagen. ;)

Im übrigen würde ich Me einsetzen, wo immer es geht, das vereinfacht den Durchblick und die Schreibarbeit und macht dich unabhängig vom tatsächlichen Objektnamen. Gleiches gilt für Unterformulare, die Steuerelemente würde ich Ufo1 - n nennen, egal an welches Formular es gebunden ist.

Also: Else
Me!Titel = "Null" ' wozu?

Me!Titel = Me!ufo1.Form!Produktname & " / " & Me!ufo1.Form!Namenszusatz

Me!ufo2.Form.Filter = "PI =" & Me!ufo1.Form!PI
Me!ufo2.Form.FilterOn = True
Me!ufo2.Form!PI.DefaultValue = Me!PI
End If

Storch
24.01.2008, 14:05
Nu lässt mein Humor wieder nach.

Habe die Konstruktion jetzt im 2.Ufo. Klappt alles ausser: der DS-Zeiger hängt im 1. DS. Kann den Ds also nicht wechseln. Muss das sooooooo?

Anne Berg
24.01.2008, 14:27
Ich verstehe das nicht mit dem DS-Zeiger und dem Datensatzwechsel.
Wie meinst du das?

Storch
24.01.2008, 15:41
Hallo Anne, ich habe jetzt unten stehenden Code im Ereignis BEI ANZEIGEN im 2. UFo. DIeses soll sich also selbst filtern. Das Kriterium ist PI aus 1. UFo.

Private Sub Form_Current()

'IsNUll-Behandlung
If IsNull(Me!PSI) Then
MsgBox ("Sie müssen ein Rohstoff definieren!")
Me!Rohstoff.SetFocus
Exit Sub
Else
'Zuweisungen an Feld TITEL im HForm
Forms!frm_Produktion.Form!Titel = _
Forms!frm_Produktion!frm_Produktion1.Form!Produktname _
& " / " & Forms!frm_Produktion!frm_Produktion1.Form!Namenszusatz _
& " / " & Forms!frm_Produktion!frm_Produktion2.Form!Rohstoff

'Filter anwenden und Default-Wert setzen
Forms!frm_Produktion!frm_Produktion2.Form.Filter = "PI =" & _
Forms!frm_Produktion!frm_Produktion1.Form!PI
Forms!frm_Produktion!frm_Produktion2.Form.FilterOn = True
Forms!frm_Produktion!frm_Produktion2.Form!PI.DefaultValue = Me!PI

End If
End Sub

Sobald der Code durchgelaufen ist, steht im 2.UFo der Focus im 1. DS auf dem 1. Control. Ich kann mit TAB zum DS-Ende aber dann springt der Fokus wieder auf das 1.Control. Üblicherweise springt er doch in den nächsten DS.
Ich kann auch weder mit Mausklick oder mit den Navigationsflächen in einen anderen als den 1. gefilterten DS gehen.

Ichhoffe das war jetzt verständlich.

Anne Berg
24.01.2008, 15:50
Na ja, ist schon klar... das ist ein Endlosform?

Hast du schon mal drüber nachgedacht, wann das Ereignis ausgelöst wird? :p

Nachtrag:
Ich würde das 2. Ufo doch besser aus dem 1. Ufo heraus synchronisieren, anders macht das wohl keinen Sinn.
Oder hast du nicht eine Registerkarte? Dann kannst du dort das Change-Ereignis nutzen!

Storch
24.01.2008, 16:27
ich finde auch das es mehr Sinn macht, weil sich das 2.UFo schon aktualisiert wenn im 1. der DS ausgewählt wird. Aber dann habe ich wieder das erste Problem.

Es ist unbedingt erforderlich das es Form endlos angezeigt wird. Hab es probehalber mal auf EInzeln umgestellt......das gleiche Problem.

Ich hatte ursprünglich auch 4 Register aber aus layoutgründen wollte ich es nur mit zweien machen.

Ich habe soeben herausgefunden, das es am Ereignis BEIM ANZEIGEN liegt. Mir ist schon in der Vergangenheit aufgefallen, das das Ereignis gerne mal 2-3mal hintereinander auftritt. Habe ne MSGBOX reingesetzt und siehe da, wähle ich nen anderen DS geht der cursor auch dahin, aber gleich im anschluss wird wieder BEIM ANZEIGEN aufgerufen und damit startet der Filer neu und der Cursor sitzt wieder auf dem ersten DS. Warum dem so ist kann ich im MOment nur ahnen.

Anne Berg
24.01.2008, 20:17
Genau das meinte ich: Current tritt ein beim Datensatzwechsel. Klickst du also einen anderen an, springt der DS-Zeiger wegen des Codes sofort wieder hoch!

Probier das doch mal aus mit der Registerkarte: Nur wenn die Seite mit Ufo2 aktiviert wird, synchronisierst du die Anzeige. Was du nicht siehst, muss ja auch nicht aktualisiert werden!

Storch
24.01.2008, 21:14
Ich hatte es ja schon soweit fertig mit 4 Registerkarten. Nur habe ich dann am Ende auf 2 registern jeweils nur eine Spalte zu stehen. Aber die Register sind ewig breit, weil das 4 register hat 8 spalten. Sieht also ein bischen komisch aus das Ganze. Da nu die Rohstoffe zum Produkt gehören und die, bisher nicht benannten Lenkungsbedingungen zu den Lenkungspunkten wollte ich das auf nur 2 registern unterbringen.

Ich hab mir überlegt, es ist doch möglich die Position des DS-Zeiger, unter VBA heisst der wohl Bookmark?, zu ermitteln und die aktuelle Zeigerposition mit der letzen in einer Schleife zu vergleichen. Wenn ein Unterschied vorhanden ist, dann soll er den Filter starten. Abgesehen davon das ich für den code nen Jahr brauchen werde frag ich mich in welches Ereignis ich diesen setzen könnte. Hättst du da noch ne Idee???

Anne Berg
24.01.2008, 21:50
Was hast du denn gegen meinen Vorschlag, den Code ins Change-Ereignis des Register-Steuerelements zu packen, wenn die Seite angesprungen wird?

Storch
24.01.2008, 22:15
ich hatte doch in der ersten version bei 4 Registern mit dem Change-Ereigniss gearbeitet. im 1.UFo den DS gewählt dann auf die 2. Registerkarte und filtern. Das hatte ich schon und lief problemlos. Ich werd es wohl auch erstmal wieder so herstellen.
Aber die andere Version reizt mich mehr. Da hätte man ne alternative zu den Access-eigenen Verknüpfungen

ebs17
24.01.2008, 22:55
Ich habe das Thema jetzt nur flüchtig mitgelesen (die exakte Durchführung scheint nicht ohne zu sein).

Vielleicht mal ein Quereinwurf (hoffentlich nicht ganz daneben):

Wenn man Unterformulare nicht ineinander, sondern nebeneinander legt, kann man sie auch übereinander (Popupformular) legen. So könnte man vielleicht das Designproblem mit dem breiten 4. UF lösen (oder mehr?).

Storch
24.01.2008, 23:28
Hallo Eberhard,

(die exakte Durchführung scheint nicht ohne zu sein).

Stimmt ... für sonen Anfänger wie mich.

Wenn man Unterformulare nicht ineinander, sondern nebeneinander legt, kann man sie auch übereinander (Popupformular) legen. So könnte man vielleicht das Designproblem mit dem breiten 4. UF lösen (oder mehr?).

Kann mir im MOment keine Vorstellung von Deinem Vorschlag machen.

Ich denke der Schlüssel zum Ganzen wäre ein Code, wie in #37 schon angedeutet, eine Funktion, die in einer kontrollierten Endloschleife die DS-Zeigerposition in einem Form "beobachtet" und bei einer Änderung desselben z.B. den Filter für das 2. Form aktiviert.

Form_Current ist dafür denkbar ungeeignet, wie wir herausgefunden haben und andere Ereignisse, die auf DS-Wechsel reagieren kenne ich nicht und gibt es auch nicht nach meinen Recherchen. Somit wäre solche Funktion ein guter Ersatz.

Aber was ich wieder nicht weiss ob das überhaupt mit solcher Endloschleife. Das Programm soll ja weiterarbeiten und die Schleife quasi im Hintergrund laufen.

Anne Berg
24.01.2008, 23:37
ich hatte doch in der ersten version bei 4 Registern mit dem Change-Ereigniss gearbeitet. im 1.UFo den DS gewählt dann auf die 2. Registerkarte und filtern. Das hatte ich schon und lief problemlos. Ich werd es wohl auch erstmal wieder so herstellen.
Aber die andere Version reizt mich mehr. Da hätte man ne alternative zu den Access-eigenen VerknüpfungenIch verstehe nicht, was für dich die "andere Version" ist, und inwiefern das eine Alternative "zu den Access-eigenen Verknüpfungen" sein könnte.

Storch
25.01.2008, 05:53
Ich verstehe nicht, was für dich die "andere Version" ist, und inwiefern das eine Alternative "zu den Access-eigenen Verknüpfungen" sein könnte.

Ich meine mit DER ANDEREN VERSION die Idee, ohne das Change-Ereignis zu arbeiten und statt dessen den beschriebenen Code zu realisieren.

Die Alternative? Meines Wissens funktioniert eine Access-verknüpfung nur, wenn die Forms ineinander verschachtelt sind. In meinem Vorhaben kann ich mit Accesseigenen Verknüpfung zwar alle UFO direkt mit dem HFO verknüpfen(gleichrangig auf einer Ebene) , aber ich kann damit nicht das 2. UFo mit dem 1. UFo verknüpfen, nicht das 3. mit dem 2. etc. Deswegen mache ich ja diese Kopfstände und ich überhaupt mache ich das weil 4 verschachtelte Forms Layouttechnisch scheisse aussehen und auch so zu handhaben sind (IMHO).
Die von Access aufgezwungenen Verschachtelungen könnten so umgangen werden. Oder gibt es andere Möglichkeiten? Ich denke nicht.

EInzig, Access prüft bei der Dateneingabe auf referentielle Integrität und die Lösch und Aktualisierungsweitergabe wird realisiert. Aber auch das, könnte ich mir vorstellen, liesse sich machen von nem guten Programmierer.

Anne Berg
25.01.2008, 08:48
Ja, das ist doch alles klar, deshalb weiß ich nicht, warum du das überhaupt ansprichst.

Du willst zwei voneinander abhängige Ufos nebeneinander auf Registerkarten platzieren, OK.
Dann synchronisierst du also Ufo2 mit Ufo1 sobald es angezeigt wird, d.h. sobald die entsprechende Registerkarte gewählt wird. Dass es im Current-Ereignis keinen Sinn macht, haben wir doch schon herausgefunden. ;)

Was die referentielle Integrität betrifft, die wird ja in den Beziehungen definiert und hat mit der Darstellung der Daten in Formularen oder Unterformularen nichts zu tun.

Storch
25.01.2008, 09:42
Du willst zwei voneinander abhängige Ufos nebeneinander auf Registerkarten platzieren, OK.
Dann synchronisierst du also Ufo2 mit Ufo1 sobald es angezeigt wird, d.h. sobald die entsprechende Registerkarte gewählt wird.

Change (bei Änderung) tritt nur ein wenn man die Registerkarten wechselt, aber nicht
1. wenn das umgebende Formular geöffnet und die Register angezeigt werden.
2. wenn im 1.Ufo die DS gewechselt werden.

demzufolge werden
1. die Daten im 2. UFo, beim Öffnen des Formulars, das die Register enthält, ungefiltert angezeigt. Man (USer) müsste also erst auf die 2.Registerkarte und dann zurück auf die 1., damit das Ereignis ausgelöst und die Daten gefiltert werden.
2. die Daten auch nicht aktualisiert, wenn im 1.UFo der DS gewechselt wird. auch hier müsste man erst einen Registerwechsel machen.

Sorry aber Du wirst mir doch zustimmen das das nicht sehr User-freundlich wäre. Unten hab ich mal die beiden Registerkarten abgebildet.

RegisterForm1 sieht im Pic unten genau so aus, wie wenn es grad geöfnet wurde. Rechts das 2.UFo ist ungefiltert. OK das ließe sich vllt. noch beim Laden oder so realisieren. ABER: Wenn ich in der linken Hälfte ein anderes Produkt wähle, MUSS sich rechts das 2.UFo aktualisieren. Wie bitteschön soll das mit Change gehen? Und mit Current geht es auch nicht.

Was die referentielle Integrität betrifft, die wird ja in den Beziehungen definiert und hat mit der Darstellung der Daten in Formularen oder Unterformularen nichts zu tun.

Demnach müssten sich die Lösch -u./o. Aktualisierungsweitergabe auch durch die Beziehungen regeln, unabhängig davon , wie ich die Forms synchronisiere????

Anne Berg
25.01.2008, 09:51
Langer Rede kurzer Sinn: solange die Registerkarte nicht angewählt und das Ufo somit nicht sichtbar ist, ist es doch ziemlich egal, welche Daten dort angezeigt würden, wenn du sie sehen könntest - oder nicht?
Oder siehst du alle Registerkarten gleichzeitig? Das ist ja wohl nicht der Sinn der Sache...

Anne Berg
25.01.2008, 11:11
Nachtrag:
Du hast also zwei Ufos auf einer Registerkarte? :eek:
Warum sagst du das nicht gleich - oder habe ich etwas übersehen?

Storch
25.01.2008, 17:38
Langer Rede kurzer Sinn: solange die Registerkarte nicht angewählt und das Ufo somit nicht sichtbar ist, ist es doch ziemlich egal, welche Daten dort angezeigt würden, wenn du sie sehen könntest - oder nicht?
Oder siehst du alle Registerkarten gleichzeitig? Das ist ja wohl nicht der Sinn der Sache...

Nicht alle Registerkarten ,.....aber die erste ist sofort zu sehen.

Storch
25.01.2008, 17:54
Nachtrag:
Du hast also zwei Ufos auf einer Registerkarte? :eek:
Warum sagst du das nicht gleich - oder habe ich etwas übersehen?

Hallo Anne,

ich meine zwar das ich das zum Ausdruck gebracht habe, falls es nicht deutlich genug rüber kam dann SORRY. Aber Threed jetzt extra nochmal durchlesen mag ich auch nicht.

Ich möchte Dir noch extra mal für Deine Geduld danken !!!

Storch
25.01.2008, 18:11
Ich habe das Thema jetzt nur flüchtig mitgelesen (die exakte Durchführung scheint nicht ohne zu sein).

Vielleicht mal ein Quereinwurf (hoffentlich nicht ganz daneben):

Wenn man Unterformulare nicht ineinander, sondern nebeneinander legt, kann man sie auch übereinander (Popupformular) legen. So könnte man vielleicht das Designproblem mit dem breiten 4. UF lösen (oder mehr?).

Hallo Eberhard,

sofern Du noch mitliest, ich hab über Deine Idee auch noch mal nachgedacht. Mittels PopUp kann ich jedes Formular für sich erstellen, somit ist das Größen(Layout)problem erledigt.
Die Formulare beim Öffnen zu synchronisieren is einfach denke ich.
Aber ich komme auch bei dieser Idee zu dem Punkt, das die Synchronisierung bei geöffneten Formularen eben nich einfach ist, weil es offensichtlich an einem geeigneten Ereignis fehlt.
Ich sehe es für meine Anwendung eigentlich schon als ein muss an, das am liebsten alle Daten gleichzeitig zu sehen sind. Es geht mir darum, das die Vorgänge wie in einer Baumstruktur für den Anwender sichtbar sind, damit dieser weiss wo er ist. Ich habe ja auch schon an TreeView gedacht aber das erschien mir für den Moment zukompliziert.

Ich werde morgen mal ne Text verfassen, der die Aufgabenstellung verdeutlicht sowie die DB soweit wie ich sie jetzt habe, hochlade. Vllt. findet sich ja noch die Ideallösung.

Josef P.
26.01.2008, 11:08
Kurze Nachfrage, da ich den Thread nur überflogen habe und irgendwie das Grundproblem nicht erkenne.

Aus #1 lese ich heraus, dass die Formulardaten von UF1 bis UFn abhängig sind. Später wird dann sehr viel über ein Registersteuerelement geschrieben.
Wie hängt das zusammen? ... das sind doch 2 Teilprobleme, die getrennt lösbar sein sollten, oder?

1.) UF synchron halten:
bei DS-Wechsel wird das Ereingis Current ausgelöst. Dieses Ereignis fängt man mit dem abhängigen Formular ab und reagiert entsprechend darauf.

2) Register
Das Problem durchschaue ich nicht.
Es ist doch egal - zumindest für die Datenfilterung des UF - ob das UF im HF liegt oder auf einem Registerblatt im HF.

Storch
26.01.2008, 12:37
Ich versuche die Problemmatik mal zusammen zufassen.

Aufgabenstellung: In der Gastronomie verwendet man zur Umsetzung der Lebensmittelhygiene ein Konzept namens HACCP. Im Threed geht es um einen Teilbereich davon.
Für alle Speisen bzw. Gruppen von Speisen muss eine Gefahrenanalyse gemacht und schriftlich fixiert werden. Der Ablauf ist wie folgt:

1. Produkte (Speisen)definition
2. Rohstoffe (Lebensmittelartikel) bestimmen
3. Lenkungspunkte festlegen
4. Lenkungsbedingungen definieren

die Fettgedruckten Bezeichnungen sind NAmensbestandteile der Formulare

in 1. werden also Speisen definiert. und in 2. werden die verwendeten Rohstoffe gelistet. Ein Schnitzel mit Pommes hat dann z.b folgende Rohstoffe: Schweinerücken, Eier, Paniermehl, Mehl, Pommes Frites, Frittierfett und Gewürze. jedem dieser Rohstoffe werden dann Lenkungspunkte ( auch Kritischer KOntrollpunkt genannt) zugewiesen, manche Lenkungspunkte auch mehrmals. Der erste Lenkungspunkt ist immer der Wareneingang. Beim Schweinerücken u. den meisten anderen Produkten wird der Wareneingang i.d.R. 4mal zugeordnet. In den Lenkbedingungen wird dann unterschieden in MHD, Verpackungszustand, Liefertemperatur u. Frischezustand.

Bei der Menge an zusammenhängenden Daten halte ich die Endlosansicht nun mal für übersichtlicher.

Da die DB im MOment ziemlich zerknautscht ist wegen meiner Probiererei zeige ich unten erstmal nur die Beziehungen.

Da ne Darstellung in Endlos mit verschachtelten Forms nicht vernünftig darstellbar ist, wollte ich zunächst Registerkarten benutzen. Da das 2. + 3.UFo nur je eine SPalte haben, wollte ich statt 4 Registerkarten nur 2 verwenden. Bei den 4 Regkarten habe ich mit dem CHange_Ereignis die Synchronisierung vorgenommen. Weiteres Problem bei Registern: UFo 2 +3 nur eine SPalte, UFo 4 aber 8 SPalten = blödes Layout. In dieser Hinsicht gefällt mir der Vorschlag von ebs, nämlich PopUps zu verwenden.

Noch ein Problem: 1. UFo und 2. UFo auf einem Register. Change tritt nicht ein wenn das Form geöffnet wird. Somit werden die DS im 2.UFo nicht gefiltert, sie sind aber sichtbar. Auch wenn der DS im 1.UFo wechselt wird 2.UFo nicht synchronisiert. Ich habe versucht das Ereigniss Current zu nutzen. Doch dieses tritt nicht nur ein bei DS-Wechsel sondern auch bei Aktualiserung des Forms und erneuter Abfrage. Ein Versuch war, 2.UFo sich selbst bei Current filtern zu lassen. Aber dazu muss man nach jedem DS-Wechsel in 1.UFo wieder erst in das 2.UFo gehen. Nach einmaliger Filterung konnte ich aber den DS nicht wechseln, weil er nach DS-Wechsel aktualisierte, dann wieder Current aufruft und sich somit wieder filtert. Im nächste Versuch sollte das 1.UFo mittels Current das 2.UFo filtern. Das ging auch ganz prima NUR: beim Öffnen des umgebenden HFo (nur als "Hülle", keine Daten) gibt er nen Fehlerm, weil zu dem Zeitpukt die anderen UFos wohl noch nicht vollständig geladen sind.

Greif ich jetz nochmal auf die PopUp-Variante zurück, dann stelle ich mir folgendes vor:
Das 1.UFo wird geöffnet, nach Áuswahl des DS wird das 2. UFo aufgerufen. Den Filter übergibt man beim Aufruf.
Aber ich möchte dann , dass das 2.UFo geöffnet bleibt und auch synchronisiert wird, wenn der DS im 1.UFo gewechselt wird. Da es offensichtlich kein Ereignis gibt, das ausschließlich auf DS-Wechsel reagiert, habe iich den Threed angefangen:
richtige wirkliche Endlosschleife? geht das?

Ich hoffe ich konnte das einigermassen zusammenfassen.

Storch
03.02.2008, 14:27
Hallo Anne, hallo Joseph und Mitleser,

so nun hab ich die letzte Woche, soweit es meine Zeit erlaubte, an der Geschichte weiter gearbeitet. Auf jeden Fall habe ich wieder ne Menge gelernt. Ich habe das Prinzip von Joseph's Beispiel aus dem anderen Threed soweit beibehalten, nur rufe ich "SetData" jetzt direkt aus Current auf und nicht mehr über
Private Sub SubFormA_Current()
Me!sfrB.Form.SetData SubFormA!idA
End Sub
Ich sehe keinen Grund warum man das nicht auch direkt aufrufen sollte. Bitte ggf,. nochmal erklären.

Am Anfang der Woche war ich vom Current-Ereignis erst völlig abgerückt und habe mir mit dem Timer_Ereignis quasi ein eigenes Ereignis konstruiert, welches nur und ausschließlich auf das Wechseln des aktuellen DS reagierte. Der Grund: Ich hatte zunächst Plausibilitätsprüfungen eingebaut, die dan durch das Current-Ereignis ausgelöst wurden, leider des öfteren 2 mal.
Das mit Timer funzte prima. Hab mich dann aber entschieden die Plausibilität anders zu prüfen. So dachte ich nehme ich denn doch wieder das Current-Ereignis, mit dem Gedanken, das 3 timer, die ständig arbeiten, vllt. an der Systemperformance nagen. Also zurückgebastelt und nun habe ich wieder das in diesem Threed schon erwähnte Problem, das beim Öffnen des HFo, ne Fehlermeldung kommt. In der Annahme, es sind ein oder mehrere UFo's noch nicht geladen, habe ich ne If-Anweisung eingebaut, die das prüfen soll, aber die sagt das das UFo2, welches als erstes fehlen dürfte, niemals geladen ist.

Öffnet mal, so ihr mögt, das Form: frm_Produktion. Da kommt die Meldung das Form2 nicht geladen ist. Das ganze einfach mal übergehen und dann die DS im 1.UFo, wo die Produkte stehen, mal wechseln. Spätestens hier sollten doch alle Forms Und UFos geladen sein. Aber irgendwas stimmt da nicht und ich bin wiedermal überfragt.

Ansonsten is das Layout noch nicht fertig und bischen Codemüll steht auch noch.