Acta_6
Messages postés29Date d'inscriptionmercredi 25 avril 2007StatutMembreDernière intervention22 avril 2008
-
18 avril 2008 à 16:48
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
22 avril 2008 à 23:47
Bonjour,
J'ai un souci sur lequel je tourne en rond depuis un moment.
Dans le cadre d'une appli tournant sous Excel 2000 (SP3) -et Windows XP-, je récupère des datas d'une base de données MySQL a l'aide d'une certaine requète pour les insérer dans un menu défilant d'un Userform.
Le hic, c'est que sur 3 PC, tout fonctionne bien, et sur 5 autres, ca ne marche pas!! (A priori, les PC sont les mêmes et ont recu les mêmes maquettes d'Install)
Après investigations, il semblerait que la méthode Fields de recordset (ou du moins le .value de cette méthode) ait un comportement différent dans chaque cas:
-- rst.fields(0).valuereste avec la bonne valeur quand ca marche.
-- rst.fields(0).value quand on execute le rst.MoveNextmais, hélas, devient "" (avec driver ODBC 3.51.16 ) ensuite, ou null (avec driver ODBC 3.51.25 ).
PS: Dans les 2 cas la requète s'execute bien puisque je vois, en pas a pas, les valeurs que je veux au moment du rst.MoveNext
* Est-ce que c'est déjà arrivé a quelqu'un? (j'ai cherché dans le forum mais les 2 seuls topics ressemblant un peu sont sans réponse)
* Est-ce que c'est mon code qui n'est pas bon?
* Est-ce que c'est un problème de conf et dans ce cas-là, d'ou ca pourrait venir?
Je suis dans une impasse et ce serait génial si quelqu'un pouvait m'en sortir.
Voici la partie de mon code en question:
La requète est toute simple:
sql = "SELECT row_criteria FROM " & TableName
et la routine appelée est:
Public Sub RowCriteriaSpecific(ByVal sql As String, ByVal param_control As Object)
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
rst.Open sql, cnx_specific 'cnx_specific est global et initialisé auparavant
param_control.Clear
While Not (rst.EOF) If rst.Fields(0) "ColName" Or rst.Fields(0) "Desc_Column" Or rst.Fields(0) = "Type_Criteria" Then
Else
param_control.AddItem rst.Fields(0)
End If
rst.MoveNext ' C'est uniquement a cette ligne que je peux voir la bonne valeur
Wend ' Ici, c'est déjà fini. On a sur l'espion, soit "" soit null en fonction du driver
End Sub
Merci de votre aide.
A voir également:
Comportement bizarre de la méthode "Fields" d'un recordset
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 19 avril 2008 à 12:43
salut,
à tenter.. :
Public Sub RowCriteriaSpecific(ByVal sql As String, ByVal param_control As Object)
Dim rst As New ADODB.Recordset
Dim sValue As String
param_control.Clear
With rst
.Open sql, cnx_specific 'cnx_specific est global et initialisé
auparavant
.movelast
.movefirst
While Not (.EOF)
sValue = .fields("row_criteria").Value
If LenB(sValue) = 0 Then
Debug.Print "RETOUR VIDE OU
NULL"
ElseIf (sValue = "ColName") Or (sValue = "Desc_Column") Or (sValue = "Type_Criteria") Then
Debug.Print "CAS PARTICULIER :
" & sValue
Else
param_control.AddItem sValue
End If
.MoveNext
Wend
.close
End With
Set rst = nothing
End Sub
++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
lolokun
Messages postés1241Date d'inscriptionmardi 10 octobre 2006StatutMembreDernière intervention27 août 20137 18 avril 2008 à 17:43
Bonjour,
' avant de commencer ta boucle,
Pense à faire :
rs.movelast
tester si rs.recordcount <>-1
et ensuite rs.movefirst
While Not (rst.EOF)
If rst.Fields(0) "ColName" Or rst.Fields(0) "Desc_Column" Or
rst.Fields(0) = "Type_Criteria" Then 'C'est normal qu'il n'y ait rien ici?
Else
param_control.AddItem rst.Fields(0)
End If
rst.MoveNext ' C'est uniquement a cette ligne que je peux voir la bonne valeur
Wend ' Ici, c'est déjà fini. On a sur l'espion, soit "" soit null en fonction du driver
Sinon peut-être que ton problème vient de ta requête, tu peux toujours tester en remplaçnt "SELECT row_criteria FROM " & TableName pas select *
Mais je ne suis vraiment pas sûr que ça vienne de là..
L'expérience, c'est une connerie par jour, mais jamais la même..
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 18 avril 2008 à 17:55
Autre idée, peux-tu consulter manuellement ta base de données ? Peut-être que row_criteria est vide dans un des enregistrements et qu'il celui-ci se retrouve simplement au debut du recordset.
Bonne prog
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
Acta_6
Messages postés29Date d'inscriptionmercredi 25 avril 2007StatutMembreDernière intervention22 avril 2008 18 avril 2008 à 18:17
Tout d'abord. Merci a vous pour vos réponses rapides.
@ bouv:
-- Je ne connais pas Microsoft.Jet.OLEDB.4.0. Je vais me documenter la-dessus, voir si c'est dispo sur nos plateformes (je maitrise pas les install qui sont faites sur les PC), et si oui, voir si ca corrige mon bug. Mais ca va me prendre un peu de temps.
-- Sinon, j'ai le moyen de consulter ma base en effet et les champs sont bien remplis. Le début de mon recordset n'est pas vide. Et le même symptome se produit quelque soit l'endroit ou je me trouve dans ma boucle.
D'ailleurs, le problème est que le vide que je vois ne l'est qu'a un instant t1 du code car a un instant t2, on voit que c'est bien rempli.
@lolokun:
je vais tester si rs.recordcount <>-1 et je te tiens au courant. Et oui, c'est normal qu'il n'y ait rien dans le then car je l'ai supprimé (Inutile a la compréhension) pour raccourcir. Mais c'est la seule chose que j'ai supprimée.
Je le sens vraiment mal ce bug. (en tout cas, merci a vous 2 de vous pencher sur mon pb)
zen69
Messages postés584Date d'inscriptionjeudi 28 décembre 2006StatutMembreDernière intervention29 avril 20101 18 avril 2008 à 21:55
with rst
if (.recordcount > 0) then
.movefirst
While Not (rst.EOF)
If .Fields(0).value "ColName" Or .Fields(0).value "Desc_Column" Or .Fields(0).value = "Type_Criteria" Then '
Else
param_control.AddItem .Fields(0).value
End If
.MoveNext ' C'est uniquement a cette ligne que je peux voir la bonne valeur
Wend
end if
end with
+ Je te suggère de toujours spécifié le .value a la fin
+ Aussi tu peux peut-etre essayer avec le nom du champs au lieu de ca position
rst.fields("row_criteria").value a place de rst.fields(0).value.
+ Afin d'alléger ton code tu deverais peut-etre utiliser un with
C'est uniquement a cette ligne que je peux voir la bonne valeur, Qu'est-ce que tu veux dire ?
Acta_6
Messages postés29Date d'inscriptionmercredi 25 avril 2007StatutMembreDernière intervention22 avril 2008 20 avril 2008 à 16:49
Merci a vous tous pour vos réponses. Ce week end, je ne peux hélas pas lire en détail ni essayer tout ca, car je n'ai ni connection, ni ordi (a part pour 1 min ^^).
Je regarde tout ca Lundi et je vous tiens au courant.
Merci encore.
Acta_6
Messages postés29Date d'inscriptionmercredi 25 avril 2007StatutMembreDernière intervention22 avril 2008 21 avril 2008 à 11:38
Bonjour a vous
Zen69 a écrit: C'est uniquement a cette ligne que je peux voir la bonne valeur, Qu'est-ce que tu veux dire ?
Ben j'ai placé un espion sur rst.fields(0).value et je déroule mon code en pas a pas.
Et il n'y a qu'après avoir exécuté le rst.MoveNext que je vois la bonne valeur (ie le contenu de mon champ)
Sinon, dès que je continue de dérouler le code, la valeur passe a "" ou null (que la ligne suivante soit un wend ou une affectation quelconque)
Par contre, je vais prendre en compte tes remarques.
C'est d'ailleurs a peu près les mêmes qui sont suggérées par PCPT.
Merci a vous 2
Bref, j'ai modifié le code, j'attends d'avoir accés a un des 5 ordis qui marche pas pour tester si ca résoud mon problème (de toute facon, ca sera plus propre ainsi)
@ lolokun:
Oui, ca, j'ai vérifié, ya bien la mise a jour SP2 sur les postes (enfin, je vais refaire la vérif moi-même mais chaque propriétaire du poste m'a dit que c'était bon)
Quant au package de livraison, mon responsable a mis a disposition le zip d'install de Mysql qu'il a télécharger et l'install lui-même partout (pour l'instant). Je n'ai qu'a installer mon outil ensuite.
Bon, je vais peut-être avoir une machine, je file faire mes tests et je reviens vous dire ce que ca a donné.
Acta_6
Messages postés29Date d'inscriptionmercredi 25 avril 2007StatutMembreDernière intervention22 avril 2008 21 avril 2008 à 17:45
Ca y est. J'ai fait quelques tests:
-- Donc 1ère chose, j'ai trouvé pourquoi, ca marchait sur certains PC et pas sur les autres. Mea Culpa: la version de Mysql n'est pas la même. Ca marche sur la 5.0.0alpha mais pas sur la 5.0.41 (mon responsable m'a dit qu'il avait changé l'install).
Bref, ceci explique la différence mais ne résout pas mon pb. Sorry, j'avais vérifié les conf Excel et XP mais pas Mysql.
-- Ensuite, pour répondre a lolokun, zen69 et PCPT, j'ai bien mis un .MoveLast avant tout. Mais celui-ci plante en me mettant une erreur d'exécution:
L'ensemble des lignes ne prend pas en charge les récupérations arrière.
Et le .recordcount est bien égal a -1
Qu'est-ce que ca veut dire? La base serait-elle mal faite?? Ou est le souci?? C'est bizarre que toutes les requètes se fassent correctement quand même.
-- Par contre, pour finir, et c'est une très bonne nouvelle (même si du coup ca va générer beaucoup de travail pour répercuter dans les autres requètes), quand j'utilise la solution complète de PCPT, ca fonctionne!!!!!
Le fields("row_criteria") a la place de fields(0), ne suffit pas. Mais si, en plus, on passe par une valeur tampon pour stocker le fields("row_criteria").value, la liste se rempli bien. J'arrive pas a comprendre comment c'est possible mais ca marche donc, je suis heureux.
Merci donc a tout le monde!!
Un petit gout amer toutefois car certaines questions reste en suspens mais au moins, j'ai une solution . Merciiiiiiiii.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 21 avril 2008 à 19:17
pour les questions en suspens...
peux-tu nous montrer ta chaîne de connexion pour cnx_specific stp
également vérifier au niveau des droits de chaque poste (enfin assez pour avoir une idée, qui marche qui marche pas) ainsi que les parefeu locaux....
tu peux également essayer la connexion à ta base avec ma source ADO HELPER, au moins pour tester....
orienté objet, çà devrait pas te faire perdre trop de temps
++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Pour une utilisation provisoire, il n'y a pas de mot de passe pour l'instant.
Même "politique" pour les droits d'accés a la base. Tous les privilèges sont accordés a l'utilisateur du poste. J'ai vérifié, chaque compte a tous les droits et est défini en majuscule et minuscule (au cas ou).
Chaque poste a été monté avec la même maquette et les même droits utilisateur (sauf 1 qui a les droits admin avec son compte mais ne marche pas quand même)
L'installation de Mysql a été faite sous un même compte admin par la même personne sur chaque poste. La seule différence (normalement) est que 2 postes sont avec Mysql 5.0.0alpha, et 5 avec Mysql 5.0.41 (et le code fonctionne sur les 2 postes avec la 5.0.0alpha)
Pour ADO HELPER, je vais essayer de tester ca dès que mon responsable me laisse respirer.
(j'aurais pas du lui dire tout de suite qu'une solution avait été trouvé )
sDatabasePort=3306 par défaut
Option, perso j'utilise 1 + 2 + 8 + 32 + 2048 + 16384 mais je ne peux pas tester avec une base distante pour le moment
une piste également est de voir ce qui a changé entre l'alpha et la nouvelle version
et si tu peux te permettre, éventuellement downgrader un des PC...
bon courage ++
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp