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 :

Update et select imbriqué


Sujet :

Requêtes et SQL.

  1. #1
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut Update et select imbriqué
    Bonjour,

    Je cherche à "mélanger" les colonnes de mes enregistrements (sous Access).

    Ma table a trois champs :
    DIR_CODE => NumeroAuto
    DIR_SIGLE => Texte
    DIR_LIBELLE => Texte

    J'essaie de m'inspirer de cette discussion
    http://www.developpez.net/forums/d31...lect-imbrique/

    Avec cette requête, il m'affiche bien un enregistrement "mélangé" sur trois lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT P2.DIR_CODE AS CODE, '' AS SIGLE, '' AS LIBELLE
    FROM TBL_DIRECTIONS P2
    WHERE P2.DIR_CODE=(SELECT top 1 DIR_CODE from TBL_DIRECTIONS ORDER BY  rnd(DIR_CODE))
    UNION
    SELECT '' AS CODE, P2.DIR_SIGLE AS SIGLE, '' AS LIBELLE
    FROM TBL_DIRECTIONS P2
    WHERE P2.DIR_CODE=(SELECT top 1 DIR_CODE from TBL_DIRECTIONS ORDER BY  rnd(DIR_CODE))
    UNION
    SELECT '' AS CODE, '' AS SIGLE, P2.DIR_LIBELLE AS LIBELLE
    FROM TBL_DIRECTIONS P2
    WHERE P2.DIR_CODE=(SELECT top 1 DIR_CODE from TBL_DIRECTIONS ORDER BY  rnd(DIR_CODE))
    J'ai ensuite tenté ma mise à jour avec la requête suivante, mais j'ai le message "L'opération doit utiliser une requête qui peut être mise à jour"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE TBL_DIRECTIONS
    SET DIR_SIGLE = (SELECT P2.DIR_SIGLE
    FROM TBL_DIRECTIONS P2
    WHERE P2.DIR_CODE=(SELECT top 1 DIR_CODE from TBL_DIRECTIONS ORDER BY  rnd(DIR_CODE))),
    DIR_LIBELLE = (SELECT P2.DIR_LIBELLE
    FROM TBL_DIRECTIONS P2
    WHERE P2.DIR_CODE=(SELECT top 1 DIR_CODE from TBL_DIRECTIONS ORDER BY  rnd(DIR_CODE)));
    Quelqu'un pour m'aider ?

    Merci.

  2. #2
    Membre éclairé Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Points : 666
    Points
    666
    Par défaut
    cela fonctionne en select, en revanche ce qu'Access n'apprécie pas c'est quand tu essayes de mettre à jour une table avec un résultat basé sur la table elle-même enfin c'est que j'ai pu constater.
    Ce que je te conseille tu génères une table avec ta première requête ( type création de table) puis tu utilises cette dernière pour mettre à jour la table désirée
    ----
    Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher

    merci de penser à
    Au fait.... je ne réponds pas, moi non plus, aux mp

  3. #3
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    Merci, mais j'ai dupliqué ma table en créant une table DIRBIS.

    Avec cette requête, j'obtiens le même message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE TBL_DIRECTIONS
    SET DIR_SIGLE = (SELECT DIRBIS.DIR_SIGLE
    FROM DIRBIS
    WHERE DIRBIS.DIR_CODE = (SELECT top 1 DIRBIS.DIR_CODE from DIRBIS ORDER BY rnd(DIRBIS.DIR_CODE)));

  4. #4
    Membre éclairé Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Points : 666
    Points
    666
    Par défaut
    il n'y aurait pas un problème d’homonymie avec ton champ dir_sigle ?
    comment ta requête réagit si tu mets dans ton sous select ( select dirbis.dir_sigle as toto from ....
    ----
    Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher

    merci de penser à
    Au fait.... je ne réponds pas, moi non plus, aux mp

  5. #5
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    Merci d'essayer de m'aider.

    Avec cette requête, même message d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE TBL_DIRECTIONS
    SET DIR_SIGLE = (SELECT DIRBIS.DIR_SIGLE as toto
    FROM DIRBIS
    WHERE DIRBIS.DIR_CODE = (SELECT top 1 DIRBIS.DIR_CODE from DIRBIS ORDER BY rnd(DIRBIS.DIR_CODE)));

  6. #6
    Membre éclairé Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Points : 666
    Points
    666
    Par défaut

    par curiosité peux tu me dire combien d'occurrences sont retournée par ta sous requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DIRBIS.DIR_SIGLE as toto
    FROM DIRBIS
    WHERE DIRBIS.DIR_CODE = (SELECT top 1 DIRBIS.DIR_CODE from DIRBIS ORDER BY rnd(DIRBIS.DIR_CODE))
    ----
    Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher

    merci de penser à
    Au fait.... je ne réponds pas, moi non plus, aux mp

  7. #7
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    La sous-requête ne retourne qu'un seul enregistrement (top 1)

  8. #8
    Membre éclairé Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Points : 666
    Points
    666
    Par défaut
    désolé, ma question précédente était idiote ( j'avais omis que ton code était en numeroauto )

    sinon c'est en effet un rien crispant.....

    petite question, pour être sûr de bien comprendre le but de la manip, en admettant que cela fonctionne, on est bien d'accord que ta requête met à jour l'ensemble de la table avec les valeurs trouvées pour sigle et libelle de l'enregistrement ayant le code le plus petit ?
    ----
    Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher

    merci de penser à
    Au fait.... je ne réponds pas, moi non plus, aux mp

  9. #9
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Non,

    Le but de la manoeuvre est, comme je l'ai écris dans mon premier message, est de "mélanger" les données.
    En réalité, il s'agit d'une requête qui serait exécutée sur une table contenant des noms, prénoms et adresses, pour anonymiser les données.

  10. #10
    Membre éclairé Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Points : 666
    Points
    666
    Par défaut
    c'est encore moi

    en fouillant un peu je suis tombé là dessus
    http://www.developpez.net/forums/d13...equete-update/
    ou il est dit :
    Comme vous le savez sans doute le moteur d'access ne permet pas d'imbriquer une requête "select" après le "=" de la clause "Set" du'une requête de mise à jour ("Update").
    du coup pris d'une inspiration soudaine ( comment je me la joue ) j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE TBL_DIRECTIONS SET TBL_DIRECTIONS.DIR_SIGLE =dlookup( "dir_sigle","TBL_DIRECTIONS","[dir_code] =(SELECT top 1 TBL_DIRECTIONS.DIR_CODE from TBL_DIRECTIONS  ORDER BY  rnd(TBL_DIRECTIONS.DIR_CODE))")
    j'ai l'impression que cela fonctionne
    ----
    Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher

    merci de penser à
    Au fait.... je ne réponds pas, moi non plus, aux mp

  11. #11
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    Merci,

    La requête fait bien une mise à jour, mais le champ DIR_SIGLE est remplacé par la même valeur dans tous les enregistrements.

  12. #12
    Membre éclairé Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Points : 666
    Points
    666
    Par défaut
    oui, c'est bien ce que je pensais et c'était pour cela que je te posais la question,

    j'ai fait mes essais en m'appuyant sur la requete indiquée dans le post 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TBL_DIRECTIONS
    SET DIR_SIGLE = (SELECT DIRBIS.DIR_SIGLE
    FROM DIRBIS
    WHERE DIRBIS.DIR_CODE = (SELECT top 1 DIRBIS.DIR_CODE from DIRBIS ORDER BY rnd(DIRBIS.DIR_CODE)));
    maintenant si tu veux mélanger tes colonnes, je te conseillerai d'utiliser un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Int ((upperbound - lowerbound + 1) * Rnd + lowerbound)
    pour pointer à chaque fois sur un code aleatoire
    ----
    Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher

    merci de penser à
    Au fait.... je ne réponds pas, moi non plus, aux mp

  13. #13
    Membre éclairé Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Points : 666
    Points
    666
    Par défaut
    En fait j'ai été un peu rapide, le problème du rnd c'est qu'il faut le forcer pour le déclencher à chaque lecture

    peux tu tester ça et regarder si cela convient à ce que tu cherches faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update TBL_DIRECTIONS  
       set dir_sigle = dlast( "dir_sigle","TBL_DIRECTIONS","[dir_code]<= forcealea((select min(dir_code) from TBL_DIRECTIONS),(select max(dir_code) from TBL_DIRECTIONS)," & TBL_DIRECTIONS.dir_code-1 & ")"),
           DIR_LIBELLE = dlast( "DIR_LIBELLE","TBL_DIRECTIONS","[dir_code]<= forcealea((select min(dir_code) from TBL_DIRECTIONS),(select max(dir_code) from TBL_DIRECTIONS)," & TBL_DIRECTIONS.dir_code-1 & ")")

    J'utilise la fonction de hervé Inisian
    ' ---
    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
    ' FONCTION ALEA POUR REQUETE de  Hervé Inisan
    ' ---
    ' Entrée :    intInf <- Borne inférieure
    '             intSup <- Borne supérieure
    '                  v <- Une valeur quelconque, ou un champ de requête
    ' Sortie : ForceAlea -> Nombre entier entre intInf et infSup compris
    '
    Function ForceAlea( _
      ByVal intInf As Integer, _
      ByVal intSup As Integer, _
      ByVal v As Variant) As Integer
     
      Randomize
      ForceAlea = Int(Rnd * (intSup - intInf + 1)) + intInf
    End Function
    enfin ....j'ai bon espoir
    ----
    Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher

    merci de penser à
    Au fait.... je ne réponds pas, moi non plus, aux mp

  14. #14
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    Le problème est que j'utilise Access à partir de pages ASP.
    Je n'ai jamais vraiment approfondi son fonctionnement.
    D'où ma question : La fonction, je l'utilise comment ?

    Merci encore.

  15. #15
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    C'est bon, je l'ai mise dans un module et le résultat de la requête est PARFAIT.

    Merci de ta patience.

  16. #16
    Membre éclairé Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Points : 666
    Points
    666
    Par défaut

    ah, je n'ai jamais utilisé de pages ASP,
    mais ça devrait le faire quand même.....si tu créés un module dans ta base et tu déclares la fonction en public, normalement ensuite tu peux la solliciter ( un peu à la manière d'une procédure stockée comme dans oracle par exemple) depuis une requête.
    ce qui peux être pratique, bien évidement je ne suis pas certain des perfs si tes tables sont importantes.

    tu as été plus rapide que moi
    ----
    Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher

    merci de penser à
    Au fait.... je ne réponds pas, moi non plus, aux mp

  17. #17
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    Je vais maintenant essayer d'appliquer cette requête sur une table qui contient des noms et des adresses.
    Dans l'exemple qui a servi à la discussion, le "mélange" est fait à partir du champ DIR_CODE qui est l'identifiant.
    Dans ma nouvelle table, l'identifiant est composé de deux colonnes.
    Comment adapter la requête dans ce cas ?

    Merci.

  18. #18
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    C'est bon, j'ai créé un champ NumeroAuto et tout roule.

  19. #19
    Membre éclairé Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Points : 666
    Points
    666
    Par défaut
    Hello,
    encore moi, je me suis pris au jeu sur ton idée
    et voilà ce que je propose, c'est quasimement la même chose mais étendue avec la fonction de cryptage de M.Hubiche ( toujours avec un grand M )

    si tu peux me dire ce que tu en penses

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    ' Anonymisation de données
    ' fonction de mélange de données assortie avec une fonction de cryptage
    ' ======================================================================
    ' sur une idée de Pc75 dont j'ai été le bras armé
    ' réalisé en faisant un assemblage de deux fonctions :
    '       crypter ( Marcel Hubiche )
    '       alea ( Hervé Inisan )
    ' =======================================================================
    ' objet : permet de 'mélanger' les données d'une table en vue d'une anonymisation des données
    '  le principe est on fait un update des champs en affectant au champ d'1 enregistrement la valeur du même champ, ou d'un autre  
    ' mais issu d'un enregistrement choisi au hasard.
    ' pour les données vraiment sensibles il est possible en plus de crypter la donnée en fournissant une clé de cryptage  
    ' (si c'est pas de l'anonymisation ça ! ya plus qu'à jeter l'éponge)  
    ' contraintes : la table traitée doit avoir une valeur numérique en clé
    ' les paramètres : 
    '  nom_cle_num as string: nom de l'indentifiant qui contient la valeur numérique ,
    '  nom_rubrique as string: nom du champ à traduire ou mélanger 
    '  nom_table as string: nom de la table traitée 
    '  valeur_cle_min as double: valeur minimale de la clé numerique ( pour le choix aleatoire de valeur ),
    '  valeur_cle_max as double:valeur max de la clé numerique ( pour le choix aleatoire de valeur )
    '  valeur_actuelle as double : valeur de la cle numerique ( pour le calcul aléatoire )
    '  celcryptage as string : chaine de caractère utilisée pour le cryptage
    ' si le cryptage n'est utiliser fournir une chaîne vide "" en paramètre - (j'aime pas optional )  
    ' usage :
    ' update nomtable set <nomduchamp> = dfirst("ShakEtAnonimise('nomclenum','nomduchamp','nomtable', _ 
    '                                                     (select min(<nomclenum>) from nomtable), _
    '                                                     (select max(<nomclenum>) from nomtable), " & _
    '                                                      <nomtable>.<nomclenum> & _ 
    '													 'vnrfjzaerfaerf')","<nomtable>")
    '
    ' le dfirst est un artifice pour éviter le fameux message "utilisez une table qui peut être mise à jour"
    '
    Function ShakEtAnonimise(ByVal nomclenum As String, _
                     ByVal nom_rubrique As String, _
                     ByVal nom_table As String, _
                     ByVal valeur_cle_min As Double, _
                     ByVal valeur_cle_max As Double, _
                     ByVal valeur_actuelle As Double, _
                     ByVal clecryptage As String) As String
     
    Dim intermed As String
    Dim criteres As String
    '
    ' on construit le critère de sélection
    criteres = "[" & nomclenum & "]"
    criteres = criteres & "<= forcealea( " & valeur_cle_min & "," & valeur_cle_max & "," & valeur_actuelle & "-1)"
    '
    ' on regarde la dernière valeur trouvée
    intermed = DLast(nom_rubrique, nom_table, criteres)
     
    If clecryptage <> "" Then
        ShakEtAnonimise = Crypter(intermed, clecryptage)
    Else
        ShakEtAnonimise = intermed
    End If
    End Function
     
    ' Fonction d 'alea
    '==================
    ' FONCTION ALEA POUR REQUETE de  Hervé Inisan
    ' ---
    ' Entrée :    intInf <- Borne inférieure
    '             intSup <- Borne supérieure
    '                  v <- Une valeur quelconque, ou un champ de requête
    ' Sortie : ForceAlea -> Nombre entier entre intInf et infSup compris
    '
    Function ForceAlea( _
      ByVal intInf As Double, _
      ByVal intSup As Double, _
      ByVal v As Variant) As Double
     
      Randomize
      ForceAlea = Int(Rnd * (intSup - intInf + 1)) + intInf
    End Function
     
    ' Fonction de cryptage
    '=======================
    Function Crypter(ByVal chaîneACrypter As String, ByVal clef As String) As String
    '---------------------------------------------------------------------------------------
    ' Procedure : Crypter
    ' Créée le  : lundi 18 juil 2005 18:51
    ' Auteur    : Maxence HUBICHE
    ' Site      : http://mhubiche.developpez.com
    ' Objet     : Crypter la chaîne chaîneACrypter en fonction d'une clef et de la méthode
    '               de Vigenère
    '---------------------------------------------------------------------------------------
    '
        Dim sLettres    As String
        Dim lCompteur   As Long
        Dim lLongueur   As Long
        Dim lBoucle     As Long
     
        'Définition des constantes utiles pour la fonction (Clé et nombre d'itérations de la fonction maximum)
     '   Const CLEF              As String = "nbvfdszé""'(-è_ijhgfcKLKjhgyuilM^+)àçiu-('32azsDRtvBhujkoç_è6tre""zsXWqazerfcx<;:<?"
        Const NBROTATIONSMAX    As Long = 13
     
        'Définition de la longueur de la chaîne à crypter et de la chaîne de résultat
        lLongueur = Len(chaîneACrypter)
        sLettres = String(lLongueur, Chr(0))
     
        'Boucler en fonction du nombre de rotations attendues
        For lBoucle = 1 To NBROTATIONSMAX
            'boucler pour chaque caractère de la chaîne initiale
            For lCompteur = 1 To lLongueur
                'Remplacer le caractère de la chaîne à crypter par le caractère correspondant à
                '   le reste de
                '       la valeur ascii du caractère à crypter
                '       plus
                '       la valeur ascii du caractère correspondant dans la clé, multiplié par la longueur de la clé
                '   quand on le divise par 256
                Mid(sLettres, lCompteur, 1) = Chr((Asc(Mid(chaîneACrypter, lCompteur, 1)) + _
                        (Asc(Mid(clef, (lCompteur Mod Len(clef)) + 1, 1)) * lLongueur)) Mod 256)
            'recommencer
            Next
            'réaffecter la chaîne à crypter par le résultat trouvé pour pouvoir recommencer une itération
            chaîneACrypter = sLettres
        'Nouvelle itération
        Next
        'Renvoyer le résultat final
        Crypter = sLettres
    End Function
    ----
    Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher

    merci de penser à
    Au fait.... je ne réponds pas, moi non plus, aux mp

  20. #20
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    Je dis : Chapeau bas !

    Je pense que ça a sa place dans les contributions parce que j'ai cherché pendant longtemps et je n'ai pas trouvé d'équivalent.

    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 15
    Dernier message: 26/11/2014, 14h30
  2. Update sur Select imbriqué partageant une clef commune
    Par srappaille dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/10/2010, 20h15
  3. [Delphi6,Access] Requête update avec select imbriqué
    Par magicstar dans le forum Débuter
    Réponses: 3
    Dernier message: 30/03/2009, 19h40
  4. requete update avec select imbriqué
    Par mikees dans le forum SQL
    Réponses: 3
    Dernier message: 09/02/2009, 17h42
  5. Requete Update avec Select imbriqué: etrange resultat!
    Par corentone dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/08/2007, 15h05

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