Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" 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,

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?

Knobbi38

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


KonradR

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.

Knobbi38

Hallo Konrad,

das sieht doch schon mal vielversprechend aus.  :)

Noch ein paar Vorschläge zur Verbesserung:
  • Wenn du wissen möchtest, wieviel DS für ein bestimmtes Kriterium in einer Tabelle vorhanden sind, öffnet man kein Recordset und liest alle vorhandenen DS, sondern man verwendet dafür dir Aggregatfunktion count(*), bzw. in Access dann auch einfach DCount().
  • Solche Referenzen
    [Form_frm101Wochenplanung_Haupt].Form![sfrmMahlzeitTag1] ...solltest du vermeiden. Wenn das im aktuellen HF aufgerufen wird, sollte me.<subcontrolname>.form.requery reichen.
  • Forms!frm101Wochenplanung_Haupt!txtMontag = a(0)
    ...
    gehört auf keinen Fall in die Funktion GetNextID(), sondern in die aufrufende Sub oder Funktion. GetNextID() liefert als Rückgabewert schon das dafür benötigte Array. -> Also gleich verschieben!
  • Später kannst du aus die 7 Aufrufe für jede subForm noch umwandeln in eine Schleife, dann wäre diese Kosmetik auch erledigt.

Gruß
Knobbi38