Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: KonradR am Februar 19, 2025, 17:43:50

Titel: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 19, 2025, 17:43:50
Hallo liebe Accessfreunde,

ich möchte ein Unterformularsteuerelement von seinem Fremdschlüsselfeld an das Primärschlüsselfeld des UFO's mit den Daten aus der übergeordneten Tabelle verknüpfen. Mit dem mir bekannten Wissen über z.B [sfrmBlock].Form![BlockID] funktioniert das leider nicht. Gibt es da auch eine Möglichkeit, auf eine bestimmte Zeile, also die 1., 2. oder 3. zu verknüpfen? Schon im Voraus vielen Dank.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: MzKlMu am Februar 19, 2025, 18:03:18
Hallo,
warum nutzt Du nicht die Dateneigenschaften "Verknüpfen von/nach". Da braucht es doch keinen Code.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 19, 2025, 18:23:39
Hallo Klaus,

Zitat von: MzKlMu am Februar 19, 2025, 18:03:18warum nutzt Du nicht die Dateneigenschaften "Verknüpfen von/nach"
Die will ich ja nutzen. [sfrmBlock].Form![BlockID] ist ja der Teil mit "Verknüpfen nach". Allerdings will ich in eine bestimmte Zeile, verknüpfen.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: MzKlMu am Februar 19, 2025, 19:00:16
Hallo,
das geht nicht.
Zitat[sfrmBlock].Form![BlockID]
Was soll das sein ?
Zum Verknüpfen brauchst Du einen Wert. Wie stellst Du sicher, dass der gewünschte Wert in der 3.Zeile steht. Oder, anders gefragt, warum die 3.Zeile ?
Wenn dieser Wert einmalig ist, hast Du nur einen Datensatz im Ufo.
Kannst Du das Vorhaben mal näher erläutern?
Was wird der Sinn des Vorhabens ?
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 19, 2025, 19:21:58
Hallo Konrad,

bei den Eigenschaften Verknüpfen kommen entweder direkt die Feldnamen oder beteiligten Steuerelementnamen hinein. Eine bestimme Zeile kannst du aber so nicht auswählen, daß ist "Excel-Denke", Datenbanken verarbeiten Datensätze, auf die man per Keys zugreift.

Gruß
Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 19, 2025, 19:23:40
Hallo Klaus,

Zitat von: MzKlMu am Februar 19, 2025, 19:00:16Was soll das sein ?
Das ist der Inhalt von "Verknüpfen nach". Dabei wird auf das Unterformularsteuerelement "sfrmBlock" mit der "BlockID" verknüpft.

Zitat von: MzKlMu am Februar 19, 2025, 19:00:16Wie stellst Du sicher, dass der gewünschte Wert in der 3.Zeile steht.
Weil es um Tage einer Woche geht und der erste Tag immer in der ersten und der zweite Tag immer in der zweiten Zeile usw. steht.

Zitat von: MzKlMu am Februar 19, 2025, 19:00:16Kannst Du das Vorhaben mal näher erläutern?
Sehr gerne. Ich habe ein Formular mit 10 Unterformularen und einem Kombinationsfeld erstellt. Das Kombinationsfeld bestimmt die in den darauffolgenden 3 UFOs angezeigten Daten. Das habe ich mit "Verknüpfen von" und "Verknüpfen nach" erledigt. Die darauffolgenden Ufos zeigen den BLOCK die darin enthaltenen WOCHEN und die wiederum darin enthaltenen TAGE an. Jetzt möchte ich in den weiteren 7 UFOS die Mahlzeiten für jeden Tag einer  übersichtlich nebeneinander darstellen. Daher sind die Mahlzeiten für den ersten Tag einer Woche immer im UFO ganz links und für den zweiten Tag rechts daneben usw. angezeigt. Hier noch ein Bild, von der Formularoberfläche:
Screenshot 2025-02-19 191648.png


Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 19, 2025, 19:25:35
Hallo Knobbi38,

Zitat von: knobbi38 am Februar 19, 2025, 19:21:58Datenbanken verarbeiten Datensätze, auf die man per Keys zugreift.
Danke für deine Antwort. Dann komme ich um VBA also nicht herum. Ich dachte, erst es geht ohne.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: MzKlMu am Februar 19, 2025, 19:31:42
Hallo,
Du kannst doch die 7 Ufos für die Tage direkt auf den gewünschten Tag filtern.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 19, 2025, 20:56:18
Hallo Klaus,

Zitat von: MzKlMu am Februar 19, 2025, 19:31:42Du kannst doch die 7 Ufos für die Tage direkt auf den gewünschten Tag filtern.
Vielen Dank dafür. Gleichzeitig will ich die Mahlzeiten für den Tag in dem betreffenden UFO nicht nur anzeigen, sondern auch eingeben. Dann darf ich bei der Eingabe sicher auslesen dürfen, in welchem Unterformularsteuerelement ich mich gerade bewege und anhand dessen den Fremdschlüssel für den entsprechenden Tag setzten. Anschließend kann ich filtern. Wahrscheinlich mit der Form.Filter-Eigenschaft?
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 20, 2025, 12:40:11
Hallo Konrad,

es gibt mehrere Möglichkeiten, daß umzusetzen. Sicherlich könnte man 7 UFs erstellen und die jeweils anders konfigurieren, sinnvoller wäre es aber, 1 UF x-mal zu verwenden. Beim Öffnen des HF werden dann alle UF entsprechend initialisiert. Die Verknüpfung ist ja für alle gleich, aber die Datenherkunft kann über den Wochentag als Kriterium angepaßt werden. Alternativ kann auch ein entsprechender Filterausdruck pro UF verwendet werden. Bei der Initialisierung kannst du dann auch gleich den Default-Wert für den Fremdschlüssel zuweisen, so dass neue DS auch gleich richtig zugeordnet werden.

Gruß
Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 20, 2025, 19:14:56
Hallo knobbi38,

Zitat von: knobbi38 am Februar 20, 2025, 12:40:111 UF x-mal zu verwenden. Beim Öffnen des HF werden dann alle UF entsprechend initialisiert.
Das hatte ich auch ursprünglich gemeint, aber leider missverständlich geschrieben.

Zitat von: knobbi38 am Februar 20, 2025, 12:40:11Alternativ kann auch ein entsprechender Filterausdruck pro UF verwendet werden. Bei der Initialisierung kannst du dann auch gleich den Default-Wert für den Fremdschlüssel zuweisen, so dass neue DS auch gleich richtig zugeordnet werden.
Das habe ich schon recherschiert. Das dürfte ich umgesetzt bekommen.

Nur ist mir noch unklar, wie ich die entsprechende, gefilterte Instanz des Unterformulars nun dem gewünschten Unterformularsteuerelement zuweise. Wenn ich es so probiere, gibt es bei mir die Fehlermeldung "Typen unverträglich":
Dim MahlzeitMontag As Form_frm01Wochenplanung_Unter_Mahlzeit

Private Sub Form_Load()
    Set MahlzeitMontag = New Form_frm01Wochenplanung_Unter_Mahlzeit
    MahlzeitMontag.Visible = True
    Me.sfrmMahlzeitTag1.SourceObject = MahlzeitMontag
End Sub

Hast du da noch eine Idee, wie ich das umgesetzt bekomme?
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 21, 2025, 11:24:03
Zitat... wie ich die entsprechende, gefilterte Instanz des Unterformulars nun dem gewünschten Unterformularsteuerelement zuweise.
Das wäre ja so auch nicht ganz i.O.

Die Vorgehensweise ist in etwa so, wenn ich mal von der Filtermethode ausgehe:

Hier der Air-Code aus dem HF:
---
' Im HF Form Load Event:
  ' Bind meals per Weekday subforms
  If HasRecords(Me.Recordset) then
    LoadSubform Me.subMonday, vbMonday
    LoadSubform Me.subTuesday, vbTuesday
    ...
  End If
---

' Im HF Codemodul:
Private Sub LoadSubform( _
    ByRef ctl As Access.subForm, _
    ByVal DayOfWeek As VbDayOfWeek)

  Const FLT_EXPR As String = "[Wochentag]={0}"
  Const SUB_FORM_NAME as String = "sfrmMahlzeitenProWochentag"

  Dim strFilter As String

  ' Build filter expression
  strFilter = Replace(FLT_EXPR, "{0}", CStr(DayOfWeek))

  ' Load subform and apply filter
  ctl.SourceObject = SUB_FORM_NAME
  ctl.Form.Filter = strFilter
  ctl.Form.FilterOn = CBool(Len(strFilter) > 0)
End Sub
Feldnamen und Formularnamen mußt du natürlich noch an deinen Gegebenheiten anpassen und die Funktion HasRecords() selber noch kurz ausprogrammieren.

Gruß
Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 21, 2025, 16:11:54
Hallo Knobbi38,

danke für deine Antwort. Ich habe deinen Codevorschlag so übernommen und für "Wochentag" meinen Feldnamen für den Fremdschlüssel zur Tabelle mit den Wochen mit "MahlztagIDRef" eingetragen.
Wenn ich es so drin stehen habe, dann kommt die Fehlermeldung bei "Sub oder Function nicht definiert" und "hasrecords" wird markiert. "Hasrecords" scheint der Compiler nicht zu kennen. Wenn ich alles ohne "If" und "hasrecords" durchlaufen lasse, dann gibt es auch keine Fehlermeldung, aber die Formular sind trotzdem leer. Das Kombinationsfeld am Anfang habe ich mal als Standardwert mit dem ersten Eintrag aus der Datensatzherkunft versehen
 
Private Sub Form_Load()
        Me.cboErnaehrungsplan.DefaultValue = 1
        LoadSubform Me.sfrmMahlzeitTag1, vbMonday
        LoadSubform Me.sfrmMahlzeitTag2, vbTuesday
        LoadSubform Me.sfrmMahlzeitTag3, vbWednesday
        LoadSubform Me.sfrmMahlzeitTag4, vbThursday
        LoadSubform Me.sfrmMahlzeitTag5, vbFriday
        LoadSubform Me.sfrmMahlzeitTag6, vbSaturday
        LoadSubform Me.sfrmMahlzeitTag7, vbSunday
End Sub

Private Sub LoadSubform(ByRef ctl As Access.SubForm, ByVal DayOfWeek As VbDayOfWeek)

  Const FLT_EXPR As String = "[MahlztagIDRef]={0}"
  Const SUB_FORM_NAME As String = "sfrmMahlzeitenProWochentag"

  Dim strFilter As String

  ' Build filter expression
  strFilter = Replace(FLT_EXPR, "{0}", CStr(DayOfWeek))

  ' Load subform and apply filter
  ctl.SourceObject = "frm01Wochenplanung_Unter_Mahlzeit"
  ctl.Form.Filter = strFilter
  ctl.Form.FilterOn = CBool(Len(strFilter) > 0)
End Sub

Hast du noch eine Idee, woran es liegen kann, dass alles leer bleibt?
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 22, 2025, 09:59:44
Hallo liebe Accessfreunde,

ich habe es jetzt mal mit meinem Wissen probiert. Wissentlich, dass der folgende Code mit einer Schleife abgearbeitet werden könnte, habe ich es erst mal ohne gemacht, um mich auf die Funktionalität zu konzentrieren.
Für den Code ist es wichtig, dass die Formulare "Form_frm101Wochenplanung_Haupt" und "frm104Wochenplanung_UnterTag" geladen sind, da ich auf das RecordsetClone-Element des Formulars "frm104Wochenplanung_UnterTag" zugreife. Im Form_Load Ereigniss von Formular "frm101Wochenplanung_Haupt" funktioniert der Code auch super. Der Code soll aber auch im Form_Current Ereigniss von Unterformular "frm103Wochenplanung_UnterWoche" funktionieren. Nun ist es leider so, dass das 3. Unterformular gar nicht geladen, also
SysCmd(acSysCmdGetObjectState, acForm, "frm104Wochenplanung_UnterTag") = 0 ist. Wie kann das sein? Ich kann das Formular doch sehen. Könnt ihr mir da eine Hilfestellung geben, wie ich das Formular im Current_Ereignis von Formular "frm103Wochenplanung_UnterWoche" geladen bekommeJ? Anbei mein Code:
Private Sub Form_Current()
'    Debug.Print "Form_Current: " & Me.Name
    [Form_frm101Wochenplanung_Haupt].Form![sfrmTag].Requery
   
    Dim rstRSC As DAO.Recordset
    Dim lngTagRef1 As Long
    Dim lngTagRef2 As Long
    Dim lngTagRef3 As Long
    Dim lngTagRef4 As Long
    Dim lngTagRef5 As Long
    Dim lngTagRef6 As Long
    Dim lngTagRef7 As Long

    If SysCmd(acSysCmdGetObjectState, acForm, "frm101Wochenplanung_Haupt") > 0 Then 'And SysCmd(acSysCmdGetObjectState, acForm, "frm104Wochenplanung_UnterTag") > 0 Then
        Debug.Print Form_frm101Wochenplanung_Haupt.Name & ": " & SysCmd(acSysCmdGetObjectState, acForm, "frm101Wochenplanung_Haupt")
        Debug.Print Form_frm104Wochenplanung_UnterTag.Name & ": " & SysCmd(acSysCmdGetObjectState, acForm, "frm104Wochenplanung_UnterTag")
        Set rstRSC = Form_frm101Wochenplanung_Haupt.sfrmTag.Form.RecordsetClone
            If Not rstRSC.RecordCount = 0 Then
               lngTagRef1 = rstRSC.Fields("TagID").Value
            End If
            rstRSC.MoveNext
            If Not rstRSC.EOF Then
               lngTagRef2 = rstRSC.Fields("TagID").Value
            End If
            rstRSC.MoveNext
            If Not rstRSC.EOF Then
                lngTagRef3 = rstRSC.Fields("TagID").Value
            End If
            rstRSC.MoveNext
            If Not rstRSC.EOF Then
                lngTagRef4 = rstRSC.Fields("TagID").Value
            End If
            rstRSC.MoveNext
            If Not rstRSC.EOF Then
                lngTagRef5 = rstRSC.Fields("TagID").Value
            End If
            rstRSC.MoveNext
            If Not rstRSC.EOF Then
                lngTagRef6 = rstRSC.Fields("TagID").Value
            End If
            rstRSC.MoveNext
            If Not rstRSC.EOF Then
                lngTagRef7 = rstRSC.Fields("TagID").Value
            End If
        rstRSC.Close
    Else
        Debug.Print Form_frm101Wochenplanung_Haupt.Name & ": " & SysCmd(acSysCmdGetObjectState, acForm, "frm101Wochenplanung_Haupt")
        Debug.Print Form_frm104Wochenplanung_UnterTag.Name & ": " & SysCmd(acSysCmdGetObjectState, acForm, "frm104Wochenplanung_UnterTag")
    End If
   
    With Form_frm101Wochenplanung_Haupt
        .sfrmMahlzeitTag1.SourceObject = "frm105Wochenplanung_UnterMahlzeit01"
        .sfrmMahlzeitTag2.SourceObject = "frm106Wochenplanung_UnterMahlzeit02"
        .sfrmMahlzeitTag3.SourceObject = "frm107Wochenplanung_UnterMahlzeit03"
        .sfrmMahlzeitTag4.SourceObject = "frm108Wochenplanung_UnterMahlzeit04"
        .sfrmMahlzeitTag5.SourceObject = "frm109Wochenplanung_UnterMahlzeit05"
        .sfrmMahlzeitTag6.SourceObject = "frm110Wochenplanung_UnterMahlzeit06"
        .sfrmMahlzeitTag7.SourceObject = "frm111Wochenplanung_UnterMahlzeit07"
    End With

    Form_frm105Wochenplanung_UnterMahlzeit01.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef1
    Form_frm106Wochenplanung_UnterMahlzeit02.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef2
    Form_frm107Wochenplanung_UnterMahlzeit03.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef3
    Form_frm108Wochenplanung_UnterMahlzeit04.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef4
    Form_frm109Wochenplanung_UnterMahlzeit05.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef5
    Form_frm110Wochenplanung_UnterMahlzeit06.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef6
    Form_frm111Wochenplanung_UnterMahlzeit07.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef7
   
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag1].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag2].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag3].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag4].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag5].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag6].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag7].Requery

End Sub
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 22, 2025, 12:46:11
Hallo Konrad,

du warst schon auf dem richtige Weg, bist dann aber nochmal abgebogen.  ;)

Wenn du auf meine Hilfestellung nicht eingehen möchtest, solltest du das klar kommunizieren und dann kannst du dein eigenes Ding weiter machen. Ich habe nicht vor, alles für die Mülltone zu schreiben. Mein Vorschlag beinhaltet die Wiederverwendung von einem UF und nicht von 7 verschiedenen UFs. Das ist eine ganz andere Baustelle.

Hier nochmal ein paar Anmerkungen bei einem UF:

Dein Trugschluss war, daß man ein geladenes UF so nicht erkennen kann, weder mit SysCmd() noch in der Forms-Auflistung oder per AllForms() Auflistung. Ob ein Formular als UF geladen ist, kann man nur erfahren, indem man bei allen SubForm-Controls die SourceObject Eigenschaft ausliest.

Zurück zum ursprünglichen Code von mir. Der setzt voraus, daß in dem UF bereits eine Datenherkunft (Recordsource) eingetragen ist:
.Recordsource = "SELECT * FROM qryMahlzeitTagRezept01"Sie ist für alle gleich und muß deshalb nicht separat zugewiesen werden, sondern kann fest im Entwurf eingestellt werden. Die Selektion mit der "Where-Bedingung" wird in diesem Beispiel über Zuweisung des Filters erreicht! Das ist auch der Grund, warum bei dir nichts angezeigt worden ist - ohne Datenherkunft?  ::)

Das die Funktion HasRecords() nicht existiert, hatte ich übrigens geschrieben. Das war als deine Hausaufgabe gedacht, ich kann ja nicht alles machen.  ;)

Noch ein paar Hinweise:

Gruß
Knobbi38

Nachtrag:
Das HF Current Ereignis kannst du für eine Initialisierung dieser Art nicht verwenden, das gehört ins Load Ereignis! Das hatte ich aber auch schon geschrieben.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 22, 2025, 15:42:38
Hallo Knobbi38,

author=knobbi38 link=msg=166440 date=1740224771]Wenn du auf meine Hilfestellung nicht eingehen möchtest, solltest du das klar kommunizieren und dann kannst du dein eigenes Ding weiter machen. Ich habe nicht vor, alles für die Mülltone zu schreiben. Mein Vorschlag beinhaltet die Wiederverwendung von einem UF und nicht von 7 verschiedenen UFs. Das ist eine ganz andere Baustelle.[/quote]
Danke für deine Antwort. Ich bin dir sehr dankbar für deine Hilfestellung. Allerdings hatte ich in meinen Recherschen nur Lösungen gefunden, wo für jedes UF-Steuerelement ein separates Formular verwendet wird. Also Lösungen, welche die Formulare per VBA erzeugen und wieder löschen, wenn das Hauptformular geschlossen wird. Das erschien mir zu kompliziert, aber ich wollte den Weg mit mehreren Formularen auch ausprobieren, auch, weil ich den Veracht hatte, dass es mit einem Formular und mehreren Instanzen möglicherweise nicht geht.

Zitat von: knobbi38 am Februar 22, 2025, 12:46:11Deine Trugschluss war, daß man ein geladenes UF so nicht erkennen kann, weder mit SysCmd() noch in der Forms-Auflistung oder per AllForms() Auflistung. Ob ein Formular als UF geladen ist, kann man nur erfahren, indem man bei allen SubForm-Controls die SourceObject Eigenschaft ausliest.

Zitat von: knobbi38 am Februar 22, 2025, 12:46:11Sie ist für alle gleich und muß deshalb nicht separat zugewiesen werden, sondern kann fest im Entwurf eingestellt werden. Die Selektion mit der "Where-Bedingung" wird in diesem Beispiel über Zuweisung des Filters erreicht! Das ist auch der Grund, warum bei dir nichts angezeigt worden ist - ohne Datenherkunft?
Das hatte ich tatsächlich nicht bedacht. Jetzt habe ich dem Formular im Eigenschaftsfenster im Feld "Datensatzquelle", diesen Ausdruck hinterlegt:
SELECT * FROM qryMahlzeitTagRezept01; Allerdings wird weiterhin in den Formularen nichts angezeigt.

Zitat von: knobbi38 am Februar 22, 2025, 12:46:11Das die Funktion HasRecords() nicht existiert, hatte ich übrigens geschrieben. Das war als deine Hausaufgabe gedacht, ich kann ja nicht alles machen.
Das hatte ich überlesen. Danke dir noch mal für den Hinweis.

Zitat von: knobbi38 am Februar 22, 2025, 12:46:11Solche Ausdrücke wie "Form_frm105Wochenplanung_UnterMahlzeit01.RecordSource" kannst du übrigens gleich vergessen, ein UF kann so nicht angesprochen werden!
Kann sein, aber die Datensatzquelle konnte ich mit dieser Variante tatsächlich dem Formular zuweisen. Es hat wirklich funktioniert.

Zitat von: knobbi38 am Februar 22, 2025, 12:46:11wenn man einem Formular eine neue Recordsource zuweist, kann man sich ein Requery schenken, das ist doppelt gemoppelt.
Danke, das macht dann absolut keinen Sinn. Das hatte ich vorher so nicht gesehen.

Anbei noch mal mein korrigierter Code:
Private Sub Form_Load()
        Me.cboErnaehrungsplan.DefaultValue = 1
        LoadSubform Me.sfrmMahlzeitTag1, vbMonday
        LoadSubform Me.sfrmMahlzeitTag2, vbTuesday
        LoadSubform Me.sfrmMahlzeitTag3, vbWednesday
        LoadSubform Me.sfrmMahlzeitTag4, vbThursday
        LoadSubform Me.sfrmMahlzeitTag5, vbFriday
        LoadSubform Me.sfrmMahlzeitTag6, vbSaturday
'        LoadSubform Me.sfrmMahlzeitTag7, vbSunday
End Sub

Private Sub LoadSubform(ByRef ctl As Access.SubForm, ByVal DayOfWeek As VbDayOfWeek)

  Const FLT_EXPR As String = "[MahlztagIDRef]={0}"
  Const SUB_FORM_NAME As String = "frm105Wochenplanung_UnterMahlzeit01"

  Dim strFilter As String

  ' Build filter expression
  strFilter = Replace(FLT_EXPR, "{0}", CStr(DayOfWeek))

  ' Load subform and apply filter
  ctl.SourceObject = SUB_FORM_NAME
  ctl.Form.Filter = strFilter
  ctl.Form.FilterOn = CBool(Len(strFilter) > 0)
End Sub

Zitat von: knobbi38 am Februar 22, 2025, 12:46:11Das HF Current Ereignis kannst du für eine Initialisierung dieser Art nicht verwenden, das gehört ins Load Ereignis! Das hatte ich aber auch schon geschrieben.
Was ist aber, wenn sich im vorgeschalteten Formular durch das Current-Ereigniss die angezeigten Daten ändern, dann bleiben die Daten in den 7 Unterformularen gleich. Ich hatte beabsichtig, dass sich das mitändert.

Zitat von: knobbi38 am Februar 22, 2025, 12:46:11Ob ein Formular als UF geladen ist, kann man nur erfahren, indem man bei allen SubForm-Controls die SourceObject Eigenschaft ausliest.
Und wenn da der Formularname ausgelesen wird, ist es geladen und wenn ein Leerstring herauskommt ist es nicht geladen?
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 22, 2025, 15:46:05
Nachtrag:
Zitat.sfrmMahlzeitTag1.SourceObject = "frm105Wochenplanung_UnterMahlzeit01"

Du solltes als Präfix für dein SubForm-Steuerelement nicht den Präfix für ein Unterformular verwenden - das erschwert die Lesbarkeit enorm.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 22, 2025, 16:04:10
Hallo Konrad,

Zitat... also Lösungen, welche die Formulare per VBA erzeugen und wieder löschen, wenn das Hauptformular geschlossen wird. Das erschien mir zu kompliziert,
"Formulare per VBA erzeugen und wieder löschen"? Wo steht denn so ein Blödsinn? Selbstmodifizierende Programme sollte man erst gar nicht in Erwägung ziehen und sind immer äußerst verdächtig. 

Es ist deutlich einfacher, ein einzelnes Unterformular zu verwenden, als immer sieben Unterformulare ändern zu müssen, insbesondere dann, wenn sowieso das Gleiche dargestellt werden soll, nur mit anderen Parametern.

Wenn du ohne Filter bei dieser Query "SELECT * FROM qryMahlzeitTagRezept01; " nichts angezeigt bekommst, stimmen die Verknüpfungen (LinkMasterField, LinkChildField) nicht oder deine Query ist schlichtweg falsch. Die Query sollte ohne Filter alle Mahlzeiten einer ID für die ganze Woche anzeigen.

ZitatLoadSubform Me.sfrmMahlzeitTag1, vbMonday
siehe #16

ZitatMe.cboErnaehrungsplan.DefaultValue = 1
Ich dachte, die Kombobox gehört auf das UF und dann gehört die Initialisierung dafür in die Prozedur LoadSubForm. Der Wert kann auch nicht "1" sein, sondern müßte DayOfWeek sein, oder?

Gruß
Knobbi38
 
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 22, 2025, 16:09:08
Hallo Knobbi38,

Zitat von: knobbi38 am Februar 22, 2025, 15:46:05Du solltes als Präfix für dein SubForm-Steuerelement nicht den Präfix für ein Unterformular verwenden - das erschwert die Lesbarkeit enorm.
Präfix sfrm ist für mich immer das Unterformularsteuerelement und frm ist für mich immer das Formular. Für sich alleine ist ja jedes Formular ein Formular. Zum Unterformular wird es für mich durch das Suffix "_Unter".
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 22, 2025, 16:18:25
Zitat von: KonradR am Februar 22, 2025, 15:42:38Was ist aber, wenn sich im vorgeschalteten Formular durch das Current-Ereigniss die angezeigten Daten ändern, dann bleiben die Daten in den 7 Unterformularen gleich. Ich hatte beabsichtig, dass sich das mitändert.
Natürlich muß sich das mit ändern. Da wird aber mit Hilfe der Verknüpfungsfelder des SubForm-Steuerelements umgesetzt.
ZitatUnd wenn da der Formularname ausgelesen wird, ist es geladen und wenn ein Leerstring herauskommt ist es nicht geladen?
Jein, denn das ist ja nur die Information für ein SubForm-Steuerelement. Es müssen schon alle SubForm-Steuerelemente durchlaufen und geprüft werden, bis das Formular gefunden wird.

Gruß
Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 22, 2025, 16:28:38
Zitat von: KonradR am Februar 22, 2025, 16:09:08Präfix sfrm ist für mich immer das Unterformularsteuerelement
Das kann man natürlich so machen, aber es entspricht dann keiner gängigen Namenskonvention mehr und ist verwirrend, wenn andere das gleiche oder ein ähnliches Präfix für etwas anderes verwenden.  Präfixe sind im Allgemeinen nicht notwendig, aber wenn sie verwendet werden, sollten sie die Lesbarkeit verbessern.

Siehe mal hier unter "Tags for Control Objects":
http://access.mvps.org/access/general/gen0012.htm (http://access.mvps.org/access/general/gen0012.htm)

Gruß
Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 22, 2025, 16:32:15
Hallo Knobbi,

Zitat von: knobbi38 am Februar 22, 2025, 16:04:10"Formulare per VBA erzeugen und wieder löschen"? Wo steht denn so ein Blödsinn?
Hier: https://access-im-unternehmen.de/Mehrere_Datensaetze_pro_Spalte_in_Formularen/

Zitat von: knobbi38 am Februar 22, 2025, 16:04:10Wenn du ohne Filter bei dieser Query "SELECT * FROM qryMahlzeitTagRezept01; " nichts angezeigt bekommst, stimmen die Verknüpfungen (LinkMasterField, LinkChildField) nicht oder deine Query ist schlichtweg falsch. Die Query sollte ohne Filter alle Mahlzeiten einer ID für die ganze Woche anzeigen.
Ich habe alle Filter rausgenommen, die Verknüpfungen ergänzt und die Abfrage geprüft. Parallel habe ich das selbe Unterformular in einem gleichen Unterformular verwendet und auf die herkömmliche Weise mit Datensatzquellenangabe der Abfrage und der Verknüpfungsfelder eingebunden. Das funktioniert tadellos

Zitat von: knobbi38 am Februar 22, 2025, 16:04:10Ich dachte, die Kombobox gehört auf das UF und dann gehört die Initialisierung dafür in die Prozedur LoadSubForm. Der Wert kann auch nicht "1" sein, sondern müßte DayOfWeek sein, oder?
Nein, hier geht es um etwas komplett anderes. Der Inhalt vom Kombinationsfeld ist der Ernährungsplan, der dann festlegt, was in den folgenden Wochen genau passiert. Jeder Ernährungsplan hat ein anderes Ziel. Den wähle ich am Anfang aus. Wenn ich nichts auswähle, ist das Feld leer und ich muss es doch auswählen. Dann setze ich lieber einen Standardwert und erspare mir so immer wieder das neue Auswählen des entsprechenden Eintrags.



Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 22, 2025, 16:42:44
Zitat von: knobbi38 am Februar 22, 2025, 16:18:25Es müssen schon alle SubForm-Steuerelemente durchlaufen und geprüft werden, bis das Formular gefunden wird.
Also wenn die ControlSource Eigenschaft aller Unterformulare geprüft und der Name des Unterformulars nicht gefunden wurde, ist das Unterformular nicht geöffnet. Ok, Danke.

Zitat von: knobbi38 am Februar 22, 2025, 16:28:38Siehe mal hier unter "Tags for Control Objects":
http://access.mvps.org/access/general/gen0012.htm
Danke auch hier. Allerdings ist das Unterformularsteuerelement nicht extra benannt und hier gibt es nur "ctl" als mögliche Auswahl für Control als Representant für ein Steuerelement. Das ist sehr allgemein, wie ich finde. "sfrmctl" wäre da treffender, aber das ist leider nicht definiert.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 22, 2025, 16:53:56
Hallo Konrad,

bezügl. deines Links: dort werden mitnichten SubForm-Controls und Formulare dynamisch zur Laufzeit angelegt, sondern es wird eine Hilfsprozedur verwendet, die Entwicklung etwas zu vereinfachen. Das sind quasi selbst geschriebene Tools und ist somit auch vollkommen legitim. Hätte mich auch gewundert, wenn André Minhorst so etwas machen würde. Die Formulare werden übrigens dort auch mit dem Präfix "sfm" angelegt. Leider werden zur Vereinfachung die SubForm-Steuerelemte mit den gleichen Präfixen versehen, um diese dann besser in einer Schleife ansprechen zu können - hätte man auch anders machen können, aber das ist eben die "künstlerische" Freiheit des Autors.

Knobbi38

Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 22, 2025, 16:57:14
Zitat von: KonradR am Februar 22, 2025, 16:42:44Danke auch hier. Allerdings ist das Unterformularsteuerelement nicht extra benannt und hier gibt es nur "ctl" als mögliche Auswahl für Control als Representant für ein Steuerelement.
Das steht doch ganz eindeutig:

  "Subform/report    sub    subContact"

in der Tabelle.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 22, 2025, 17:02:57
Hallo Konrad,

ich kenne dein Datenmodell nicht, deshalb kann ich leider dir bezüglich deiner Abfragen oder den Verknüpfungen der UFs nicht helfen, aber dass bekommst du sicherlich hin. Wenn du jedoch in den Unterformularen Datensätze anlegen möchtest und dafür Default-Werte benötigt werden, würde so etwas in die Sub LoadSubForm() gehören.

Gruß
Knobbi38
 
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 22, 2025, 20:05:41
Zitat von: knobbi38 am Februar 22, 2025, 16:57:14"Subform/report 
Danke dir. Das kann ich ja dann noch umschreiben.

Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 22, 2025, 20:07:03
Zitat von: knobbi38 am Februar 22, 2025, 17:02:57Wenn du jedoch in den Unterformularen Datensätze anlegen möchtest und dafür Default-Werte benötigt werden, würde so etwas in die Sub LoadSubForm() gehören.
Danke für den Tip. Das kommt als nächste Herausforderung.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 23, 2025, 09:49:02
Hallo Knobbi38,

ich habe mir deinen Code noch mal angeschaut und ein paar Fragen, vielleicht kannst du mir da noch mal weiterhelfen?

Warum deklarierst du die Variable ctl für ein Unterformularsteuerelement mit ByRef bzw. was passiert, wenn ich es einfach weglasse oder mit ByVal ersetzte?

Mit "DayOfWeek" hast du eine Variable vom Typ VbDayOfWeek erzeugt, der über eine Zahl von 0 bis 7 einen Wochentag angibt. Mir ist nicht klar, warum in der Replace()-Funktion die Zeichenkette (String) des vorher gesetzten Filterstrings mit "{0}" ersetzt und der zu ersetzende Typ anhand des vorher in einen String umgewandelten Wochentags gesucht wurde. Was ist "{0}" eigentlich? Diesen Ausdruck kenne ich nicht.
                                                                                       
Mit dem Ausdruck "[MahlztagIDRef]={0}" kann ich leider auch nichts anfangen, weil ich mit geschweiften Klammern in VBA noch nicht gearbeitet habe. Was machen die geschweiften Klammern und warum steht darin 0?
                                                                                       
Außerdem stellt sich mir bei deinem Code die Frage nach der Formularinstanz. Wenn ich deine "Private Sub LoadSubform" 7x, also für jeden Wochentag durchlaufe, bezieht sich der Code 7x auf das selbe Formular. Das heißt, ich zeige, Stand deinem Code, in jedem Unterformularsteuerelement hintereinander eine Filterung, der Inhalte beginnend mit Montag und endend mit Sonntag. Dann habe ich am Ende, wenn alles funktioniert, den Filter für das Formular für Sonntag gesetzt und sehe in allen Unterformularsteuerlementen das Formular mit dem Filter für Sonntag, weil sich alle Unterformularsteuerelement, wie oben erwähnt auf das selbe Unterformular beziehen. Wie siehst du das?
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 23, 2025, 13:10:22
Hallo Konrad,

ZitatWarum deklarierst du die Variable ctl für ein Unterformularsteuerelement mit ByRef bzw. was passiert, wenn ich es einfach weglasse oder mit ByVal ersetzte?
"ByRef" und "ByVal" sind für Objekte fast identisch, beide übergeben eine Referenz auf das Objekt ctl. Der Unterschied bei Objekten ist, dass mit "ByRef" direkt die Referenz auf das Objekt übergeben wird, mit "ByVal" wird eine Kopie der Referenz erzeugt und dann als Argument übergeben. Mit ByRef könnte man also in der Funktion die Referenz selber ändern, mit Byval würde man nur die Kopie verändern, das Original bliebe erhalten. Dieses Verhalten ist wichtig, wenn man innerhalb der Funktion das übergebene Objekt durch ein anderes ersetzen möchte - spielt in diesem Fall also keine Rolle. Hier wird der Vorteil genutzt, daß die Übergabe mit ByRef beim Aufruf performanter ist. 

ZitatMit "DayOfWeek" hast du eine Variable vom Typ VbDayOfWeek erzeugt, der über eine Zahl von 0 bis 7 einen Wochentag angibt. Mir ist nicht klar, warum in der Replace()-Funktion die Zeichenkette (String) des vorher gesetzten Filterstrings mit "{0}" ersetzt und der zu ersetzende Typ anhand des vorher in einen String umgewandelten Wochentags gesucht wurde. Was ist "{0}" eigentlich?
"{0}" ist ein von mir definierter Platzhalter (welcher im String nicht vorkommen sollte) und dient dazu in einem String an einer bestimmten Stelle einen anderen String einzufügen. Das erspart mir mit dem &-Operator den String aus den Teilstrings zusammenzusetzen und ist deutlich übersichtlicher und einfacher. Für das Ersetzen wird die Funktion Replace() verwendet. Weil Replace() einen String durch einen anderen ersetzt, wird mit CStr(vbMonday) der numerische Wert explizit in einen String konvertiert. Das hätte ich auch weglassen können, aber dann würde VBA eine implizite Konvertierung vornehmen und das möchte ich damit vermeiden.
                                                                                     
ZitatMit dem Ausdruck "[MahlztagIDRef]={0}" kann ich leider auch nichts anfangen, weil ich mit geschweiften Klammern in VBA noch nicht gearbeitet habe. Was machen die geschweiften Klammern und warum steht darin 0?
Wofür der String "{0}" steht, habe ich oben beschrieben, die "0" bedeutet einfach nur der 1. Platzhalter. Wenn man mehrere Platzhalter braucht, werden diese einfach durchnummeriert. Der nächste wäre dann "{1}".
                                                                                       
ZitatAußerdem stellt sich mir bei deinem Code die Frage nach der Formularinstanz. Wenn ich deine "Private Sub LoadSubform" 7x, also für jeden Wochentag durchlaufe, bezieht sich der Code 7x auf das selbe Formular.
Nein. LoadSubForm() bezieht sich 7 mal auf das gleiche Formular, nicht dasselbe! Es werden also 7 verschiedene Instanzen des gleichen Formulars erzeugt.

ZitatDas heißt, ich zeige, Stand deinem Code, in jedem Unterformularsteuerelement hintereinander eine Filterung, der Inhalte beginnend mit Montag und endend mit Sonntag. Dann habe ich am Ende, wenn alles funktioniert, den Filter für das Formular für Sonntag gesetzt und sehe in allen Unterformularsteuerlementen das Formular mit dem Filter für Sonntag, weil sich alle Unterformularsteuerelement, wie oben erwähnt auf das selbe Unterformular beziehen. Wie siehst du das?
Erklärung siehe vorher. Es werden sieben unterschiedliche Formularinstanzen erzeugt, die voneinander gar nichts wissen. Das ist genauso wie mit allen Objekten auch. Wenn du zwei Collections anlegst, haben die auch nichts miteinander zu tun, obwohl es beide Collections-Objekte sind.

Gruß
Knobbi38
 
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 23, 2025, 21:47:53
Hallo Knobbi38,

deine Antwort hat mir sehr geholfen, auch deinen Code und die Zusammenhänge von Unterformularsteuerelementen und Formularen besser zu verstehen. Nun habe ich deinen Code, zum testen, noch mal angepasst. Die Nummern für die Fremdschlüssel habe ich für die ersten 7 Tage der ersten Woche erst mal fest vergeben. Wenn alles läuft würde ich das noch variabel anpassen. Stand jetzt, werden die Daten gefiltert in den jeweilgen Unterformularsteuerelementen angezeigt, wenn ich auf den aktuellen Tag bzw. Datensatz klicke. Aber die anderen Formulare sind dann leer. Das wollte ich ja so nicht. Ich wollte ja, dass jede Formularinstanz, mit ihrem aufgesetzten Filter für Montag bis Sonntag gleichzeitig zu sehen ist. Hier meine Anpassungen im Code:
Private Sub Form_Load()
        Me.cboErnaehrungsplan.DefaultValue = 1
        LoadSubform Me.sfrmMahlzeitTag1, 43
        LoadSubform Me.sfrmMahlzeitTag2, 44
        LoadSubform Me.sfrmMahlzeitTag3, 45
        LoadSubform Me.sfrmMahlzeitTag4, 46
        LoadSubform Me.sfrmMahlzeitTag5, 47
        LoadSubform Me.sfrmMahlzeitTag6, 48
        LoadSubform Me.sfrmMahlzeitTag7, 49
End Sub

Private Sub LoadSubform(ByRef ctl As Access.SubForm, ByVal DayOfWeek As Long)
  Const FLT_EXPR As String = "[MahlztagIDRef]={0}"
  Const SUB_FORM_NAME As String = "frm105Wochenplanung_UnterMahlzeit"

  Dim strFilter As String

  ' Build filter expression
  strFilter = Replace(FLT_EXPR, "{0}", CStr(DayOfWeek))

  ' Load subform and apply filter
  ctl.SourceObject = SUB_FORM_NAME
  ctl.Form.Filter = strFilter
  ctl.Form.FilterOn = CBool(Len(strFilter) > 0)
End Sub
Hast du da eine Idee, wie dein Code so ertüchtigt werden kann, dass die Formularinstanzen mit Ihren Filtern gleichzeitig zu sehen sein können?
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 23, 2025, 23:02:44
Hallo Konrad,

hier muß ich passen, denn wie bereits geschrieben, kenne ich das Datenmodell und deinen Daten nicht. Woher soll ich wissen, warum da etwas nicht angezeigt wird?

Gruß
Knobbi38


 
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 25, 2025, 13:40:49
Hallo Knobbi38,

Zitat von: knobbi38 am Februar 22, 2025, 16:04:10Die Query sollte ohne Filter alle Mahlzeiten einer ID für die ganze Woche anzeigen.
Danke für deine Hilfe bis hier hin. Die von dir erwähnten Eigenschaften sind erfüllt. Ohne Filter werden alle Mahlzeiten aller Tage der Woche angezeigt. Das die Verknüpfungen funktionieren, zeigt mir der Umstand, dass wenn ich deinen Filter aus dem Skript rausnehme, auch die Daten in den UFO's aktualisieren. Mit .Requery hatte ich die Aktualisierung der UFO's erzwungen. Aber seis drum. Eventuell kannst du mir noch bei einer Sache helfen. Und zwar zeigt es mir für die Recordsetclone-Eigenschaft des Unterformulars den Fehler 2455
Zitat"Sie haben einen Ausruck eingegeben, der einen ungültigen Verweis auf die Form/Report-Eigenschaft enhält."
In einer vorangegangen Antwort hattest du mir ja empfohlen alle Subformelemente auf meinem Hauptformular zu durchlaufen und zu prüfen, ob die SourceObject-Eigenschaft eines Subform-Elementes dem Element entspricht, was ich auf einen geladen Zustand prüfen will, weil im Current-Ereignis des übergeordneten Formulars alles super läuft, wenn alle Formulare geladen sind, aber wenn ich das Hauptformular lade, eben die vorbenannte Fehlermeldung auftritt. Anbei mein Code, der die SourceObject-Eigenschaft aller Unterformularsteuerelemente auf meinem Hauptformular prüft:

Private Sub Form_Current()

    [Form_frm101Wochenplanung_Haupt].Form![sfrmTag].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag7].Requery
'Debug.Print "Form_Current(): " & Me.Name
    Dim rstRSC As DAO.Recordset
    Dim lngTagRef1 As Long
    Dim lngTagRef2 As Long
    Dim lngTagRef3 As Long
    Dim lngTagRef4 As Long
    Dim lngTagRef5 As Long
    Dim lngTagRef6 As Long
    Dim lngTagRef7 As Long
    Dim ctlSub As Control
    Dim frmFormular As Access.Form
    Dim sfrmFormular As Access.Form
   
    Set frmFormular = Form_frm101Wochenplanung_Haupt
    Set sfrmFormular = Form_frm104Wochenplanung_UnterTag

   For Each ctlSub In frmFormular.Controls
        Debug.Print ctlSub.Name
        If ctlSub.ControlType = acSubform Then
            If ctlSub.SourceObject = sfrmFormular.Name Then
                Debug.Print ctlSub.Name & ": " & sfrmFormular.Name & ": vorhanden"
                Set rstRSC = Form_frm101Wochenplanung_Haupt.sfrmTag.Form.RecordsetClone
                If Not rstRSC.RecordCount = 0 Then
                   rstRSC.MoveFirst
                   lngTagRef1 = rstRSC.Fields("TagID").Value
                Else
                    GoTo Abbruch
                End If
'.....Die Punkte stehen nur für alle weiteren Datensätze, bis der 7. Datensatz ereicht ist.
Abbruch:
                With Form_frm101Wochenplanung_Haupt
                    .sfrmMahlzeitTag1.SourceObject = "frm105Wochenplanung_UnterMahlzeit01"
                    .sfrmMahlzeitTag2.SourceObject = "frm106Wochenplanung_UnterMahlzeit02"
                    .sfrmMahlzeitTag3.SourceObject = "frm107Wochenplanung_UnterMahlzeit03"
                    .sfrmMahlzeitTag4.SourceObject = "frm108Wochenplanung_UnterMahlzeit04"
                    .sfrmMahlzeitTag5.SourceObject = "frm109Wochenplanung_UnterMahlzeit05"
                    .sfrmMahlzeitTag6.SourceObject = "frm110Wochenplanung_UnterMahlzeit06"
                    .sfrmMahlzeitTag7.SourceObject = "frm111Wochenplanung_UnterMahlzeit07"
                End With
           
                Form_frm105Wochenplanung_UnterMahlzeit01.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef1
                Form_frm106Wochenplanung_UnterMahlzeit02.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef2
                Form_frm107Wochenplanung_UnterMahlzeit03.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef3
                Form_frm108Wochenplanung_UnterMahlzeit04.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef4
                Form_frm109Wochenplanung_UnterMahlzeit05.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef5
                Form_frm110Wochenplanung_UnterMahlzeit06.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef6
                Form_frm111Wochenplanung_UnterMahlzeit07.RecordSource = "SELECT * FROM qryMahlzeitTagRezept01 WHERE MahlztagIDRef = " & lngTagRef7
           
                [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag1].Requery
                [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag2].Requery
                [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag3].Requery
                [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag4].Requery
                [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag5].Requery
                [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag6].Requery
                [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag7].Requery
            Else

                Debug.Print ctlSub.Name & ": " & sfrmFormular.Name & ": nicht vorhanden"
            End If
        End If
    Next ctlSub
End Sub
Vielleicht hast du eine Idee, was noch der Grund sein könnte, dass dieser Fehler auftritt. Übrigens: Wenn ich den Code in Einzelschritten bis zum Fehler durchlaufe, entspricht die SourceObject-Eigenschaft meinem gesuchten Formular. Wenn ich dann aber mit F11 + ALT in die Formularansicht wechsle ist kein Formular zu sehen.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 25, 2025, 15:22:07
Hallo Konrad,

warum machst du dir das Leben immer wieder selber schwer und hältst dich nicht an gängige Konventionen und Ratschläge?

Set sfrmFormular = Form_frm104Wochenplanung_UnterTag
Ich hatte doch mehrfach darauf hingewiesen, daß man in Access die Default-Instanzen von Formularen tunlichst nicht verwenden sollte - genau das macht du hier und auch an den anderen Stellen, und das Ganze nur, um an den Namen des Formulars zu kommen?

Die Namen deiner Unterformulare sind konstant und damit kannst du diese auch so verwenden und brauchst nicht ein neues Objekt/Formular erzeugen bzw. auf die Default-Instanz zurückgreifen.

Vielleicht zum Verständnis noch eine Hintergrundinformation, die ich eventuell vergessen habe zu erwähnen:
Wenn ein Formular in ein SubForm-Steuerelement geladen wird und keine Datensätze zum Anzeigen enthält, ist
die Detail-Sektion des UF nicht sichtbar und die Steuerelemente der Sektion werden somit auch nicht angezeigt.

Wenn du also den Namen des Formulars in .SourceObject suchst, kann es durchaus passieren, daß zwar der Name übereinstimmt, aber das Formular nicht wie gewohnt über die .Form Eigenschaft angesprochen werden kann, weil die Eigenschaft .Form nur vorhanden ist, wenn das Formular auch angezeigt wird, aber nicht unbedingt immer der Fall sein muß und dann gibt es die Property einfach nicht und Access generiert den Fehler 2455. Schöner wäre gewesen, daß man .Form auf Nothing abfragen könnte, aber das ist leider nicht der Fall ein unschönes Verhalten von Access.

Wenn also UF dynamisch verwendet werden, ist es unabdingbar, den Zugriff auf die .Form Eigenschaft mit einer Fehlerbehandlungsroutine abzusichern. Am einfachsten mit einer entsprechenden Funktion, denn das braucht man dann öfter. Alternativ könnte man auch prüfen, ob die Property "Form" in der Properties Auflistung des SubForm-Steuerelements existiert; das mit der Funktion läßt sich allerdings einfacher umsetzen.

Warum fragst du eigentlich nicht die Form.RecordCount Eigenschaft ab, sondern gehst den Umweg über Form.Recordsetclone ? Ein zusätzlicher Aufwand, den man sich hier sparen kann.

Gruß Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 25, 2025, 15:52:32
Hallo Konrad,

wenn du doch statisch mit 7 verschiedenen UF arbeitest, brauchst du doch das ganze Gedöns mit dem Abfragen und Vergleichen, welches Formular und welches SubForm-Control geladen ist, überhaupt nicht, daß ist doch per Design festgelegt und jederzeit bekannt.

Auch dein Konstrukt mit dem Abfragen der TagID gibt überhaupt keinen Sinn, weil auch dieses ist deterministisch festgelegt, kannst du dir also alles sparen.

Gruß Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 25, 2025, 18:13:59
Hallo Knobbi38,

Zitat von: knobbi38 am Februar 25, 2025, 15:22:07Ich hatte doch mehrfach darauf hingewiesen, daß man in Access die Default-Instanzen von Formularen tunlichst nicht verwenden sollte - genau das macht du hier und auch an den anderen Stellen, und das Ganze nur, um an den Namen des Formulars zu kommen?
Genau, ich möchte den Formularnamen ermitteln. Ich finde das auf diesen Weg sehr bequem und ja das hattest du erwähnt und zwar hier:
ZitatMit "Form_frm105Wochenplanung_UnterMahlzeit01" wird übrigens die Default-Instanz eines Formulars aufgerufen, was in Access normalerweise nicht notwendig ist - so etwas macht man einfach nicht, außer man weiß genau, warum und wann man es ausdrücklich braucht!
Mir ist aber nicht ganz klar warum das ein Problem sein könnte?

Zitat von: knobbi38 am Februar 25, 2025, 15:22:07Wenn du also den Namen des Formulars in .SourceObject suchst, kann es durchaus passieren, daß zwar der Name übereinstimmt, aber das Formular nicht wie gewohnt über die .Form Eigenschaft angesprochen werden kann, weil die Eigenschaft .Form nur vorhanden ist, wenn das Formular auch angezeigt wird, aber nicht unbedingt immer der Fall sein muß und dann gibt es die Property einfach nicht und Access generiert den Fehler 2455.
Danke dir. Wieder was gelernt.

Zitat von: knobbi38 am Februar 25, 2025, 15:22:07Alternativ könnte man auch prüfen, ob die Property "Form" in der Properties Auflistung des SubForm-Steuerelements existiert; das mit der Funktion läßt sich allerdings einfacher umsetzen.
Dann probiere ich es mal damit. Danke für den Tip.

Zitat von: knobbi38 am Februar 25, 2025, 15:22:07Warum fragst du eigentlich nicht die Form.RecordCount Eigenschaft ab, sondern gehst den Umweg über Form.Recordsetclone ? Ein zusätzlicher Aufwand, den man sich hier sparen kann.
Nun ja, die Form.RecordCount Eigenschaft zeigt es über Intellisense nicht an und ist auch in der Windows-Hilfe nicht zu finden. Gibt es die denn überhaupt oder meintest du die Form.Count - Eigenschaft? Außerdem will ich ja nicht nur die Datensätze zählen sondern den Inhalt angezeigten Unterformular abfragen und das ist meiner Ansicht nach die RecordsetClone - Eigenschaft des Formulars.

Zitat von: knobbi38 am Februar 25, 2025, 15:52:32wenn du doch statisch mit 7 verschiedenen UF arbeitest, brauchst du doch das ganze Gedöns mit dem Abfragen und Vergleichen, welches Formular und welches SubForm-Control geladen ist, überhaupt nicht, daß ist doch per Design festgelegt und jederzeit bekannt.
Möglich, aber es generiert mir beim Laden vom Hauptformular eben den Fehler 2455. Wie ich verstanden habe, liegt das daran, dass das betreffende Unterformular nicht angezeigt wird. Dann darf ich ja irgendwie abfragen, ob es angezeigt oder geladen oder sonst eine Eigenschaft erfüllt, die erfüllt ist, wenn es angezeigt bzw. nicht angezeigt wird. Denn wenn das Hauptformular geladen wird, wird für das betreffende UFO das Current-Ereignis ausgeführt, obwohl es noch nicht angezeigt wird und das führt dann zum o.g. Fehler.

Zitat von: knobbi38 am Februar 25, 2025, 15:52:32Auch dein Konstrukt mit dem Abfragen der TagID gibt überhaupt keinen Sinn, weil auch dieses ist deterministisch festgelegt, kannst du dir also alles sparen.
Deterministisch, ich habe recherschiert heißt ja:
ZitatDer Determinismus ist die Auffassung, dass alle – insbesondere auch zukünftige – Ereignisse durch Vorbedingungen eindeutig festgelegt sind.
Das würde für mich bedeuten, dass alle Unterformularsteuerelemente für den jeweiligen Tag eine feste Verknüpfung zum Ufo für die Tage haben. Aber das ist ja nicht der Fall. Es sollen ja im UFO1 für Montag eben die Datensätze aus der ersten Zeile, dem 1. Datensatz, von dem UFO für die Tage angezeigt werden. Das geht zwar mit deinem VBA-Filter, aber eben nicht für alle Tage gleichzeitig. Daher eben das Konstrukt mit 7 Unterformularen für jeden Tag, welche ich auf die einzelne Spalten referenziere, damit die Formulare unabhängig voneinander sind. Wie das deterministisch, also über entsprechende Vorbedingungen der Ereignisse einzustellen geht, weis ich leider nicht.



Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 25, 2025, 21:06:34
Hallo Konrad,

nimm das mal als gegeben hin, daß man nicht die Default-Instanzen verwendet - eine Erklärung würde hier jetzt zu weit führen, dafür müßt man sehr viel tiefer in OOP einsteigen, aber sei dir gesagt, daß das Default-Formular und das gleiche, nich dasselbe, geladene Formular in einem SubForm-Steuerelement zwei verschiedene Instanzen sind.

Zitat... Form.RecordCount

Sorry, ich meinte natürlich Form.Recordset.Recordcount

ZitatDenn wenn das Hauptformular geladen wird, wird für das betreffende UFO das Current-Ereignis ausgeführt, obwohl es noch nicht angezeigt wird und das führt dann zum o.g. Fehler.

Statische UF werden immer vor dem HF geladen. So etwas muß man immer im Hinterkopf behalten und ggf. in seinem Workflow mit berücksichtigen.

ZitatAber das ist ja nicht der Fall. Es sollen ja im UFO1 für Montag eben die Datensätze aus der ersten Zeile, dem 1. Datensatz, von dem UFO für die Tage angezeigt werden. Das geht zwar mit deinem VBA-Filter, aber eben nicht für alle Tage gleichzeitig.
Genau da kann ich dir nicht mehr folgen - es fehlt mir offensichtlich die Phantasie dafür, was du da eigentlich vor hast.
Das Access nur DS kennt und keine Tabellenkalkulation ist, ist die Definition, was der "erste" oder auch "letzt" DS ist, sehr wage wenn nicht sogar unbrauchbar. Wenn du auf einen DS Bezug nehmen möchtest, geht das nicht über Positionen, sondern nur über eindeutige Feldinhalte des gewünschten DS, welche man als Schlüssel verwenden könnte. Gibt es keinen "natürlichen" Schlüssel, muß man ggf. einen neuen, künstlichen Schlüssel, selber generieren. Das dürfte dann auch die Ursache für deine Probleme mit deinem Workflow sein.

Gruß Knobbi38
 





Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am Februar 26, 2025, 07:38:25
Hallo Knobbi38,

Zitat von: knobbi38 am Februar 25, 2025, 21:06:34Genau da kann ich dir nicht mehr folgen - es fehlt mir offensichtlich die Phantasie dafür, was du da eigentlich vor hast.
Wahrscheinlich habe ich es nur schlecht veranschaulicht.

Zitat von: knobbi38 am Februar 25, 2025, 15:22:07Alternativ könnte man auch prüfen, ob die Property "Form" in der Properties Auflistung des SubForm-Steuerelements existiert; das mit der Funktion läßt sich allerdings einfacher umsetzen.
Diesen Ansatz finde ich ganz interessant. Nun habe ich meine Prozedur in Einzelschritten durchlaufen lassen und in dem Moment, in dem
ctlSub.SourceObject = subfrmFormular.Name gleich sfrmTag <> frm104Wochenplanung_UnterTag, also der Name meines gesuchten Formulars NICHT im "SourceObject" zu finden war,
ctlSub.Form eingegeben um zu prüfen, ob "Form" in der Eigenschaftenauflistung des Unterformularsteuerelements vorhanden ist. Nur um vorab zu schauen, ob die Form-Eigenschaft nun auswählbar bzw. vorhanden ist oder nicht. Aber sie ist auswählbar und vorhanden, auch wenn die oben erwähnte Übereinstimmung von "SourceObject" und Formularnamen (sfrmTag <> frm104Wochenplanung_UnterTag) nicht vorhanden ist. Ist diese Vorgehensweise geeignet um eine Prüfung des Vorhandenseins der Form-Eigenschaft des Unterformularsteuerlements zu prüfen, ode hattest du etwas Anderes gemeint?
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am Februar 26, 2025, 13:09:35
Hallo Konrad,

hier eine kleine Hilfsfunktion, mit der du auf die Form Eigenschaft ohne Fehlermeldung zugreifen kannst:
Public Function GetForm(ByRef ctl As SubForm) As Form
  On Error Resume Next
  Set GetForm = ctl.Form
  Err.Clear
End Function

Die Funktion gibt dir das Form-Objekt zurück oder Nothing, z.B.:
if not GetForm(me.subControl) is nohting then ...
' oder
set frm = GetForm(me.subControl)
if not frm is nothing then
  ...
end if

Du kannst natürlich auch die Funktion so umschreiben, daß nicht gleich das Objekt zurückgegeben wird, sondern nur ein Boolean Wert, der angibt, ob der Zugriff auf die Form-Eigenschaft erfolgreich war oder nicht - gerade so, wie du das brauchst.

Gruß Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am März 01, 2025, 09:48:18
Hallo Knobbi38,

danke für deine Antwort. Auf meine anfängliche Frage habe ich doch zufällig eine Antwort gefunden und zwar habe ich für jedes Unterformularsteuerelement, dass ich an das eine UFO "frmTag" geknüpft habe ein Textfeld erstellt und diese mit diesem Ausdruck mit für den 1.Datensatz des Unterformularsteuerelments "subTag" "=[sfrmTag].[Formular]![txtTagID]" versehen für das 2. Textfeld und damit für das UFO für den 2.Wochentag den Ausdruck "=[sfrmTag].[Formular]![txtTagID]+1" usw.. Damit habei ich beim Laden auch keine Fehlermeldungen mehr. Anbei noch ein Bild vom Formular:
Screenshot 2025-03-01 094716.png
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am März 01, 2025, 11:14:48
Hallo Konrad,

das sieht doch schon mal brauchbar aus.  :)
Ich hoffe jetzt nur, daß TagID nicht ein Autowert ist, denn diese kann auch schon mal unstetig sein und dann wäre der Ausdruck TagID + 1 nicht mehr erfüllt. Wenn dem so ist, würde ich ein die TagID Werte in einer Schleife auslesen und dann direkt als Verknüpfung verwenden. 

Gruß
Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am März 02, 2025, 09:56:30
Hallo Knobbi38,

Zitat von: knobbi38 am März 01, 2025, 11:14:48Ich hoffe jetzt nur, daß TagID nicht ein Autowert ist, denn diese kann auch schon mal unstetig sein und dann wäre der Ausdruck TagID + 1 nicht mehr erfüllt. Wenn dem so ist, würde ich ein die TagID Werte in einer Schleife auslesen und dann direkt als Verknüpfung verwenden. 
Ja, es sind tatsächlich Autowerte. Danke für den Tipp. Dann mache ich das mit der Schleife und lese die Werte aus, um sie dann als Verknüfpfung zu verwenden.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am März 02, 2025, 12:24:50
Hallo Konrad,

hier eine kleine Hilfsfunktion für das Auslesen der IDs:
Private Function GetNextIDs(ByVal StartID As Long, Optional ByVal Number As Long) As Long()
  Dim rst As Object
  Dim strSQL As String
  Dim avnt As Variant
  Dim a() As Long
  Dim i As Long
 
  Const SQL_SELECT As String = "SELECT TOP {0} ID FROM <table/query> WHERE ID >= {1};"

  strSQL = Replace(SQL_SELECT, "{0}", CStr(Number))
  strSQL = Replace(strSQL, "{1}", CStr(StartID))
 
  Set rst = CurrentDb.OpenRecordset(strSQL)
  avnt = rst.GetRows(Number)
  rst.Close: Set rst = Nothing

  ' Convert 2d to 1d array
  ReDim a(UBound(avnt, 2)) As Long
   
  For i = 0 To UBound(a)
    a(i) = avnt(0, i)
  Next
 
  GetNextIDs = a
End Function
Die Bezeichnungen mußt du ggf. anpassen.

Beispiel:
  Dim aID() As Long
  aID() = GetNextIDs(StartID:=4, Number:=5)

Gruß Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am März 03, 2025, 05:51:12
Hallo Knobbi38,

danke für deinen Codevorschlag. Ich habe noch ein paar Fragen dazu:
- Wenn ich das richtig verstehe, ist wird mit 
Dim aID() As Long
aID() = GetNextIDs(StartID:=4, Number:=5)
der Wert 4 für die StartID und der Wert 5 für die Zeilennummer übergeben.
- Wenn ja, wie werden denn diese Werte ermittelt? Wird das mit der RecordCount-Eigenschaft gemacht?

- Die Variable "rst" ist als Objekt deklariert, wird aber im folgenden Code der Wert eines Recordsets zugewiesen. Warum wird die Variable dann nicht als "DAO.Recordset" deklariert?

- SQL: Warum wird "TOP" genutzt, wenn doch nur ein Datensatz angezeigt werden kann?

ReDim a(UBound(avnt, 2)) As LongWarum muss der Array neu dimensioniert werden und warum wird als oberstes Ende des Arrays (UBound) die Spalte 3 festgelegt?

avnt(0, i)Warum werden hier alle Spalten und nicht alle Zeilen des Arrays durchlaufen?
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am März 03, 2025, 10:56:29
Hallo Konrad,

ich habe den Code jetzt wirklich nicht mit vielen Kommentaren versehen, aber die meisten Dinge könntest du dir mit Hilfe der Doku auch selber erklären.

Zitat- Wenn ich das richtig verstehe, ist wird mit 
Dim aID() As Long
aID() = GetNextIDs(StartID:=4, Number:=5)
der Wert 4 für die StartID und der Wert 5 für die Zeilennummer übergeben.
Nein. Die Funktion liest die nächsten 5 Autowerte beginnend mit der StartID aus und gibt diese als eindimensionales Array zurück.

Zitat- Wenn ja, wie werden denn diese Werte ermittelt? Wird das mit der RecordCount-Eigenschaft gemacht?
Schau dir mal die Methode DAO.GetRows (https://learn.microsoft.com/de-de/office/client-developer/access/desktop-database-reference/recordset-getrows-method-dao) in der Doku an. Mit Recordcount hat das nichts zu tun.

Zitat- Die Variable "rst" ist als Objekt deklariert, wird aber im folgenden Code der Wert eines Recordsets zugewiesen. Warum wird die Variable dann nicht als "DAO.Recordset" deklariert?
Du hast recht, man sollte in diesem Fall das besser als DAO.Recordset deklarieren.

Zitat- SQL: Warum wird "TOP" genutzt, wenn doch nur ein Datensatz angezeigt werden kann?
Es werden in einem Rutsch die nächsten n IDs gelesen und zurückgegeben, anstatt n-mal mit DLookup je einen Wert zu ermitteln, weil diese anschließend für die Zuweisung bei den Filtern benötigt werden.

ZitatReDim a(UBound(avnt, 2)) As LongWarum muss der Array neu dimensioniert werden und warum wird als oberstes Ende des Arrays (UBound) die Spalte 3 festgelegt?
Wie aus dem Kommentar ersichtlich, wird ein 2-dimensionales Array in ein 1-dimensionales Array konvertiert. Mit Ubound(Arrayname, Dimension) wird der höchste Index der 2.Dimension des Arrays ermitteln, damit anschließend die Größe des 1-dimensionales Arrays festgelegt werden kann. Von Spalte 3 ist hier überhaupt keine Rede.

Zitatavnt(0, i)Warum werden hier alle Spalten und nicht alle Zeilen des Arrays durchlaufen?
Sie Doku zu GetRows()

Gruß
Knobbi38
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am März 07, 2025, 06:05:33
Hallo Knobbi38,

ich habe mir jetzt die "Recordset.GetRows"-Methode mal genauer angeschaut und noch ein paar Fragen.

Zitat von: knobbi38 am März 02, 2025, 12:24:50aID() = GetNextIDs(StartID:=4, Number:=5)
Warum legst du die StartID auf 4 fest?

Zitat von: knobbi38 am März 02, 2025, 12:24:50avnt = rst.GetRows(Number)
Wenn ich das richtig verstanden habe, wird damit festgelegt, dass die ersten 5 Zeilen des Recordsets kopiert werden. Aber was ist, wenn der Recordset mehr als 5 Zeilen hat? Müsste ich dann nicht noch eine Schleife einbauen, die bis zur letzten Zeile im Recordset läuft und alle Datensätze in die "Recordset.GetRows"-Methode aufnimmt, bis der letzte Datensatz ereicht ist?
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am März 07, 2025, 10:59:31
Hallo Konrad,

das sind doch nur Beispielwerte, die du an deine Gegebenheiten anpassen mußt. Es werden bei GetRows auch keine DS kopiert und eine Schleife ist in diesem Fall nicht notwendig, weil die Anzahl der zu lesenden Werte mit dem Argument "Number" übergeben werden.

Die Bedeutung der Parameter StartID und Number hatte ich beschrieben. Du kannst ja mal im Einzelschritt diese Funktion mal mit anderen Parametern aufrufen und dann kannst du auch nachverfolgen, wofür die verwendet werden.

Gruß Knobbi38

Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: KonradR am März 08, 2025, 06:19:12
Hallo Knobbi,

Zitat von: knobbi38 am März 07, 2025, 10:59:31Du kannst ja mal im Einzelschritt diese Funktion mal mit anderen Parametern aufrufen und dann kannst du auch nachverfolgen, wofür die verwendet werden.
Manchmal ist einfach probieren ganz sinnvoll. Ja es klappt. Wenn ich für "Number" als Wert die 5 stehen lasse, werde nur die 5 ersten Werte in das Array gefüllt. Daher habe ich im Current-Ereignis von dem betreffenden Formular noch ein paar Zeilen Code eingefügt, welche mir die Anzahl der Datensätze ermitteln und an "Number" übergeben. Für die "StartID" ermittelt mir der Code noch den ersten Wert im Recordset und falls der Recordset keine Datensätze hat wird einfach 0 ausgegeben und das verknüpfte Unterformular bleibt leer. Hier mein Code:
Private Sub Form_Current()
    Dim aID() As Long
    Dim rcsTag As DAO.Recordset
    Dim lngWocheID As Long
    Dim lngAnzahlDS As Long
    Dim lngStartID As Long
   
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag1].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag2].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag3].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag4].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag5].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag6].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag7].Requery
    [Form_frm101Wochenplanung_Haupt].Form![sfrm105Wochenplanung_UnterMahlzeit].Requery
   
    lngWocheID = Nz(Form_frm101Wochenplanung_Haupt.sfrmWoche.Form.Controls("txtWocheID").Value, 0)

    Set rcsTag = CurrentDb.OpenRecordset("SELECT TagID FROM tblTag WHERE TagwocheIDRef = " & lngWocheID, dbOpenDynaset)

    With rcsTag
        If Not .EOF Then
            .MoveLast
            lngAnzahlDS = .RecordCount
            .MoveFirst
            lngStartID = Nz(.Fields("TagID").Value, 0)
        Else
            Forms!frm101Wochenplanung_Haupt!txtMontag = 0
            Forms!frm101Wochenplanung_Haupt!txtDienstag = 0
            Forms!frm101Wochenplanung_Haupt!txtMittwoch = 0
            Forms!frm101Wochenplanung_Haupt!txtDonnerstag = 0
            Forms!frm101Wochenplanung_Haupt!txtFreitag = 0
            Forms!frm101Wochenplanung_Haupt!txtSamstag = 0
            Forms!frm101Wochenplanung_Haupt!txtSonntag = 0
        End If
    End With
   
    If Not lngStartID = 0 Then
        aID() = GetNextIDs(StartID:=lngStartID, Number:=lngAnzahlDS)
    Else
    End If
End Sub

Private Function GetNextIDs(ByVal StartID As Long, Optional ByVal Number As Long) As Long()
  Dim rst As Object
  Dim strSQL As String
  Dim avnt As Variant
  Dim a() As Long
  Dim i As Long

  Const SQL_SELECT As String = "SELECT TOP {0} TagID FROM tblTag WHERE TagID >= {1};"

  strSQL = Replace(SQL_SELECT, "{0}", CStr(Number))
  strSQL = Replace(strSQL, "{1}", CStr(StartID))

  Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
  avnt = rst.GetRows(Number)
  rst.Close: Set rst = Nothing

  ReDim a(UBound(avnt, 2)) As Long

  For i = 0 To UBound(a)
    a(i) = avnt(0, i)
  Next

  GetNextIDs = a
 
  Forms!frm101Wochenplanung_Haupt!txtMontag = a(0)
  Forms!frm101Wochenplanung_Haupt!txtDienstag = a(1)
  Forms!frm101Wochenplanung_Haupt!txtMittwoch = a(2)
  Forms!frm101Wochenplanung_Haupt!txtDonnerstag = a(3)
  Forms!frm101Wochenplanung_Haupt!txtFreitag = a(4)
  Forms!frm101Wochenplanung_Haupt!txtSamstag = a(5)
  Forms!frm101Wochenplanung_Haupt!txtSonntag = a(6)

End Function

Vielen vielen Dank noch mal.
Titel: Re: Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen
Beitrag von: Knobbi38 am März 08, 2025, 15:18:06
Hallo Konrad,

das sieht doch schon mal vielversprechend aus.  :)

Noch ein paar Vorschläge zur Verbesserung:

Gruß
Knobbi38