IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Recherche de valeur basée sur une valeur fixe + puissance 2


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué Avatar de Orakle
    Homme Profil pro
    Responsable Informatique
    Inscrit en
    Mars 2004
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable Informatique
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2004
    Messages : 204
    Points : 154
    Points
    154
    Par défaut Recherche de valeur basée sur une valeur fixe + puissance 2
    Bonjour à tous,

    pour vous expliquer ma recherche je vous propose de vous montrer un tableau de constante à conserver pour mémoire:
    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
    // iFlagFonction
      const IFONCTION_PAR_DEFAUT = 1;
      const SFONCTION_PAR_DEFAUT = 'par défaut';
      const IFONCTION_COMMERCIAL = 2; // 2^1
      const SFONCTION_COMMERCIAL = 'Commercial'; // 2^1
      const IFONCTION_COMPTABILITE = 4; // 2^2
      const SFONCTION_COMPTABILITE = 'Comptabilité'; // 2^2
      const IFONCTION_EXPLOITATION = 8; // 2^3
      const SFONCTION_EXPLOITATION = 'Exploitation'; // 2^3
      const IFONCTION_ADMINISTRATION = 16; // 2^4
      const SFONCTION_ADMINISTRATION = 'Administration'; // 2^4
      const IFONCTION_FACTURATION = 32; // 2^5
      const SFONCTION_FACTURATION = 'Facturation'; // 2^5
      const IFONCTION_SAV = 64; // 2^6
      const SFONCTION_SAV = 'SAV'; // 2^6
      const IFONCTION_DIRECTION = 128; // 2^7
      const SFONCTION_DIRECTION = 'Direction'; // 2^7
    etc...
    ces constantes correspondent à la valeur 2 élevée à une certaine puissance selon la valeur texte associée.

    Celle qui m'intéresse ici c'est "direction" et toutes les valeurs qui pourraient lui être associée.
    Donc on garde en tête la valeur 128.

    Dans une table je possède une colonne avec des valeurs correspondant à
    soit la valeur brute = 128 (pour direction donc)
    soit "des valeurs associées" = 130 (128 + 2 direction commercial), 132 (128 + 4 direction comptabilité), 192 (128 + 64 direction SAV), etc, etc...

    *Notez que je n'ai pas la valeur texte associée dans une autre colonne de ma table. (sinon je ne serais pas ici)

    Ma question : Comment verriez-vous en requête SQL, la fonction ou la règle arithmétique qui me permettrait d'isoler dans mon champ toutes les valeurs (brutes ou associées) à partir d'une valeur donnée comme expliqué ci-dessus?

    N'hésitez pas à poser des questions si j'ai omis quelques infos.
    Bien souvent quand on est dans le jus on ne voit pas toujours depuis l'extérieur.

    Merci à tous pour votre participation.

  2. #2
    Membre habitué Avatar de Orakle
    Homme Profil pro
    Responsable Informatique
    Inscrit en
    Mars 2004
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable Informatique
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2004
    Messages : 204
    Points : 154
    Points
    154
    Par défaut
    Plus simplement, y aurait-il une fonction basée sur toutes les valeurs élevée à la puissance 2 (2, 4, 8, 16,...) ?

  3. #3
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    Normalement on utilise un And pour ce genre de chose.
    Mais à partir d'une requête on ne voit pas les Constantes VBA (qui chez toi semble être du Java).
    Donc créer un module et une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...Declaration de tes constantes ou d'une enum
     
    Public Function isDirection(maValeur as variant) as boolean
     
    if isnull(maValeur) then exit function
    if not isnumeric(maValeur) then exit function
     
    If maValeur  And IFONCTION_DIRECTION Then
        isDirection = true
    End If
     
    End Function
    Et dans la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM ... WHERE isdirection(macolonne);
    Tout simplement.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  4. #4
    Membre habitué Avatar de Orakle
    Homme Profil pro
    Responsable Informatique
    Inscrit en
    Mars 2004
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable Informatique
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2004
    Messages : 204
    Points : 154
    Points
    154
    Par défaut
    Bonjour loufab et merci pour ton intervention.

    J'ai du mal m'exprimer alors je vais faire autrement, car ici les constantes ne sont présentes qu'à titre indicatif.

    je récupère (dans une requête) 4 champs d'une table on va dire : sNom, sPrenom, sEmail, et ce fameux champ que nous appellerons Flag.

    Nom : 2021-10-08_14h32_46.png
Affichages : 57
Taille : 138,3 Ko

    quelque part sur l'application sur laquelle repose ma Bdd j'ai plusieurs case à cocher type direction; commercial; comptabilité; etc... (voir colonne B ci-dessous)
    Selon que tu coches une ou plusieurs cases, la valeur qui se retrouve dans le tableau de constantes va s'additionner à l'autre et se dépose dans le champ Flag. (Comme le montre la capture ci-dessus colonne de droite)

    Cette valeur se modifie selon une règle d'incrémentation que j'ai essayé d'expliquer avec le tableau de valeur (les constantes)
    Mais pour reprendre je vais me mettre sous format Excel.
    Donc d'origine on a des valeurs de texte associées à des valeurs en puissance de 2 :

    Nom : 2021-10-08_15h13_53.png
Affichages : 56
Taille : 15,9 Ko

    (Toutes les valeurs ne sont pas ici représentées)
    Les valeurs de A s'additionnent selon une règle que j'ai mise en tableau ci dessous pour une meilleure compréhension.

    En colonne C (et par défaut) je mets au minimum la valeur à 128 car je recherche tous les Emails qui comporte au moins le mot direction.
    A B C
    count =2^A(x) =128+B(x)
    1 2 130
    2 4 132
    3 8 136
    4 16 144
    5 32 160

    donc d'après ce tableau:

    A= un compteur
    B = l'élévation du compteur à la puissance 2
    C = somme de la valeur 128 par défaut (direction) + la valeur de B

    Donc maintenant je veux (dans une requête) pouvoir faire ressortir toutes les valeurs contenues dans ma table qui prendront cette règle
    = 128 ou 128 + valeur(x). (et uniquement si valeur(x) est une puissance de 2)

    Car si tu reprends ma 1ere capture et ma colonne de droite tu as des valeurs qui ne peuvent pas entrer dans cette règle.
    ex : 17472; 16384; 1216;...

    Et j'en ai par contre d'autres qui rentrent dans la règle et qui ne sont pas affichées ici mais qui prennent par exemple la valeur : 192; 136 voire même 16512 qui est = 128 + (14^2)

    En essayant d'expliquer je me rend compte que je dois passer par un champ intermédiaire qui va déjà m'extraire 128 de la valeur du champ.
    Et c'est sur cette dernière partie que je dois chercher si c'est une puissance de 2 ou pas.

    C'est long mais j'espère que c'est plus clair?

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 600
    Points
    24 600
    Par défaut
    Bonjour,

    Il me semblait avoir compris le montage utilisé (ajout de nombre en base 2) somme toute assez commun, mais j'avoue que là je suis perdu.

    J'ai fait un petit test avec ton exemple en passant un nouveau paramètre qui est le nombre à trouver, dont voici le résultat :

    Nom : 2021-10-11_23h12_16.png
Affichages : 46
Taille : 9,4 Ko

    Si ce n'est pas ça alors je ne vois pas.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  6. #6
    Membre habitué Avatar de Orakle
    Homme Profil pro
    Responsable Informatique
    Inscrit en
    Mars 2004
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable Informatique
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2004
    Messages : 204
    Points : 154
    Points
    154
    Par défaut
    Bonjour loufab

    Si la réponse se situe en colonne 128 alors à part 1216/Frederic les résultats sont bons oui, donc tu devais dire la même chose, juste que je n'ai pas compris sur le coup.
    Cela impliquait également que pour faire la fonction, je devais monter une table avec mes constantes, ce que je n'avais pas de base.

    Entre temps j'ai trouvé ma réponse qui est beaucoup moins "propre" que la tienne mais qui fonctionne aussi.
    Je passe par 2 requêtes:

    La première est une requête création de table que j'appelle tEmailDir où à partir de ma colonne initiale je créé 3 colonnes supplémentaires:

    Flag1 = [MaColonne]-128 - me donne la valeur brute
    Flag2 = LOG([Macolonne]-128/LOG(2) - Me donne le nombre élevé à la puissance de 2 (lorsque ce n'est pas une puissance de 2 le résultat est décimal)
    Flag3 = CCur([Flag2] - Int([Flag2]))= 0 - Qui me renvoie la valeur 0 ou -1 si la valeur trouvée = 0 (Ccur qui me retourne CMonnaie en l'occurence mais qui fonctionne) (au passage je remercie ici aussi tee_gransbois pour sa solution)

    Ma 2e requête n'est qu'une sélection de critères que je ne pouvais pas faire en cumulé dans la première car j'avais des erreurs.

    Flag1 = 0 - pour remonter uniquement quand j'avais la valeur 128
    ou
    Flag3 = -1 - pour me remonter toutes les valeurs monétaires qui soustraite à leur valeur entière me retourne 0 (ainsi j'obtiens tous les résultats sans décimales)

    donc pour moi c'est résolu, mais si d'autres voulais + de précisions sur cette solution en posant d'autres questions je ne ferme pas le post, je laisserai la fermeture à l'appréciation des modos.

    Merci encore à la communauté.

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/08/2021, 18h30
  2. [Débutant] Création colonne basée sur une autre valeur d'une autre colonne
    Par lFantasyz dans le forum MATLAB
    Réponses: 2
    Dernier message: 03/02/2014, 16h41
  3. Réponses: 1
    Dernier message: 25/05/2010, 22h57
  4. requete SQL basée sur une valeur d'un edit
    Par imeneimene dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/06/2009, 08h54
  5. Progress bar basée sur une valeur
    Par Norin dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 11/02/2008, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo