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 :

Rechercher des enregistrements dans un jeu d'enregistrements DAO de type Table..


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 29
    Points
    29
    Par défaut Rechercher des enregistrements dans un jeu d'enregistrements DAO de type Table..
    ... et les mettre dans un champ d'une autre table (en access 2007)

    Bonjour

    Ce que je souhaites (ou plutôt que je DOIS) faire est un peu compliquer pour mon faible niveau en VBA mais je n'est pas le choix...

    Je sais ce que je dois faire mais je ne sais pas comment le faire
    J'ai un peu fouiller quand même avant de venir ici, j'ai regardé dans l'aide access et j'ai trouvé un début de piste mais je n'arrive pas à l'appliquer.

    Enfin bref... faisons les choses dans l'ordre.

    J'ai un formulaire contenant un formulaire sous forme feuille de données qui repose sur la table OPERATIONS ainsi qu'un groupe d'option sous la forme de radio bouton.
    Cette table est reliée à 2 autres tables (ASSEMBLAGE et SAV) qui vont me servir.

    Mes Tables:
    Table OPERATIONS (IdOperation, NomOperation,..., IdOpAssemblage, IdOpSAV)
    Table ASSEMBLAGE (IdOpAssemblage, OpAssemblage)
    Table SAV (IdOpSAV, OpSAV1, OpSAV2, OpSAV3,..., OpSAVn) >> pour le moment je n'ai que 4 champs dans cette table mais il pourrait y en avoir plusieurs à l'avenir d'où le OpSAVn

    Les tables ASSEMBLAGE et SAV correspondent en fait à des listes. Par ex, dans le champ OpAssemblage il y a un liste de 4 ou 5 opérations ce qui fait 4 ou 5 enregistrements. Idem pour la table SAV (pour le moment seul le champ OpSAV1 contient des enregistrements!)

    Dans mon formulaire, mon groupe d'options en comporte 4 qui sont:
    OpAssemblage, OpSAV1, OpSAV2, OpSAV3
    correspondant aux champs respectifs du même nom des tables ASSEMBLAGE et SAV.

    Voilà pour la présentation.

    Maintenant ce qu'il faut que je fasse, c'est lorsque je choisi une option (par ex OpAssemblage), mettre les valeurs de ce champ dans le champ NomOperation de la table OPERATIONS et qui se trouve dans le sous-formulaire.

    J'ai d'abord utiliser un select case et DLookUp pour le faire mais ça ne marche pas et en plus j'ai une erreur d'exécution (94)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Choix_cycle_Click()
        Dim NomOp As String
        NomOp = SF_Détails_Opérations_Composant.Form.NomOperation    
        Select Case Me.Choix_cycle.Value
            Case 1
                NomOp = DLookUp ("[OpAssemblage]", "ASSEMBLAGE")
            Case 2
                NomOp = DLookUp ("[OpSAV1]", "SAV")
            Case 3
                NomOp = DLookUp ("[OpSAV2]", "SAV")
            Case 4
                NomOp = DLookUp ("[OpSAV3]", "SAV")
        End Select
    End Sub
    En fouillant un peu plus, je suis tomber sur un exemple dans l'aide qui utilise la méthode Seek.
    J'ai donc créé mes 2 fonctions sur le modèle de l'exemple, une pour la table ASSEMBLAGE et une pour la table SAV.
    Mais ça marche pas des masses non plus et j'ai toujours cette foutu erreur d'exécution

    Pour assemblage:
    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
    Function GetOpAssemblage(lgOpAssemblageId As Long) As Variant
        Dim dbsBDD As DAO.Database
        Dim rstAssemblage As DAO.Recordset
     
        On Error GoTo ErrorHandler
            Set dbsBDD = CurrentDb
            Set rstAssemblage = dbsBDD.OpenRecordset("ASSEMBLAGE")
     
            rstAssemblage.Index = "PrimaryKey"
            rstAssemblage.Seek "=", lgOpAssemblageId
     
            If rstAssemblage.NoMatch Then
                GetOpAssemblage = Null
            Else
                GetOpAssemblage = rstAssemblage!OpAssemblage
            End If
     
            rstAssemblage.Close
            dbsBDD.Close
     
            Set rstAssemblage = Nothing
            Set dbsBDD = Nothing
        Exit Function
     
    ErrorHandler:
       MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description
    End Function
    Pour sav:
    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
    Function GetOpSAV1(lgOpSAVId As Long) As Variant
        Dim dbsBDD As DAO.Database
        Dim rstSAV As DAO.Recordset
     
        On Error GoTo ErrorHandler
            Set dbsBDD = CurrentDb
            Set rstSAV = dbsBDD.OpenRecordset("SAV")
     
            rstSAV.Index = "PrimaryKey"
            rstSAV.Seek "=", lgOpSAVId
     
            If rstSAV.NoMatch Then
                GetOpSAV1 = Null
            Else
                GetOpSAV1 = rstSAV!OpSAV1
            End If
     
            rstSAV.Close
            dbsBDD.Close
     
            Set rstSAV = Nothing
            Set dbsBDD = Nothing
        Exit Function
     
    ErrorHandler:
       MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description
    End Function
    Mais le problème de cette méthode c'est que je ne récupère qu'un seul enregistrement, or je dois récupérer tous les enregistrements du champ pour les mettre dans le champ NomOperation de la table OPERATIONS.
    De plus, pour la table SAV j'ai plusieurs champs et je ne peux pas faire une fonction pour chaque champs, ce serait trop lourd à géré d'autant plus qu'il pourrait y en avoir davantage par la suite. Il faudrait donc que je puisse mettre tout dans une seule fonction pour la table SAV mais je ne sais pas comment

    Voilà, c'est un peu long mais j'espère avoir été clair dans mes explications et merci de m'avoir lu jusqu'au bout. Si certains points vous parraissent obscurs ou mal expliquer, n'hésitez pas à me redemander.

    Merci aussi à ceux qui voudront bien se pencher sur mon problème épineux et me donner conseils et solutions

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 86
    Points
    86
    Par défaut
    je sais pas si j'ai tout comprit mais je peut te donner un debut de piste.
    Pour inserer des données dans une table en VBA tu devrais utiliser les recordset.

    Pour ce faire tu declare un recordset
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dim rst as dao recordset
    ensuite tu le definie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set rst=recordset("nom de ta table",type de recordset genre "dynaset")
    et apres tu inseres tes données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rst.fields("nom du champs de ta table")="valeur que tu veus lui attribuer"
    En fin de boucle tu fermes ton recordset que tu reouvriras en debut de boucle pour qu'il s'actualise au fur et a mesure de tes ajouts.

    Amicalement Scons
    Amicalement Scons

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 29
    Points
    29
    Par défaut
    Bonjour Scons

    J'ai essayé avec ce que tu m'a mis mais la deuxième ligne ne marche pas. J'ai toujours une erreur soit d'execution soit de compilation quelque soit le manière dont je l'écris

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 598
    Points : 34 286
    Points
    34 286
    Par défaut
    je reprends juste pour donner les lignes correctes du code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim rst as DAO.RecordSet
    set rst=CurrentDb.OpenRecordSet("nom de ta table", dbopendynaset)
    rst.Edit
    rst.fields("nom du champs de ta table")="valeur que tu veus lui attribuer"
    rst.Update
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 86
    Points
    86
    Par défaut
    excuse moi j'ai oublier quelques elements en fait.

    au depart tu dois aussi declarer la base de données avec laquelle tu travail.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim bd As Database
    definition de la base de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set bd = CurrentDb
    apres tu reprend les lignes que je t'ai données.

    remplace ta deuxieme ligne par celle ci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set rst=bd.openrecordset("ta table", dbopendynaset")
    place un "rst.edit" avant le "rst.fields" et un "rst.update" apres
    et enfin verifie que dans les references VBA tu as bien la reference a DAO
    Amicalement Scons

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 29
    Points
    29
    Par défaut
    Oui j'ai bien les réf DAO

    Mais j'ai une question toute bête

    Je met ça où? dans ma function à la place de ce que j'ai déjà fait??

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 86
    Points
    86
    Par défaut
    tu met ça dans ton programme et tu vire tes fonctions.
    Tu places les lignes de code pour chaque "case" de ton programme.

    Amicalement Scons
    Amicalement Scons

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 29
    Points
    29
    Par défaut
    Bonjour

    J'ai modifié ma procédure comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Choix_cycle_Click()
        Dim dbsBDD As DAO.Database
        Dim rst As DAO.Recordset
        Set dbsBDD = CurrentDb
        Set rst = dbsBDD.OpenRecordset("OPERATIONS", dbOpenDynaset)
        Select Case Me.Choix_cycle.Value
            Case 1
                rst.Edit
                rst.Fields("Nom Operation") = Me.OpAssemblage
                rst.Update
            ...
        End Select
    End Sub
    Mais ça me donne une erreur: "erreur d'exécution '3021': aucun enregistrement en cours" sur la ligne rst.Edit

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 86
    Points
    86
    Par défaut
    Excuse moi, decidement je tape un peu en touche.
    En fait c'est pas "rst.edit" qu'il faut que tu mette mais "rst.addnew".

    "rst.edit" sert a editer un enregistrement existant et la vu que ta table est vide c'est normal que tu est ce message.
    Amicalement Scons

Discussions similaires

  1. Recherche dans un fichier impossible enregistré dans un fichier
    Par cdjkhdjlhxjklnjskznj dans le forum Langage
    Réponses: 19
    Dernier message: 03/12/2014, 00h09
  2. Réponses: 22
    Dernier message: 22/05/2013, 17h52
  3. Réponses: 2
    Dernier message: 24/11/2010, 09h40
  4. Réponses: 0
    Dernier message: 25/07/2010, 17h22

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