BCD-Code erleichtert die Auswahl von Entitäten

By , 15. April 2012

BCD-Code ist vielen sicherlich noch von früher aus dem Informatikuntericht bekannt. Ich kam damit das erste mal während meiner Ausbildung duch BCD-Codierschalter in Berührung. Beim BCD-Code wird jede Ziffer einer Dezimalzahl einzeln dualkodiert. BCD-Code wird auch 8-4-2-1 Code genannt, weil die zweierpotenzen diese Ziffern ergeben. Damit lässt sich jede Ganzzahl darstellen.

Beispiel: 14: 8+4+2 oder 22: 16+4+2 usw.

Wie nützt uns jetzt dies bei Access? Der Aufbau des Codes hat auch einen zusätzlichen Effekt. Und zwar ist jede Zahl im Code (1, 2, 4, 8, 16….) größer als die Summe aller darunter liegender Zahlen, und zwar immer genau um 1 größer. Beispiel: 64 > 32+16+8+4+2+1.

Wenn man jetzt einen Enum Definiert dann nicht mehr mit 1, 2, 3…. sondern mit 1, 2, 4…

Ich glaub ich mach jetzt am besten erst mal ein Beispiel:

Option Explicit

Private Enum eAuswahl
    vbArbeiter = 1
    vbAngestellte = 2
    vbTechniker = 4
    vbführungskräfte = 8
    vbBerater = 16
    vbAlle = 32
End Enum

Das Beispiel zeigt wie man verschiedene Mitarbeitergruppen einer Firma auswählt. Dazu erstellen wir jetzt zuerst eine Prozedur „Auswahl“. Dieser Prozedur möchten wir übergeben welche Gruppen z.B. zu einem Meeting eingeladen werden sollen.

Private Sub Auswahl(ByVal Wahl As eAuswahl)
    If nz(Wahl, 0) < 1 Then Exit Sub
    Do While Wahl > 0
        Select Case Wahl
            Case Is >= vbAlle
                Einladen "Alle"
                Wahl = Wahl - vbAlle
            Case Is >= vbBerater
                Einladen "Berater"
                Wahl = Wahl - vbBerater
            Case Is >= vbführungskräfte
                Einladen "Führungskräfte"
                Wahl = Wahl - vbführungskräfte
            Case Is >= vbTechniker
                Einladen "Techniker"
                Wahl = Wahl - vbTechniker
            Case Is >= vbAngestellte
                Einladen "Angestellte"
                Wahl = Wahl - vbAngestellte
            Case Is >= vbArbeiter
                Einladen "Arbeiter"
                Wahl = Wahl - vbArbeiter
            Case Else
                Exit Sub
        End Select
    Loop
End Sub

Bevor wir ins Detail gehen möchte ich die aufrufende Test-Prozedur zeigen, wodurch obige Struktur vieleicht deutlicher wird:

Private Sub test()
    Auswahl vbArbeiter + vbTechniker + vbAngestellte
End Sub

Da die Konstantenausdrücke in einem Enum immer vom Typ Long sind, spricht ja nichts dagegen diese einfach aufzusummieren. Es wird euch vieleicht bekannt vorkommen, denn wenn ihr eine msgbox erstellt könnt ihr die Parameter auch einfach addieren. Bsp: vbInformation + vbOkOnly

Kommen wir zur Prozedur Auswahl. Sie enthält eine Schleife die so lange läuft wie Wahl größer 0 ist. Damit keine Endlos-Schleife entsteht muss Wahl vermindert werden, und zwar um den Wert der zuvor im Select Case ermittelt wurde. Die Select-Klausel ist so zu gestalten dass zu oberst die größte Zahl abgeprüft wird, und darunter dann absteigend sortiert bis zur kleinsten Zahl (1). Nur so funktioniert der Algorithmus.
Im Beispiel übergebe ich die Zahl 7 (1+2+4). Dann wird zuerst geprüft ob die 32 hinein passt. danach wird auf die 16 geprüft, auf die 8 und dann auf die 4. Da 7 >= 4 ist, werden die Techniker eingeladen und der Schleifenzähler Wahl um 4 reduziert. D.H. danach ist Wahl = 3. Im nächsten Schleifendurchlauf wird bis bis zur 2 herunter geprüft und die Angestellten eingeladen. Wahl wird reduziert auf 1 und im nächsten Schleifendurchlauf wird wieder geprüft und bei 1>=1 werden die Arbeiter eingeladen. Der Schleifenzähler wird auf 0 gesetzt und die Schleife beendet sich.

Der Vollständigkeit sei hir noch die Prozedur Einladen genannt:

Private Sub Einladen(ByVal Mitarbeitergruppe As String)
    MsgBox Mitarbeitergruppe & " der Einladungsliste hinzugefügt"
End Sub

Ich denke ich habe es euch anschaulich zeigen können welchen Nutzen der BCD-Code bringt. Dadurch kann ich mittels Addition mehrere Elemente eines Enums an die verarbeitende Prozedur übergeben. Wenn ihr auf diese Verkettung verzichten könnt bringt es euch keinen Mehrwert. Ich finde es sehr gut dass man auf diese Weise auf einfachste Weise verschiedene Gruppen bilden kann und diese durch nur 1 Angabe an eine Prozedur übergeben kann, wie z.B. auch alle Gruppen.

Bis dahin
© 2012 Andreas Vogt

OfficeFolders theme by Themocracy