Wenn das Kombifeld zu viele Daten hat

Du klickst ins Formular – und Access friert kurz ein.
Weil das Kombinationsfeld 10.000 Datensätze lädt.
Das will keiner.

Die Lösung: Lazy Loading.
Also: Erst Daten holen, wenn der Benutzer wirklich sucht.

Mein Ansatz: Kombifeld mit RowSource on demand

  1. Leere RowSource beim Start
  2. Beim Tippen Daten nachladen
  3. Optional mit Mindestanzahl Zeichen
  4. Optional mit SQL Server per Pass-Through

Beispiel 1: Dynamisches Nachladen bei Eingabe

Private Sub cboKunde_Change()
    Dim sSQL As String
    Dim sSuche As String

    sSuche = Me.cboKunde.Text

    If Len(sSuche) < 3 Then
        Exit Sub
    End If

    sSQL = "SELECT KundenID, Name FROM Kunden " & _
           "WHERE Name LIKE '" & Replace(sSuche, "'", "''") & "%' " & _
           "ORDER BY Name"

    Me.cboKunde.RowSource = sSQL
    Me.cboKunde.Dropdown
End Sub

Beim Tippen ab 3 Zeichen wird die Liste geladen.
Kein voller Datensatzbestand. Kein Hänger.

Beispiel 2: Kombifeld leer initialisieren

Private Sub Form_Load()
    Me.cboKunde.RowSource = "SELECT KundenID, Name FROM Kunden WHERE 1=0"
End Sub

Damit bleibt das Feld leer bis zur ersten Eingabe.
Sieht sauber aus. Reagiert schnell.

Beispiel 3: Mit SQL Server – per Pass-Through

Function LadeKundenSuche(sSuche As String) As String
    Dim qd As DAO.QueryDef
    On Error Resume Next
    CurrentDb.QueryDefs.Delete "pt_KundenSuche"
    On Error GoTo 0

    Set qd = CurrentDb.CreateQueryDef("pt_KundenSuche")
    qd.Connect = "ODBC;DSN=SQLServerDSN;"
    qd.ReturnsRecords = True
    qd.SQL = "SELECT KundenID, Name FROM dbo.Kunden " & _
             "WHERE Name LIKE '" & Replace(sSuche, "'", "''") & "%' " & _
             "ORDER BY Name"

    LadeKundenSuche = "pt_KundenSuche"
End Function
Private Sub cboKunde_Change()
    If Len(Me.cboKunde.Text) < 3 Then Exit Sub
    Me.cboKunde.RowSource = LadeKundenSuche(Me.cboKunde.Text)
    Me.cboKunde.Dropdown
End Sub

Mit Pass-Through wird die Abfrage direkt auf dem Server ausgeführt.
Kein lokaler Overhead.

Tipps zur Performance

  • LIKE 'xyz%' nutzt Index – LIKE '%xyz%' nicht
  • Nicht auf Views mit Joins – lieber gezielt auf Basis-Tabelle
  • Nur TOP 100 laden bei vielen Treffern
  • ColumnWidths setzen, damit Dropdown flott bleibt
Me.cboKunde.ColumnWidths = "0cm;5cm"

Tabelle: Lazy Loading vs. Standard

EigenschaftStandard-KombifeldLazy Loading Kombifeld
Ladezeit beim ÖffnenLangsam bei großen DatenSchnell, da leer
SpeicherverbrauchHochNiedrig
BenutzerfreundlichkeitUnübersichtlichZielgerichtet
KomplexitätEinfachHöher, aber steuerbar

Lazy läuft

Große Kombifelder sind wie Excel-Listen auf Papier.
Am Anfang meint man, man braucht alles.
Am Ende reicht ein Filter.

Mach’s effizient. Mach’s nutzbar.
Lazy Loading lohnt sich.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert