Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Neueste Beiträge

#11
Tabelle/Abfrage / Re: Access SQL: Konvertierung ...
Letzter Beitrag von hajott - April 03, 2026, 14:56:21
Hallo Knobbi,

die Grundlagen der Datentypen beherrsche ich eigentlich. Dass "Binär" nur eine 0 und 1 speichern kann, vergleichbar mit BOOLEAN, hätte ich mir bei längerem Nachdenken auch herleiten können, aber ich war verzweifelt auf Suche und griff danach als scheinbaren Strohhalm. Eigentlich logisch, denn wenn dieser Datentyp nicht über die Bedieneroberfläche definierbar ist sondern nur über VBA, wird das Gründe haben.

Die Funktion von Jens reicht für meine Zwecke mehr als aus, weil der übergebende Wert stabil eine Dezimalzahl zwischen 1 und 16.383 ist. Auch ein NULL muss nicht behandelt werden, die nicht zutreffenden Einträge wurden vorher schon herausgejoint.

Ob die Binärkodierung wirklich sonnvoll ist, ist eine wichtige Frage, die aber dahin gestellt bleiben kann, denn es soll genau so.

Dir auch herzlichen Dank

Hans-JÜrgen
#12
Tabelle/Abfrage / Re: Access SQL: Konvertierung ...
Letzter Beitrag von hajott - April 03, 2026, 14:44:39
Hallo Jens,

vielen Dank für deine Augen-öffnende Nachricht. Ich hab vor vielen Jahren mal gehört, dass man in VBA Funktionen definieren kann, die man dann aus SQL aufruft. Aber das hatte ich schlicht vergessen, weil ich bisher nie eine Funktion brauchte, die nicht schon serienmäßig eingebaut ist.

Dann: Sorry für meine Nachricht "Die Quelle hab ich auch gefunden". Ich dachte, es wäre der VBA-Code, den ich im Netz gesehen habe. Beim zweiten Hinsehen merkte ich dann - an der 14 - dass du den für mich schon angepasst hattest.

Falls es dich interessiert: Ich habe den Code an zweieinhalb Stellen angepasst:
- Durch den Abbruch bei Zahl = 0 ergeben sich unterschiedlich lange Strings, und das rechtsbündige Auffüllen ist da kontraproduktiv ;-) Ich zähle daher von 1 bis 14 und habe am Ende nur Nullen
- In der Zeile
Ergebnis = (Zahl Mod 2) & Ergebnis habe ich die Reihenfolge der Operatoren getauscht, damit die kleinste Zahl links steht
- Den Teil mit Zahl = 0 konnte ich weglassen, dass ist durch die vorherigen Abfragen ausgeschlossen (=Schichten, die in den nächsten zwei Wochen keine Arbeitstage haben, sind gar nicht verzeichnet)

Ich habe noch meinen "Minimalismus-Filter" angewendet und die Funktion sieht jetzt so aus:
Function DECTOBIN(dec As Long) As String
Dim count As Byte

    DECTOBIN = ""
    For count = 1 To 14
        DECTOBIN = DECTOBIN & dec MOD 2
        dec = dec \ 2
    Next
   
End Function

Ich hab das hier reinkopiert, falls jemand das anderweitig benötigt. Und das Beste: Es klappt einwandfrei!

Danke! :D

Hans-Jürgen
#13
Access Programmierung / Re: Datensätze filtern per But...
Letzter Beitrag von Knobbi38 - April 03, 2026, 14:42:57
Hallo,

das funktioniert aber nur, wenn die Felder mit Sicherheit keinen Zeitabteil enthalten, was ja vorkommen kann. Deshalb vielleicht eine leicht modifizierte Variante (Pseudocode):
    dim strCriteria as String

    dtVon = DateSerial(lngJahr, 1, 1)
    dtBis = DateSerial(lngJahr + 1 , 1, 1)

    strCriteria = "Buchungsdatum >= " & format$(dtVon, "\#mm\/dd\/yyyy\#" ) _
                &  " AND " _
                & "Buchungsdatum < "  & format$(dtBis , "\#mm\/dd\/yyyy\#" )"
    Me.Filter = strCriteria
Damit wird dann das ganze Jahr auf jedenfall berücksichtigt.

Siehe auch https://codekabinett.com/rdumps.php?Lang=1&targetDoc=datum-uhrzeit-datentyp-vba-access

Warum eigentlich keine Kombobox?

Knobbi38

#14
Tabelle/Abfrage / Re: Access SQL: Konvertierung ...
Letzter Beitrag von Knobbi38 - April 03, 2026, 14:01:13
Hallo Hans-Jürgen,

du solltest dich dringend noch einmal mit den Datentypen beschäftigen. Dann sollte dir klar sein, dass der Datentyp Bit nur die Werte 0 und 1 aufnehmen kann, aber keinen Zahlenwert von 37.
Der Dezimaldatentyp ist ebenfalls für eine binäre Auswertung ungeeignet. Das sind Grundlagen!

Wenn du also binär etwas kodieren möchtest, bleibt dir der Datentyp Long, wobei das MSB das Vorzeichen repräsentiert, oder du kannst auch auf einen String ausweichen, dann können die Bits anders kodiert werden.

Eine Funktion für die Umwandlung einer Zahl in die Binärdarstellung gibt es in SQL nicht, das geht nur über den Umweg VBA. Was du machen kannst ist, deine Datenbank auf SQL-92 zu konvertieren. Dann werden binäre Operatoren wie BAND, BOR usw. unterstützt.

Beispiel:
Gegeben sei eine Tabelle mit dem Feld "Wert" (LONG INTEGER) mit den Datensätzen mit Wert := 0-15 .
Dann kannst du mit
SELECT Wert, WERT BAND 2
FROM Tabelle1
WHERE (WERT BAND 2) = 2
alle Datensätze ermitteln, wo in WERT das BIT1 (BITS 0-15 von rechts nach links gezählt) gesetzt ist.

Jens hat dir ja schon aufgezeigt, wie man prinzipiell eine VBA Funktion in SQL verwenden kann, aber die angegebene  Funktion DezimalNachBinaer() ist in der Form nur bedingt zu gebrauchen, weil weder NULL noch das MSB-Bit eines Longs behandelt werden. Außerdem ist das nicht gerade die schnellste Methode, um so etwas in VBA zu implementieren. Aber es geht ja erstmal nur um das Prinzip - optimieren kann man später nochmal.

Unabhängig davon sollte man sich vielleicht mal überlegen, ob so für deine Problemstellung überhaupt eine Binärkodierung in der DB verwendet werden sollte, oder ob es da nicht doch noch eine andere Möglichkeit gibt. So ganz kann ich deiner Problemdarstellung noch nicht folgen.

Knobbi38

PS:
Hier ein Link für optimierte Umrechnungen von Long nach Binärdarstellung als String.  Die Versionen  LongToBit07() oder LongToBit08() von PeterNierop sind wahrscheinlich am besten geeignet. Für die Verwendung in SQL sollte aber noch die Behandlung von NULL Werten eingebaut werden:
http://www.xbeat.net/vbspeed/c_LongToBit.htm
#15
Tabelle/Abfrage / Re: Access SQL: Konvertierung ...
Letzter Beitrag von jens05 - April 03, 2026, 13:30:58
Hallo
wenn du in der Entwurfsansicht der Abfrage bist, gehe in eine neue Spalte und füge dort

BinCode: DezimalNachBinaer([NamedeinesZahlenfeldes])

Alternativ als SQL Sicht der Abfrage
SELECT
    *,
    DezimalNachBinaer ([NamedeinesZahlenfeldes]) AS BinCode
FROM
    NameDeinerTabelle 


Die obigen Funktion "Function DezimalNachBinaer(ByVal Zahl As Long) As String" in ein Modul einfügen (Alt+F11), dann im Menü: Einfügen->Modul

#16
Tabelle/Abfrage / Re: Access SQL: Konvertierung ...
Letzter Beitrag von hajott - April 03, 2026, 13:18:19
Hallo Jens,

vielen Dank, die Quelle hab ich auch gefunden. Es ist aber eine Funktion in VBA, die ich nicht in meine SQL-Abfrage implementieren kann (ich wüsste jedenfalls nicht, wie)

Viele Grüße

Hans-Jürgen
#17
Tabelle/Abfrage / Re: Access SQL: Konvertierung ...
Letzter Beitrag von jens05 - April 03, 2026, 10:48:17
Hallo,
schau mal ob dir dies weiterhilft
Function DezimalNachBinaer(ByVal Zahl As Long) As String
    Dim Ergebnis As String

    If Zahl = 0 Then
        DezimalNachBinaer = "0"
        Exit Function
    End If

    Ergebnis = ""
    Do While Zahl > 0
        Ergebnis = (Zahl Mod 2) & Ergebnis
        Zahl = Zahl \ 2
    Loop

    DezimalNachBinaer = Ergebnis & String(14 - Len(Ergebnis), "0")

End Function
#18
Access Programmierung / Re: Datensätze filtern per But...
Letzter Beitrag von jens05 - April 03, 2026, 09:47:14
Hallo,
für deinen Buttonwunsch, und einem entsprechenden Formularfilter ginge folgendesPrivate Sub FilterNachJahr(ByVal lngJahr As Long)

    Dim dtVon As Date
    Dim dtBis As Date

    dtVon = DateSerial(lngJahr, 1, 1)
    dtBis = DateSerial(lngJahr, 12, 31)

    Me.Filter = "[Buchungsdatum] BETWEEN #" & _
                Format(dtVon, "mm\/dd\/yyyy") & "# AND #" & _
                Format(dtBis, "mm\/dd\/yyyy") & "#"

    Me.FilterOn = True

End Sub
Jetzt könntest du Buttons benutzen die die Prozedur aufrufen Private Sub cmd2024_Click()
    FilterNachJahr 2024
End Sub
Die Verwendung von Where year(DeinDatumsfeld) = " & lng_Kal_Jahr & " ggf. noch order by .. etc."würde eine Indexnutzung des Feldes verhindern ;-)
#19
Access Programmierung / Re: Datensätze filtern per But...
Letzter Beitrag von werner budde - April 02, 2026, 20:03:24
Meine Empfehlung:

Deklariere im Deklarationsteil Deines Formularcodes eine Variable:
Dim lng_Kal_Jahr as long
  • Lege eine neue Hilfstabelle mit einem Feld [Kalenderjahr] an, einmalig zu befüllen mit den für Dich relevanten Kalenderjahren 19xx bis 20xx.
  • Diese Hilfstabelle soll dann die Datenherkunft eines einfachen Kombi- oder Listenfeldes in Deinem Formular sein
  • Die eigentliche Abfrage zu Deinem Formular in der SQL-Ansicht ungefähr so aufbauen:
      "Select DeineFelder from DeineTabelle Where year(DeinDatumsfeld) = " & lng_Kal_Jahr & " ggf. noch order by .. etc."
  • Bei Auswahl (AfterUpdate) eines Eintrages im Kalenderjahr-Kombifeld 2 Dinge:
lng_Kal_Jahr = me.Kombifeld
 me.requery


Nicht getestet, aber der Ansatz müsste so gehen.
#20
Tabelle/Abfrage / Re: Access SQL: Konvertierung ...
Letzter Beitrag von hajott - April 02, 2026, 18:31:28
Hehe, manchmal muss man vielleicht das Problem auch nur aufschreiben, um selbst auf ne Idee zu kommen... ihr seid da sozusagen meine Therapiegruppe...

Also den Workaround könnte man (vereinfacht und nicht mathematisch ausgedrückt) so machen:

BIN = IIF(DEC geprüft auf Teilerbedingung 2^0,'X','-') &
      IIF(DEC geprüft auf Teilerbedingung 2^1,'X','-') &
      IIF(DEC geprüft auf Teilerbedingung 2^2,'X','-') usw

Also man kriegts "hässlich" irgendwie hin. Bleibt die Frage: Gibt es auch eine elegante Lösung der Konvertierung?