Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Feld-Verknüpfung in Navigationsformular

Begonnen von Illu, September 16, 2011, 17:25:29

⏪ vorheriges - nächstes ⏩

Illu

Hallo Leute,

ich bin gerade wirklich am verzweifeln mit meinem Navigationsformular.
Folgendes Problem:

Ich habe über den Assistenten ein Navigationsformular erstellt und habe auf diesem eine Kombobox platziert, die über eine Abfrage gefüllt wird. Nun will ich den Inhalt der Kombobox mit den Unterformularen verknüpfen, bin aber noch nicht dahintergestiegen, wie das geht. Die Eigenschaften LinkChild sind in einem Navigationsformular bzw. seinen Unterformularen anscheinend nicht gültig.
Man kann das ganze zwar durch Filterung umgehen, dann funktioniert es aber nicht, neue Einträge im Formular hinzuzufügen, da ja eine Eigenschaft fehlt, die sonst durch die Verknüpfung festgelegt würde.


Gibt es also keine Möglichkeit in einem Navigationsformular Verknüpfungen zu nutzen? Ich würde gerne auf die Verwendung des Registerkartenelements verzichten, da das Navigationselement designtechnisch meiner Meinung nach praktischer ist.

Ich hoffe ihr könnt mir helfen.

Gruß
Illu

database

#1
Hallo,

m.E. liegen da ein paar Definitionsprobleme im Raum...

Unterformulare ... sind das was ihr Name aussagt - Unterformulare haben stets ein Hauptformular und stellen in der Regel die n-Seite von 1:n in Beziehung stehender Tabellen dar.


ZitatNun will ich den Inhalt der Kombobox mit den Unterformularen verknüpfen
Naja, hier würde ich darauf tippen, dass die Daten, welche in einem eingebundenen Formular (nicht Unterformular) angezeigt werden von der Auswahl im Kombifeld abhängig gemacht werden können - nicht umgekehrt.

Die Daten des AKTUELL angezeigten 'Unterformulars' im Navigationsformular KÖNNTEST du dann mit folgendem Code mit der Auswahl im Kombifeld Synchronisieren:


Private Sub KombiFeld_AfterUpdate()

   Dim rst As DAO.Recordset
   Set rst = Me!Navigationsunterformular.Form.RecordsetClone

   rst.FindFirst "Id = " & Me.KombiFeld
   
   If Not rst.NoMatch Then
       Me!Navigationsunterformular.Form.Bookmark = rst.Bookmark
   End If

   Set rst = Nothing

End Sub

Zu beachten ist in dem Fall, dass JEDES eingebundene Formular mit dem Namen 'Navigationsunterformular' angesprochen wird.


ZitatGibt es also keine Möglichkeit in einem Navigationsformular Verknüpfungen zu nutzen
Ich verstehe leider hier nicht was du damit genau meinst  :-\

Zitat...da ja eine Eigenschaft fehlt, die sonst durch die Verknüpfung festgelegt würde
ja, und die wäre welche  ???


Illu

Wahrscheinlich erkläre ich am besten, worum es konkret geht.

Also es handelt sich wiegesagt um ein Navigationsformular, in dem 3 "Unterformulare" (ich dachte, diese heißen auch Unterformulare) eingebunden sind. Im Hauptformular ist eben diese KombiBox, in der die Namen von Personen stehen, die man auswählen kann.

Im ersten Register stehen nun immer Sie Stammdaten der Person. Dieses Formular ist kein Problem.
Im zweiten und dritten Register sind allerdings Formulare eingebunden, die auf eine Tabelle verweisen, auf die eine 1:n Beziehung von den Personen besteht. In Diesem Formular kann man dann "Aufgabenbereiche" auswählen. In der Tabelle, die diesem Formular zugrunde liegt, wird dabei die PersonenID und die ID des Aufgabenbereichs gespeichert. Im Formular soll dann aber natürlich nur der Aufgabenbereich eingetragen werden. Wenn man dies versucht, meckert Access aber natürlich, dass es keine PersonenID hat. Jetzt würde ich gerne den Inhalt der KombiBox mit dieser PersonenID des 2. bzw. 3. Formulars verknüpfen.

Ich hoffe, du hast mich jetzt einigermaßen verstanden.

Grüße
Illu

Illu

Dazu ist noch zu sagen, dass ich die Filterung derzeit manuell über VBA bewerkstellige. Die einzelnen Register lassen sich ja über den Namen des "Unterformulars" differenzieren.

database

#4
Hallo,

manuell über VBA würde ich gene mal sehen ...
was machst du da?

Lass mal den Code sehen bitte

oder wenn nicht zu groß kannst du auch deine DB komprimiert/repariert und gezippt mit ein paar Spieldaten hochladen (nachdem du dich als Benutzer des Forums registriert hast)

Illu

Ich definiere einfach nur einen Filter für das eingebundene Formular abhängig vom Namen:

Private Function Update_Mitgliederbearbeitung()
    If lstMitglied.Column(0) <> "" Then
        If Me.Navigationsunterformular.Form.Name = "Stammdaten - Unterformular" Then
            Me.Navigationsunterformular.Form.Filter = "[mitID] = " & lstMitglied.Column(0)
        ElseIf Me.Navigationsunterformular.Form.Name = "Mitgliederstimmen - Unterformular" Then
            Me.Navigationsunterformular.Form.Filter = "[MiStmitIDRef] = " & lstMitglied.Column(0)
        ElseIf Me.Navigationsunterformular.Form.Name = "Mitgliedertechnik - Unterformular" Then
            Me.Navigationsunterformular.Form.Filter = "[MiTemitIDRef] = " & lstMitglied.Column(0)
        End If
        Me.Navigationsunterformular.Form.FilterOn = True
    End If
End Function

database

#6
Hallo,
nun ja, ich denke schon dass ich dich verstanden habe.
Das Problem ist einfach jenes, dass im Fall eines Navigationsformulars eben nicht mit der Funktionalität von HF und UF
gearbeitet werden kann, wenn sich die betreffenden Formulare auf unterschiedlichen Registern befinden.

Somit musst du praktisch beim Wechseln des Registers die Information - welche Daten angezeigt werden sollen - an das aufgerufene Formular übergeben.
Das KANN beispielsweise mit dem Klick-Ereignis des betreffenden Navigationsbutton geschehen.

Ich habe das mal in ein kleines recht übersichtliches Beispiel verpackt und hochgeladen.
In der DB befinden sich 3 Tabellen, die untereinander in Bezieung stehen und so eine klassische Basis für HF / UF geben würden.
Daneben existieren 2 Formulare welche auf die Tabellen direkt aufsetzen (Benutzer und Arbeitsbereiche) ein Formular welches die Datenherkunft zur Laufzeit erhält (Zeiterfassung)
und dann naütrlich das Navigationsformular selbst in dem diese drei Formulare eingebunden sind.

Am Navigationsformular befindet sich ein Kombifeld zur Auswahl eines Benutzernamens.
Wir ein Benutzer ausgewählt wid im Navigationsunterformular 'frmBenutzer' der Datensatz des ausgewählten Namens angezeigt.
Es kann nun der Datensatz geändert werden oder aber auch ein neuer Benutzer hinzugefügt werden.
(Es existiert aber keine Funktionalität um in dem Fall das Kombifeld zu aktualisieren - daher muss dann das Form neu geöffnet werden)
Im Formular frmArbeitsbereiche können unabhängig von der Benutzerauswahl Arbeitsbereiche definiert oder bearbeitet werden.
Wurde ein Benutzer im Kombi ausgewählt, dann werden im frmZeiterfassung nur jene Datensätze sichtbar sein, die dem ausgeewählten Benutzer zugeordnet sind.

Bitte zu beachten, dass in den Codes keinerlei Fehlerbehandlungen eingebaut sind.
Das Beispiel ist recht einfach gehalten und soll nur zeigen, wie die Datenherkunft eines Navigationsunterformulars in einer 1:n Beziehung beeinflußt werrden kann.

HTH




[Anhang gelöscht durch Administrator]

Illu

Zitat von: database am September 17, 2011, 09:07:53
Das Problem ist einfach jenes, dass im Fall eines Navigationsformulars eben nicht mit der Funktionalität von HF und UF
gearbeitet werden kann, wenn sich die betreffenden Formulare auf unterschiedlichen Registern befinden.

Ja, das habe ich leider schon feststellen müssen, wobei ich aber nicht verstehe, warum diese Funktionalität fehlt.

Zitat von: database am September 17, 2011, 09:07:53Somit musst du praktisch beim Wechseln des Registers die Information - welche Daten angezeigt werden sollen - an das aufgerufene Formular übergeben.
Das KANN beispielsweise mit dem Klick-Ereignis des betreffenden Navigationsbutton geschehen.

Die angezeigten Daten sind wiegesagt nicht das Problem, denn ich kann ja immer noch einen Filter an das Unterformular per VBA schicken, das Problem sind neue Einträge.

Zitat von: database am September 17, 2011, 09:07:53(Es existiert aber keine Funktionalität um in dem Fall das Kombifeld zu aktualisieren - daher muss dann das Form neu geöffnet werden)

Das habe ich auch noch nicht eingebaut fällt mir gerade ein, aber das ist ja im Grunde relativ einfach lösbar, das Problem liegt wo anders ;)

Insgesamt, trifft das mein Problem nicht so richtig, ich versuchs nochmal zu erklären, da die Datenbank doch relativ komplex ist. Falls ichs dir immer noch nicht genau genug beschreiben kann, richte ich eine DB her, die das Problem zeigt ;)

Also noch konkreter:
Es geht um eine Datenbank zur Verwaltung eines Orchesters. Dabei gibt es in meinem Problemfall 3 Tabellen, die eine Rolle spielen:
tblMitglieder (für die Mitgliederdatensätze), tblStimmen (in der sämtliche Stimmen im Orchester hinterlegt sind) und tblMitgliederStimmen, welche eine m:n-Beziehung zwischen Mitgliedern und Stimmen herstellt (manche Mitglieder spielen mehrere Instrumente).
Nun habe ich 2 (eigentlich 3, aber das 3. erledigt praktisch die selbe Aufgabe wie das 2.) Formulare in meinem Naviformular:
Im ersten Formular kann der Datensatz des Mitglieds, das in der Kombobox ausgewählt, bearbeitet werden. Im zweiten Formular werden sämtliche Stimmen aufgelistet, die diesem Mitglied zugeordnet sind (aber NUR die Stimmen, nicht zusätzlich noch die ID des Mitglieds an jedem Datensatz, die ja ohnehin immer gleich wäre).

Das Problem entsteht nun, wenn ich versuche in diesem Stimmenformular versuche einen neuen Datensatz anzulegen, da Access sich natürlich beschwert, dass es zusätzlich zur ausgewählten Stimme eine MitgliederID braucht.
Im "richigen" Unterformular ließ sich das mit der Verknüpfung zwischen der KombiBox und der MitgliederID auf diesem Formular lösen, aber wie stelle ich das jetzt im Navigationsformular an, dass, wenn ein neuer Datensatz angelegt wird, der Inhalt der KombiBox als MitgliederID verwendet wird?

Ich hoffe, dieses Mal ist das Problem klargeworden, ansonsten kümmer ich mich wiegesagt um eine Beispieldatenbank ;)
Danke dir auf jeden Fall für deine Unterstützung!

Grüße
Illu

database

#8
Hallo,

Zitat...wobei ich aber nicht verstehe, warum diese Funktionalität fehlt ...
Es fehlt keine Funktionalität, die Navigationsformulare sind eben mal KEINE HF / UF - Konstrukte, dazu wurden sie nicht geschaffen.  ::)

Der Hersteller beschreibt das unter Anderem so:
Zitat
Access 2010 enthält ein neues Navigationssteuerelement, mit dem der Wechsel zwischen den unterschiedlichen Formularen und Berichten
in einer Datenbank vereinfacht wird. Ein Navigationsformular ist ein einfaches Formular, das ein Navigationssteuerelement enthält.
Es wird also von unterschiedlichen Formularen gesprochen - nach meinem Verständnis sind damit EINZELNE Formulare (Standalones) gemeint.
Unterformulare können jedoch sehr wohl verwendet werden, in einer HF/UF Konstruktion innerhalb EINES Navigationsunterformulars aber NICHT auf unterschiedlichen Registern.

ZitatIch hoffe, dieses Mal ist das Problem klargeworden
Mir ist dein Problem schon klar, es betrifft die NICHT VORHANDENE Fähigkeit die Fremdschlüssel automatisch einzutragen, so wie du das möglicherweise aus HF/UF Konstrukten gewohnt bist.
Daher auch mein Beispiel mit der Zeiterfassung, ich habe halt dort diesen Automatismus nicht eingebaut sondern nur die Filterung der Datensätze auf den ausgewählten Benutzer realisiert.
Ich bin schon davon ausgegangen, dass durch mein Beispiel auch die Notwendigkeit der Erfassung der Fremdschlüssel ersichtlich wird.  8)
Hmmm ... wenn du dieses Formular 'frmZeiterfassung' anschaust, wirst du erkennen, dass sich BEIDE Fremdschlüssel in meinem frmZeiterfassung befinden 'Benutzer_FK' und 'Arbeitsbereich_FK',
wobei sich 'Arbeitsbereich_FK' bei mir und 'Stimmen_ID' bei dir sowie Benutzer_FK bei mir und Mitgleider_ID bei dir decken würden.

Ich erweitere jetzt mein Beispiel um dir zu zeigen wie du es anstellen KÖNNTEST um die Mitglieder_ID (also bei mir den Benutzer_FK) automatisch zu übertragen.
Dazu trage ich in den Eigenschaften des Kombifeldes 'cboBenutzer_FK' im frmZeiterfassung auf der Registerkarte 'Daten' unter 'Standardwert' folgendes ein: =[Formulare]![frmNavi]![cboBenutzer]
Wodurch dieses Kombifeld beim Anlegen eines neuen Datensatzes AUTOMATISCH mit der Benutzer_ID aus dem Kombifeld am Navigationsformular beschrieben wird.
Das ist eine der Standardmöglichkeiten, die Access OHNE jegliche Programmiertätigkeit bietet und stellt damit die einfachste Lösungsvariante dar.

Klarerweise musst du dann auch in deinem Formular entweder ein gebundenes Kombifeld für die Mitglieder aus deiner Datenherkunft (tblMitgliederStimmen) haben (empfohlen)
oder zumindest ein Textfeld welches an die Mitglieder_ID deiner Zwischentabelle  'tblMitgliederStimmen' gebunden ist.
Wenn es dir graphisch nicht gefällt kannst du diese Felder am Formular ja verbergen.

Mein geändertes Beispiel habe ich natürlich unten wieder reingehängt und hoffe nun meinerseits, dass ich verständlich ankomme.  :D ;D ;)


[Anhang gelöscht durch Administrator]

DF6GL

#9
Hallo,

zunächst ist es nicht einzusehen, warum im ÜBERSICHTSFORM überhaupt ein Kombifeld zu UFO-Synchronisation platziert wird.

Ein Naviform besteht in seiner Grundform aus ein paar Schaltflächen und einem UFO-Steuerelement. Wenn auf eine Schaltfläche geklickt wird, dann muss mittels Prozedur dafür gesorgt werden, dass dass
-- die UFO-LINKFIELDS-Eigenschaften gesetzt werden
-- die Sourceobject-Eigenschaft auf das anzuzeigende Form gesetzt wird.

Dabei kann es nötig sein, die Reihenfolge der Eigenschafts-Zuweisungen zu ändern und/oder die Linkfields-Eigenschaften erst zu "resetten"  (NullString zuweisen) und dannach auf die neuen Schlüsselfelder zu setzen.


Beim A2010-Naviform sind anstelle die Eigenschaften/Daten der Buttons (die zu einem "Navigations-Control" zusammengefasst sind) "Name des Navigationszieles" und die für dessen Filterung zuständige "Where Klausel für die Navigation" zu setzen. In der Where Klausel kann dann auf das Kombifeld Bezug genommen werden.

Das "Navigationsunterformular" unterscheidet sich zum "normalen" UFO u. a. eben dann darin, dass es keine Sourceobject- und LinkxxxFields-Eigenschaften besitzt.

Illu

Ok, das heißt also zusammenfassend, die einzige Möglichkeit, den Schlüssel automatisch eintragen zu lassen, ist über den Standardwert. Das klingt eigentlich nach einer guten Lösung :) Werd ich nacher gleich mal testen. Aber diesen Standardwert kann ich nur auf ein Steuerelement beziehen und nicht auf einen Feldnamen?

@DF6GL Ursprünglich dachte ich an die Verwendung eines Navigationsformulars, da bei diesem prinzipiell die gesamte Fensterbreite für das Unterformular genutzt wird, das ist bei einem Registerelement nicht der Fall, was ich gesehen habe. Das hat immer eine feste Größe. Falls das nicht stimmt, lasse ich mich gern korrigieren. Also die Entscheidung für das Navigationselement war rein ästhetischer bzw. bedienungsergonomischer Natur.

database

#11
Hallo,

@DF6GL
Alles in Allem zwar neu aber für mich nicht überzeugend ...  ;D
Hast du schon mal versucht diese WHERE-Klausel anzugeben? - Ich habs nicht hinbekommen  >:(

Ich plädiere immer noch für eine saubere HF / UF -Lösung.

@Illu
Zitatdie einzige Möglichkeit, den Schlüssel automatisch eintragen zu lassen, ist über den Standardwert
NEIN, das ist die einfachste aber nicht die einzige Möglichkeit  ;)

Zitatda bei diesem prinzipiell die gesamte Fensterbreite für das Unterformular genutzt wird
...ist aber auch nur deswegen der Fall da die Eigenschaft PopUp (wie bei allen anderen 2010-er Formularen) auf NEIN steht
Registersteuerelemente haben KEINE feste Größe und sind in ihrer Breite beliebig und individuell einstellbar.

Navigationsformulare sind grundsätzlich nichts Verwerfliches, sie haben eben andere Funktionalitäten und Eigenschaften als die
bislang bekannten und verwendeten HF / UF Konstrukte und wurden aber auch nicht dazu geschaffen diese abzulösen.
Auf die Neuerungen im Zusammenhang mit dem Navi-Form muss man halt reagieren und abwägen
was im Endeffekt für die jeweilige Applikation die bessere Lösung darstellt - Navi oder HF/UF

Illu

Hmm ok, ich könnte natürlich viel Programmierarbeit sparen, wenn ich einfach normale Unterformulare nutzen würde, aber kannst du mir erklären, wie ich dafür sorge, dass Registerelement und das darin enthaltene Formular immer das ganze Fenster ausfüllen? Gibt es dafür eine einfache Eigenschaft oder muss ich das selbst programmieren?

database

Hallo,

leider habe ich im Moment nicht die Zeit das mal nachzustellen ... ich bin gleich weg...

Erstelle ein Formular neu und füge ein Registerelement ein.
Schau mal in den Formulareigenschaften welche Breite angegeben wird, wenn du kein PopUp-Form hast - ev lass dir die Breite per MsgBox anzeigen wenn das Form in der Formularansicht angezeigt wird.
Dann stellst du die Breite des Registerformulars auf die Formularbreite angepasst ein, plazierst ein Formular in das Register und ziehst es auf die gewünschte Größe.
Natürlich kannst du all diese Dinge auch zur Laufzeit mit VBA einstellen.

Ein Maximieren wie bei einme Formular ist beio Steuerelementen nicht möglich, da müssen die Werte angegeben werden.
Da ein Formular in einem Register ebenfalls im weiteren Sinn ein Steuerelement darstellt, ist das dann auch hier nicht möglich es zu maximieren acuh nicht per VBA.
Es sieht m.E. aber auch graphisch besser aus, wenn solche Dinge nicht den ganzen Bildschirm ausfüllen.


Illu

Ich habe in meiner Datenbank eigentlich nie mit Popupformularen gearbeitet. Aber wie kann sich dann das Navigationselement immer über die gesamte Formular- bzw. Fensterbreite erstrecken?