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 :

VBA et manipulation de BDD avec requêtes SQL [AC-97]


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut VBA et manipulation de BDD avec requêtes SQL
    Bonjour à tous,

    Je travaille actuellement sur un projet qui me demande une manipulation d'une base de données sous Access 97. Elle comprend une dizaine de tables et chacune d'entre elles comprend un bon nombre de champs.
    Certains de ces champs sont de type "Memo".

    Voici donc mon problème, je dois récupérer chacune des valeurs de tous les champs de type Memo de toutes les tables et les modifier.
    Je suis débutant sur Access et rencontre donc quelques pépins.

    Grâce à la FAQ et à quelques anciens posts, je suis arrivé à une ébauche succincte. J'ai réalisé quelques tests sur le champ d'une seule table mais sans succès.
    Le soucis majeur, c'est que je n'arrive pas à récupérer la valeur du champ.

    Par exemple, j'essaie d'afficher les valeurs comprises dans le champ "DESC" à travers une MsgBox mais cela ne fonctionne pas. Pourtant j'ai réussi à les afficher une fois, mais depuis plus moyen.

    Voici mon code :

    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
    43
    Sub Main()
     
    Dim db As Database
    Dim Rs As Recordset
    Dim Fd As Field
    Dim Tables(11) As String
    Dim NbChamps
    Dim rSql As String
    Dim resultat As Currency
     
    Tables(1) = "table1"
    Tables(2) = "table2"
    Tables(3) = "table3"
    Tables(4) = "table4"
    Tables(5) = "table5"
    Tables(6) = "table6"
    Tables(7) = "table7"
    Tables(8) = "table8"
    Tables(9) = "table9"
    Tables(10) = "table10"
    Tables(11) = "table11"
     
    Set db = OpenDatabase("C:\Users\Tuvia\Desktop\BDD.mdb")
     
    rSql = "Select * From " & Tables(5)
    Set Rs = db.OpenRecordset(rSql)
    Rs.MoveFirst
     
    While Not Rs.EOF
    If (Rs("DESC") <> Null) Then
          MsgBox (Rs![DESC])
    End If
    Rs.MoveNext
    Wend
     
    Rs.Close
     
    db.Close
     
    Set Rs = Nothing
    Set db = Nothing
     
    End Sub

    Une erreur d'invalid use of Null apparaît...


    J'aimerai donc savoir ce qui ne va pas avec ce code ?
    Par la suite, j'imaginais créer plusieurs tableaux de String comprenant le nom de chacun des champs d'une seule table et faire une boucle pour apporter les modifications à tous les champs concernés. J'aimerai également savoir s'il y a une manière plus simple et automatisé de réaliser une modification sur toute une BDD ou si ce que j'envisage est la meilleure solution ?

    Je vous remercie d'avance pour toute l'aide apportée.

    Tuvia.

  2. #2
    Membre habitué
    Homme Profil pro
    Apprendre
    Inscrit en
    Avril 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations professionnelles :
    Activité : Apprendre
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 147
    Points : 175
    Points
    175
    Par défaut
    Bonjour,

    J'ai eu un problème similaire dernièrement, je voulais passer une table en revue ligne par ligne et en retirer une valeur particulière.

    Certaines fonctions m'ont été utiles, mais je n'ai pas vraiment réussi à utiliser adéquatement le rs.eof.

    Mais j'ai contourné le problème de la manière suivante:

    J'ai créer un formulaire avec le recordsource voulue (Ex.: Table1). J'ai placé le curseur sur le premier enregistrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.GoToRecord acDataForm, "nom de ton formulaire", acFirst
    Puis j'ai fait un décompte du nombre d'enregistrement de la table par la clé primaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim compte As Integer
    compte = DCount("[clé primaire]", "table1")
    Ensuite, j'ai établi une variable pour récupérer le champ voulu.

    Pour récupérer le champ voulu, j'ai utiliser la fonciton suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable = DLookup("[le champ de la table dans ton formulaire]", "table1")
    En ayant la valeur voulu du premier enregistrement de la table, je passais la table en revue en utilisant la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 1 To compte
    variable = DLookup("[le champ de ton formulaire]", "table1)
    msgbox variable
    DoCmd.GoToRecord acDataForm, "nom du formulaire", acNext
    next
    En modifiant le recordsource de ton formulaire(via VBA) tu pourrais obtenir le résultat pour toutes tes tables.

    Maintenant, je suis certain que faire l'opération avec le principe du eof est beaucoup plus efficace.

    Pour ce qui est de modifier les enregistrements, je pense qu'un bon vieux update en SQL ferait l'affaire.

    En espérant que ça puisse aider, mais comme je te l'ai indiqué, ce n'est surement pas la manière la plus efficace de procéder.

    Je suis sous Access 2010, peut-être n'est-ce même pas possible d'effectuer de la manière que je propose, à tester!

    Merci

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bonjour Myrddin,

    Merci pour ces conseils, j'ai testé mais j'ai finalement réussi à récupérer les données grâce à EOF. Maintenant je n'arrive pas à faire l'UPDATE. C'est un problème lié à la valeur de l'un de mes champs. L'erreur rencontrée est "Erreur de syntaxe (opérateur absent) dans l'expression : Valeur du champ"

    N.B : La valeur du champ comprend des guillemets, je suppose que le problème provient de là. Mais je n'ai aucune idée pour le résoudre. Y aurait-il une fonction qui permettrait d'échapper les caractères spéciaux à l'instar de la fonction Escape pour les Regex en VB ( voir : ici?


    Voici le code modifié pour celles et ceux qui auraient le même problème que précédemment :

    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
    43
    44
    45
    46
    Sub Main()
     
    Dim db As Database
    Dim Rs As Recordset
    Dim Fd As Field
    Dim Tables(11) As String
    Dim rSql As String
    Dim temp As String
    Dim cle As String
     
    Tables(1) = "table1"
    Tables(2) = "table2"
    Tables(3) = "table3"
    Tables(4) = "table4"
    Tables(5) = "table5"
    Tables(6) = "table6"
    Tables(7) = "table7"
    Tables(8) = "table8"
    Tables(9) = "table9"
    Tables(10) = "table10"
    Tables(11) = "table11"
     
    Set db = OpenDatabase("C:\Users\Tuvia\Desktop\BDD.mdb")
     
    rSql = "Select * From " & Tables(5)
    Set Rs = db.OpenRecordset(rSql)
    Rs.MoveFirst
     
    While Not Rs.EOF
    temp = "" & Rs![DESC]
    temp = ReplaceT(temp, "£")
    cle = Rs![REF]
     
    rSql = "UPDATE " & Tables(5) & " SET [DESC] = """ & temp & """ WHERE REF = """ & cle + """"
    db.Execute (rSql)
     
    Rs.MoveNext
    Wend
     
    Rs.Close
    db.Close
     
    Set Rs = Nothing
    Set db = Nothing
     
    End Sub
    La fonction ReplaceT est la fonction que j'ai conçu pour apporter les modifications aux valeurs de mes champs.

    Tuvia.

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 108
    Points : 5 231
    Points
    5 231
    Par défaut
    Bonjour,

    Plutot qu'un update, rs est éditable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    While Not Rs.EOF
    if not isnull(Rs!DESC) then
      temp = ReplaceT(Rs!DESC, "£")
      if rs!desc<>temp then
        rs.edit
        rs!desc=temp
        rs.update
      end if
    end if
    Rs.MoveNext
    Wend

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bonjour Nico,

    Effectivement ! Mon problème est résolu
    Merci de votre aide !

    Tuvia

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

Discussions similaires

  1. Extraction depuis BdD avec requêtes SQL
    Par Rorylh dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 30/01/2013, 09h54
  2. Réponses: 2
    Dernier message: 28/12/2008, 15h28
  3. Problème avec requête SQL dans VBA
    Par Mimisio dans le forum VBA Access
    Réponses: 10
    Dernier message: 13/07/2007, 11h00
  4. VBA avec requête SQL
    Par seba_stien dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 17/10/2006, 15h39
  5. [MySQL] Problème de listes déroulantes liées avec requêtes sql
    Par richton95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/12/2005, 16h04

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