Modifier la source de donnée d'une listBox au runtime ? - VB/VBA/VBS - Programmation
Marsh Posté le 03-05-2006 à 17:30:09
Quand tu dis que la requête ne s'exécute pas, cela veut-il dire que le contenu de la liste se vide ? Y a-t-il un message d'erreur ? Ou alors le contenu ne change pas ?
As-tu fait un .requery sur le contrôle listbox/combobox ?
Marsh Posté le 03-05-2006 à 17:38:34
Bonsoir Tegu,
Décidément tu es souvent fidèle au poste.
En fait je n'ai pas de message d'erreur (à un momment j'avais fait en affectena tl amême requète à un recordset de la listbox et là j'ai eu une erreur).
Mais sinon, le contenu ne change pas et je n'ai pas de message d'erreur. Et aussi j'ai bien regardé, je fais le requery.
Merci de ta réponse.
Marco.
Marsh Posté le 03-05-2006 à 17:47:10
Essaye de créer deux requêtes statiques Access contenant l'une ta requête globale accédant à toutes les régions, l'autre avec un filtre sur une région donnée.
Ensuite dans ta proprité recordsource (suis plus sûr du nom), au lieu de mettre la chaine SQL, mets le nom de ces requêtes et switch entre les deux comme tu devrais le faire normalement.
Si ça marche, c'est déjà pas le principe de ton code qui est foireux et il faudra remettre en question la syntaxe SQL ou autre chose.
edit: bien sûr tes requêtes devront avoir fonctionner d'abord indépendament de ton code pour dire que le code fonctionne
Marsh Posté le 03-05-2006 à 18:13:55
Salut,
Donc voilà mes requêtes :
1 -> Celle simple et sans paramètres :
SELECT Site.Site, Ville.Ville, Region.NomRegion
FROM (Region INNER JOIN Ville ON Region.NomRegion = Ville.Region) INNER JOIN Site ON Ville.Ville = Site.Ville;
2 -> Celle qui sélectionne en fonction de la région souhaitée :
SELECT Site.Site, Ville.Ville, Region.NomRegion
FROM (Region INNER JOIN Ville ON Region.NomRegion = Ville.Region) INNER JOIN Site ON Ville.Ville = Site.Ville
WHERE (((Region.NomRegion)="MED" ));
3 -> Celle qui va chercher le nom du champs dans un champs texte :
SELECT Site.Site, Ville.Ville, Region.NomRegion
FROM (Region INNER JOIN Ville ON Region.NomRegion = Ville.Region) INNER JOIN Site ON Ville.Ville = Site.Ville
WHERE (((Region.NomRegion)=[Formulaires]![Form_FrmFormulaireIncident]![TxtRegionParam].[Value]));
Pour être pluis précis, je passe dans mon code la valeur d'une variable publique à mon formulaire (au chargement) à un champs texte caché (TxtRegionParam). mais ce n'est peut être pas la meilleure manière de faire ?
Autrement en général, je génére les requêtes avec le QBE d'Access et ensuite, soit j'enregistre, soit je les copie dans mon code pour avoir le résultat souhaité. Ainsi ça doit pouvoir éviter de trops grosses erreurs... Ces trois requêtes donnent un résultat quand je les exécute dans l'éditeur de requêtes.
Je te poste le code de ma fonction dans le post suivant pour as trops surcharger celui-ci.
Marco.
Marsh Posté le 03-05-2006 à 18:17:43
Public Function FctRechercheDroitsFicheIncident( _
ByVal StrDroits As String, _
ByVal StrRegion As String, _
ByVal StrStatut As String, _
ByVal StrUser As String) As Boolean
Dim SQL As String
Dim SQLRegion As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim LngIndex As Long
On Error GoTo ErrHandler
FctRechercheDroitsFicheIncident = False
SQL = "SELECT Incident.NumIncident, Incident.Typologie, Incident.NumSite, Incident.DatIncident, Incident.NomRedacteur, Incident.TypIncident, Incident.MatIncident, Incident.EquipIncident, Incident.DatAnalyseNational, Incident.ResponsableAnalyse, Incident.OuvertLe, Incident.ClosLe, Incident.ClosPar, Incident.CompteRendu, Incident.MesuresSecurisationIntermédiaires, Incident.DateAnalyse, Incident.ResultatAnalyse, Incident.ChefDeProjetRegional, Incident.ChefDeProjetNational, Incident.Statut" & _
" FROM ((Region INNER JOIN Ville ON Region.NomRegion = Ville.Region) INNER JOIN (Site INNER JOIN Incident ON Site.Site = Incident.NumSite) ON Ville.Ville = Site.Ville) INNER JOIN Login ON Region.NomRegion = Login.Region" '& _
" WHERE Incident.NumIncident='" & Form_FrmListeDesIncidents.LstResultQuery.ItemsSelected(0)
If StrDroits <> CstAdmin Then
If StrRegion = "NAT" Then
'Si le code région est : "National"
SQL = SQL & " WHERE (((Incident.Statut)='" & "Public" & "'))"
' SQL = SQL & " AND (((Incident.Statut)='" & "Public" & "'))"
Else
'Sinon : c'est une des 6 régions
SQL = SQL & " WHERE (((Incident.Statut)='" & "Public" & "')) OR (((Region.NomRegion)='" & StrRegion & "'))"
' SQL = SQL & " AND (((Incident.Statut)='" & "Public" & "')) OR (((Region.NomRegion)='" & StrRegion & "'))"
SQLRegion = "SELECT Site.Site, Ville.Ville, Region.NomRegion" & _
" FROM (Region INNER JOIN Ville ON Region.NomRegion = Ville.Region) INNER JOIN Site ON Ville.Ville = Site.Ville" & _
" WHERE (((Region.NomRegion)='" & StrRegion & "'));"
End If
Else
End If
SQL = SQL & " ;"
Set db = DBEngine.Workspaces(0).Databases(0)
Set rs = db.OpenRecordset(SQL, DB_OPEN_DYNASET)
'===> La partie qui m'intéresse est ici...
If Not rs.NoMatch Then
Form_FrmFormulaireIncident.RecordSource = SQL
' If Trim(SQLRegion) <> "" Then
Form_FrmFormulaireIncident.NumSite.RowSourceType = "Table/Query"
Form_FrmFormulaireIncident.NumSite.RowSource = ReqLocalisationRegion 'SQLRegion
' Set rs = Nothing
' Set rs = db.OpenRecordset(SQLRegion, DB_OPEN_DYNASET)
' Set Form_FrmFormulaireIncident.NumSite.Recordset = rs
Form_FrmFormulaireIncident.Requery
' End If
Else
Err.Description = "Aucun incident ne correspond aux critères sélectionnés"
Err.Raise 1
End If
FctRechercheDroitsFicheIncident = True
ExitHandler:
Set rs = Nothing
Set db = Nothing
Exit Function
ErrHandler:
Resume
MsgBox Err.Description, vbExclamation, CstAppName
FctRechercheDroitsFicheIncident = False
Resume ExitHandler
End Function
Marsh Posté le 03-05-2006 à 18:36:05
Ça ne serait pas là ton problème ?
If Not rs.NoMatch Then |
Tu ne fais aucune recherche au préalable, donc le flag .nomatch n'a rien à faire là
Il faut utiliser .BOF plutôt.
Mais je ne suis pas sûr de l'état d'initialisation de ce flag sans recherche auparavant, aussi peut-être cela passe quand même dans le code du If mais j'ai un doute.
Marsh Posté le 03-05-2006 à 18:46:40
Salut,
En fait comme tu peux e voir, dans ma fonction j'enchaîne deux requêtes. La première passe bien passe même le "nomatch", mais la seconde n'a pas l'air de s'exécuter. Je l'ai fais dérouler en pas à pas et apparemment ça ne produit pas d'effets bien que le curseur d'exécution passe sur la ligne de code qui contient : Form_FrmFormulaireIncident.NumSite.RowSource = ReqLocalisationRegion .
J'avoue que je commence à en perdre quelques peut mon latin en fait.
Merci en tous les cas si tu peux m'aider.
A bientôt.
Marco.
Marsh Posté le 03-05-2006 à 19:00:05
Heu entre ce que je t'ai demandé de tester et ton code original je ne suis pas sûr de moi, mais ta variable ReqLocalisationRegion contient quoi à l'exécution ?
Je vois pas d'initialisation là
edit: si c'est le nom de ta requête faut les guillemets
Marsh Posté le 03-05-2006 à 19:12:08
Oui en fait c'est bien le nom de ma requète.
Mais avec ou sans ça donne le même résultat.
Marsh Posté le 04-05-2006 à 08:48:29
Autre sérieuse piste, je vois que ton .requery ne se fait que sur le formulaire (Form_FrmFormulaireIncident.Requery)
Il faut le faire sur la combobox surtout (Form_FrmFormulaireIncident.NumSite.Requery )
Désolé de ne pas l'avoir vu avant.
Marsh Posté le 04-05-2006 à 11:14:45
Bonjour Tegu,
En fait ça n'a rien donné. j'ai bien esasyé comme tu me l'as dit, mais rien ne se passe.
J'ai modifié ma requète pour mettre une requète paramétrée dans la source de données du formulaire (avec un champs caché que j'alimente au momment du chargement).
Là en ce momment j'ai un autre effet de bord... Apapremment il vide le contenu des chaps que j'ai en public à un momment donné... Dont ceux qui m'intéressent.
J'ai un peut l'impression de tourner en rond.
Merci et à plus tard.
Marco.
Marsh Posté le 04-05-2006 à 11:17:13
Je crois que je ne pourrais pas plus t'aider. Le forum n'est pas idéal pour certains problèmes et sans ta base dans les mains j'aurais du mal à aller plus loin. Désolé.
J'ai fait du code de ce genre des dizaines de fois et je ne m'explique pas que tu rencontres autant de soucis.
Marsh Posté le 04-05-2006 à 11:58:20
Salut Tegdu,
En fait j'ai changé mon fusil d'épaule et je mets une requête paramétrée dans les propriétés de la zone de liste (avec un champs caché).
Ca a l'air de mieux marcher. Maintenant j'ai un autre problème, c'est que apapremment je perds certaines valeurs en route (la variable publique au formulaire qui me sert ) alimenter ce champs)...
Merci en tous els cas.
A bientôt.
Marco.
Marsh Posté le 03-05-2006 à 15:55:57
Bonjour,
Voilà mon souci aujourd'hui.
J'ai une zone de liste en Access 2003 que j'ai paramétré et je récupére le contenu d'une requête que j'ai stoqué par ailleur.
Cette zone de liste contient 3 colonnes (la première est affectée à la value de ma zone de liste et les deux suivantes sont affectées à deux textBox.
Plus concrêtement pour vous présenter mon cas je sélectionne un numéro de zone géographine dans ma zone de liste déroulante (et je vois en même temps la ville et la région qui lui correspondent) et quand je fais ma sélection, une textBox reçoit la nom de la ville et l'autre le nom de la région.
Jusque là tout va bien.
Sauf que certains utilisateurs ont accés dans cet écran seulement à une région (la leur)... Là dessus je récupère bien le nom de la région au momment du login dans la table qui va bien. Je veux donc dans certains cas que la requète que j'ai passé en paramètre à ma zone de liste en tant que source de donnée soit remplécé dans mon programme par une nouvelle requête qui aura pour paramètre le nom de la région. Ors apparemment la requète ne s'exécute pas et je ne récupère pas dans ma zone de liste le résultat de la requête.
Voilà toute ma question. J'espère avoir été clair. Si quelqu'un peut m'aider ? Je suis un peut désespéré en fait.
Marco.
---------------
Marco