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 en fonction des champs d'un formulaire [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Insertion en fonction des champs d'un formulaire
    Bonjour à tous,

    Je vous explique le contexte : je souhaite, lors de la consultation de données dans un formulaire, avoir la possibilité d'insérer dans ma table l'enregistrement actif, mais seulement les champs non null, à la suite de l'appuie sur un bouton.

    Ce qui marche : je crée une variable qui va contenir la liste des champs non null et une variable qui va contenir la liste des valeurs associées aux champs.

    Voici le code qui me permet de créer ces variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim Champs As String, Valeur As String, requete As String
              If Not IsNull([champs]) Then
                      Champs = "champs"
                      Valeur = "'" & Me![champs] & "'"
              End If
              If Not IsNull([champs2]) Then
                      Champs = Champs & ", champs2"
                      Valeur = Valeur & ", '" & Me![champs2] & "'"
              End If
    Ensuite je crée la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete = "INSERT INTO maTable (" & Champs & ") VALUES (" & Valeur & ");"
    Ce qui ne marche pas : evidemment l'execution de la requête avec le code suivant :
    Voici l'erreur :
    Erreur d'execution '3075'
    Erreur de syntaxe (opérateur absent) dans l'expression :
    et l'expression en question est le contenu de la variable Valeur

    Bien sur avant de poster sur le forum, j'ai fait les tests evident à savoir afficher les différentes variables dans une MsgBox pour vérifier la syntaxe et tout me parait clair...

    Je vous joins une copie d'écran des différentes variables au cas ou je ne serais pas bien réveillé :p

    Merci d'avance

    Edit : je viens de tester sur différents enregistrements et le résultat est plutôt surprenant : sur certains enregistrements aucun problème, mon "insert" marche nikel alors que sur d'autres pas moyen...
    J'ai alors pensé que cela pouvait provenir de la taille des variables mais mes tests me prouvent le contraire... Je suis vraiment perdu
    Images attachées Images attachées  

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 206
    Points : 243
    Points
    243
    Par défaut
    Petit remarque, je ne sais pas si cela peut-être à l'origine de l'erreur, mais j'ai remarqué des dates dans ta requête, les champs de ta table sont ils en format "date" ?
    Si c'est le cas il faudrait les entourer du symbole '#' dans ta requête.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    En effet les dates sont bien au format "Date" même "Date, abrégée" mais le problème ne vient pas de la (je viens de faire le test).

    Merci tout de même pour ta réponse.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 206
    Points : 243
    Points
    243
    Par défaut
    Dans la requête que tu as fournis, le deuxième champs doit poser problème.

    " 'Contrat d’exécution' " => Il y a une apostrophe. Vérifie si les enregistrements qui ont réussi à passer en ont, si c'est pas le cas, ça doit venir de là.

    Pour éviter les injections, tu peux créer une fonction du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function PrepareString(strChaine as String) as String (
     
         PrepareString = Replace(strChaine, "'" , "_")
     
    End Function
    Et au niveau de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
             If Not IsNull([champs2]) Then
                      Champs = Champs & ", champs2"
                      Valeur = Valeur & ", '" & PrepareString(Me![champs2]) & "'"
              End If

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Alors là je dis "chapeau bas" !

    Un énorme merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/11/2014, 21h21
  2. Réponses: 2
    Dernier message: 10/12/2013, 09h42
  3. Comment "mapper" un array en fonction des champs name d'un formulaire ?
    Par student_php dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/05/2013, 11h11
  4. [MySQL] afficher des champs d'un formulaire en fonction d'une liste déroulante
    Par mademoizel dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 08/10/2009, 12h31
  5. Réponses: 1
    Dernier message: 22/08/2007, 00h05

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