Neuigkeiten:

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

Mobiles Hauptmenü

Ein UFO über "Verknüpfen nach" an eine feste Zeile eines anderen UFO verknüpfen

Begonnen von KonradR, Februar 19, 2025, 17:43:50

⏪ vorheriges - nächstes ⏩

KonradR

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?

Knobbi38

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


 

KonradR

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.

Knobbi38

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

Knobbi38

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

KonradR

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.




Knobbi38

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
 






KonradR

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?

Knobbi38

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

KonradR

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:
Sie dürfen in diesem Board keine Dateianhänge sehen.

Knobbi38

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

KonradR

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.

Knobbi38

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

KonradR

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?

Knobbi38

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 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