Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Débuter
Débuter Forum d'entraide pour débuter avec Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/06/2006, 13h57   #1
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
Par défaut Chercher par bits

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
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2006, 18h25   #2
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
c'est possible d'avoir un peu plus de précisions ?
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2006, 09h15   #3
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
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 )

Code :
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
Merci en avance

A+
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2006, 13h47   #4
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
Salut.
Regarde du coté de l'UDF RFUNC, il y a pas mal de fonction sur les Bits dedans.

Bonne continuation
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2006, 16h41   #5
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
Merci, je le fait maintenant
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2006, 17h17   #6
Rédacteur
 
Inscription : janvier 2004
Messages : 2 123
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : janvier 2004
Messages : 2 123
Points : 1 977
Points : 1 977
cadetill, ca serait possible de proposer une réponse (exemple de code ou autre) ?
Pour ceux qui se retrouveront avec le même problème.

Et un petit résolu

__________________
Ancien pseudo : yobenzen

Recherche un emploi de Chef de Projet ou Développeur en Normandie
Delphi/Oracle/Interbase
Migration vers symfony

CV :
- LinkedIn
- Viadeo
Benjamin GAGNEUX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2006, 18h48   #7
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
Citation:
Envoyé par yobenzen
cadetill, ca serait possible de proposer une réponse (exemple de code ou autre) ?
Pour ceux qui se retrouveront avec le même problème.

Et un petit résolu

Oui, bien sur, tout ça quan je réusi
Aujourd'hui j'ai fait autres choses "plus importantes". Mon chef... tu sais?
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2006, 19h36   #8
Rédacteur
 
Inscription : janvier 2004
Messages : 2 123
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : janvier 2004
Messages : 2 123
Points : 1 977
Points : 1 977
Citation:
Envoyé par cadetill
Oui, bien sur, tout ça quan je réusi
Aujourd'hui j'ai fait autres choses "plus importantes". Mon chef... tu sais?
Ah ok
Désolé, je croyais que tu avais fini...

Bon courage alors
__________________
Ancien pseudo : yobenzen

Recherche un emploi de Chef de Projet ou Développeur en Normandie
Delphi/Oracle/Interbase
Migration vers symfony

CV :
- LinkedIn
- Viadeo
Benjamin GAGNEUX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2006, 07h54   #9
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
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 .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2006, 08h51   #10
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
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+
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2006, 12h14   #11
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
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)

Code :
1
2
3
 
SELECT bin_xor(cast(champ AS integer), 2) 
FROM TABLE
Mais le "cast" me donne erreur (¿normal?)

Peut être sera mieux me cree ma prope UDF?

Merci
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 17h39   #12
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
mais de quel type est ton champ ?
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 21h59   #13
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
Citation:
Envoyé par cadetill
...j'ai un champ Varchar(1).....


Merci
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2006, 16h12   #14
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
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 .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2006, 16h16   #15
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2006, 16h21   #16
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
ceci dit tu peux y arriver en stockant des puissance de 2 dans un champ integer
et en utilisant
Code :
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2006, 12h16   #17
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
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+
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2006, 12h57   #18
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
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)

Code :
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;
Bon, avec ça je peux savoir ce que je veux et je peux faire par exemple

Code :
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
Merci a tous

A+
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h41.


 
 
 
 
Partenaires

Hébergement Web