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

VBA Access Discussion :

Insertion impossible à cause d'un champ


Sujet :

VBA Access

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut Insertion impossible à cause d'un champ
    Bonjour à tous !

    Je suis déjà venu ici pour un problème d'insertion dans une table, mais une fois de plus je suis perdue... Je crois que le VBA ACCESS n'est pas pour moi...


    J'ai un formulaire permettant d'insérer une nouvelle entreprise dans la base de données. Dans cette table il y a 11 champs :

    ENTREPRISE : Numéro entreprise, nom, #numéro activité, ville, code postal, télephone,mail, fax, commentaire sur l'entreprise et case à imprimer (booléen grâce à un chekbox)
    ACTIVITE : Numero activité, libellé activité

    J'ai fait un code VBA pour pouvoir insérer une nouvelle entreprise quand je clique sur le bouton "Enregistrer":

    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
    'Declaration des variables
    Dim bd As Database
    Dim rs As Recordset
    Dim critere As String
        
        
    'Sélection de la BDD
    Set bd = CurrentDb
    Set rs = bd.OpenRecordset("Entreprise", DB_OPEN_DYNASET)
    critere = "NumActvEnt=" & Me.Modifiable2.Column(0)
    rs.FindFirst critere
    
    
    'Ajout de l'enregistrement
    
    rs.AddNew
    
    rs![NumEnt] = Me.Texte20
    rs![NomEnt] = Me.Texte6
    rs![NumActvEnt] = Me.Modifiable2.Column(0)
    rs![RueEnt] = Me.Texte8
    rs![VilleEnt] = Me.Texte10
    rs![CPEnt] = Me.Texte12
    rs![TelEnt] = Me.Texte14
    rs![MailEnt] = Me.Texte18
    rs![FaxEnt] = Me.Texte16
    rs![CommEnt] = Me.Texte4
    
    rs.Update
    rs.MoveLast
    
    On Error GoTo Err_Commande19_Click
    
    
        DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70
    
    Exit_Commande19_Click:
        Exit Sub
    
    Err_Commande19_Click:
        MsgBox Err.Description
        Resume Exit_Commande19_Click
    Dans mon formulaire pour choisir le numéro de l'activité du métier j'ai une liste déroulante (Modifiable2).

    J'ai un message d'erreur : "Modification non effectuée : risque de doublons dans champs index, clé principale ou relation interdisant les doublons. Modifier les données des champs contenant les doublons, enlevez ou redéfinisser l'index pour permettre les doublons et recommencez"

    Le bug est sur "rs.update"

    Je n'arrive pas à savoir pourquoi ! Avez vous une idée ?!?
    Merci d'avance !

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 221
    Par défaut
    Essaye de voir ce que te renvoi ta liste déroulante
    Mets simplement un petit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Modifiable2.Value
    juste avant de le mettre dans le recordset. Et tiens moi au courant

    Si ta fonction est déclaré dans ton formulaire et non dans un module tu n'as pas besoin de mettre les "Me."
    Enfin après c'est une préférence personnelle

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Bonjour et merci de ta réponse !

    Ma liste retourne bien le numéro d'activité correspondant a ce que j'ai selectionné dans ma liste.

    Et c'est bien "rs.update" qui est en bug. Je sais qu'il est obligatoire pourtant...

    Quand je l'enlève, un autre message d'erreur : "Vous ne pouvez pas ajouter ou modifier un enregistrement car l'enregistrement associé est requis dans la table Activité".

    Alors que le numero d'activité est déjà bien présent dans la base !

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 221
    Par défaut
    Si ca marche pas comme ca, passe par une requete SQL INSERT INTO. Moi c'est ce que j'utilise pratiquement tout le temps pour les requête d'ajout.
    Tu construit ta requête qui va bien et tu l'envoi avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL  le_nom_de_ta_requete
    y'a pas de raison que ca marche pas!

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Mdr tu vas jamais me croire mais c'est ce que j'essaie de faire depuis tout à l'heure

    Mais bon j'ai 2 tit soucis (bien entendu...^^) :

    Voilà ma superbe requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            requete = "INSERT INTO entreprise (NumEnt, NomEnt, NumActvEnt, RueEnt, VilleEnt, CPEnt, TelEnt, MailEnt, FaxEnt, CommEnt) VALUES ('" & Texte20.Value & "' , '" & Texte6.Value & "', '" & Modifiable2.Value & "', '" & Texte8.Value & "', '" & Texte10.Value & "', '" & Texte12.Value & "', '" & Texte14.Value & "', '" & Texte18.Value & "', '" & Texte16.Value & "', '" & Texte4.Value & "');"
     
            MsgBox requete
            DoCmd.RunSQL requete
     
            MsgBox "Mise à jour effectuée !"
    j'ai mis le msgBox comme tu me l'a conseillé pour le VB, tout est clean sauf le numéro automatique qui ne prend pas le dernier numero de la table. En cliquant quand même sur ok il y a 2 messages bizarre:

    Vous allez ajouter 1 ligne. Etes vous sur de vouloir ajouter les lignes selectionnées ? (Je clique sur oui)

    Microsoft ACCESS ne peut pas ajouter tous les enregistrements de la requête ajout. Microsoft a attribué la valeur Null à 0 champ(s) à le suite d'une erreur de conversion de type, 1 enregistrement n'a pas été ajouté à la table à la suite d'une violation de clé [...] Voulez vous tout de même exécuter cette requete ? (Je clique sur Oui)

    Et bien entendu rien ne se passe. Alors je pense bien entendu que c'est à cause du problème avec le numéro auto. Penses tu qu'il faut que je fasse un requête max ?


    J'ai changé ma requête en remplacant NumEnt dans la requête INSERT INTO par un select max :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SELECT MAX(NumEnt)+1 FROM Entreprise)
    . Ca ne reconnait pas et j'ai un messag d'erreur, tu connais la synthaxe exact ?

    J'ai fini ma journée ! A demain j'espere Bonne soirée !

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 221
    Par défaut
    C'est quoi le nom de ton numéro auto? Nument?

    Moi ce que je fais quand j'ai un numéro auto et que je veux Ajouter un nouvel enregistrement (je ne sais pas si c'est la meilleure solution mais ca marche sans bug ^^) c'est que je récupère le dernier numéro présent en fin de table, je lui ajoute un et j'envoi ma requête avec cette valeur.

    De plus j'ai vu que tu as plusieurs champs qui sont des numéros. Si ils sont déclaré comme numérique dans ta table, il faut que tu enlève les simples cotes de chaque coté de tes variables.

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Voilà mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim req As String
    Dim nummax As Integer
     
    req = "select max (NumEnt) FROM Entreprise"
    nummax = req + 1
    Puis j'ai remplacé NumEnt dans la seconde partie de la requête par "& nummax &". Mais ça ne marche pas.

    Il me trouve une erreur : "Imcompatibilité de type".
    Debogage sur

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 221
    Par défaut
    C'est normal. Ce que tu essayes de faire avec ton code c'est d'ajouter 1 à ta chain de caractère. Il faut d'abord que tu récupère la réponse de ta requête dans un recordset du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim req As String
    Dim nummax As Integer
    Dim rs as recordset
     
    req = "select max (NumEnt) FROM Entreprise"
    Set rs = Application.Currentdb.OpenRecordSet(req, dbOpenDynaset)
     
    nummax = rs.fields("NumEnt")
    nummax = req + 1
    rs.Close
    La tu récupère le numéro et tu l'incrémente de 1.
    Voila essayes avec un truc du genre

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Je comprends le début du code et bien entendu le seul truc que je comprends pas c'est là où il y a un bug !

    Pourrais tu m'expliquer qu'est ce que rs.fields ?

    J'ai essayé 2 bout de code différent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim req As String
    Dim nummax As Integer
    Dim rs as recordset
     
    req = "select max (NumEnt) FROM Entreprise"
    Set rs = Application.Currentdb.OpenRecordSet(req, dbOpenDynaset)
     
    nummax = rs.fields("NumEnt") ==> debogage (Elément non trouvé dans cette collection)
    nummax = req + 1
    rs.Close
    Et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim req As String
    Dim nummax As Integer
    Dim rs as recordset
    Dim db as database
     
    Set db = CurrentDb
    req = "select max (NumEnt) FROM Entreprise"
    Set rs = Application.Currentdb.OpenRecordSet("Entreprise", dbOpenDynaset)
     
    nummax = rs.fields("NumEnt")
    nummax = req + 1 ==> Debogage (Erreur d'incompabilité de type)
    rs.Close

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 221
    Par défaut
    Le fields renvoi la valeur du champ que tu lui passes en paramètre.
    Par exemple dans ta requête si tu demande Nom, Prenom et Ville (par exemple ^^), pour récupérer la valeur du nom tu utilises rs.Fields("Nom") ou rs.Fields("Ville") si tu souhaites récuperer la valeur du champ ville qeu tu viens de récupérer.

    Pour ton code essayes de remplacer ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    req = "select max (NumEnt) FROM Entreprise"
    Set rs = Application.Currentdb.OpenRecordSet(req, dbOpenDynaset)
     
    nummax = rs.fields("NumEnt")
    nummax = req + 1
    par ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    req = "select max (NumEnt) as NumMax FROM Entreprise"
    Set rs = Application.Currentdb.OpenRecordSet(req, dbOpenDynaset)
     
    nummax = rs.fields("NumMax")
    nummax = nummax + 1

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Bon alors le MsgBox m'indique que c'est perfect ! Le numero prend bien le numero du dernière enregistrement + 1 !

    MAIS (^^) Il y a encore un bug !!!! Après le MsgBox : Erreur de synthaxe dans l'expression INSERT INTO

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 221
    Par défaut
    renvoi moi la syntaxe de ta requete s'il te plait
    Il doit y avoir un petit soucis

  13. #13
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    requete = "INSERT INTO Entreprise (NumEnt, NomEnt, NumActvEnt, RueEnt, VilleEnt, CPEnt, TelEnt, MailEnt, FaxEnt, CommEnt) VALUES (" & nummax & " ,'" & NomEnt.Value & "', " & Modifiable2.Value & ", '" & RueEnt.Value & "', '" & VilleEnt.Value & "', " & CPEnt.Value & ", " & TelEnt.Value & ", '" & MailEnt.Value & "', " & FaxEnt.Value & ", '" & CommEnt.Value & "')"
     
    DoCmd.RunSQL requete
    J'ai remplacé les texte.value par le nom des champs pour que ce soit plus compréhensible pour toi

    OUPS Fausse alerte !!!!! Tout marche j'avais oublié de verifié la base de données, c'était tout en texte sauf le Numero d'activité qui était en numérique !! Honte à moi !!

    Merci pour tout !!! Problème résolu

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 221
    Par défaut
    Héhé nickel alors
    Bonne continuation à toi !

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

Discussions similaires

  1. [insert][bug] cause inconnue
    Par bakonu dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 15/12/2006, 16h02
  2. Réponses: 8
    Dernier message: 26/07/2006, 14h50
  3. Insertion impossible a cause de l'IDENTITY_INSERT
    Par oli_carbo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/03/2006, 14h24
  4. [MySQL] Pb d'insertion d'une valeur de champ select dans une Bdd
    Par Mimisator dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 20/10/2005, 18h51
  5. Update ou insert avec incrément d'un champ
    Par dany13 dans le forum ASP
    Réponses: 5
    Dernier message: 15/10/2004, 12h53

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