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 :

Passage d'un objet en paramètre [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut Passage d'un objet en paramètre
    Bonjour,

    Je développe actuellement une base de données sous access 2007 en essayant d'appliquer la méthode UML au plus près de ce que j'ai pu voir en cours du soir l'an dernier...

    Tout se passe pour le mieux mais je coince depuis quelques temps sur un soucis majeur à mon sens. Je n'arrive pas du tout à faire passer un objet de mon cru en paramètre à une fonction (par exemple passer un recordset ne pose pas de soucis particuliers). Si quelqu'un à une idée de la bonne manière de procéder cela me rendrait bien service.

    Explications de ce que je souhaite faire :
    - j'ai créé une classe domaine
    - j'ai créé une classe formation qui contient un objet de type "domaine"

    La classe formation contient une fonction setDomaine déclarée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'declaration de l'argument domaine
    private domaine as new classDomaine
    'declaration de ma fonction setDomaine
    public function setDomaine(pDomaine as classDomaine)
      set domaine = pDomaine
    end function
    J'ai réalisé l'appel à la fonction de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    'creation d'un objet de type formation et d'un objet de type domaine
    dim maFormation as new classFormation
    dim monDomaine as new classDomaine
    'je vous passe les details mais en gros j'affecte des valeurs aux attributs de l'objet monDomaine
    'vient le moment d'appeler la fonction setDomaine
    ...
    maFormation.setDomaine(monDomaine)
    L'execution ne va pas plus loin et me renvoie une erreur 438 propriété ou méthode non gérée par cet objet.

    Je n'ai vraiment aucune idée de ce que je fait de travers et malgré des recherches en anglais, en francais... aucune solution ne s'est présentée.

    Merci pour votre attention

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Par défaut
    Il manque pas un New lors de la déclaration?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut
    Bien vu en effet... j'ai oublié les "new" lors de la déclaration de mes objets :p
    Mais uniquement sur le forum. Ils sont biens présents dans mon code.
    Je modifie le post, merci

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Par défaut
    Faudrait voir l'ensemble du code du module de classe pour mieux comprendre.

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut
    Alors, alors voila pour le code :

    Code de la classe domaine :
    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
     
    Private intNumero As Integer
    Private strLibelle As String
     
    Public Function getListeDomaines() As DAO.Recordset
        Dim mabase As DAO.Database
        Set mabase = CurrentDb
     
        Dim recListeDomaines As DAO.Recordset
        Set recListeDomaines = mabase.OpenRecordset("tDomaine")
     
        Set getListeDomaines = recListeDomaines
    End Function
     
    Public Function setNumero(pNumero As Integer)
        intNumero = pNumero
    End Function
     
    Public Function setLibelle(pLibelle As String)
        strLibelle = pLibelle
    End Function
     
    Public Function getNumero() As Integer
        getNumero = intNumero
    End Function
    Une classe formation :
    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 intNumero As Integer
    Private strIntitule As String
    Private domaine As New classDomaine
     
    Public Function getListeFormation()
     
    End Function
     
    Public Function setDomaine(pDomaine As classDomaine)
        Set domaine = pDomaine
    End Function
     
    Public Function setIntitule(pIntitule As String)
        strIntitule = pIntitule
    End Function
     
    Public Function enregistrerFormation() As Boolean
        Dim mabase As DAO.Database
        Set mabase = CurrentDb
     
        Dim recFormation As DAO.Recordset
        Set recFormation = mabase.OpenRecordset(tFormation)
     
        recFormation.AddNew
        recFormation!int_for = strIntitule
        recFormation!num_dom = domaine.getNumero()
        recFormation.Update
     
        enregistrerFormation = True
    End Function
    Une classe controle qui appelle la fonction setDomaine d'un objet de type formation :
    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
     
    Public Function demanderListeDomaines() As DAO.Recordset
        Dim monDomaine As New classDomaine
     
        Set demanderListeDomaines = monDomaine.getListeDomaines()
    End Function
     
    Public Function demanderEnregistrementFormation(pDomaine As Integer, pIntitule As String) As Boolean
        Dim maFormation As New classFormation
        Dim monDomaine As New classDomaine
     
        Dim mabase As DAO.Database
        Set mabase = CurrentDb
     
        Dim reqMonDomaine As DAO.Recordset
        Set reqMonDomaine = mabase.OpenRecordset("SELECT * FROM tDomaine WHERE num_dom = " & pDomaine & ";")
        MsgBox reqMonDomaine!num_dom
     
        monDomaine.setNumero (reqMonDomaine!num_dom)
        monDomaine.setLibelle (reqMonDomaine!lib_dom)
     
        maFormation.setIntitule (pIntitule)
        maFormation.setDomaine (monDomaine)
        demanderEnregistrementFormation = maFormation.enregistrerFormation()
    End Function
    Tout semble fonctionner jusqu'a l'appel de cette fameuse fonction setDomaine, c'est le passage de l'objet en parametre qui semble poser probleme mais je ne comprend pas pourquoi :s

  6. #6
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Par défaut
    Très bizarre ton code... J'ai l'impression de lire du Java...
    Sinon pleins de choses à revoir à mon avis...

    Citation Envoyé par guit21 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public Function getListeDomaines() As DAO.Recordset
        Dim mabase As DAO.Database
        Set mabase = CurrentDb
     
        Dim recListeDomaines As DAO.Recordset
        Set recListeDomaines = mabase.OpenRecordset("tDomaine")
     
        Set getListeDomaines = recListeDomaines
    End Function
    Je ne comprends pas l'intérêt de cette fonction pour un module de classe... D'autant qu'il n'y a pas d'objet Recordset comme variable dans la classe...


    Citation Envoyé par guit21 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Function setNumero(pNumero As Integer)
        intNumero = pNumero
    End Function
     
    Public Function setLibelle(pLibelle As String)
        strLibelle = pLibelle
    End Function
    Personnellement je remplacerais le Function par un Sub.


    Citation Envoyé par guit21 Voir le message
    Une classe formation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private intNumero As Integer
    Private strIntitule As String
    Private domaine As New classDomaine
     
    Public Function getListeFormation()
     
    End Function
     
     
    Public Function setIntitule(pIntitule As String)
        strIntitule = pIntitule
    End Function
    Mêmes remarques que précédemment...

    Citation Envoyé par guit21 Voir le message
    Une classe controle qui appelle la fonction setDomaine d'un objet de type formation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public Function demanderEnregistrementFormation(pDomaine As Integer, pIntitule As String) As Boolean
     
        maFormation.setIntitule pIntitule
        maFormation.setDomaine monDomaine
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Sub setDomaine(pDomaine As classDomaine)
        Set domaine = pDomaine
    End Sub
    En enlevant le new en plus, dans la déclaration de l'objet domaine dans le module de classe de Formation.

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut
    Merci beaucoup,

    Il commence a y avoir du mieux j'ai une autre erreur sur laquelle je vais pouvoir me pencher maintenant

    Sinon pour répondre à tes interrogations, j'ai réalisé une analyse assez poussé en UML, en suivant les méthodes données par un prof du CNAM auprès duquel j'avais suivi le cours de Methodologie des Systemes d'Information... Mon projet est pas enorme, et en plus Access est peut etre pas le meilleur outil pour l'application d'UML mais il faut bien entamer par quelque chose.
    Pour ce qui est des méthodes getListeDomaines et getListeFormation, elles ont attérit là par le fait que mon diagramme de séquence les fait atterir là... Vois-tu une autre méthode pour obtenir la liste des domaines ou des formations tout en concervant une approche "full objet" ?
    Autre chose, y'a-t-il une raison au fait de retirer les parentheses lors de l'appel des fonctions ? Ma syntaxe était-elle complètement fausse ?

    Aller pour ce soir je stop ! Merci pour ton aide en tout cas, si tu veux plus de détails sur ce que je suis en train de développer et la manière dont je m'y prend n'hésite pas à me le faire savoir.
    Je me pencherai sur mon nouveau message d'erreur demain, je changerai le statut du sujet en RESOLU si jamais c'est effectivement le cas (la piste semble bonne en tout cas).

  8. #8
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Par défaut
    Pourquoi je dis que la fonction renvoyant un recordset dans un module de classe ne sert à rien? C'est simple. L'intérêt de faire un objet est de pouvoir y associer des méthodes (fonctions ou procédures), et des variables qui ont un rapport entre elles. Hors, tu utilise une fonction qui peut très bien être créée ailleurs que dans le module de classe. Ta fonction renvoie un objet recordset dont les données proviennent d'une table "tdomaine". Je ne vois alors pas l'intérêt de créer cette fonction dans le module, en sachant que ta table "tdomaine" est accessible à n'importe quel moment, et quelque soit l'endroit où tu créé ton code (formulaire, état, module, module de classe,...).
    Je ne vois pas concrètement ce que tu veux faire. Si tu veux juste tester ce que tu as appris pour l'appliquer en Access, je pense que tu peux regarder ceci en complément:

    http://sinarf.developpez.com/access/vbaclass/

    Concernant le fait d'enlever les parenthèses pour l'appel de la procédure. L'intérêt de faire une fonction est que tu dois renvoyer un résultat. Si tu n'envoie pas de résultat, alors il est plus propre (et conseillé) d'utiliser une procédure avec le mot clé Sub. A ce moment là, si tu appel la procédure, il ne doit pas y avoir de parenthèses (c'est la syntaxe qui veut ça). Si pour des raisons mystiques tu veux quand même utiliser des parenthèses il aurait fallu faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Call maFormation.setIntitule(pIntitule)
    Mais bon: c'est très moche comme ça...

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Par défaut
    Pour ce qui est des fonctions et procédures il faut que je m'occupe de modifier tout ça, merci pour cet éclaircissement. Cela fait quelques années que je n'avais plus fait de VBA et en php (langage que je pratique un peu plus...), il ne me semble pas qu'il y ai de différence lors de la déclaration d'une procédure ou d'une fonction (soit il y a une valeur de retour, soit pas).

    Sinon pour ce qui est de l'utilité de l'application, il s'agit de mettre en place (pour une de mes collègues...) une base de données contenant des formations. J'ai donc une liste de formations, des établissements qui peuvent les dispenser et des domaines de formation (par exemple automobile pour un CAP Mecanique Auto...).

    Pour finir, c'est vrai que ma fonction qui renvoie des domaines est un peu curieusement placée, j'aurai peut être du créer une classe listeDomaines, ça aurait été plus clair...

    Merci encore pour ton aide.

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

Discussions similaires

  1. [WD14] Passage d'un objet en paramètre à une fenêtre
    Par ritchi46 dans le forum WinDev
    Réponses: 21
    Dernier message: 04/05/2010, 09h35
  2. passage d'un objet en paramètre
    Par g30167 dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2007, 23h25
  3. passage d'objet en paramètre
    Par chilokan dans le forum Delphi
    Réponses: 6
    Dernier message: 07/05/2007, 21h29
  4. [WD10]Passage d'objet en paramètres de methode
    Par Isildur dans le forum WinDev
    Réponses: 25
    Dernier message: 26/03/2007, 17h35
  5. [DLL] Passage d'objet en paramètre
    Par TitiFr dans le forum Langage
    Réponses: 4
    Dernier message: 20/08/2005, 23h18

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