none
REFLEXION SUR LES ETATS RRS feed

  • Question

  • Bonjour,

    Je construits une application destinée à être déployée dans différents sites avec des fonctionnalités variables et des adaptations spécifiques.

    J'ai choisi d'utiliser ADODB plutôt que DAO pour l'accès aux données dans la mesure où je suis sur une base SQL Serveur (ne venez pas me dire que j'aurais mieux fait d'utiliser DAO que j'utilise depuis sa sortie alors que je me bats encore avec ADO !!)

    Dans un soucis d'homogénéisation du code et de simplification des mises à jour, je veux organiser l'ensemble des ressources de telle manière que je puisse diffuser des modules communs (projets .adp) tout en conservant les modules spécifiques de chaque site.

    Par exemple, la mise en forme des états variera d'un site à l'autre et, si on peut bien sur gérer différents éléments de personnalisation de l'état au moment de sa mise en page, il sera souvent plus simple de créer un état spécifique.

    J'ai donc créé un projet complémentaire (ce n'est pas un complément au sens propre du terme) associé au projet principal sous forme de référence. Au stade actuel j'en suis encore aux formats .adp en espérant qu'il n'y aura pas de mauvaise surprise en .ade...

    Lorsque je veux utiliser un état personnalisé, il me suffit de le créer dans ce projet complémentaire et de lui donner le même nom que celui du projet principal - utilisé par défaut. Une petite routine d'ouverture de l'état a été créée dans le sous-projet de telle manière qu'elle recherche d'abord l'état dans le sous-projet puis dans le projet principal.

    Jusque là tout va bien (sauf certains problèmes de plantage total lors de l'utilisation de classes dont je vous parlerai plus tard).

    OBSERVATIONS ET PROBLEMES:

    1 - Définir la source de l'état.

    Idéalement, le projet complémentaire ne devrait être qu'un récipient d'objets Reports. j'ai donc voulu exploiter l'affectation de la propriété .recordset dans l'événement .open de l'état (je fournis un pointeur vers une structure globale qui permet de sélectionner les données). Un objet ADODB.Recordset est constitué avant l'ouverture de l'état pour être affecté à la propriété .Recordset de l'état.

    Observations :

    Le projet complémentaire n'est associé à aucune base de données

    • L'affectation de la propriété .RecordSet  est sans effet avec un état du projet principal
    • L'affectation de la propriété .RecordSet est acceptée par un état du projet complémentaire mais aucune donnée ne s'affiche (j'ai bien répétition de la section de détail pour chaque enregistrement mais tout est vide)
    • L'affectation de la propriété .RecordSource fonctionne avec un état du projet principal
    • L'affectation de la propriété .RecordSource ne fonctionne pas avec un état du projet complémentaire.

    Contournement :

    J'ai associé le projet complémentaire à la base de données SQL et je définis les sources via la propriété .RecordSource, mais ça ne me plaît pas...

    2 - Message d'erreur trompeur.

    Lors de l'affectation de la propriété .RecordSource de l'état, si la chaine SQL comporte une erreur de syntaxe Access envoie un message d'erreur indiquant que la source d'un état ne peut être définie en mode aperçu ou après le début de l'impression. Indication qui oriente bien mal le fautif !

    Bon, j'arrête là, il faut aussi que je bosse un peu. J'espère que la communauté accueille quelques Francophones parceque pour ma part je ne suis pas prêt à faire de la prose dans la langue de Shakespeare!

    mardi 13 avril 2010 07:30

Toutes les réponses

  • Peut-être que là...

    http://vb.developpez.com/bidou/recordset-ado/


    http://www.facebook.com/peper.eliot
    mardi 13 avril 2010 14:19
  • Merci pour ta réponse rapide peper-eliot.

    Pour ce qui concerne la définition de la source d'un état :

    Je connaissais l'article de J-M.Rabilloud que j'ai utilisé lors de mes débuts ADO avec VB.

    J'en ai donc refait une lecture attentive mais toute sa réflexion est basée sur une utilisation directe des RS (RecordSet) essentiellement sous VB.

    J'ai repris mon code et essayé de multiples combinaisons de curseur sans succès.

    Voici la portion de code concerné extrait d'un état enregistré dans la base principale. Même ça ça ne marche pas. Je précise que la vérification de la source et du nombre d'enregistrement obtenus sont bonnes -> le RS fonctionne donc correctement mais lorsque l'état s'affiche il se comporte exactement comme s'il n'avait aucune source de définie !

    L'objet mRs est un RS déclaré au niveau du module (idem avec une déclaration locale où la récupération par une procédure extérieure à l'état)

                With mRs
                  
                   Set .ActiveConnection = Application.CurrentProject.Connection
                   '.CursorLocation = adUseServer '  ne fonctionne que si la connexion à la même localisation
                   .CursorType = adOpenDynamic
                   .LockType = adLockReadOnly
                  
                   .Source = ObjEtat.DataSource
                   .Open
                End With

                Set Me.RecordSet = mRs
                
                Debug.Print Me.RecordSet.Source
                Debug.Print "Nb enreg = "; Me.RecordSet.RecordCount
                Debug.Print "==================================="

    J'ai aussi essayé d'affecter à la propriété RecordSet un clone du RS constitué : idem; la modification du curseur de la connexion (avec fermeture et ré-ouverture) et tous les types de curseur sans verrouillage (readonly).

    A suivre...

    mercredi 14 avril 2010 09:39
  • Merci pour ta réponse rapide peper-eliot.

    Pour ce qui concerne la définition de la source d'un état :

    Je connaissais l'article de J-M.Rabilloud que j'ai utilisé lors de mes débuts ADO avec VB.

    J'en ai donc refait une lecture attentive mais toute sa réflexion est basée sur une utilisation directe des RS (RecordSet) essentiellement sous VB.

    J'ai repris mon code et essayé de multiples combinaisons de curseur sans succès.

    Voici la portion de code concerné extrait d'un état enregistré dans la base principale. Même ça ça ne marche pas. Je précise que la vérification de la source et du nombre d'enregistrement obtenus sont bonnes -> le RS fonctionne donc correctement mais lorsque l'état s'affiche il se comporte exactement comme s'il n'avait aucune source de définie !

    L'objet mRs est un RS déclaré au niveau du module (idem avec une déclaration locale où la récupération par une procédure extérieure à l'état)

                With mRs
                  
                   Set .ActiveConnection = Application.CurrentProject.Connection
                   '.CursorLocation = adUseServer '  ne fonctionne que si la connexion à la même localisation
                   .CursorType = adOpenDynamic
                   .LockType = adLockReadOnly
                  
                   .Source = ObjEtat.DataSource
                   .Open
                End With

                Set Me.RecordSet = mRs
                
                Debug.Print Me.RecordSet.Source
                Debug.Print "Nb enreg = "; Me.RecordSet.RecordCount
                Debug.Print "==================================="

    J'ai aussi essayé d'affecter à la propriété RecordSet un clone du RS constitué : idem; la modification du curseur de la connexion (avec fermeture et ré-ouverture) et tous les types de curseur sans verrouillage (readonly).

    A suivre...


    Alors là... je passe là main ;-) j'ai toujours voulu me mettre AFondDansAccess, mais j'ai jamais eut le temps ;-) Et je crois que j'aurais pas mal de chemein a parcourir avant d'arriver a ton niveau... Bon courage a toi AccessAfond
    http://www.facebook.com/peper.eliot
    mercredi 28 avril 2010 18:15