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 :

instruction UPDATE : comment utiliser une fonction en argument de SET ?


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut instruction UPDATE : comment utiliser une fonction en argument de SET ?
    Bonjour,

    je suis débutant en SQL et je me pose la question suivante : peut-on remplir une colonne avec des nombres aléatoires tous différents avec une instruction UPDATE ?

    Pour ma table TABLE dont je veux remplir la colone COL, j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TABLE
        SET COL = RND();
    mais cette instruction remplit la colonne du même nombre aléatoirement choisi.

    J'ai remarqué aussi qu'en Microsoft SQL (cf. ce lien) on peut faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TABLE
        SET COL = newid()
    Je me dis donc que quelque chose de cet ordre est possible en Access, mais je ne sais pas comment sont évaluées les fonctions dans les arguments d'une instruction - et je ne trouve pas de documentation facilement accessible sur le net sur le sujet...

    Merci beaucoup de vos réponses,

  2. #2
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    RND() n'est exécutée qu'une fois car elle n'a pas en argument un champ de la table.

    Dans un module de code colles ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Function InitRnd()
    Randomize
    End Function
     
    Public Function MyRnd(v As Variant)
    MyRnd = Rnd() * &H7FFFFFFF
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TABLE
        SET COL = MyRnd([COL]);
    Le fonction MyRnd sera appelée pour chaque enregistrement car elle a pour argument un champ de la table.

    Avant d'exécuter la requête de mise à jour, il faut appeler InitRnd pour initialiser le générateur de nombres pseudo-aléatoires.

    Par contre je ne sais pas si Rnd renvoie des nombres différents.

    Si le but est d'avoir une colonne avec des nombres uniques, il vaut mieux ajouter un champ type NuméroAuto.

    A+

  3. #3
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    Salut LedZepII,

    merci beaucoup pour tes conseils ! J'ai résolu mon problème grâce à ton idée de fonction MyRnd et Randomize. Le résultat est que j'ai numéroté avec un entier toutes mes lignes de façons aléatoire et unique dans une plage donnée. Pour cela, j'ai rajouté un Int() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyRnd = Int( Rnd() * N )
    C'est l'aide d'access qui nous donne la réponse sur l'unicité :
    l'instruction Randomize crée une valeur initiale utilisée par la fonction Rnd pour créer des séquences de nombres pseudo-aléatoires uniques.
    Et si l'on utilise pas cette fonction d'initialisation :
    En l'absence de Randomize, la fonction Rnd (sans argument) adopte le même nombre comme valeur initiale la première fois qu'elle est appelée. Lors des appels ultérieurs, elle réutilise le dernier nombre généré comme valeur initiale.
    Autre comportement curieux, si on change la requête UPDATE en SELECT, en mode affichage tableau, le contenu des champs se recalcule à chaque saisie, à chaque sélection ; ce qui fait que le contenu de la requête change constamment... ce qui n'est pas le cas pour la requête UPDATE.

    Merci encore !
    A bientôt !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/09/2008, 09h11
  2. Comment utiliser une fonction dans une fonction
    Par hatenaku dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2008, 20h00
  3. Comment utiliser une fonction dans une classe.
    Par metalamania dans le forum wxPython
    Réponses: 5
    Dernier message: 17/02/2008, 17h50
  4. comment utiliser une fonction sql en dotNet?
    Par bicho dans le forum Accès aux données
    Réponses: 6
    Dernier message: 19/03/2007, 11h44
  5. Comment passer une fonction en argument
    Par Pades75 dans le forum Langage
    Réponses: 4
    Dernier message: 16/02/2006, 10h34

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