-Access 2000-
Ich habe ein Hauptformular 'Firma' und damit verbunden ein Unterformular
'Dozent'.
Jetzt möchte ich im Hauptformular folgendes:
1. nach dem Firmennamen suchen.
Dies ist über den Assistenten auch kein Problem! (Einen Datensatz im
Formular basierend auf dem im Kombifeld gewählten Wert suchen). Nach dem
ausgewählten Firmennamen, wird der passende Datensatz in meinem
Hauptformular aktualisiert und angezeigt.
2. Ich möchte ein weiteres Kombifeld im Hauptformular plazieren, welches
nach einem Dozentennamen (die Daten sind im Unterformular) sucht. Nach
dem ausgewählten Dozentennamen, soll mir der Firmenname,...(Datensatz)
angezeigt werden, bei dem dieser Dozent arbeitet.
Mein ERM:
Firma beschäftigt Dozent(en)
1 - n
Wie muss ich Schritt 2 umsetzen?
Vielen Dank für eure Hilfe.
Grüße
Melanie
Das UFo-Steuerelement im Hauptformular hat die Eigenschaften
"Verknüpfen von" und "Verknüpfen nach". Bei "von" trägst du den
Namen des Feldes ein, der im Unterformular den Dozenten
bestimmt (ist hoffentlich nicht wirklich ein Name sondern ein
eindeutig indiziertes Feld wie DozentenId o.ä.). Bei "nach" trägst
du den Namen des Kombis ein. Die gebundene Spalte des
Kombis ist wiederum die o.a. Id.
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
Datenbankprofis: http://www.dbdev.org
richtig, meine Tabellen besitzen einen eindeutigen Schlüssel
. Bei "nach" trägst
> du den Namen des Kombis ein. Die gebundene Spalte des
> Kombis ist wiederum die o.a. Id.
>
ansonsten komme ich leider nicht mit.
Die Verknüpfungseigenschaft bezieht sich doch auf Unterformulare und
nicht auf mein Kombinationsfeld? hier habe ich doch nur die Möglichkeit
der Datensatzherkunft.
Weiterhin besteht das Problem, dass der Datensatz, den ich suchen möchte
mir anschließend bei Auswahl, die Einträge der 1-Seite (Firma)
aktualisieren soll. (also bei welcher Firma der Dozent arbeitet).
So wie ich das in meinem Fall 1. geschrieben haben, wird hier über den
Assistenten ein VBA-Code generiert. Diesen bekomm ich aber nicht auf
meinen Fall 2 umgeschrieben.
Gruß
Melanie
> ansonsten komme ich leider nicht mit.
>
> Die Verknüpfungseigenschaft bezieht sich doch auf Unterformulare und
> nicht auf mein Kombinationsfeld?
Stimmt schon, aber sie sagt aus, über welches Feld, bzw. welche Felder
die Daten des HF mit den Daten des UF verknüpft sind, und genau diese
Verknüpfung sollst du in die Datensatzherkunft des neu zu erstellenden
Kombinationsfeldes einbeziehen, damit du innerhalb dieser Datensatz-
herkunft eine verwertbare ID zur Suche innerhalb der Datenherkunft
des HF bekommst.
> Weiterhin besteht das Problem, dass der Datensatz, den ich suchen
> möchte mir anschließend bei Auswahl, die Einträge der 1-Seite (Firma)
> aktualisieren soll.
Na na, aktualisieren wird ja nicht gleich gewünscht sein. Hingehen
wird schon genügen, hoffentlich. Und dann gleich mehrere Einträge
aktualisieren ...
> (also bei welcher Firma der Dozent arbeitet).
>
> So wie ich das in meinem Fall 1. geschrieben haben, wird hier über den
> den Assistenten ein VBA-Code generiert. Diesen bekomm ich aber nicht
> auf meinen Fall 2 umgeschrieben.
Am Code soll sich eigentlich gar nichts ändern (abgesehen vom Namen
des Kombinationsfeldes). Aber damit das Kombinationsfeld eine FirmenID
enthalten kann, musst du die Datensatzherkunft so aufbauen, dass sie
zwei Tabellen miteinander verknüpft, nämlich die Tabelle der Firmen
mit der Tabelle der Dozenten, und zwar über die selben Felder, über
die auch schon das UF mit dem HF verknüpft ist.
Salü,
Sven
--
Im Übrigen bin ich der Meinung, dass die Groß-/Kleinschreibung
abzuschaffen ist.
> Am Code soll sich eigentlich gar nichts ändern (abgesehen vom Namen
> des Kombinationsfeldes). Aber damit das Kombinationsfeld eine FirmenID
> enthalten kann, musst du die Datensatzherkunft so aufbauen, dass sie
> zwei Tabellen miteinander verknüpft, nämlich die Tabelle der Firmen
> mit der Tabelle der Dozenten, und zwar über die selben Felder, über
> die auch schon das UF mit dem HF verknüpft ist.
>
Hierzu komme ich dann glaube ich etwas später :-)
Ciao
Melanie
>> Stimmt schon, aber sie sagt aus, über welches Feld, bzw. welche Felder
>> die Daten des HF mit den Daten des UF verknüpft sind, und genau diese
>> Verknüpfung sollst du in die Datensatzherkunft des neu zu erstellenden
>> Kombinationsfeldes einbeziehen, damit du innerhalb dieser Datensatz-
>> herkunft eine verwertbare ID zur Suche innerhalb der Datenherkunft
>> des HF bekommst.
>>
> Kannst du mir hier vielleicht ein CodeBeispiel geben?
Das geht deswegen nicht, weil es nichts mit Code zu tun hat.
> mir ist der Befehl nicht klar.
Das könnte daher kommen, dass es sich nicht um einen Befehl
handelt.
Du hast doch bereits ein Kombinationsfeld, und dazu vom Assistenten
generierten Code, um im HF nach einer Firma zu suchen. Dabei wird
nach aussen hin der Name der Firma angezeigt, und intern nach der
zu diesem Namen gehörenden ID gesucht.
Wenn du jetzt nach einem Dozenten suchen willst, dann kannst du
das nicht direkt tun, sondern musst im HF eigentlich nach der Firma
suchen zu der der Dozent gehört. Nach aussen hin sieht man dabei
die Namen der Dozenten, während intern wie schon beim ersten
Kombinationsfeld nach der ID der Firma gesucht wird (bei der
der zur Suche gewählte Dozent beschäftigt ist).
Damit das klappt musst du die Liste, die das Kombinationsfeld
verwendet (das was bei deren Eigenschaft <Datensatzherkunft>
eingestellt ist) so aufbauen, dass sie sowohl die Namen der
Dozenten als auch (am besten als erste Spalte) die ID der
Firmen beinhaltet. Um so eine "Liste" zu erzeugen musst du
eine Abfrage erstellen, die die Firmen mit den Dozenten
verknüpft. Das kannst du extra vorab machen, oder direkt bei
der Bearbeitung des Kombinationsfeldes.
Ganz rechts bei der <Datensatzherkunft>-Eigenschaft des
Kombinationsfeldes ist eine kleine Befehlsschaltfläche, die mit
drei Punkten beschriftet ist, und die die gewohnte Entwurfsansicht
für Abfragen aufruft. Da kannst du dir die Abfrage zusammenstellen,
die die Firmentabelle mit der Dozententabelle verknüpft (wie gesagt
über die selben Felder, die auch verwendet werden um das HF mit dem
UF zu verknüpfen), und daraus die ID aus der Firmentabelle und
die Dozentennamen aus der Dozententabelle wählen. Dann wird die
dem Entwurf entsprechende SQL-Anweisung in die Eigenschaft
eingetragen.
Du kannst aber auch diese Abfrage als normale neue Abfrage erstellen,
und dann in der <Datensatzherkunft>-Eigenschaft nur den Namen dieser
Abfrage angeben.
Wichtig ist, dass die Datensatzherkunft des Kombinationsfeldes
die ID aus der Firmentabelle und den Dozentennamen aus der Dozenten-
tabelle enthält. Dann kannst du den gleichen Code für dieses
Kombinationsfeld verwenden, der schon beim ersten Kombinationsfeld
steht, weil du ja auch diesmal wieder eine FirmenID hast, nach der
gesucht wird.
>> des Kombinationsfeldes). Aber damit das Kombinationsfeld eine FirmenID
>> enthalten kann, musst du die Datensatzherkunft so aufbauen, dass sie
>> zwei Tabellen miteinander verknüpft, nämlich die Tabelle der Firmen
>> mit der Tabelle der Dozenten, und zwar über die selben Felder, über
>> die auch schon das UF mit dem HF verknüpft ist.
>>
> Hierzu komme ich dann glaube ich etwas später :-)
Nein, das kannst du nicht verschieben, weil es die Grundvoraussetzung
ist. Du kannst nicht den zweiten Schritt vor dem ersten tun.
Es ist ja auch gar nichts so schrecklich Kompliziertes, sondern
alltägliches Handwerkszeug: die Tabelle der Dozenten in den
Abfrageentwurf bringen, die Tabelle der Firmen in den Abfrageentwurf
bringen, das entsprechende Feld aus der einen Tabelle auf das
entsprechende Feld der anderen Tabelle ziehen, sodass eine
Verbindungslinie entsteht. Fertig. Kein Problem. Alles easy.
erst einmal vielen Dank für deine ausführliche Erklärung.
Hat super geklappt, ich habs verstanden und bin nun total happy :-)
> Fertig. Kein Problem. Alles easy.
Eigentlich hast du recht.
Mein Problem ist, dass ich zwar grundlegendes Wissen zu ERM , SQL und
Programmiersprachen besitze, jedoch Access und VBA für mich recht neu sind.
Nun hab ich noch eine weitere Frage zu meinem Formular:
Die Firmendaten befinden sich auf einem Registerblatt Nr1.
Die zugehörigen Dozentdaten auf dem Registerblatt Nr2 in Form der
Standardansicht: Einzelnes Formular.
Was kann man eingeben, damit bei erfolgreicher Suche meines Dozenten,
nicht nur das Registerblatt Nr1 aktualiesiert wird ( die Firma ),
sondern wenn ich auf Blatt 2 wechsel, auch meine aktueller Dozentenname
zu sehen ist?
Momentan muss ich noch die Datensätze durchgehen, bis ich "meinen"
Dozenten gefunden habe, der bei der Firma arbeitet.
Bis dann
Melanie
> Die Firmendaten befinden sich auf einem Registerblatt Nr1.
> Die zugehörigen Dozentdaten auf dem Registerblatt Nr2 in Form der
> Standardansicht: Einzelnes Formular.
>
> Was kann man eingeben, damit bei erfolgreicher Suche meines Dozenten,
> nicht nur das Registerblatt Nr1 aktualiesiert wird ( die Firma ),
> sondern wenn ich auf Blatt 2 wechsel, auch meine aktueller Dozentenname
> zu sehen ist?
du kannst fast den gleichen Code wie für die Firmensuche verwenden, nur
daß du halt statt me me.DeinUfoSteuerElement.Form setzen mußt und halt
nach der Dozenten-Id suchen mußt.
HTH Jürgen
> Eigentlich hast du recht.
Ahhh, recht haben ist was Schönes! ;-)
> Mein Problem ist, dass ich zwar grundlegendes Wissen zu ERM,
> SQL und Programmiersprachen besitze, jedoch Access und VBA
> für mich recht neu sind.
Das heisst, dass man dir weniger den Unterschied zwischen INNER
JOIN und LEFT JOIN erklären muss, als vielmehr wie man sich in
der Entwurfsansicht einer Abfrage bewegt, um die richtige Art
JOIN zu erstellen?
> Nun hab ich noch eine weitere Frage zu meinem Formular:
Ahem <räusper> da sollte man dann aber eigentlich einen neuen
Thread starten. Eigentlich.
> Die Firmendaten befinden sich auf einem Registerblatt Nr1.
Au weh. Was ist an den Dingern bloß so schön?
> Die zugehörigen Dozentdaten auf dem Registerblatt Nr2 in Form der
> der Standardansicht: Einzelnes Formular.
>
> Was kann man eingeben, damit bei erfolgreicher Suche meines,
> Dozenten nicht nur das Registerblatt Nr1 ( die Firma ) aktualisiert
> wird,
Könnten wir uns darauf einigen, dass nicht das Registerblatt
aktualisiert, sondern lediglich darin zu einem bestimmten
Datensatz gesprungen wird? Nachdem beides möglich ist, aber
etwas Grundverschiedenes bedeutet, führt die beliebige
Verwendung der Ausdrucksweisen womöglich bald einmal zu
tief greifenden Missverständnissen, die unnötig Aufwand
kosten.
Und in welcher Art und Weise befinden sich denn die Firmendaten
auf einem Registerblatt? Über Textfeld-Steuerelemente, oder auch
wieder innerhalb eines Formularobjekts, das sich seinerseits
innerhalb eines Unterformular-Steuerelements befindet?
> sondern wenn ich auf Blatt 2 wechsle, auch meine aktueller
> Dozentenname zu sehen ist?
Dazu musst du den Code, der für das Suchen generiert worden
ist, nochmal duplizieren, damit er im Unterformular sucht.
Also: im Hauptformular hast du jetzt zwei Komboboxen, die beide
nach einer Firma suchen, wobei bei der ersten ein Firmenname zu
sehen (und auszuwählen) ist, und bei der zweiten ein Dozentenname.
Diese zweite Kombobox gehört um eine Spalte erweitert, nämlich
die ID des Dozenten. Das gehört erstens in der Datensatzherkunft
(über die Entwurfsansicht der Abfrage) ergänzt, und zweitens
gehört der Wert der Eigenschaft <Spaltenanzahl> um 1 erhöht, und
eine Spaltenbreite für die neue Spalte festgelegt, idealerweise
0cm, damit sie nicht zu sehen ist.
Der Zugriff auf diese neue Spalte erfolgt in VBA mittels
Me![Komboboxname].Column(n)
wobei in diesem Kontext die Zählung der Spalten bei 0 beginnt
und <n> somit für "Spaltennummer - 1" steht. Da drin steht
also der Wert, nach dem gesucht wird. Wenn der Code im
Unterformular laufen soll, dann muss auf ein Steuerelement
des übergeordneten Hauptformulars zugegriffen werden, also
nicht
Me![...
sondern
Me.Parent![...
Ansonsten ist der Code wieder der gleiche wie gehabt.
Wenn der Code dagegen im Hauptformular ablaufen soll
(immerhin findet das auslösende Ereignis ja im Haupt-
formular statt), dann muss in einem RecordsetClone
des Unterformulars gesucht, und auch die Bookmark-
Eigenschaft des Unterformulars gesetzt werden. Das
muss beides zusätzlich zum bisherigen Suchen im
Hauptformular stattfinden, also wenn die Firma gefunden
ist, und zu ihr gesprungen wurde.
Dim vUFO As Access.Form
'die ersten beiden Zeilen müssten bereits vorhanden sein:
If Me.RecordsetClone.NoMatch <> True Then
Me.Bookmark = Me.RecordsetClone.Bookmark
'und dahinter dann ergänzen:
Set vUFO = Me![UFO_Steuerelementname].Form
vUFO.RecordsetClone.FindFirst "[DozentID]=" _
& Format$(Me![Kombobox2_Name].Column(2))
If vUFO.RecordsetClone.NoMatch <> True Then
vUFO.Bookmark = vUFO.RecordsetClone.Bookmark
Else
MsgBox "Dozent '" & Me![Kombobox2_Name].Column(1) _
& "' unerklärlicherweise nicht gefunden(?!?!)"
End If
'ab hier sollten die Zeilen wiederum bereits vorhanden sein
Else
MsgBox "Dozent '" & Me![Kombobox2_Name].Column(1) _
& "' arbeitet anscheinend bei keiner Firma(?!?!)"
End If
'auch neu:
Set vUFO = Nothing 'immer hinterher schön den Müll raustragen
So ungefähr müsste es funktionieren, wenn du die verwendeten
Namen entsprechend anpasst. Dabei darf man aber nicht den
Namen des Steuerelements, das das Unterformular enthält, mit
dem Namen das Formularobjekts im Datenbankfenster verwechseln!
Das rechteckige Steuerelement in dem das Formularobjekt, das als
Unterformular benutzt wird, "wohnt", ist ein eigenständiges
Objekt und hat als solches auch einen eigenständigen Namen.
> Das heisst, dass man dir weniger den Unterschied zwischen INNER
> JOIN und LEFT JOIN erklären muss, als vielmehr wie man sich in
> der Entwurfsansicht einer Abfrage bewegt, um die richtige Art
> JOIN zu erstellen?
ganz gut erkannt
> Diese zweite Kombobox gehört um eine Spalte erweitert, nämlich
> die ID des Dozenten. Das gehört erstens in der Datensatzherkunft
> (über die Entwurfsansicht der Abfrage) ergänzt, und zweitens
> gehört der Wert der Eigenschaft <Spaltenanzahl> um 1 erhöht, und
> eine Spaltenbreite für die neue Spalte festgelegt, idealerweise
> 0cm, damit sie nicht zu sehen ist.
Nachdem ich den Teufelskreis nun aufgebrochen habe, funktioniert es nun
mit deiner Hilfe. Danke.
Als Zusatz - die "gebundene Spalte" muss ebenfalls geändert werden ->
auf die DozentenID (stand vorher auf FirmenID). Ansonsten hatte ich das
Problem, dass die Kombobox immer den ersten (in alphabetischer
Reihenfolge) Listeintrag gewählt hat, wenn z.B. zwei Dozenten bei einer
Firma arbeiten.
> vUFO.Bookmark = vUFO.RecordsetClone.Bookmark
Warum hast du das Recordset geclonet? Da keine Änderungen vorgenommen
werden, sondern lediglich ein Datensatz gesucht wird, könnte man doch
mit dem ürsprüglichen Recordset arbeiten? Oder wo ist Haken?
> Else
> MsgBox "Dozent '" & Me![Kombobox2_Name].Column(1) _
> & "' unerklärlicherweise nicht gefunden(?!?!)"
ist das Richtig, wenn die Eigenschaft des Kombifeldes auf "Nur
Listeneinträge=Ja" steht, kann diese Else-Abfrage entfallen?
Ein schönes Wochenende
Melanie
Melanie Braunschweig:
> Hallo Sven,
Ich heiße zwar nicht so, aber ... ;-)
> ...
> Als Zusatz - die "gebundene Spalte" muss ebenfalls
> geändert werden -> auf die DozentenID (stand vorher auf
> FirmenID). Ansonsten hatte ich das Problem, dass die
> Kombobox immer den ersten (in alphabetischer Reihenfolge)
> Listeintrag gewählt hat, wenn z.B. zwei Dozenten bei
> einer Firma arbeiten.
Prinzipieller Tip: Um eine benutzerdefinierte Reihenfolge
zu bekommen, sollte man direkt schon in den Tabellen ein
Zahlenfeld "Reihenfolge" führen, in dem man durch Eintrag
entsprechender Werte die Reihenfolge beliebig gestalten
kann, wenn man danach sortiert.
> > vUFO.Bookmark = vUFO.RecordsetClone.Bookmark
>
> Warum hast du das Recordset geclonet?
Sven hat noch A97; da ist kein direkter Code-Zugriff auf
das Form.Recordset möglich. Ab A2000 (wenn keine
Abwärtskompatibilität gefordert ist) könnte man sich
das schenken.
> > Else
> > MsgBox "Dozent '" & Me![Kombobox2_Name].Column(1) _
> > & "' unerklärlicherweise nicht gefunden(?!?!)"
>
> ist das Richtig, wenn die Eigenschaft des Kombifeldes auf
> "Nur Listeneinträge=Ja" steht, kann diese Else-Abfrage
> entfallen?
Theoretisch ja. Aber vielleicht löscht ein zweiter
Prozeß Einträge aus der Liste?
Sicherer ist es, den Else-Zweig zu führen; wenn die
Bedingung nicht eintritt, frißt er ja kein Brot.
Gruß aus Mainz
Michael
Michael Zimmermann <Zimme...@SZWeb.de> schrieb:
> Melanie Braunschweig:
>> Hallo Sven,
>
> Ich heiße zwar nicht so, aber ... ;-)
ich glaube, die wenigsten heissen hier "Sven" ;-))
SCNR
--
Thomas
Homepage: www.team-moeller.de
TM-AbhängigeObjekte: Update auf Version 3.50 (seit 04.06.04)
sehr aufschlussreich - herzlichen Dank.
Gruß
Melanie
> Als Zusatz - die "gebundene Spalte" muss ebenfalls geändert werden ->
> auf die DozentenID (stand vorher auf FirmenID). Ansonsten hatte ich
> das Problem, dass die Kombobox immer den ersten (in alphabetischer
> Reihenfolge) Listeintrag gewählt hat, wenn z.B. zwei Dozenten bei
> einer Firma arbeiten.
Klar. Dann darfst du im Hauptformular nicht nach Kombobox suchen,
sondern nach Kombobox.Column(n), dafür aber im Unterformular nach
Kombobox direkt.
>> vUFO.Bookmark = vUFO.RecordsetClone.Bookmark
>
> Warum hast du das Recordset geclonet?
Nun, in Access97 gibt es keine Recordset-Eigenschaft des Formulars,
nur RecordsetClone.
> Da keine Änderungen vorgenommen werden, sondern lediglich
> ein Datensatz gesucht wird, könnte man doch mit dem ürsprüglichen
> Recordset arbeiten? Oder wo ist Haken?
In solchen Fällen pflege ich zu sagen: Versuch macht kluch.
Oder brutaler ausgedrückt: Wie wär's wenn du mal ausnahmsweise
*nicht* zu faul wärst, deine eigene Zeit zu strapazieren
anstatt der der NG-TeilnehmerInnen, und es einfach mal
höchstselbst ausprobieren würdest? Das ist durchaus erlaubt,
erwünscht, und mit einer Kopie der Datenbank auch noch völlig
schmerzfrei.
>> Else
>> MsgBox "Dozent '" & Me![Kombobox2_Name].Column(1) _
>> & "' unerklärlicherweise nicht gefunden(?!?!)"
>
> ist das Richtig, wenn die Eigenschaft des Kombifeldes auf "Nur
> Listeneinträge=Ja" steht, kann diese Else-Abfrage entfallen?
Siehe oben.
> In solchen Fällen pflege ich zu sagen: Versuch macht kluch.
>
> Oder brutaler ausgedrückt: Wie wär's wenn du mal ausnahmsweise
> *nicht* zu faul wärst, deine eigene Zeit zu strapazieren
> anstatt der der NG-TeilnehmerInnen, und es einfach mal
> höchstselbst ausprobieren würdest? Das ist durchaus erlaubt,
> erwünscht, und mit einer Kopie der Datenbank auch noch völlig
> schmerzfrei.
Danke für den Tipp ;-))
Aber hier ging es nicht ums Ausprobieren....mir war klar dass beide
Methoden funktionieren (Habs ausprobiert).
Da du aber offenbar wesentlich mehr Erfahrung hast, ging ich davon aus,
dass du einen bestimmten Grund hattest das Recordset zu clonen. :)
Nochmals danke für deine guten Tipps und die aufgewendete Zeit, es hat
mir sehr geholfen.
Viele Grüße
Melanie
>> In solchen Fällen pflege ich zu sagen: Versuch macht kluch.
>
> Danke für den Tipp ;-))
>
> Aber hier ging es nicht ums Ausprobieren.
Mir schon.
>...mir war klar dass beide Methoden funktionieren
Mir nicht. Ich hätte ein klein wenig Angst, dass die Benutzung
von direkt jenem Recordset auf dem das Formular basiert im
Fall dass der Suchbegriff nicht gefunden wird den aktuellen
Datensatz unbeabsichtigt wechseln könnte, eventuell zum letzten
oder ersten oder sowas.
> (Habs ausprobiert).
Du Gute! (© Loriot)
> Da du aber offenbar wesentlich mehr Erfahrung hast, ging ich davon
> aus, dass du einen bestimmten Grund hattest das Recordset zu clonen.
Ja: Ich habe Access 97.