AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL ORDER BY mit Bitoperation
Thema durchsuchen
Ansicht
Themen-Optionen

SQL ORDER BY mit Bitoperation

Ein Thema von e-gon · begonnen am 6. Dez 2013 · letzter Beitrag vom 6. Dez 2013
Antwort Antwort
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#1

SQL ORDER BY mit Bitoperation

  Alt 6. Dez 2013, 14:11
Datenbank: MS Access • Version: 2003 • Zugriff über: ADO
Hallo!

Vielleicht kann mir jemand bei folgendem Problem helfen. Eine MS Access-Datenbank mit einer Tabelle namens BENUTZER mit drei Feldern.
1. ID
2. Benutzer
3. Berechtigung (Bit 1-Admin, Bit 2-Benutzer, Bit 3-Programmierer) - Mehrfachnennung möglich!

Die Abfrage funktioniert bezüglich der Bitoperationen wie gewünscht:
Code:
SELECT BENUTZER.Benutzer
FROM BENUTZER
WHERE (BENUTZER.Benutzer="Thomas") OR (BENUTZER.Berechtigung & 1>0) OR (BENUTZER.Berechtigung & 4>0);
Jetzt bräuchte ich in dieser Abfrage allerdings auch eine zusätzliche Spalte Sortierung anhand die abgefragten Berechtigungsbits abgebildet und nach denen sortiert werden soll:
Code:
SELECT BENUTZER.Benutzer, (INT([BENUTZER].[Berechtigung] & 1) + INT([BENUTZER].[Berechtigung] & 4)) AS Sortierung
FROM BENUTZER
GROUP BY BENUTZER.Benutzer, Sortierung
HAVING (BENUTZER.Benutzer="Thomas") OR (BENUTZER.Berechtigung & 1>0) OR (BENUTZER.Berechtigung & 4>0)
ORDER BY Sortierung;
Doch statt 1, 4 oder 5 steht im Feld Sortierung immer "14", also der Text "1" und "4" zusammen.

Wie kann ich die Summe dieser Bitoperation erhalten?

Gruß
e-gon
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: SQL ORDER BY mit Bitoperation

  Alt 6. Dez 2013, 14:16
Sieht so aus, dass tatsächlich eine String Konkatenierung stattfindet. Schon mal explizite Typkonvertierung zu Int über das Bit AND gelegt?
Prüfbar wäre es ja auch, wenn man mit anderen Operanden arbeitet, sodass 0 rauskommen muss. Ergebnis wäre dann bspw "04" oder so.

P.S.:
Der Spaltentyp müsste natürlich auch String bzw. Varchar anzeigen, damit wäre das dann belegt.
Gruß, Jo
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: SQL ORDER BY mit Bitoperation

  Alt 6. Dez 2013, 14:25
Hallo Jo,

danke für die schnelle Antwort!

Wie meinst Du das mit der expliziten Konvertierung zu Int? Das habe ich doch bereits in der Abfrage
Code:
INT([BENUTZER].[Berechtigung] & 1)
gemacht, oder nicht?

Das tut jedenfalls auch nicht:
Code:
INT(INT([BENUTZER].[Berechtigung]) & INT(1))
Gruß
e-gon
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: SQL ORDER BY mit Bitoperation

  Alt 6. Dez 2013, 15:04
Sorry, das war Blödsinn. Ich bin mit den Code Fenstern durcheinander gekommen.
Was sagt denn der Spaltentyp von Sortierung?
Und was sagt der Spaltentyp bei einer Bit And Operation?

falls es (trotzdem) ein Texttyp ist:
Alternativ 1 kannst Du statt INT ggF. Clng oder CDbl versuchen.
Alternativ 2 kannst Du mit eine Pseudo Substraktion vielleicht einen Zahlentyp erzwingen: (([FeldWert] & xy)-0) + (([FeldWert] & z)-0)
usw.
Das Minus hat sehr Wahrscheinlich keine typabhängige Überladung.
Gruß, Jo

Geändert von jobo ( 6. Dez 2013 um 15:12 Uhr)
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: SQL ORDER BY mit Bitoperation

  Alt 6. Dez 2013, 15:53
Der Spaltentyp von Sortierung ist Zahl.

Bei einer Bit AND-Operation kommt für alle Datensätze, bei denen eine der Möglichkeiten oder beides zutrifft, -1 ansonsten 0 heraus.
Code:
(INT([BENUTZER].[Berechtigung] AND 1) + INT([BENUTZER].[Berechtigung] AND 4)) AS Sortierung
Und CInt oder CDbl haben leider genauso wenig Wirkung wie eine pseudo Subtraktion!

Ich werde noch wahnsinnig!

Gruß
e-gon
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: SQL ORDER BY mit Bitoperation

  Alt 6. Dez 2013, 18:32
Der Spaltentyp von Sortierung ist Zahl.

Bei einer Bit AND-Operation kommt für alle Datensätze, bei denen eine der Möglichkeiten oder beides zutrifft, -1 ansonsten 0 heraus.
Genau das ist das Problem!

Code:
(abs(INT([BENUTZER].[Berechtigung] AND 1))*1 + abs(INT([BENUTZER].[Berechtigung] AND 4)*4) AS Sortierung
Versuch es mal so

Gruß
K-H

P.S. Access ist doch für Masochisten
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: SQL ORDER BY mit Bitoperation

  Alt 6. Dez 2013, 19:00
Hallo K-H,

die Idee war gut! Doch leider scheint der "AND"-Operator nicht das zu sein, was er sein müsste!

Code:
[BENUTZER].[Berechtigung] AND 1
bringt für ALLE Werte von Berechtigung > 0 eine -1!!!

Was für ein Mist dieses Access!!!

Zitat:
P.S. Access ist doch für Masochisten
Wem sagst Du das!

Gruß
e-gon
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: SQL ORDER BY mit Bitoperation

  Alt 6. Dez 2013, 19:33
Das AND in SQL erzeugt wohl immer True/False und ist kein BitAnd.
Das "&" scheint analog dem "&" in Excelformeln zu funktionieren, also Concatenation.
Ein BitAnd oder BAND scheint es nicht (mehr) zu geben.

Ein selbstgebaute VBA Function mit:
Code:
Public Function BitwiseAndQuery(a, b As Integer) As Integer
    BitwiseAndQuery = a And b
End Function
funktioniert aber und kann in einer Abfrage verwendet werden, um mit den Ergebnissen weiterzurechnen.

select BitwiseAndQuery(1,4) ;
>0
select BitwiseAndQuery(5,4) ;
>4
Gruß, Jo
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: SQL ORDER BY mit Bitoperation

  Alt 6. Dez 2013, 20:08
Hallo jobo!

Vielen Dank für die Hilfe! Damit funktioniert es endlich!

Gruß
e-gon
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz