Modifier la source de donnée d'une listBox au runtime ?

Modifier la source de donnée d'une listBox au runtime ? - VB/VBA/VBS - Programmation

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
Reply

Marsh Posté le 03-05-2006 à 15:55:57   

Reply

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 ?

Reply

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.


---------------
Marco
Reply

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 :)


Message édité par tegu le 03-05-2006 à 17:50:03
Reply

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.
 
 


---------------
Marco
Reply

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


Message édité par cotmar le 03-05-2006 à 18:18:27

---------------
Marco
Reply

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.


Message édité par tegu le 03-05-2006 à 18:36:26
Reply

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.


---------------
Marco
Reply

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


Message édité par tegu le 03-05-2006 à 19:02:03
Reply

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.


---------------
Marco
Reply

Marsh Posté le 03-05-2006 à 19:12:08   

Reply

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.


Message édité par tegu le 04-05-2006 à 08:49:25
Reply

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.


---------------
Marco
Reply

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.


Message édité par tegu le 04-05-2006 à 11:19:15
Reply

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.


---------------
Marco
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed