Newsgroup: it.comp.lang.visual-basic
Titolo: Query con maschere di bit

Ciao,
forse la domanda è banale...
ho la necessità di effettuare una query (su un MDB) facendo una maschera
di bit su un campo Long.
Per intenderci devo fare una cosa del tipo:
"Seleziona tutti i record tranne quelli in cui il 3° bit del campo Stato
 è a 1"
Ho provato con :
SELECT .... FROM ... WHERE (STATO AND 4) <> 4
ma non funge. (4 Dec = 00000100)
-- 
Tnx a lot!
Daniele.
Free As In Freedom
www.fsf.org

Barzo ha scritto:

Purtroppo JET ha alcuni liomiti:
1. Solo il SQL di Jet 4 (A00, AX) ha dei operatori logici.
2. BAND, BOR e BNOT non sono documentati.
3. Sono raggiungibili solo con OLEDB. Vuol dire nel codice
    con ADO. p.e. puoi eseguire lo tuo statement così:
CurrentProject.Connection.Execute "SELECT BitData BOR 2 From TableData"
O con un recordset. p.e.
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set cnn = CurrentProject.Connection
rs.Open "SELECT BitData BOR 2 AS Foo From TableData", cnn
Ciao
@Alex

 CurrentProject.Connection.Execute "SELECT BitData BOR 2 From TableData"
Quindi non ho modo di effettuare il controllo all'interno di un filtro,
ovvero settando la proprietà FILTER del Recordset?
-- 
Tnx a lot!
Daniele.
Free As In Freedom
www.fsf.org

Barzo ha scritto:

Dubito fortemente ma non ho verificato, se hai modo di provare mi
interessa
il risultato.
Io lavoro quasi esclusivamente con Access, ed in questo caso si può
ricorrere
all'uso di Funzioni lato Client(anche se rallentano molto, ma con JET
è poco significativo).
Ciao
@Alex

 ovvero settando la proprietà FILTER del Recordset?
Il FILTER usa la sintassi ADO (e non quella di Access), e non mi sembra 
proprio che abbia operatori binari.
Quello che puoi fare, è di estrarre alcune colonne aggiuntive già in 
fase di select, che contengano il risultato dei vari AND (cioè, avrai 
delle colonne Bit_0, Bit_1, Bit_2, ecc..., valorizzate 0 o 1).
Successivamente, comunque, il FILTER non ti offrirà particolari 
comodità, avendo grossi vincoli sull'utilizzo di AND e OR (come 
operatori logici).
Ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 ma non funge. (4 Dec = 00000100)
A parte quanto detto da altri, per verificare che un bit sia alto devi fare
(STATO AND 4) <> 0
altrimenti sarà sempre falso.
Ciao 

Fabio ha detto questo giovedì :

Beh, in realtà (STATO AND 4) vale proprio 4, se il bit è alto...


 Beh, in realtà (STATO AND 4) vale proprio 4, se il bit è alto...
Appunto, non potrà mai essere <> da 4 ;)
Ciao 

Fabio ha scritto:

Il Bit(3) varrà 1 quindi il Valore risultante dall'AND =4  solo se il
Bit(3) del campo STATO=1
pertanto a mio avviso è corretto.
@Alex

Fabio ci ha detto :

Non ti seguo...
Sarà <>4 quando il bit è basso.
L'OP faceva un esempio in cui voleva i record col bit 2 basso, e 
secondo me (STATO AND 4)<>4 andava benissimo...
Se vuoi quelli col bit alto, metterai = anzichè <>, ma non capisco la 
tua precisazione precedente (che non è sbagliata, cioè funziona anche 
con lo zero, ma non cambia niente, è come mettere un NOT davanti...)
Ciao


 con lo zero, ma non cambia niente, č come mettere un NOT davanti...)
Gli altri bit potrebbero influenzare la comparazione....
-- 
On a clear disk you can seek forever...
News 2000 [v 2.06] - 
http://www.akapulce.net/socket2000

 Gli altri bit potrebbero influenzare la comparazione....
Le possibilità sono solo due:
- O io non ho capito come funziona l'AND
- O tu hai sparato una minchiata enorme.
Adesso ci pensiamo tutti e due, poi ne riparliamo.


 Alberto
La 2° senza ombra di dubbio...!
Quanto dici è logica Booleana elementare
e mascherando in AND a ZERO non c'è influenza che tenga, l'aviaria
forse....
ma colpisce i polli...!!!!
@Alex

 il risultato.
Mmm..infatti è un bordello!
Ho dovuto abdicare aggirando il problema ed includendo due ulteriori campi!
-- 
Tnx a lot!
Daniele.
Free As In Freedom
www.fsf.org

 - O tu hai sparato una minchiata enorme.
No, è la terza :)
Ho sparato una minchiata enorme :P
Mi sono fatto imbrogliare dal poco ortodosso <> 4
Vado a ripassarmi le 4 operazioni elementari ;)
Ciao 

 
???? :)


 Mi sono fatto imbrogliare dal poco ortodosso <> 4
Devo confessare che anche io uso il <>0.
Ma ciò non toglie che non possa definire 'sbagliato' l'utilizzo del 
valore.
Io uso =0 o <>0, semplicemente per avere la costante non ridondante.
Ad esempio, per lo stato degli oggetti ADO (perchè .State è una 
maschera di bit), uso:
If (RS.State AND AdStateOpen)<>0 Then
If (RS.State AND AdStateFetching)<>0 Then
in modo da dover cambiare la costante solo in un punto.
Ma avrebbe funzionato allo stesso modo anche:
If (RS.State AND AdStateOpen)=AdStateOpen Then
If (RS.State AND AdStateFetching)=AdStateFetching Then
Oppure, altra formula che mi piace tantissimo:
If CBool(RS.State AND AdStateOpen) Then
If CBool(RS.State AND AdStateFetching) Then
Ciao


 
Bè, di solito si scrive:
If (RS.State AND AdStateOpen) Then
Senza usare né = né <>, che secondo me risulta ancora più semplice!
In effetti non so nemmeno io dove ho tirato fuori quel '<> 4'...a volte
la stanchezza! :)


 If (RS.State AND AdStateOpen) Then
Che è la versione 'implicita' di quello che ho scritto prima, ossia:
If CBool(RS.State AND AdStateOpen) Then
E siccome io esplicito sempre tutto...


 - O tu hai sparato una minchiata enorme.
L'ho sparata io, perchè non so come ero convinto di aver letto la 
formula (STATO = 4)
-- 
C:\WINDOWS C:\WINDOWS\RUN C:\PC\CRAWL 
News 2002 [v 2.07] / StopDialer / PopDuster - 
http://www.socket2000.com
Akapulce portal: 
http://www.akapulce.net