Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Daten / Datenbank / FillCombo

ComboBox mit Daten aus MDB füllen

Für den Zugriff von VB5 auf eine Access-DB (*.MDB) bietet sich DAO an. Seit VB6 propagiert Microsoft zwar ADO, allerdings ist DAO immer noch die beste Wahl für Access, weil dafür optimiert.

Hier nun ein Beispiel für folgendes Szenario (benutzt die mitgelieferte NWind-Datenbank):
Man hat eine Tabelle "Categories" mit dem Feld "CategoryName" für die Beschreibung einer Kategorie und dem Feld "CategoryID" für die interne numerische Darstellung (der sogenannte Primärschlüssel). In fast allen Fällen werden ComboBoxen auf diese Art und Weise genutzt: Bei Auswahl eines Elements wird nicht die Beschreibung, sondern die interne ID (weiter)verwendet.

Zuerst muß unter Projekt/Referenzen sichergestellt werden, daß die "Microsoft DAO 3.5 Object Library" (o.ä.) aktiviert ist. In einem Modul (namens "DB" o.ä.) wird folgender Code eingegeben:
'Die Datenbank-Variable db soll global nutzbar sein:
Public db As Database

Public Sub FillCombo( _
    ByRef cmb As ComboBox, _
    ByVal SQL As String)

  Dim rs As Recordset
  Dim HasID As Boolean 'Enthält SQL eine ID?
  
  With cmb
    .Clear
    Set rs = db.OpenRecordset(SQL, dbOpenForwardOnly)
    If rs.Fields.Count > 1 Then
      HasID = (rs(1).Type = dbLong)
    End If
    Do Until rs.EOF
      'Beschreibung hinzufügen:
      '(OBdA: 1. Feld enthält Beschreibung)
      .AddItem rs(0)
      If HasID Then
        'Primärschlüssel merken:
        '(OBdA: 2. Feld enthält ID)
        .ItemData(.NewIndex) = rs(1)
      End If
      rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing
  End With
End Sub
Auf einer Form muß eine ComboBox "cmbCategories" plaziert und folgender Code eingegeben werden:
Private Sub cmbCategories_Click()
  'Bei Auswahl anzeigen:
  With cmbCategories
    If .ItemData(.ListIndex) Then
      'ID vorhanden:
      MsgBox "ID=" & .ItemData(.ListIndex)
    Else
      'ID nicht vorhanden:
      MsgBox "Text=" & .Text
    End If
  End With
End Sub


Private Sub Form_Load()
  'Konstanten (ggf. anpassen!)
  Const MDB = "E:\Programme\DevStudio\VB\NWind.MDB"
  Const SQL = "select CategoryName,CategoryID " & _
              "from Categories " & _
              "order by CategoryName"

  'Datenbank öffnen:
  Set db = OpenDatabase(MDB)

  'ComboBox füllen:
  FillCombo cmbCategories, SQL
End Sub


Private Sub Form_Unload(Cancel As Integer)
  'Datenbank schließen:
  db.Close
  Set db = Nothing
End Sub
Bei Auswahl eines Elements der ComboBox erscheint eine MessageBox, welche die entsprechende ID anzeigt. Wird in Form_Load die vorhandene Deklaration für SQL ersetzt durch
Const SQL = "select CategoryName from Categories " & _
            "order by CategoryName"
so erscheint statt der ID der korrespondierende Text - ohne den Code für das Füllen ändern zu müssen!

© Jost Schwider, 30.04.2000-30.04.2000 - http://vb-tec.de/fillcomb.htm