none
Combobox-Rowsource einschränken

    Frage

  • Beim Einschränken der Auswahlliste einer Combobox in VBA mit dem Befehl

    Me!ComboboxName.Rowsource = "SELECT ... "

    tritt bei mir das Problem auf, dass gespeicherte Werte in anderen Zeilen des Listenformulars kurzzeitig aus der Anzeige verschwinden.

    Im Beispiel habe ich eine Tabelle "Sportart" definiert mit Sportarten wie Fußball, Handball etc. und einem Primärschlüssel "SportartID". In einer weiteren Tabelle "Liga" sind verschiedene Ligen zu der Sportart gespeichert. Neben der LigaID als Primärschlüssel ist u.a. die Möglichkeit vorhanden zu einer Liga die übergeordnete "Aufstiegsliga" anzugeben. Dieses erfolgt durch eine Selbstreferenz auf die jeweilige LigaID.

    In einem Formular werden jetzt die Sportarten und mit Hilfe eines Unterformulars die dazu gehörigen Ligen verwaltet. Das Feld für die Aufstiegsliga ist mit einem Nachschlager verknüpft, der die Namen der Ligen statt der LigaIDs zur Auswahl bereitstellt.

    Soweit funktioniert alles!

    Der Nachschlager des Kombinationsfeldes bietet in dieser Version alle Ligen zur Auswahl an, also auch den Aufstieg in dieselbe Liga und den Aufstieg in die Liga einer anderen Sportart, z.B. von einer Fußballliga in eine Handballliga. Dieses Auswahl ist unsinnig! Daher habe ich durch eine kleine VBA-Prozedur die Auswahl eingeschränkt.

    Private Sub AufstiegID_Enter()
        Me!AufstiegID.RowSource = _
            " SELECT LigaID, Liga " & _
            " FROM Liga " & _
            " WHERE SportartID = " & Forms!Sportart!SportartID & _
            " AND LigaID <> " & Nz(Me!LigaID, 0) & _
            " ORDER BY Liga;"
    End Sub

    Das funktioniert soweit, dass in der Auswahl nur Ligen mit derselben Sportart wie im Hauptformular angeboten werden und diejeweilige Liga selbst ausgeblendet wird. Das Problem ist, dass der jeweilige SQL-Befehl auch in anderen Zeilen des Unterformulars Wirkung zeigt und einzelne Werte wie von Geisterhand verschwinden und wieder auftauchen. Klickt man z.B. auf das Aufstiegsfeld der 1. Bundesliga verschwindet die Anzeige der 1. Bundesliga im Aufstiegsfeld der 2. Bundesliga. Klickt man nun auf das Aufstiegsfeld der 2. Bundesliga, dann wird der Wert wieder angezeigt, aber es verschwindet die Anzeige der 2. Bundesliga im Aufstiegsfeld der 3. Bundesliga usw.

    Vielen Dank für einen Tipp.
    Freitag, 29. März 2013 15:44

Alle Antworten

  • Erasmus Albatros wrote:
    > Beim Einschränken der Auswahlliste einer Combobox in VBA
    > mit dem Befehl
    >
    > Me!ComboboxName.Rowsource = "SELECT ... "
    >
    > tritt bei mir das Problem auf, dass gespeicherte Werte in anderen
    > Zeilen des Listenformulars kurzzeitig aus der Anzeige verschwinden.
    > ...
     
    Das ist wohl das altbekannte Problem im Endlosformular, dass
    in einem abhängigen Kombi in vorhandenen Datensätzen die
    Einträge nicht aufscheinen, wenn der gerade aktuelle "Filter"
    eben nicht für sie passt. Dafür gibt's keine schöne Lösung.
     
    Eine unschöne ist ein ungebundenes Textfeld über dem Kombi,
    das per DLookUp den passenden Wert anzeigt und
    "Beim Hingehen" den Fokus an das Kombi weitergibt.
    Das ist nicht besonders performant, aber für mich noch der
    beste Workaround.
     
    --
    Servus
    Karl
    *********
    SNEK2: SQL Server und .NET-Entwickler-Konferenz 13/14.4. Nürnberg
     
     
     
    Freitag, 29. März 2013 15:58
  • Hallo Erasmus,

    Dies ist genau der Grund, warum ich möglichst versuche, um Endlosformulare herumzukommen.

    Eine andere Möglichkeit ist, das Formular lediglich zur Anzeige der Liste zu benutzen, hier könnte auch ein ListView-Control zum Einsatz kommen und lediglich die Bearbeitung in einem eigenen Dialogformular machst.

    Hier musst Du natürlioch aufpassen, dass Du dann wirklich nur den einen Datensatz in das Dialogformular holst, um die Performance aufrechtzuerhalten. Dann hast Du aber die völlige Kontrolle über den Datensatz, kannst eventuell auch Business Rules (Pflichtfelder etc.) überprüfen und dann wieder speichern.

    Bei einem Listview hast Du auch den Vorteil, dass Du nicht unbedingt ein Requery machen musst, wenn Du die Listviewzeile auch aus dem Dialogformular entsprechend manipulierst.

    Gruß

    Roland


    It's no problem, it's just the syntax

    • Als Antwort vorgeschlagen Roland Grothe Montag, 15. April 2013 13:59
    Dienstag, 2. April 2013 13:29