Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: gromax am Januar 02, 2016, 00:30:31

Titel: Formularwechsel mit Datenübernahme
Beitrag von: gromax am Januar 02, 2016, 00:30:31
Hallo, liebe Access-Profis,

in meiner DB habe ich ein Formular A (frm_SCHUELER03) mit eingepflegtem Unterformular ufoA (frm_Schueler_ufoBearbeitung03).
Das Hauptformular funktioniert über ein Kombinationsfeld [Liste29], in dem ein Namen aufgerufen wird und nachfolgend werden die Daten - auch im ufoA - angezeigt.
Von diesem ufoA aus wechsele ich zu einem strukturgleichen Formular B (frm_InklSCHUELER03) mit ufoB (frm_InklSchueler_ufoBearbeitung03).
Jetzt möchte ich, dass der in Formular A angezeigte Namen auch im Formular B angezeigt wird und der Anwender diesen nicht aus dem dortigen Kombinationsfeld - auch [Liste29] - auswählen muss. Ich habe dazu folgenden Code geschrieben - dieser funktioniert aber nicht:


Private Sub cmd_FormInklusion_Click()
Dim strName As String

strName = DLookup("SuS_Name", "tbl_SCHUELER", "SuS_PS =" & Forms!frm_SCHUELER03!frm_Schueler_ufoBearbeitung03.Form!SuS_FS)
DoCmd.OpenForm "frm_InklSCHUELER03", acNormal
Me.Parent!Liste29.RowSource = "'" & strName & "'"
Me.Refresh
DoCmd.Close acForm, "frm_SCHUELER03"

End Sub



Der Wechsel zum anderen Formular funktioniert, auch wird die Variable "strName" korrekt gefüllt, aber das Formular B startet leer.

Für eine Anregung bin ich immer dankbar.

Viele Grüße
gromax
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: MaggieMay am Januar 02, 2016, 01:27:27
Hallo,

warum öffnest du das zweite Formular nicht mit einem Kriterium?
So könnte das bspw. aussehen:
DoCmd.OpenForm "frm_InklSCHUELER03", acNormal, , "SuS_PS =" & Me!SuS_PS

BTW:
1. Was hat die "03" am Ende des Formularnamens zu bedeuten? Gibt es noch mehr davon?
2. Ein Kombifeld sollte stets die Datensatz-ID als gebundene Spalte haben. Du kannst sie mit der Spaltenbreite 0 ausblenden, um den zugehörigen Text zu sehen.
3. Die RowSource ist die Datensatzquelle eines Kombifeldes, eine Zuweisung wie die folgende macht daher wenig Sinn:
Me.Parent!Liste29.RowSource = "'" & strName & "'"
4. Und schließlich: Wozu brauchst du zwei baugleiche Formulare?
So etwas sollte grundsätzlich wegen unnötig erhöhtem Pflegeaufwand vermieden werden.
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: gromax am Januar 02, 2016, 17:12:27
Hallo MaggieMay,

vielen Dank für die prompte Antwort und Deinen Code; dieser bewirkt allerdings nicht das, was ich möchte. Ich glaube, ich habe die Frage nicht richtig auf den Punkt formuliert.

Zuerst zu den BTW-Anmerkungen:
1. Die Nummer '03' bedeutet in der Tat, dass es mehrere Formulare entsprechend den Berechtigungen gibt.
2. Das habe ich schon so gemacht.
3. Habe ich verstanden und auch gelöscht.
4. An dieser Datenbank arbeiten zwei verschiedene "Berechtigungen"; entsprechend öffnet sich für jede "Berechtigung" ein anderes Formular.

Wieder zurück zu meiner Fragestellung:
An dieser DB arbeiten A-Kollegen/innen, die für behinderte Kinder eine sonderpädagogische Feststellung mit entsprechendem Bescheid ausstellen. Sollten Eltern dieser Kinder eine inklusive Beschulung wünschen, so organisieren dies wiederum andere B-Kollegen/innen.
So weit, so gut!
Problemstellung:
Unter bestimmten Bedingungen wechseln die A-Kollegen/innen in die Rolle der B-Kollegen/innen und müssen, nachdem sie einen sonderpädagogischen Bescheid erlassen haben, auch eine eventuell anstehende inklusive Beschulung organisieren. Jetzt sollten Sie von ihrem A-Formular mit einem Klick zum B-Formular wechseln können und dabei sollte der Schülerdatensatz im B-Formular auch gleich angezeigt werden; sie sollten diesen nicht erst im Kombinationsfeld auswählen müssen. Letzteres geht natürlich, aber ist nicht sehr komfortabel.

In der Anlage habe ich die beiden Formulare als Bilddatei eingefügt, so dass es ein wenig transparenter wird.

Viele Grüße
gromax
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: DF6GL am Januar 02, 2016, 17:30:25
Hallo,
hängen beide (Haupt-) Formulare an der selben Tabelle?

Ist beim (vorm) Wechsel zum B-Formular der DS (der Schüler) schon in der Tabelle gespeichert?

Vor dem Öffnen des B-Forms ist sehr wahrscheinlich ein
Me.Dirty = false
bzw.
runcommand accmdsaverecord
zum Speichern der akt. Daten erforderlich.

Wenn nur das Auswahl-Kombi mit dem Namen besetzt werden soll, könnte das mit Übergabe des Namens (bzw. der Schüler-ID) mittels Openargs-Parameter erfolgen.
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: gromax am Januar 02, 2016, 17:54:53
Hallo Franz,

beide Formulare hängen an derselben Tabelle und die Daten sind bereits in der Tabelle gespeichert.
Ich habe nun den Befehl Me.Dirty = false eingesetzt, aber dies hat keine Änderung bewirkt; das B-Formular startet immer leer.
Bei dem Openarg-Parameter weiß ich nicht, wie ich diesen umsetzen könnte; könntest Du mir dabei helfen?

Viele Grüße
gromax
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: DF6GL am Januar 02, 2016, 18:19:17
Hallo,

mit dem (korrigierten) Vorschlag vom MaggieMay:

DoCmd.OpenForm "frm_InklSCHUELER03", acNormal, , "SuS_PS =" & Me!SuS_FS

(alternativ:
DoCmd.OpenForm "frm_InklSCHUELER03", acNormal, , "SuS_PS =" & Me.parent!SuS_PS  )

sollte sich das B-Form mit dem richtigen DS öffnen, sofern "SuS_FS" das Feld mit der Schülerid im UFO(!) ist und der Code auch dort ausgeführt wird (Button liegt im UfoA)
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: gromax am Januar 02, 2016, 20:20:07
Hallo Franz,

Deine Annahme
Zitatsofern "SuS_FS" das Feld mit der Schülerid im UFO(!) ist und der Code auch dort ausgeführt wird (Button liegt im UfoA)
ist zutreffend, aber das B-Formular bleibt weiterhin leer.

Ein weitere "Merkwürdigkeit" hilft vielleicht weiter:
Wenn ich nach dem Formularwechsel im B-Formular den Schülernamen im Kombinationsfeld manuell eingebe und wie gewohnt die ENTER-Taste drücke, werden die weiteren Daten korrekt angezeigt, so als warten die Daten auf diese Aktion des Anwenders.
Wähle ich aber dann einen anderen Schülernamen im Kombifeld aus, bleiben die Daten des Schülers, den ich vormals beim Formularwechsel benutzt habe, stehen! Das Formular aktualisiert die Daten nicht mehr, was es beim separaten Aufruf durch die B-Kollegen/innen aber weiterhin korrekt macht.
Noch eins draufgesetzt:
Wenn ich nach dem Formularwechsel in dem leeren Kombifeld einen anderen Schülernamen aufrufe, werden auch die Daten des Schülers, den ich beim Formularwechsel eingestellt hatte, angezeigt. Irgendwie werden die Daten übertragen, sie sind aber aufgrund des nicht angezeigten Namens im Kombifeld auch nicht sichtbar.
Komisch, dass sie sichtbar werden, wenn irgendein Namen im Kombifeld aufgerufen wird.
Nach dem Formularwechsel scheinen die Daten wie gemeißelt.

Viele Grüße
gromax
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: DF6GL am Januar 02, 2016, 21:46:28
Hallo,

naja, ich/wir kennen doch die weiteren Hintergründe und Prozeduren nicht.. 

Zitatso als warten die Daten auf diese Aktion des Anwenders.

Naja, vermutlich gibt es eine Ereignisprozedur "Nach Aktualisierung" des Kombis. Vielleicht wird die Filterung ja durch Zuweisung eines SQL-Strings mit Where-Condition an die Datenherkunft des Forms realisiert.  Dann kann eine andere Filterung über die Openform-Methode nicht so recht gelingen....
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: MaggieMay am Januar 02, 2016, 23:35:58
Hi,

ZitatUnter bestimmten Bedingungen wechseln die A-Kollegen/innen in die Rolle der B-Kollegen/innen und müssen, nachdem sie einen sonderpädagogischen Bescheid erlassen haben, auch eine eventuell anstehende inklusive Beschulung organisieren.

ich hätte dazu eine andere Idee, und zwar könnten die unterschiedlichen Datengruppen in Unterformularen auf Registerkarten innerhalb eines Formulars angezeigt werden.
Je nach Berechtigung können die Registerkarten beim Öffnen des HF ein-/ausgeblendet und bei Bedarf auch (vorübergehend) wieder eingeblendet werden.

Doch noch einmal zu deinem aktuellen Problem: Ein Formular mit einem bestimmten Datensatz zu öffnen ist im Grunde eine ziemlich triviale Aufgabe und dazu wurden dir bereits verschiedene Beispiele gezeigt. Doch nur du kennst die zugrunde liegenden Tabellen (oder Abfragen?) und ihre Beziehungen. Also kannst auch nur du die korrekten Bezeichnungen für das zu filternde Datenfeld und das wert-gebende Steuerelement im Formular oder Unterformular kennen. Damit solltest du eigentlich zum Ziel kommen können...

Falls das Filtern dann immer noch nicht klappt, nenne bitte sämtliche diesbezüglichen  Details oder lade eine (abgespeckte!) Beispiel-DB hoch.
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: gromax am Januar 03, 2016, 00:15:16
Hallo Franz,

Du hast recht; nicht im Ereignis "AfterUpdate" sondern im Ereignis "Form_Load" des B-Formulars steht folgender Code:

Private Sub Form_Load()
Me.Bezeichnungsfeld14 = p_cstrName2
DoCmd.GoToRecord acDataForm, "frm_InklSCHUELER03", acNewRec
End Sub

so dass den B-Kollegen/innen jeweils ein noch leeres Formular angeboten wird.

Meine Lösung beim Wechseln vom A-Formular zum B-Formular ist dessen Öffnung und nachfolgende Befüllung

Private Sub cmd_FormInklusion_Click()

DoCmd.OpenForm "frm_InklSCHUELER03", acNewRec
DoCmd.OpenForm "frm_InklSCHUELER03", acNormal, , "SuS_PS =" & Me!SuS_FS
DoCmd.Close acForm, "frm_SCHUELER03"

End Sub



Das scheint zu klappen; zumindest werden alle Daten dieses Schülers im Formular angezeigt. Die Anzeige im Kombinationsfeld ist immer noch leer. Wie könnte ich denn den Namen darin noch zur Anzeige bringen?

Ist dieses, mein Vorgehen zu fehlerhaft oder gar zu dilettantisch? Gibt es einen besseren Weg?

Lass bitte nochmals was hören.

Viele Grüße
gromax
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: MaggieMay am Januar 03, 2016, 00:35:19
Dass das zweimalige Öffnen des Formulars - einmal mit Sprung auf den neuen Datensatz und einmal mit Filter - nicht wirklich Sinn macht, solltest du eigentlich selbst erkennen können. Wirksam ist jeweils der letzte Befehl, also kann hier der erste entfallen.

Und warum schließt du das öffnende Formular? Es soll doch automatisch wieder zum Vorschein kommen, wenn das zweite geschlossen wird, oder?

ZitatDie Anzeige im Kombinationsfeld ist immer noch leer.
Kein Wunder, wenn du ihm keinen Wert zuweist. Aber wozu auch, das ist doch gar nicht nötig.

BTW:
DoCmd.GoToRecord acDataForm, "frm_InklSCHUELER03", acNewRec
Absolute Referenzen sollten nach Möglichkeit vermieden werden. Hier täte es auch ein simples "Me.Name" oder gar
DoCmd.GoToRecord , , acNewRec
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: gromax am Januar 03, 2016, 02:42:54
Hallo MaggieMay,

das mit dem zweimaligen Öffnen eines Formulars war mir natürlich nicht geheuer, aber meine Überlegung war dem Load-Ereignis einen Vorgang drauf zu setzen; wenn ich den ersten Aufruf des Formulars nicht vollziehe, so bleibt - nach meiner Meinung - der Ladevorgang mit dem Warten  auf eine Eingabe (Status acNewRec) stehen. Es funktioniert jedenfalls nicht, wenn ich die Zeile >>DoCmd.OpenForm "frm_InklSCHUELER03", acNewRec<< weglasse; dann bleibt das ganze Formular leer und wird erst nach einem beliebigen Aufruf im Kombifeld mit den dann richtigen Daten gefüllt.

Das Schließen des Formulars hat lediglich optische Gründe; das sieht doch nicht gut aus, wenn das A-Formular als das größere hinter dem kleineren B-Formular vorschaut.

Natürlich muss der Namen aus datentechnischen Gründen nicht im Kombinationsfeld angezeigt werden, schon klar - es sind ja die zum Schüler gehörenden Daten, die wichtig sind. Aber zur Orientierung im alltäglichen Geschäft (Unterbrechungen durch Telefonate, Kurz-Besprechungen,...) ist es für den Anwender schon wichtig, dass er bei Wiederaufnahme der Arbeit noch weiß, um welchen Schüler es sich handelt.

Das Zuweisen eines Wertes zum Kombinationsfeld habe ich schon vielfach versucht, u.a.:

Private Sub cmd_FormInklusion_Click()
Dim strName As String

strName = DLookup("SuS_Name", "qry_SCHUELER03_HF_Inkl", "SuS_PS =" & Forms!frm_SCHUELER03!frm_Schueler_ufoBearbeitung03.Form!SuS_FS)

DoCmd.OpenForm "frm_InklSCHUELER03", acNewRec
DoCmd.OpenForm "frm_InklSCHUELER03", acNormal, , "SuS_PS =" & Me!SuS_FS
Forms!frm_InklSCHUELER03!Liste29.Value = strName  'funktioniert nicht
DoCmd.Close acForm, "frm_SCHUELER03"

End sub


Das ist wirklich vertrackt!!

Viele Grüße
gromax

p.s.: Deine Idee mit den Register in Abhängigkeit der Berechtigungen ist spannend; ich komme aber derzeit nicht zu diesem Ansatz, solange der andere eigentlich zielführend ist. Ich schaue ihn mir aber noch an!
Kein Lösungsansatz ist umsonst.
Danke!
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: DF6GL am Januar 03, 2016, 09:45:15
Hallo,

also, ich verstehe Deine Vorstellung über den Bedienungsablauf immer weniger...



Ein einziges Formular mit z.B. dem Register-Steuerelement oder auch das dynamische Laden des UfoB in das (einzige) UFO-Steuerelement ist sicherlich einfacher und besser als dieses Öffnen- und Schliessen-Gewurschtel. Zudem ist es mir nicht erklärlich, warum Du in den HFOs nicht die gesamten (nötigen) Daten eines Schülers (also auch dessen Namen) mit gebundenen(!) Textfeldern anzeigst anstatt den Namen in  einem Such-Kombi (?) anzuzeigen.

Um in Deiner Version das Kombifeld (warum heißt das "Liste29"?) beim (nach dem)  Laden des Forms auf den aktuellen Namen zu setzen (Wie lautet denn die Datensatzherkunft dieses Kombis? Ich vermute, in Spalte 0 steht die Schüler-ID) , muss denn auch die Schüler-ID zugewiesen werden und nicht der Name des Schülers:


Forms!frm_InklSCHUELER03!Liste29= Me!SuS_FS

oder besser so im Form "frm_InklSCHUELER03":

Sub Form_Current()
Me!Liste29 = Me!SuS_PS
End Sub
Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: gromax am Januar 03, 2016, 22:30:59
Hallo Franz,

vielen Dank für Dein dauerhaftes Bemühen; letztlich hast Du durchgehend recht gehabt.
Der Ausdruck >Forms!frm_InklSCHUELER03!Liste29= Me!SuS_FS< hat funktioniert.
Trotzdem habe ich Deinem und MaggieMays Ratschlag Folge geleistet; mit der Registerversion ist es tatsächlich sehr viel einfacher und wirkt weniger träge!

Frage mich nicht, warum 'Liste29' 'Liste29' heißt; dies ist meinen Anfängen geschuldet und zollt der Unsystematik bei der Nomenklatur Rechnung! So ist das nun mal, wenn man mit Access die ersten Schritte macht.

Viele Grüße und einen
guten Start in die Woche
gromax

Titel: Re: Formularwechsel mit Datenübernahme
Beitrag von: MaggieMay am Januar 04, 2016, 00:04:14
Hallo gromax
ZitatFrage mich nicht, warum 'Liste29' 'Liste29' heißt;
das ist natürlich auch nur eine rein rhetorische Frage und soll dir einen Anstoß geben, die Steuerelemente von vornherein sinnvoll zu benennen - auch wenn Access dich nicht ausdrücklich danach fragt.