|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Invité régulier
![]() Guillaume BARJOTIngénieur en hydraulique urbaine Inscription : février 2011 Messages : 28 ![]() |
Bonjour à tous,
Tout d'abord, félicitation pour l'excellent tenue de ce forum et pour son immense richesse. Cela fait maintenant quelques semaines que mon patron m'a chargé de développer une application Acces pour simplifier la vie de nos assistantes. Il me l'a confié à moi car j'ai quelques bases d'Access et que je me suis déjà fait plusieurs outils pour accélérer mon travail. J'ai réussi à développer l'intégralité de l'outil sans trop de soucis. Normal, j'ai découvert votre forum et à chaque gros problème, hop le tutoriel correspondant ![]() Cependant, aujourd'hui je bloque sur une épine à laquelle je n'arrive pas trouver de réponse : Pour X raison, il me faut développer un export d'une requête paramétrée vers Excel (d'ailleurs il y aura plusieurs exports à faire, mais bon, si j'arrive pour une, les autres devraient suivre). Les paramètres sont des dates (la requête s'exécute entre DateD et dateF). A noter que la requête est une requête sélection, avec les paramètres date de début et date de fin selon un formulaire indépendant. Cette requête sélection une dizaine de champ entre dateD et DateF et répondant au critère [Etat] = "Gangné" ou "Perdu" ou "En-Cours"" J'ai donc mis en place une automation vers Excel, avec un QueryDef (merci les tutoriels du forum Lorsque j'exécute mon code (procédure sur l'évènement clic d'un bouton) j'ai, au choix, deux messages d'erreur : Erreur de conversion de type de données (code 3421) si j'utilise ce code : Code :
Code :
Merci d'avance à ceux qui pourront me débloquer et désolé si j'ai loupé un sujet sur le forum ou si mon post n'est pas au bon endroit. Edit : Après avoir relu les règle de modération j'ai supprimé la seconde partie du code de mon bouton, il n'avait rien avoir avec la question puisqu'il expliquait comment, après avoir chargé le recordset je construisais ma feuille Excel. A noter cependant que le post n°3 fait référence avec cette partie de code supprimée et pointe vers la méthode .Copyfromrecordset pour éviter de faire une copie ligne à ligne. Merci à la personne qui m'a suggéré cette méthode, qui fonctionne à merveille, même si elle ne résous pas mon problème initial. |
||||
|
|
00
|
|
|
#2 | ||
|
Membre habitué
![]() Inscription : janvier 2006 Messages : 99 ![]() |
Bonjour,
je suppose que vous avez défini vos paramètres dans votre requête RQSelect_Propositions_Affaires comme des dates (PARAMETERS DateD Date, DateF Date; ...). Si c'est le cas, il faut donc renvoyer des dates comme paramètres de votre queryfdef. Or dans les 2 exemples que vous avez montrés vous renvoyez une chaine de caratères (même avec des #, il s'agit bien d'un type String). Je vous suggère de simplement mettre les valeurs de vos champs de votre formulaire comme paramètres de votre querydef : Code :
|
||
|
|
00
|
|
|
#3 | ||
|
Invité régulier
![]() Guillaume BARJOTIngénieur en hydraulique urbaine Inscription : février 2011 Messages : 28 ![]() |
Il me semblait que c'est bien ce que je faisais dans la deuxième solution puisque même si je garde le code pour attribuer les dates à DateD_O et dateF_O, ils ne sont pas utilisés dans la définition des paramètres
Dans le deuxième extrait j'utilise bien les valeurs du champ. Code :
Par contre, j'ai effectivement déclaré des paramètres dans ma requêtes, alors que d'habitude, pour lier une requête à des champs de formulaires, je ne déclare pas des paramètres mais utilise ce genre de critère : Entre [Formulaires]![Form_GenerationEtat].[DateD] Et [Formulaires]![Form_GenerationEtat].[DateF] Où DateD et DateF sont les nom des zones de texte (au format Date réduite jj/mm/yyyy, remplis par sélection du calendrier) de mon formulaire. Dans le cas de la génération vers Excel, j'avais cru comprendre qu'il ne fallait pas utiliser cette syntaxe mais mettre des vrais paramètres (dommage du coup, car je ne sais plus faire le lien entre les champs de mon formulaire et ma requête pour par exemple imprimer l'état --> il me demande les paramètres, ce qui est logique, et ne tient pas compte de la valeur des champs) |
||
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Chercheur de bonheur Inscription : août 2007 Messages : 2 255 ![]() |
Bonjour à tous,
Guibar18, je te suggère pour ton export vers excel de t'inspirer de cette discussion car pour une question de performance, il est préférable d'utilise .Copyfromrecordset pour importer les données dans excel.
__________________
(\ _ /) Cordialement G@dz (='.'=) (")-(") Vous avez des neurones. Sollicitez-les. ![]() . Si vous êtes aidé, pensez à Voter.
|
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Guillaume BARJOTIngénieur en hydraulique urbaine Inscription : février 2011 Messages : 28 ![]() |
Alors,
Merci pour le lien, je vais m'en inspirer. La méthode de .Copyfromrecordset me semble pas mal, elle évite effectivement de faire du code ligne à ligne. Edit J'ai pris bonne note et je vais modifier mon code en conséquence pour ne pas avoir à faire du "ligne à ligne". Effectivement ça économise un petit bout de code puisqu'il suffit d'une ligne ... ... Merci pour l'info , maintenant, ça ne résous pas mon problème : je n'ai toujours rien à copierPar contre, cela ne résous pas mon premier problème qui est d'ouvrir le recordset. Tant qu'il n'est pas chargé, dans tous les cas, impossible de copier |
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() |
bonjour
Code :
@+ |
||
|
|
00
|
|
|
#7 |
|
Invité régulier
![]() Guillaume BARJOTIngénieur en hydraulique urbaine Inscription : février 2011 Messages : 28 ![]() |
On en apprend tous les jours, merci
|
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() |
Attention j'ai legerement modifier ton code; à ce niveau:
"mm/dd/yyyy" au lieu de "dd/mm/yyyy" @+ |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Pierre ANTOINEInscription : février 2008 Messages : 650 ![]() |
Bonjour
3 petites choses : - au niveau du débuggage, avez-vous utilisé l'assistant de requête pour vérifier et trouver où cela coince? - peut-être faut-il envisager non de passer par "parameters", mais de changer la source SQL de la requête? - enfin, personnellement, je ne travaille plus avec le format date. Les dates sont au format "Double"; j'affiche cette valeur en formatant avec un format date. Pierre |
|
|
00
|
|
|
#10 | ||
|
Invité régulier
![]() Guillaume BARJOTIngénieur en hydraulique urbaine Inscription : février 2011 Messages : 28 ![]() |
Alors, pour répondre :
Note : J'entends par "Exécuter normalement" que lorsque depuis la requête on fait "Executer", il demande les valeurs de DateD et DateF (via une text box) puis, en fonction des date rentrée, il fait la sélection demandée. A noter en ce qui concerne le second point : je n'ai pas compris mais essayons tout de même. Me suggérez-vous de ne pas passer par un QueryDef mais de directement mettre la chaine SQL de ma requête dans l'expression Openrecordset("ChaineSQL") ? Si c'est cela, pourquoi pas. Seulement c'est ce que je faisais au début et comme ma requête sélectionne 18 champs en tout la syntaxe n'est pas des plus légère. En outre, dans les différents tutoriels présentés, tout le mode passe par QueryDef lorsqu'il s'agit de charger un recordset sur une requête paramétrée, il doit donc y avoir une raison (même si celle ci est hors de ma portée) et des pour et des contres dans les deux sens j'imagine. Dans tous les cas, utiliser directement la chaine SQL de la requête dans Open recordset ne fonctionne pas. Evidemment je n'ai pas injecté la requête telle quelle, en réalité j'ai procédé comme suit :
Edit : Utiliser des réels doubles dans les critères ne change rien, j'ai toujours le joli message d'erreur 3464 "Type de données incompatibles dans l'expression du critère" au niveau de la ligne Edit 2 : Voici le code SQL de ma requête : [code] Code SQL :
Edit : Je viens de relire les règles de Post du forum j'ai donc adapté ce post avec la Balise "SQL" (en plus de la balise Code, pour une meilleure lisibilité |
||
|
|
00
|
|
|
#11 | ||
|
Invité régulier
![]() Guillaume BARJOTIngénieur en hydraulique urbaine Inscription : février 2011 Messages : 28 ![]() |
Alors, entre temps vos posts m'ont donné des idées et j'ai finit par tester ceci :
Code :
dans les deux cas, j'obtiens un nouveau message d'erreur : Erreur d'exécution 6 : dépassement de capacité Derrière ce test, je voulais tester ce que donnait le format date au standard anglais (mm/dd/yyyy). |
||
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() |
bonjour
Et le débogueur, il s'arrête sur quelle ligne? peux-tu nous montrer cette partie du code en entier? @+ |
|
|
00
|
|
|
#13 | ||||||
|
Invité régulier
![]() Guillaume BARJOTIngénieur en hydraulique urbaine Inscription : février 2011 Messages : 28 ![]() |
Comme dit plus haut, le débogueur s'arrête sur
Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() |
bonsoir
Un detail: mm / dd / yyyy c'est plutot comme ça:"mm/dd/yyyy"; non? Code :
qdf.Parameters("DateD") = Format(Me.DateD, mm / dd / yyyy) Code :
qdf.Parameters("DateD") = Format(Me.DateD, "mm/dd/yyyy") @+ |
|
|
00
|
|
|
#15 | ||
|
Invité régulier
![]() Guillaume BARJOTIngénieur en hydraulique urbaine Inscription : février 2011 Messages : 28 ![]() |
Alors, je viens d'essayer d'une part avec le format anglo-saxon (mm/dd/yyyy) et d'autre part avec le format français (dd/mm/yyyy).
Dans les deux cas, j'obtiens une erreur 3464 : "Type de données incompatible dans l'expression du critère" à la ligne en rouge dans le code : Code :
Edit : Si je donne des paramètres au format réel double dans ma requête, j'obtiens une erreur 3421 : "Erreur de conversion de type de données" à la ligne : Code :
qdf.Parameters("DateD") = Format(Me.DateD, "dd/mm/yyyy") Par ailleurs, il y a ce problème d'avoir un message d'erreur au chargement de la référence Microsoft office DAO (quelle que soit la version) me disant que celle-ci est déjà chargée alors que dans la liste elle n'apparait pas cochée. Je vais mettre une copie d'écran du message d'erreur. La source de mon problème est peut-être à cet endroit La première image montre les librairies chargée dans mon projet, la seconde le message que j'obtiens si je coche la référence DAO et que je fais OK. |
||
|
|
00
|
|
|
#16 | ||
|
Membre Expert
![]() |
Bonjour
essaie comme ça pour voir: laisse Me.DateD et Me.DateF au format date. Code :
@+ |
||
|
|
00
|
|
|
#17 | ||
|
Invité régulier
![]() Guillaume BARJOTIngénieur en hydraulique urbaine Inscription : février 2011 Messages : 28 ![]() |
En faisant cette opération, le message d'erreur se déplace sur la ligne en rouge ci-après :
Code :
Note : Sans trop d'espoir (mais on ne sait jamais) j'ai aussi testé (suite à un des post) de tout mettre en variable de type string. Cela ne marche pas non plus (il bloque au niveau du chargement du recordset avec le message habituel) Je vais essayer aussi de tester sans faire appel aux textbox du formulaire mais via un popup de saisie des dates (généré depuis VBA) |
||
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Pierre ANTOINEInscription : février 2008 Messages : 650 ![]() |
Bonjour
Vous évoquiez des text box au format "date abrégé". Or vous avez un message d'erreur de conversion. Donc essayez de convertir d'abord vos paramètres. Code :
qdf.Parameters("DateD") = cdbl(Me.DateD) |
|
|
00
|
|
|
#19 | ||
|
Invité régulier
![]() Guillaume BARJOTIngénieur en hydraulique urbaine Inscription : février 2011 Messages : 28 ![]() |
J'ai essayé la conversion en Réel Double. J'obtiens toujours le même message d'erreur, au même endroit.
Le critère viens faire une comparaison sur un champ au format date (recherche des enregistrements entre deux dates), il me semble donc logique que si je fait la recherche à partir d'un paramètre de type double, la requête ne puisse s'exécuter complètement. A noter que j'ai testé la conversion en réel double (via CDbl) en changeant la nature de ma requête (paramètre placés au format "Réels doubles " et non plus date/heure). Je veux bien essayer de changer la nature du champ qui sert de base à ma requête en mettant un champ de type "réel double" avec un masque de saisie correspondant à une date, mais du coup, j'ai un peu peur de mettre le bazar dans les enregistrements déjà présents ... ... si vous pouviez me rassurer sur ce point alors je fais le test. Edit : J'ai aussi essayé la fonction CDate, de cette manière : Code :
|
||
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() Pierre ANTOINEInscription : février 2008 Messages : 650 ![]() |
Bonjour
Je ne peux pas trop vous rassurer... Par contre ce que vous pouvez faire, c'est créer un nouveau champ, pour faire les tests. Pierre |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com