Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Definire 4 entita Si/No con un solo Smallint

  1. #1
    L'avatar di nman
    nman non è in linea Topo di biblioteca
    Vi pongo una domanda di logica (non so se questa è la sezione giusta ma ci provo)

    devo definire 4 entità per esempio:
    - alto/basso
    - grasso/magro
    - bello/brutto
    - maschio/femmina
    (NB: Non si tratta di un sito di incontri, e solo il primo esempio che mi è venuto in mente)

    Avrei bisogno di una tabella con 4 campi booleani, ma il DataBase (SQLServer) non fatto da me mi lascia disponibile solo 1 campo Smallint (quindi un numerico)

    In tutto ci sono 16 possibili combinazioni (2 x 2 x 2 x 2)

    La domanda è:
    Quale è secondo voi la logica migliore per estrarre da 1 solo numero quelle 4 entita

    Grazie

  2. #2
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Quote Originariamente inviato da nman Visualizza il messaggio
    Avrei bisogno di una tabella con 4 campi booleani, ma il DataBase (SQLServer) non fatto da me mi lascia disponibile solo 1 campo Smallint (quindi un numerico)

    In tutto ci sono 16 possibili combinazioni (2 x 2 x 2 x 2)

    La domanda è:
    Quale è secondo voi la logica migliore per estrarre da 1 solo numero quelle 4 entita

    Grazie
    Devi usare le potenze del 2 quindi :
    - campo1 2^0 = 1
    - campo2 2^1 = 2
    - campo3 2^2 = 4
    - campo4 2^3 = 8

    Per estrarre il singolo bit dal campo devi usare l'AND quindi se tu dovessi estrarre il campo3 (il cui bit vale 4) devi fare un'operazione simile (compatibilmente con la sintassi) :
    campo3 = (campodb AND 2^2) = 2^2

    Per costruire invece il campodb partendo dai singoli bit devi usare l'OR ...

  3. #3
    Ogni bit una informazione

    bit 0 alto/basso
    bit 1 grasso/magro
    bit 2 bello/brutto
    bit 3 maschio/femmina

    primo valore a 0 e secondo valore a 1

    Quindi un maschio, brutto, grasso, basso

    0 1 0 1 => 0+4+0+1 => 5
    ℹ️ Leggi di più su AntonioG ...

  4. #4
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Da codice per poi semplificare
    Public Enum eStyle
        Normale=-1
        Basso = 0
        Alto=1
        Magro = 2
        Grasso=3
        Brutto = 4
        Bello=5
        Maschio=6
        Femmina= 7
    End Enum
    Elemento=NOT eStyle.Femmina+eStyle.Brutto...
    
    Stessa cosa per estrarre in mascherata binaria...
    Maschio=ValoreStylw AND eStyle.Maschio
    
    Adesso abbiamo coperto tutto. .
    ℹ️ Leggi di più su @Alex ...

  5. #5
    Alex... così non può determinare le varie combinazioni con una maschera
    ℹ️ Leggi di più su AntonioG ...

  6. #6
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Quote Originariamente inviato da AntonioG Visualizza il messaggio
    Alex... così non può determinare le varie combinazioni con una maschera
    Certo infatti ho detto da codice..., ma in realtà bastano i valori di esponente base 2 come detto da max...
    Magari ho frainteso quello che dici...?
    Di fatto è solo un modo più comodo per mascherare il numero equivalente decimale...
    Se voglio come nel tuo esempio : maschio, brutto, grasso, basso
    Maschera=eStyle.Basso + Not eStyle.Magro + eStyle.Brutto + eStyle.Maschio=12=1100
    
    Secondo me equivale al tuo esempio dove maschio sarebbe stato 3°bit non 1 ma 8(2 alla 3°) quindi sommato al 4=12...

    Boh magari ho capito male io.
    Ultima modifica di @Alex; 13-06-2021 15:18 
    ℹ️ Leggi di più su @Alex ...

  7. #7
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    A chiarezza della cavolata detta... si può gestire solo il BitMask, con l'OR degli Enum, ma non la somma dei valori per coprire le 16 possibilità...!

    Public Enum eStyle
        Normale=0
        Alto=1			0001
        Grasso = 2		0010
        Bello=4		0100
        Maschio=8		1000
    End Enum
    
    ℹ️ Leggi di più su @Alex ...

  8. #8
    Ultima correzione

    Undef=0
    ℹ️ Leggi di più su AntonioG ...

  9. #9
    L'avatar di nman
    nman non è in linea Topo di biblioteca
    Grazie a tutti,
    la idea della conversione in binario è stata "illuminante"

    Alla fine considerato che non sto usando VBA (scusatemi non lo avevo detto) ma bensi TSQL
    me la sono cavata con una semplice formulina la cui logica è:
    - Scrivo direttamente nel mio campo Smallint il valore binario in quanto con 4 scelte arrivo a 1111 mentre nello Smallint posso arrivare fino a 32000
    - Converto il numero spora in stringa
    - Ci metto davanti una stringa di Zeri fino a che non sia lungo 4 caratteri
    - ogniuno di questi 4 caratteri 0/1 rappresenta una delle mie 4 entita

    Detto in codice per trovare per esempio la entita faccio cosi:

    SUBSTRING(RIGHT (N'0000' + CONVERT (nvarchar, NomeCampoSmallint), 4), 3, 1)

    .
    Ultima modifica di nman; 15-06-2021 19:21 

  10. #10
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Quote Originariamente inviato da nman Visualizza il messaggio
    Grazie a tutti,
    la idea della conversione in binario è stata "illuminante"

    Alla fine considerato che non sto usando VBA (scusatemi non lo avevo detto) ma bensi TSQL
    me la sono cavata con una semplice formulina la cui logica è:
    - Scrivo direttamente nel mio campo Smallint il valore binario in quanto con 4 scelte arrivo a 1111 mentre nello Smallint posso arrivare fino a 32000
    - Converto il numero spora in stringa
    - Ci metto davanti una stringa di Zeri fino a che non sia lungo 4 caratteri
    - ogniuno di questi 4 caratteri 0/1 rappresenta una delle mie 4 entita

    Detto in codice per trovare per esempio la entita faccio cosi:

    SUBSTRING(RIGHT (N'0000' + CONVERT (nvarchar, NomeCampoSmallint), 4), 3, 1)

    .
    Bene che hai risolto però ci sono delle 'imprecisioni' ...

    Con un campo smallint (2 bytes / 1 word) puoi memorizzare un array di 16 bit (se il campo è di tipo signed il bit del segno potrebbe essere rognoso da gestire). Se ragioni in binario NON memorizzi fino a 32000 ma memorizzi 1111 1111 1111 1111 (4 gruppi di 4 bit volutamente separati da uno spazi solo per chiarezza). Ovvio che il campo, se gestito come smallint (ovvero numerico), può contenere un numero fino a 65535 (se unsigned).

    Diciamo che in questo contesto l'aver trasformato la somma di bit
    in una stringa può aver un suo perché : nel mio mondo (ovvero i PLC)
    quest'operazione sarebbe considerata folle (oltre che controproducente).

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. lan e wan, definire ip
    Da mobile75 nel forum Networking e sicurezza
    Risposte: 7
    Ultimo Post: 18-01-2021, 17:07
  2. Decisione sul'entità principale in un DB
    Da Diego1966 nel forum Microsoft Access
    Risposte: 3
    Ultimo Post: 01-04-2019, 14:49
  3. Modello entità relazione
    Da Paolodocet nel forum Altri Database Server
    Risposte: 1
    Ultimo Post: 13-04-2014, 18:17
  4. Risposte: 1
    Ultimo Post: 04-06-2011, 22:04
  5. VB6 - ciclo da definire
    Da Louis nel forum Visual Basic 6
    Risposte: 11
    Ultimo Post: 03-05-2005, 16:29