Auteur de questions
REFLEXION SUR LES ETATS

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!
- Déplacé Roxana PANAITMicrosoft employee mercredi 14 avril 2010 10:10 (Origine :Administration et déploiement d'Office 2010)
Toutes les réponses
-
Peut-être que là...
http://vb.developpez.com/bidou/recordset-ado/
http://www.facebook.com/peper.eliot -
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 WithSet 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...
-
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