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 :

Pb pour formuler mon INSERT avec un WHERE


Sujet :

Requêtes et SQL.

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut Pb pour formuler mon INSERT avec un WHERE
    Bonjour,
    Je cherche à améliorer une requête d'insert en y mettant des critères pour ne pas insérer partout!

    Actuellement je fais un delete puis un insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL "Delete * from [HISTOCLUB] WHERE [ANNEE] LIKE " & ANNEETARIFCLUB & ""

    puis mon insert que je souhaite 'filtrer' sur la même table : si ANNEE est différent de mon champ ANNEETARIFCLUB et si C_COD_CLT <> CODECLIENT alors je fais le insert

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Désinscription = "INSERT INTO HISTOCLUB " & _
                            "( C_COD_CLT, ANNEE ) " & _
                            "SELECT '" & CODECLIENT & "', " & ANNEETARIFCLUB & " FROM HISTOCLUB WHERE ANNEE <> " & ANNEETARIFCLUB & " AND C_COD_CLT <> CODECLIENT;"
                            Debug.Print ReqINSCRIPTIONANNEECLUB
                            DoCmd.RunSQL ReqINSCRIPTIONANNEECLUB
    ce qui me donne cette requête extrait de 2 lignes)
    INSERT INTO HISTOCLUB ( C_COD_CLT, ANNEE ) SELECT '08043', 2011 FROM HISTOCLUB WHERE ANNEE <> 2011 AND C_COD_CLT <> '08043';
    INSERT INTO HISTOCLUB ( C_COD_CLT, ANNEE ) SELECT '08048', 2011 FROM HISTOCLUB WHERE ANNEE <> 2011 AND C_COD_CLT <> '08048';
    cela tourne mais rien ne se met dans ma table qui est vide.

    J'ai essayé en enlevant le FROM (car finalement je veux qu'elle se filtre sur elle-même)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Désinscription = "INSERT INTO HISTOCLUB " & _
                            "( C_COD_CLT, ANNEE ) " & _
                            "SELECT '" & CODECLIENT & "', " & ANNEETARIFCLUB & " WHERE ANNEE <> " & ANNEETARIFCLUB & " AND C_COD_CLT <> CODECLIENT;"
                            Debug.Print ReqINSCRIPTIONANNEECLUB
                            DoCmd.RunSQL ReqINSCRIPTIONANNEECLUB
    mais là, je me fais sermoner erreur 3075 erreur de syntaxe opérateur absent

    Savez-vous s'il est possible de faire un INSERT dans un table en filtrant sur cette même table ?

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Exécute ton code avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDB.Execute SQLScript, dbFailOnError
    plutôt qu'un couplée à un en amont et un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Err.Description,,Err.Number
    en aval dans l'étiquette.

    Tu auras la réponse du problème.

    Argy

    P.S. Ceci est juste pour le test ; si ton script est une boucle, il faudra prévoir un objet Database plutôt que d'utiliser CurrentDB().

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 753
    Points : 57 593
    Points
    57 593
    Billets dans le blog
    42
    Par défaut
    bonsoir,

    Citation Envoyé par tibofo Voir le message
    ...ce qui me donne cette requête extrait de 2 lignes)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO HISTOCLUB ( C_COD_CLT, ANNEE ) 
    SELECT '08043', 2011 FROM HISTOCLUB 
    WHERE ANNEE <> 2011 AND C_COD_CLT <> '08043';
    J'ai l'impression que l'idée est d'insérer une ligne dans la table HISTOCLUB en évitant les doublons sur le couple ( C_COD_CLT, ANNEE ), non ?

    la syntaxe serait plutôt:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO HISTOCLUB ( C_COD_CLT, ANNEE ) 
    VALUES ( '08043', 2011);

    tu peux éventuellement tester si la ligne existe déjà avec un DLookUp avant le INSERT, ou mieux, tu mets un index "unique" sur ( C_COD_CLT, ANNEE ) pour interdire les doublons...

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut
    Merci à vous 2 pour votre intérêt:

    Actuellement, le bouton de mon formulaire permet d'insérer une info (2010, 2011...) dans la table :
    client - année - club1 - club 2 - club3 ...
    DUPONT-2010 - 0 - 0 - 0
    TOTO - 2010 - 0 - 0 - 0

    Puis en cours de vie de la base, sur, par exemple, l'année 2010, les clubs peuvent passer à 1. Ce qui donne par exemple:
    client - année - club1 - club 2 - club3 ...
    DUPONT-2010 - 0 - 1 - 0
    TOTO - 2010 - 1 - 1 - 0

    Mon pb est que si l'utilisateur re-clique sur ce bouton, cela me supprime tout le contenu de la table (DELETE) puis fais le INSERT INTO

    Alors je voudrais améliorer en retirant le DELETE et en ne laissant qu'1 INSERT INTO qui inséra que si le client et son année n'existent pas déjà dans la table. (parce que il peut y avoir des nouveaux clients qui ne sont pas encore dans cette table)

  5. #5
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par tibofo Voir le message
    Mon pb est que si l'utilisateur re-clique sur ce bouton, cela me supprime tout le contenu de la table (DELETE) puis fais le INSERT INTO
    Les événements ça se gère dans un form.
    S'il a cliqué alors une variable de type Boolean est à True et si ce boolean est à True, le script n'est pas éxécuté ; un message de rochonnage bien ficelé peut accompagner cet déclenchement.
    Une fois le script terminé (et sans erreur) tu le repasses à False.

    Argy

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/11/2007, 13h11
  2. INSERT INTO avec un WHERE ?
    Par Dams33520 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 13/06/2007, 13h59
  3. Insert avec une clause where !?
    Par Thomad dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/08/2006, 09h55
  4. problème pour faire un insert avec une image
    Par vbcasimir dans le forum Modules
    Réponses: 3
    Dernier message: 02/11/2005, 09h21
  5. Réponses: 1
    Dernier message: 18/05/2005, 18h18

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