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 :

INSERT INTO ne crée pas de nouvel enregistrement. [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut INSERT INTO ne crée pas de nouvel enregistrement.
    Bonjour,

    Je n'en suis pas à ma première requête INSERT INTO, mais là, je ne trouve pas le problème...

    Je cherche à insérer un enregistrement dans une table de jointure (t_Projets_REL_Factures). À toutes fins utiles, l'intégrité référentielle est appliquée de part et d'autre de la table de jointure.

    Les deux champs de la table de jointure sont des clés primaires, et je n'ai apparemment pas de problème de doublon ou de Null. Les enregistrements à lier par la table de jointure existent bien dans chacune des tables t_Factures et t_Projets (donc les clés de ces tables, sur lesquelles doit se faire la jointure, sont remplies).

    Bref, il reste juste à créer un enregistrement dans la table de jointure en renseignant les deux champs avec les valeurs des clés des tables.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            Dim strSQL As String
            Dim dbs As DAO.Database
     
            Set dbs = CurrentDb()
     
            'Crée/insère enregistrement dans table t_Projets_REL_Factures
                strSQL = "INSERT INTO t_Projets_REL_Factures (Projet_ID, Facture_ID) VALUES (1373, " & Cstr(.txtID_Facture) & "); "
     
                dbs.Execute strSQL
                Set dbs = Nothing
    *Le premier chiffre est en dur pour simplifier, mais il sera aussi rendu dynamique plus tard.

    La fenêtre Espions me donne bien ceci à l'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = "INSERT INTO t_Projets_REL_Factures (Projet_ID, Facture_ID) VALUES (1373, 1357); "
    Aucun enregistrement n'est ajouté à la table de jointure.

    Pourtant, lorsque je tape dans la fenêtre Exécution la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentdb.Execute "INSERT INTO t_Projets_REL_Factures (Projet_ID, Facture_ID) VALUES (1373, 1357); "
    l'enregistrement s'ajoute bien dans ma table.

    Une idée du problème?

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,

    & Cstr(.txtID_Facture)
    que fais-tu là ?

    Ça donne une valeur de type numérique ?
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  3. #3
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    Dans mon champ Me.txtID_Facture, j'ai un entier long (le préfixe txt signifie textbox).

    Pour l'incorporer à l'instruction SQL, qui est de type String, et insérer une valeur numérique dans mon champ, il faut bien que je transforme le contenu de mon champ en string. Je peux ainsi le concaténer à l'instruction SQL, mais cela permettra d'insérer dans la table une valeur numérique (sans guillemets).

    Et c'est bien ce que j'obtiens pendant l'exécution de mon code, comme le montre la fenêtre Espion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL = "INSERT INTO t_Projets_REL_Factures (Projet_ID, Facture_ID) VALUES (1373, 1357); "
    Le problème, c'est que la même instruction SQL fonctionne dans la fenêtre Exécution, mais pas dans le code VBA.

  4. #4
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Le problème, c'est que la même instruction SQL fonctionne dans la fenêtre Exécution, mais pas dans le code VBA.


    Quand tu dis ne marche pas, tu veux bien dire "n'ajoute pas l'enregistrement attendu" mais ne plante pas ?

    Tu a une unicité sur la paire 'Projet_ID', 'Facture_ID' de la table 't_Projets_REL_Factures' ?

    Si c'est le cas, tu supprime donc manuellement l'enregistrement avant chaque test ?

  5. #5
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    Oui, en fait, à chaque test, mon t_Factures.ID_Facture (numéroauto) est incrémenté. Dès lors, la clé primaire sur deux champs de ma table de jointure est toujours unique.

    Et en effet, je n'ai pas de message d'erreur. Simplement, l"enregistrement n'est pas ajouté quand j'exécute le code VBA. (Alors que la même instruction fonctionne parfaitement quand je la lance dans la fenêtre Exécution.)

    En fait, mon code est dans un formulaire. Le formulaire compte un sous-formulaire, qui est articulé avec le formulaire parent par la table de jointure. Autrement dit, dans le contrôle sous-formulaire, le champ père est t_Factures.Id_Facture et le champ fils t_Projets_REL_Factures.Facture_Id. (Convention perso : je mets toujours le ID_ en tête du nom de champ quand c'est la clé primaire et le _ID à la fin quand c'est une clé étrangère.)

    Se peut-il que le fait que la table de jointure, qui "lie" le formulaire et le sous-formulaire", soit verrouillée quand j'ouvre le formulaire et exécute le code, et que cela empêche l'ajout d'un enregistrement dans la table de jointure?

    PS : J'ai essayé d'exécuter mon code après avoir supprimé le sous-formulaire. Donc la table de jointure n'est pas utilisée à ce moment-là. Et mon instruction SQL ne fonctionne pas plus. Ce n'est donc pas une question de verrouillage de la table de jointure. Le mystère reste entier...

  6. #6
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    J'oubliais, essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbs.Execute strSQL, dbFailOnError
    Un message d'erreur te donnera peut être une indication.

  7. #7
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    Merci mumem,

    Je crois qu'on a mis le doigt dessus :

    Erreur 3201 : Vous ne pouvez pas ajouter ou modifier un enregistrement car l'enregistrement associé est requis dans la table «*t_Factures*».
    Et pour cause, puisque je viens de créer mon enregistrement dans t_Factures. Donc il est bien créé dans le formulaire (mon champ Id_Facture s'est bien incrémenté) ou le recordset sous-jacent, mais il n'a apparemment pas encore été versé dans la table t_Factures.

    En tout cas, c'est bien lié à l'intégrité référentielle, comme je le subodorais initialement.

    Je crois qu'il existe une commande pour forcer la création de l'enregistrement dans la table, mais je ne sais plus laquelle (Me.Refresh?). Ça se fait en principe quand je ferme l'enregistrement ou passe à un autre enregistrement, mais je pense qu'il y a plus simple. En revanche, après ça, Me.NewRecord risque de me renvoyer Faux; je vais devoir écrire le code qui exploite cette propriété, mais j'imagine qu,on ne peut pas tout avoir .

  8. #8
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    Et c'était bien ça.
    Et ça fonctionne avec Refresh!

    Merci mumem

  9. #9
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Pour forcer l'écriture de l'enregistrement, je crois que

    est la solution la plus propre puisqu'elle ne touchera qu'au recordset.

  10. #10
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    Cette utilisation de Me.Dirty n'est pas documentée, mais ça donne aussi le résultat recherché.
    En revanche, tout comme Me.Refresh, elle fait perdre le statut Me.NewRecord = True à l'enregistrement... ce qui est logique...

    Encore merci

  11. #11
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,

    Il me semble avoir compris que tu trouves dans un contexte de formulaires père et fils.
    Pourquoi es-tu amené à insérer toi-même (avec ta requête ajout) ?
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  12. #12
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    Contrairement à ce qui se fait habituellement, je ne veux pas ajouter de nouvel enregistrement dans le sous formulaire, mais ajouter un nouvel enregistrement dans le formulaire pour un enregistrement déjà existant dans le sous-formulaire (que je couple une fois l'enregistrement du formulaire principal créé).

    Concrètement, je veux créer une nouvelle facture pour un projet existant. Je veux appeler le formulaire Nouvelle facture depuis le formulaire du Projet courant. Je souhaite mettre les éléments de la nouvelle facture en tête, et rappeler pour info les éléments du projet dans le sous-form. Le problème de ce choix, c'est que tant que l'enregistrement facture n'est pas créé, je ne peux pas le coupler à l'enregistrement projet via la table de jointure. Maintenant, ça marche.

    Il est vrai que j'aurais pu/dû faire l'inverse, mais j'avais envie d'explorer cette voie-là. À vrai dire, je vais créer les deux solutions (la solution inverse ne pose pas de problème) et voir à l'usage ce qui me convient le mieux.

  13. #13
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Merci pour ta réponse.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

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

Discussions similaires

  1. [MySQL] pourquoi insert into ne fonctionne pas
    Par Philcmoi dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/10/2009, 13h38
  2. [AJAX] Gridview ne crée pas de nouvelles lignes
    Par dachir dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/11/2008, 09h15
  3. [SQL] requete INSERT INTO ne marche pas
    Par mimagyc dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 07/08/2007, 11h48
  4. [WD11] Insert Into ne fonctionne pas
    Par IdrilElendil dans le forum WinDev
    Réponses: 4
    Dernier message: 04/04/2007, 15h03
  5. Ne pas afficher "Nouvel Enregistrement"
    Par Keuf95 dans le forum Access
    Réponses: 1
    Dernier message: 29/07/2006, 01h37

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