Liebes Forum
ich habe eine Abfrage mit einem Datenfeld vom Typ Byte das ich als Kriterium verwenden möchte.
Als Kriterium möchte ich die einzelnen Bits ansprechen. Mit "And (2 ^0)" kann man ja bekanntlich ein einzelnes Bit auslesen. Wie formuliere ich das in einer Access Abfrage?
Der folgende Code in der Abfrage liefert mir alle Datensätze die irgendein Bit gesetzt haben.
Danke für Eure Hilfe
Ausdruck1: [abt] And (2 ^0)
Hallo,
der Datentyp Byte bei Access speichert Zahlen von 0-255 (256 Werte = 2^8). Insofern ist die Bitfolge eine Zahl zwischen 0 und 255.
Was Du jetzt mit den Bits erreichen willst verstehe ich jetzt nicht.
2^0 = 1, daher sieht ja eigentlich Dein Ausdruck so aus:
Ausdruck1: [abt] And 1
Zitat von: vittorio0 am Januar 22, 2012, 22:33:19
Als Kriterium möchte ich die einzelnen Bits ansprechen.
Moin,
im Anhang gibt es eine Abfrage, die überprüft, ob ein bit gesetzt ist.
War es das, was Du suchst?
Harald
[Anhang gelöscht durch Administrator]
Hallo,
ich tue mir gerade schwer das zu verstehen. Was natürlich auch an mir liegen kann. ;D
Bei jeder Eingabe >0 wird mindestens ein Bit gesetzt.
Bit1 =128
Bit2 = 64
Bit3 = 32
Bit4 = 16
Bit5 = 8
Bit6 = 4
Bit7 = 2
Bit8 = 1
Wenn ich also wissen will, ob ein Bit gesetzt ist, muss ich doch nur wissen ob die Eingabe >0 ist.
Hallo,
auch mein Senf:
Public Function IsBitOn(Number As Long, BitNr As Long) As Boolean
IsBitOn = Number And 2 ^ BitNr
End Function
liefert True, wenn das Bit in "Number" an der angegebenen Position ("BitNr") gesetzt ist,
wobei 0 in BitNr das erste (rechte) Bit kennzeichnet.
Hallo,
jetzt eine Verständnisfrage von mir zur "and-Funktion".
Wenn ich die Zahl (byte) 5 als Dual-Zahl darstellen, erhalte ich "0101" = 0 * 8 + 1 * 4 + 0 * 2 + 1 * 1 = 5
Wenn ich das mit obiger Syntax in der Art "Zahl and 8" schreibe, resultiert in der access-Abfrage "-1".
Bei
5 : 0101
8 : 1000
---------- mit bit-weisem "and"-Verknüpfen
0000 hatte ich aber erwartet: also 0.
Wo liegt mein Denkfehler?
Harald
Hallo,
Zeige mal ausführlich, welche Abfrage (SQL-String) Du nun meinst..
Hi Franz,
siehe obiger Anhang:
- Ausdruck3 bzw Ausdruck 4 in der Abfrage, die da lautet:
SELECT Tabelle1.D, fuellen(d_to_b([D])) AS B, Bit_gesetzt([B ],1) AS Ausdr1, Bit_gesetzt([B ],2) AS Ausdr2, [d] And 1 AS Ausdr3, [d] And 2 AS Ausdr4
FROM Tabelle1;
Harald
PS habe hier bei [B ] ein Leerzeichen eingefügt, damit das Foren-Programm das nicht als Anweisung zum Fettschreiben mißversteht
Hallo,
mhmm, ich befürchte, dass "And" in einem SQL-Liste-Ausdruck anderes interpretiert/ausgeführt wird als der And-Operator in VBA....
Habe keine Beschreibung darüber in Jet-SQL-Spezifikationen gefunden.
Hi Franz,
danke für die Antwort.
... dann brauche ich ja nicht so kompliziert zu denken wie im Modul vom obigen Anhang ;D
Harald
"Was Du jetzt mit den Bits erreichen willst verstehe ich jetzt nicht."
Ich habe ein Artikelstamm. Diese Artikel sollen in bis zu 8 Gruppen zugewiesen werden. Dabei kann ein Artikel in mehreren Gruppen vorkommen. Also Artikel yx kommt in Gruppe0 und Gruppe7 vor, so Bit 0 und Bit 7 wird gesetzt.
Mit der Abfrage muss ich nun alle Artikel rausziehen die Bit0 oder eins der 8 Bits gesetzt haben.
Danke allen für Eure Hilfe, die Funktion IsBitOn von Franz hat mein Problem gelöst.
Hallo,
ich halte das für keine gute Lösung, ich halte das eher für Murks. Das ist eine klassische n:m Beziehung und sollte demzufolge mit einer Zwischentabelle und 2 1:n Beziehungen gelöst werden. Sobals Du irgendwann mal 9 Gruppen hast, geht das sowieso nicht mehr.
Wie kommst Du eigentlich an die Text der Gruppen, wenn Du mal eine Abfrage haben willst mit den Klartexten der Artikel und der Gruppen?
Über kurz oder lang wirst Du das jetzige Konstrukt bedauern, weil es unflexibel und problematisch in der Handhabung ist.