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

Access Discussion :

[MSG ERROR] vba object module needs implements for interface


Sujet :

Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 344
    Points : 158
    Points
    158
    Par défaut [MSG ERROR] vba object module needs implements for interface
    bonjour,

    j ai cree 2 class module vba excel : ConnectDAO DisconnectDAO

    j appelle ces modules dans un userform vba excel voila le code de mon userform:
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
    Implements ConnectDAO
    Implements DisconnectDAO
     
     
    Private Sub UserForm_Initialize()
     
     
    'Dim db As DAO.Database
     
    Dim rscode As Recordset
     
    ConnectDAO
     
     
    'Set db = DBEngine.OpenDatabase("d:\invoice.mdb", True)
     
     
    Set rscode = db.OpenRecordset("code", dbOpenTable, dbFailOnError)
     
     
        With rscode
            While Not .EOF
     
            code_nom = !code_nom
            Combocode.AddItem code_nom
            .MoveNext
     
            Wend
     
        End With
     
    rscode.Close
    'db.Close
     
    DisconnectDAO
     
    Set rscode = Nothing
    'Set db = Nothing
     
    End Sub
     
    Private Sub ButtonAjoutCode_Click()
     
    Dim db As DAO.Database
     
    Dim rsaddcode As Recordset
     
    Set db = DBEngine.OpenDatabase("d:\invoice.mdb", True)
     
     
    Set rsaddcode = db.OpenRecordset("code", dbOpenTable, dbFailOnError)
     
    rsaddcode.AddNew
     
    rsaddcode.Fields("code_nom").Value = TxtboxCode.Value
    rsaddcode.Update
     
    rsaddcode.Close
    db.Close
     
    Set rsaddcode = Nothing
    Set db = Nothing
     
     
     
    End Sub

    et voila le code des class module

    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
     
     
     
    Public Sub ConnectDAO()
     
    Dim db As DAO.Database
     
     
    Set db = DBEngine.OpenDatabase("d:\invoice.mdb", True)
     
    End Sub
     
     
     
     
    Public Sub DisconnectDAO()
     
    db.Close
     
    Set db = Nothing
     
    End Sub

    et lorsque je lance le userform message error suivant :

    object module needs to implement 'connectDAO' for interface 'connectDAO'

    car en fait je veux centraliser la connection a un seul fichier et appeler des que j en ai besoin

    merci pour votre aide

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Question: pourquoi créér une interface ?
    Tu te compliques bien la vie pour peu de choses

    Argy

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 344
    Points : 158
    Points
    158
    Par défaut
    non en fait je ne veux pas creer une interface

    je veux mettre mes parametres de connection deconnection DAO dans une function ou classe je ne sais pas trop et l appeler quand j en ai besoin

    qu est ce que je dois faire? s il te plait merci

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    Tu créés simplement une fonction Publique générique dans un module...
    Par exemple:

    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
    Public Function AddThisItem(ByVal FieldName As String, ByVal TableName As String, ByVal NewData As String) As Boolean
    Dim oRS As DAO.Recordset
    Dim SQLSelect As String
    Dim blnSuccess As Boolean
     
      On Error GoTo L_ErrNoData
      SQLSelect = "SELECT * FROM " & TableName
      Set oRS = CurrentDb.OpenRecordset(SQLSelect, 2)
        With oRS
          .AddNew
          .Fields(FieldName).Value = NewData
          .update
          .Close
        End With
    L_ExNoData:
      AddThisItem = blnSuccess
      Set oRS = Nothing
      Exit Function
    L_ErrNoData:
      blnSuccess = False
      Resume L_ExNoData
    End Function
    Ensuite tu l'appelles depuis ton formulaire avec les paramètres requis.
    Tu peux créer une autre qui s'appelle UpdateThisItem et une autre DeleteThisItem...

    Argy

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 344
    Points : 158
    Points
    158
    Par défaut
    o merci j avais pas vu ca comme ca

    je vais modifier mon code en consequence merci

  6. #6
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Ou alors, si tu veux vraiment encapsuler ton code dans une classe, ce qui est plus propre, tu peux :

    Créer une classe UseDAO
    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
    Private m_db As DAO.Database 
     
    Property Get CurrentDB() as DAO.Database
        if m_db is Nothing then
            ConnectDAO
        else
            'rien à faire
        end if
            Set CurrentDB=m_db
    End Property
     
    Public Function ConnectDAO()  as DAO.Database
        Set m_db = DBEngine.OpenDatabase("d:\invoice.mdb", True) 
        Set ConnectDAO=m_db
    End Function 
     
    Public Sub DisconnectDAO() 
        m_db.Close 
        Set m_db = Nothing 
    End Sub
    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
     
     
    Private m_ConnDAO as NomDeTaClasse
     
    Private Sub UserForm_Initialize() 
        Dim rscode As Recordset 
     
        Set m_ConnDAO = New NomDeTaClasse
     
     
        Set rscode = m_ConnDAO.Currentdb.OpenRecordset("code", dbOpenTable, dbFailOnError) 
    ...
    ...
    ...
    ...
    Voilà

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 344
    Points : 158
    Points
    158
    Par défaut
    merci c 'etait ca que j essayais d'obtenir merci

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 344
    Points : 158
    Points
    158
    Par défaut
    une petite question technique de newbie :

    c'est quoi la différence entre public sub et public function

  9. #9
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    PS !

    On pouvait faire mieux !!!
    Sur l'initialize de la class, faire la connexion.
    Sur le terminate, faire la déconnexion.

    Comme cela, la classe n'a qu'une seule propriété, en lecture seule : currentdb.

    waouw !

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 344
    Points : 158
    Points
    158
    Par défaut
    ok ca fonctionne voici le code pour ceux que ca interesse :

    un grand merci a argyronet et Maxence

    la class module nommée ClassDAO: voici le 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
     
     
    Private m_db As DAO.Database
     
        Property Get CurrentDB() As DAO.Database
     
            If m_db Is Nothing Then
            ConnectDAO
            Else
            End If
     
            Set CurrentDB = m_db
     
        End Property
     
     
        Public Function ConnectDAO() As DAO.Database
     
        Set m_db = DBEngine.OpenDatabase("d:\invoice.mdb", True)
        Set ConnectDAO = m_db
     
        End Function
     
        Public Sub DisconnectDAO()
     
     
        m_db.Close
     
        Set m_db = Nothing
     
        End Sub

    et voici mon formulaire ajoutlot avec combo excel->vba->DAO->access-> table lot pour liste des lots deja existant ensuite une textbo ou je saisie le nouveau lot et un bouton pour ajouter dans la base access

    avec le ClassDAO ca donne ca :


    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
     
     
    Private cnxDAO As ClassDAO
     
    Private Sub UserForm_Initialize()
     
     
    'Dim db As DAO.Database
    'Set db = DBEngine.OpenDatabase("d:\invoice.mdb", True)
     
    Set cnxDAO = New ClassDAO
     
    cnxDAO.ConnectDAO
     
     
     
    Dim rscode As Recordset
     
    Set rscode = cnxDAO.CurrentDB.OpenRecordset("code", dbOpenTable, dbFailOnError)
     
     
        With rscode
            While Not .EOF
     
            code_nom = !code_nom
            Combocode.AddItem code_nom
            .MoveNext
     
            Wend
     
        End With
     
    rscode.Close
    Set rscode = Nothing
     
    cnxDAO.DisconnectDAO
     
     
     
    'db.Close
    'Set db = Nothing
     
    End Sub
     
    Private Sub ButtonAjoutCode_Click()
     
    'Dim db As DAO.Database
    'Set db = DBEngine.OpenDatabase("d:\invoice.mdb", True)
     
    cnxDAO.ConnectDAO
     
     
     
    Dim rsaddcode As Recordset
     
     
    Set rsaddcode = cnxDAO.CurrentDB.OpenRecordset("code", dbOpenTable, dbFailOnError)
     
    rsaddcode.AddNew
     
    rsaddcode.Fields("code_nom").Value = TxtboxCode.Value
    rsaddcode.Update
     
    rsaddcode.Close
     
    Set rsaddcode = Nothing
     
     
    cnxDAO.DisconnectDAO
     
    'db.Close
    'Set db = Nothing
     
     
     
    End Sub

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/01/2008, 12h58
  2. Réponses: 7
    Dernier message: 04/04/2006, 15h35
  3. Réponses: 2
    Dernier message: 30/08/2005, 17h08
  4. Réponses: 2
    Dernier message: 19/04/2005, 16h31
  5. Réponses: 3
    Dernier message: 10/12/2004, 10h42

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