Salut
Je travaille avec Firebird 1.5 et, dans un table, j'ai un champ Varchar(1) qui peut tenir actif n'importe quel bit.
On peut savoir quel bit est actif dans une requête SQL?
Merci
Salut
Je travaille avec Firebird 1.5 et, dans un table, j'ai un champ Varchar(1) qui peut tenir actif n'importe quel bit.
On peut savoir quel bit est actif dans une requête SQL?
Merci
c'est possible d'avoir un peu plus de précisions ?
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
Oui, bien sur
Par exemple, le champ peut avoir ces valeurs:
00000001 - ça veut dire une chose
00000010 - ça veut dire une autre
00000100 - ça une autre en plus
....
10000000 - et ça une autre
C'est que je veux, est faire un case (o quelque chose comme ça) parce que la requête me renvoi, au lieu de ce varchar(1), une description. Quelque chose comme ça (que ne fonctionne pas, bien sur )
Merci en avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 select case champ when BitActif(1) then 'bit 1 actif' when BitActif(2) then 'bit 2 actif' .... end from table
A+
Salut.
Regarde du coté de l'UDF RFUNC, il y a pas mal de fonction sur les Bits dedans.
Bonne continuation
On progresse .....
Oui, bien sur, tout ça quan je réusiEnvoyé par yobenzen
Aujourd'hui j'ai fait autres choses "plus importantes". Mon chef... tu sais?
Salut Cadetill,
Dans ton problème, est ce qu'il n'y a qu'un bit qui est à 1 sur les 8 bits ou toute combinaison est possible?
A+
On progresse .....
Salut
Non, seulement 1 bit est à 1 parce qu'il indique le type du registre et n'a pas de sens que plusieurs bits sont à 1 (sauf s'il y a un erreur, bien sur)
A+
Salut
Bon, aujourd'hui j'ai fait quelques test avec la UDF proposé par Andry (RFUNC) et encore avec la UDF ib_udf qu'elle a aussi des fonctions pour la manipulation de bits
Le fonctionnement est le même: les fonctions on 2 parametres integer (les deux valeurs pour faire un XOR) et renvoie un autre integer (résultat du XOR)
Mais le "cast" me donne erreur (¿normal?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select bin_xor(cast(champ as integer), 2) from table
Peut être sera mieux me cree ma prope UDF?
Merci
mais de quel type est ton champ ?
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
Salut,
Je vois pas trop comment tu fait pour enregistrer dans '00000001' dans un varchar.
Porquoi ne pas faire le traitement dans l'application client.
A+
On progresse .....
pardon je n'avais pas vu
et comment tu fait pour stocker 00000100 dans un varchar(1) ?
c'est très fort ça !
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
ceci dit tu peux y arriver en stockant des puissance de 2 dans un champ integer
et en utilisant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 DECLARE EXTERNAL FUNCTION BIN_AND INTEGER, INTEGER RETURNS INTEGER BY VALUE ENTRY_POINT 'IB_UDF_bin_and' MODULE_NAME 'ib_udf';
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
Salut
@Andry et makowski: Je ne le fais pas, c'est un autre appli que le fait
@makowski: ja vais essayer pour cet côté
Merci
A+
Salut
Bon, a la fin je m'ai fait ma propre UDF.
J'ai fait une fonction que me renvoie le 1er bit a 1 (en théorie seulement 1 bit peut être a 1)
Bon, avec ça je peux savoir ce que je veux et je peux faire par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 function gf_FirstBitActif(aValue: PChar): integer; var OrdStr: byte; Temp: byte; i: integer; Str: string; begin Result := 0; Str := StrPas(aValue); if Str <> '' then begin OrdStr := Ord(Str[1]); for i := 1 to 8 do begin Temp := (OrdStr shr i) shl i; Temp := OrdStr xor Temp; if Temp <> 0 then begin Result := i; Break; end; end; end; end;
Merci a tous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 select case bitactif(c.zahlm) when 1 then 'Effectif' when 6 then 'Chèque' when 7 then 'Carte' when 8 then 'Talon' end from tiqcap c
A+
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager