Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Von Unterformular zu Unterformular - die Zweite

Begonnen von gromax, September 07, 2014, 01:00:13

⏪ vorheriges - nächstes ⏩

gromax

Hallo Access-Profis,

eigentlich dachte ich, dass ich mit der vormaligen Lösung von Df6gl das meiste geschafft hätte, aber wieder einmal stecke ich fest und weiß nicht weiter.
Ich habe ein Hauptformular und darin zwei Unterformulare, die aber auf dieselbe Abfrage zugreifen. Da das ,,Geteilte Formular" als Ufo nicht funktioniert, habe ich Ufo2 in der Ansicht ,,Einzelnes Formular", Ufo3 dagegen in der ,,Datenblatt"-Ansicht formatiert.
Jetzt möchte ich per Doppelklick in den Datensätzen des Datenblattes (Ufo3) den jeweiligen Datensatz in Ufo1 in der Ansicht Einzelnes Formular darstellen.
Wenn ich in Ufo2 (Formular-Ansicht) mit dem Weiterschalten-Button andere Datensätze aufrufe, sollte in Ufo3 der jeweilige Datensatz markiert/hervorgehoben werden.
Für eine Hilfe wäre ich sehr dankbar.
Gromax

p.s.: Zur visuellen Verdeutlichung habe ich einen Screenshot angehängt.

DF6GL

Hallo,

eine Möglichkeit bestünde darin, ein Feld in UFO "Übersicht der Massnahmen" mittels der Bedingten Formatierung auf z. B. eine bestimmte Hintergrundfarbe zu setzen. Die Bedingte Formatierung enthielte einen Ausdruck, der den Primärschlüssel aus den UFOs "Bescheid" und "Übersicht der Massnahmen" auf Gleichheit prüft.


Ausdruck ist  ---    Parent![PKFeld] = [PKFeld]

MaggieMay

Hallo,

die Tabelle, die als Basis von Ufo2 und Ufo3 eingesetzt wird muss zwingend einen eindeutigen Primärschlüssel haben, den kann ich in den Formularen allerdings nicht finden, das ist weiter nicht schlimm, er muss ja nicht sichtbar gemacht werden, muss jedoch in der datenquelle der Formulare enthalten sein. Dann kannst du im Doppelklick-Ereignis von Ufo3 folgenden Code einsetzen:Me.Parent!ufo2.Form.Recordset.Findfirst "ID=" & Me.ID
Im Formular-Ereignis "Beim Anzeigen" von Ufo2 kannst du folgendermaßen auf den Datensatzwechsel reagieren:Me.Parent!ufo3.Form.Recordset.Findfirst "ID=" & Me.ID

Zusätzlich kannst du dann in Ufo3 auch noch die bedingte Formatierung einsetzen, die Datensatzmarkierung erfolgt jedoch nur mit Hilfe von FindFirst oder Einsatz der Bookmark-Methode.
Freundliche Grüße
MaggieMay

gromax

Hallo MaggieMay,

vielen Dank für Deinen Vorschlag!
Ich habe den Code so umgesetzt und es funktioniert prima - aber nur bedingt:
Wenn ich das Hauptformular starte, meldet mir Access einen Laufzeitfehler " '2455' - Sie haben einen Ausdruck eingegeben, der einen ungültigen Verweis auf die Form/Report-Eigenschaft enthält.

Mein angepasster Code in Ufo2 lautet mit dem Verweis auf Ufo3 (frm_Schueler_ufoBearbeitung03Liste) wie folgt:

Private Sub Form_Current()
Me.Parent!frm_Schueler_ufoBearbeitung03Liste.Form.Recordset.FindFirst "BEA_PS=" & Me.BEA_PS
End Sub

Wenn ich den Debugger dann zurücksetze, funktioniert alles bestens; die beiden Formulare sehen sich und synchronisieren genau so, wie es sein soll. Auch das Aufrufen im HF von anderen Datensätzen funktioniert bestens.
Schließe ich aber das Formular oder beende ich Access, so muss ich nach dem Neustart erst wieder den Debugger zurücksetzen.
Hoffentlich ist das nur eine Kleinigkeit. Für Deine Unterstützung vorab vielen Dank!

Mit Doppelklick
gromax

gromax

Hallo MaggieMay,

jetzt habe ich einfach eine Fehler-Routine eingegeben

"On Error resume Next"

... und es klappt!

Wenn dies so programmiertechnisch in Ordnung ist*, mach ich mich an den Vorschlag von Franz und dann bin ich wahrscheinlich auch bald fertig!

* Ich weiß, ich hab noch einen weiten Weg vor mir!

Viele Grüße nochmals
gromax


bahasu

Hi,

durch temporäres Deaktivieren des Ereignisses "Beim Anzeigen" läßt sich der Fehler vermutlich ohne "on error resume next" vermeiden.

In der Art:
Bei den Unterformularen im Ereignis "Beim Öffnen" einfügen:
  Me.OnCurrent = ""

Bei dem Hauptformular im Ereignis "Beim Öffnen" einfügen:
  Me!Name_des_Unterformulars_1.Form.OnCurrent = "[Event Procedure]"
  Me!Name_des_Unterformulars_2.Form.OnCurrent = "[Event Procedure]"

"Name_des_Unterformulars_1" und ".._2" sind an Deine Namen anzupassen.

Harald
Servus

gromax

Hallo Harald,

vielen Dank für Deine Unterstützung. Diese Vorgehensweise funktioniert bis auf die eingebauten Buttons zum Vor- und Zurückblättern der Datensätze.
Komme ich nämlich ans Ende der Datensätze, so kann kein neuer Datensatz angeführt werden. Trage ich "On Error resume Next" wieder ein, funktioniert auch dieses tadellos. Warum das so ist, kann ich nicht sagen, aber dazu meine Frage: Ist die Verwendung der Fehlerbehandlungsroutine "On Error..." problematisch? Oder kann ich diese bedenkenlos einsetzen?

Für eine Antwort bin ich dankbar.

Jetzt wollte ich noch einen Punkt klären, den ich mit den Code-Beispielen von MaggieMay (s.o.) zwischen zwei Unterformularen schon lösen konnte. Das funktioniert bestens.

Wie kann ich mit Doppelklick von einem Listenfeld mit aufgeführten Schülernamen zu deren Datensatz im Unterformular (Ufo1) schalten. Mit einem Makro komme ich auf den richtigen Schüler, aber eben nicht zu dessen richtigem Datensatz! Da sollte ein Datensatz des Schülers aufgerufen werden, der zwar mit dem beauftragten Gutachten, aber eben noch ohne Eingangsdatum des Gutachtens versehen ist. In meinem Formular wird immer ein Datensatz angezeigt, der bereits bearbeitet ist, so dass ich mit Hilfe der Buttons zum noch "offenen" Auftrag klicken muss. Erst jetzt kann der Auftrag abschließend bearbeitet und damit der Datensatz vervollständigt werden.

Näheres im beiliegenden Screenshot.

Vorab vielen Dank für die prima Hilfe innerhalb dieses Forums.

Viele Grüße
gromax

MaggieMay

#7
Hallo,
Zitat von: gromax am September 15, 2014, 22:39:58Komme ich nämlich ans Ende der Datensätze, so kann kein neuer Datensatz angeführt werden. Trage ich "On Error resume Next" wieder ein, funktioniert auch dieses tadellos. Warum das so ist, kann ich nicht sagen
mit "On Error Resume Next" werden Fehler ignoriert, sie treten zwar auf, aber du bekommst nichts davon mit. Das Ergebnis des ausgeführten Codes ist aber u.U. ungewiss.

Was das Blättern betrifft, so ist es halt so, dass Access feststellt, wenn du über das Ende heraus zu blättern versuchst bzw. vor den Anfang. Da dies nicht geht, wird ein Fehler erzeugt. Den kannst du abfangen, gezielt abfragen und darauf reagieren oder ihn auch ignorieren. Das kommt halt auf die Situation bzw. die programmiertechnischen Ansprüche an.
ZitatIst die Verwendung der Fehlerbehandlungsroutine "On Error..." problematisch?
Eine Fehlerbehandlung egal welcher Art sollte eigentlich jede Prozedur enthalten. Wenn du mit "..." Resume Next meinst, so sollte man das tatsächlich nur in Ausnahmefällen und im Bewusstsein aller damit verbundenen Risiken einsetzen.
ZitatWie kann ich mit Doppelklick von einem Listenfeld mit aufgeführten Schülernamen zu deren Datensatz im Unterformular (Ufo1) schalten.
Dazu musst du das Unterformular an eine entsprechende Abfrage binden. Wandele das Makro in VBA-Code um und zeig den mal her, dann sehen wir weiter.
Freundliche Grüße
MaggieMay

gromax

Hallo MaggieMay,

Du hast mich bzgl. der Fehlerbehandlungsroutinen sensibilisiert; ich muss mich da eingehender drum kümmern!

Das eingebettete Makro habe ich nicht in VBA-Code umwandeln können, aber über das Internet habe ich folgenden Code gefunden, der die analoge Funktion erfüllt.

Private Sub Liste56_DblClick(Cancel As Integer)
  Dim rs As Object
  Set rs = Me.Recordset.Clone
  rs.FindFirst "[SuS_PS] = " & Str(Nz(Me![Liste56], 0))
  If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub

Das Unterformular ist von SuS_FS (FS=Fremdschlüssel) nach SuS_PS (PS=Primärschlüssel) verknüpft; das Listenfeld [Liste56] ist ein Steuerelement des Hauptformulars und nimmt die Schülernamen auf, zu denen kein Gutachten (Feld [BEA_Gutachten]="") vorliegt und deren Termin der Beauftragung (Feld [BEA_Beauftragung]) liegt länger als 8 Wochen in der Vergangenheit!
In einer Abfrage habe ich ein Feld mit der Bezeichnung "Meldung:Wenn([BEA_Gutachten]>0;"";Wenn(Jetzt()>DatAdd("ww";8;[BEA_Beauftragung]);"X";Null))" generiert und lasse die angezeigten "X" filtern.

Ich hoffe, das kommt nachvollziehbar rüber?!

Danke vorab für Deine Unterstützung
gromax

MaggieMay

ZitatDas eingebettete Makro habe ich nicht in VBA-Code umwandeln können
Das geht über folgenden Umweg:
- eingebettetes Makro öffnen
- alles markieren (Strg+A)
- alles kopieren (Strg+C)
- schließen
- neues Makro öffnen
- alles einfügen (Strg+V)
- speichern, falls erforderlich
Anschließend steht in dem neu erstellten Makro die Funktion zur Konvertierung in VBA-Code zur Verfügung.

Es würde die Sache schon sehr vereinfachen, wenn man den "Originalcode" sehen und anpassen könnte.

Und bitte, benutze die Code-Tags, wenn du ihn zeigst.
Freundliche Grüße
MaggieMay

gromax

Hallo MaggieMay,

ich habe den Code generiert:

Function Makro3()
On Error GoTo Makro3_Err

  DoCmd.SearchForRecord , "", acFirst, "[SuS_PS] = " & Str(Nz(Screen.ActiveControl, 0))


Makro3_Exit:
  Exit Function

Makro3_Err:
  MsgBox Error$
  Resume Makro3_Exit

End Function

Hoffentlich hilft das weiter!?

Viele Grüße
gromax

gromax

Hallo MaggieMay,

man lernt halt ständig dazu - gut so!


Function Makro3()
On Error GoTo Makro3_Err

  DoCmd.SearchForRecord , "", acFirst, "[SuS_PS] = " & Str(Nz(Screen.ActiveControl, 0))


Makro3_Exit:
  Exit Function

Makro3_Err:
  MsgBox Error$
  Resume Makro3_Exit

End Function


Viele Grüße
gromax

MaggieMay

Hi,
ZitatDa (-> in Ufo1) sollte ein Datensatz des Schülers aufgerufen werden, der zwar mit dem beauftragten Gutachten, aber eben noch ohne Eingangsdatum des Gutachtens versehen ist.
dann sollte das aus dem HF heraus bspw. folgendermaßen funktionieren:Private Sub Liste56_DblClick(Cancel As Integer)
  Dim rs As Object
  Set rs = Me.Ufo1.Form.Recordset.Clone
  rs.FindFirst "[SuS_FS] = " & Me![Liste56] & " AND BEA_Gutachten Is Null"
  If Not rs.EOF Then Me.Ufo1.Form.Bookmark = rs.Bookmark
  Set rs = Nothing
End Sub


PS:
Der von dir "« am: September 16, 2014, 00:34:22 »" gezeigte Code war ja schon fast brauchbar, da wäre die Makroumwandlung gar nicht nötig gewesen.
Sorry, das war mir nicht klar.
Freundliche Grüße
MaggieMay

gromax

Hallo MaggieMay,

ich habe Deinen Code nun angepasst:


Private Sub Liste56_DblClick(Cancel As Integer)
  Dim rs As Object
  Set rs = Me.frm_Schueler_ufoBearbeitung03.Form.Recordset.Clone
  rs.FindFirst "[SuS_FS] = " & Me![Liste56] & " AND BEA_Gutachten Is Null"
  If Not rs.EOF Then Me.frm_Schueler_ufoBearbeitung03.Form.Bookmark = rs.Bookmark
  Set rs = Nothing
End Sub


jetzt zeigt das Ereignis Doppelklick in [Liste56] folgendes Verhalten:

Bei Doppelklick auf einen Schüler aus [Liste56] geht zuerst gar nichts. Rufe ich händisch im Listenfeld des HF eben diesen Schüler aus [Liste56] auf, so stellt das HF dessen Daten dar, ebenso die UFOe, erst jetzt funktioniert der anschließende Doppelklick und stellt den betreffenden Datensatz mit "BEA_Gutachten Is Null" wie gewünscht dar.
Kann man in den Code nicht einbauen, dass nach Doppelklick in [Liste56] zuerst der Schüler im Hauptformular (vermutlich mit [SuS_PS]) aufgerufen und im gleichen Ereignis der Datensatz mit "BEA_Gutachten Is Null" dargestellt wird? Das wäre perfekt!

Viele Grüße
gromax

gromax

Hallo MaggieMay,

jetzt bin ich es nochmals und erbitte Deine Zustimmung; ich habe mit dem Code vom 16. September und Deinem Code eine Synthese "gebastelt" - programmiert wäre einfach falsch - und habe jetzt folgende VBA-Anweisung:


Private Sub Liste56_DblClick(Cancel As Integer)
  Dim rs As Object
   Set rs = Me.Recordset.Clone
   rs.FindFirst "[SuS_PS] = " & Str(Nz(Me![Liste56], 0))
   If Not rs.EOF Then Me.Bookmark = rs.Bookmark
   Set rs = Nothing
 
  Set rs = Me.frm_Schueler_ufoBearbeitung03.Form.Recordset.Clone
    rs.FindFirst "[SuS_FS] = " & Me![Liste56] & " AND BEA_Gutachten Is Null"
  If Not rs.EOF Then Me.frm_Schueler_ufoBearbeitung03.Form.Bookmark = rs.Bookmark
  Set rs = Nothing
End Sub


Könntest Du mal drüber schauen; es scheint zu funktionieren?!

Vielen Dank vorab!
gromax