IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

filtre sur fichier xml


Sujet :

Flex

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Par défaut filtre sur fichier xml
    Salut,

    Voilà je voudrais faire quelques choses mais je ne sais pas si c'est possible, j'espère que vous me direz oui^^.
    Donc j'ai un fichier xml comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?xml version="1.0" encoding="UTF-8" ?>
    <root>
    	<contact>
    		<id_contact>1</id_contact>
    		<nom>emma</nom>
    		<mail>test@mail.com</mail>
    		<info>info</info>
    	</contact>
    	<contact num=3>
    		<id_contact>3</id_contact>
    		<nom>julien</nom>
    		<mail>julien</mail>
    		<info>julien</info>
    	</contact>
    	<contact>
    		<id_contact>4</id_contact>
    		<nom>marc</nom>
    		<mail>marc</mail>
    		<info>marc</info>
    	</contact>
    	<contact>
    		<id_contact>5</id_contact>
    		<nom>infoa</nom>
    		<mail>mailc</mail>
    		<info>infob</info>
    	</contact>
    </root>
    Depuis flex j'aimerais pouvoir grâce à des dropdownlist faire des filtres qui me permettront d'afficher que certain contact dans un datagrid. J'ai une dropdown list qui me propose de choisir tout les attributs du contact par exemple nom, mail... mon deuxième dropdownlist me propose en fonction du premier choix les valeurs de ces attributs par exemple si je choisit nom il me proposera emma,marc,julien...
    Donc depuis flex je récupère les chois dans des variables string.
    Ce que j'aimerais faire et qui me pose problème c'est pouvoir donc pouvoir afficher la ligne qui m'affichera seulement les données de emma par exemple si je choisit ce nom.
    J'avais pensé à quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	var valeur:XMLListCollection = new XMLListCollection(fichierXML.contact.nom==emma);
    	dataGrid.dataProvider=valeur;
    Voilà en faite j'aimerais savoir quoi mettre à la place de nom==emma

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant Angular / Java J2EE
    Inscrit en
    Novembre 2008
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant Angular / Java J2EE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Par défaut
    Salut,
    ne pourrais tu pas plutôt remplir ta datagrid à partir de ton xml, et appliquer une filterFunction à ta grid , en fonction des valeurs sélectionnées dans les combobox ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Par défaut
    Oui ça fonctionnerait aussi, mais comment implémenter tout ça tu as une idée?

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant Angular / Java J2EE
    Inscrit en
    Novembre 2008
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant Angular / Java J2EE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Par défaut
    Oui ce n'est pas bien compliqué, mais il va falloir que tu cherches un peu de ton côté aussi , d'autant plus que les articles sur ce genre de sujet sont nombreux sur la toile ..
    Je risque de faire de la paraphrase de mon post précédent, mais voici en gros ce que tu dois faire :

    - Récupérer ton xml, remplir le dataprovider de ta datagrid avec les données
    2 exemples : (http://journal.third-road.net/2007/0...s-donnees-xml/, et http://journal.third-road.net/2007/0...s-donnees-xml/)
    - affecter une filterFunction sur la grid :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <mx:AdvancedDatagrid id="myDG" filterFunction="myDGFilterFunction" />
    Et la filterfunction :

    private function myDGFilterFunction(obj:Object):Boolean {
    var containsSurname:Boolean = (obj.name == mySurnameCombobox.selectedLabel);
    var containsFirstname:Boolean = (obj.prenom == myfirstnameCombobox.selectedLabel);
    var res:Boolean = containsSurname && containsFirstname;
    return res;
    }
    Pour chaque item de ton dataprovider il vérifie la condition spécifiée. si celle-ci est vérifiée (res == true), alors la donnée est affichée et le contraire si res == false.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Par défaut
    Ok merci j'ai cherché et j'ai compris j'arrive à faire ma fonction de tri, le soucis c'est que j'ai une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <mx:DataGrid x="10" y="10" id="dataGrid" height="342" width="722" filterFunction="myDGFilterFunction">
    Apparemment je peux pas mettre l'attribut filterfunction sur mon datagrid.

    J'obtiens l'erreur: impossible de résoudre l'attribut filterfunction pour le type de composant ... datatgrid.

  6. #6
    Membre émérite
    Homme Profil pro
    Consultant Angular / Java J2EE
    Inscrit en
    Novembre 2008
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant Angular / Java J2EE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Par défaut
    Oui car tu utilises une datagrid, et non une advancedDatagrid. N'oublie pas de jeter un coup d'oeil dans la doc ...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Par défaut
    J'ai peut être trouvé une solution mais je suis pas sur,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    protected function drop2_changeHandler(event:IndexChangeEvent):void
    {
     
    	var valeur:XMLListCollection = new XMLListCollection();
    	valeur.filterFunction = filtre1;
    	valeur.refresh();
    	dataGrid.dataProvider=valeur;
    }
     
    private function filtre1(obj:Object):Boolean {
    	var critere:String=drop1.selectedItem;
    	var var1:String=drop2.selectedItem;
    	return obj[critere]==var1;
    }
    Voilà mes 2 fonctions je récupère les noms sélectionnés dans mes2 dropdownlist, j'applique le filtre sur mon XMLListCollection crée pour contenir le résultat, dans ma fonction de filtre je retourne l'objet pour le critère choisit et la valeur du critère par exemple critère = nom et var1 = emma. Je pense que c'est ici que ça ne vas pas ou alors je me trompe complétement?

  8. #8
    Membre émérite
    Homme Profil pro
    Consultant Angular / Java J2EE
    Inscrit en
    Novembre 2008
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant Angular / Java J2EE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Par défaut
    Dans ta filterFunction, ce ne serait pas plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var critere:String=drop1.selectedLabel;
    var var1:String=drop2.selectedLabel;

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Par défaut
    Non quand j'essaie de mettre cette syntaxe j'obtiens cette erreur:

    1119: Accès à la propriété selectedLabel peut-être non définie, via la référence de type static spark.componentsropDownList.

    Je comprend pas pourquoi mon code fonctionne pas j'ai beau chercher je vois pas mon erreur alors que je doit l'avoir sous le nez

  10. #10
    Membre émérite
    Homme Profil pro
    Consultant Angular / Java J2EE
    Inscrit en
    Novembre 2008
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant Angular / Java J2EE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 545
    Par défaut
    Est-ce que tu pourrais nous montrer un peu plus de ton code stp, ce sera plus facile pour t'aider (les dropdowns, la DG, la filterFunction , la fonction init si tu en as une etc ..)

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Par défaut
    ok voila le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    protected function drop1_changeHandler(event:IndexChangeEvent):void
    {
    	var critere:String=drop1.selectedItem;
    	drop2.enabled=true;
    	drop2.prompt="Selectionnez un résultat";
    	var panel:int=tn.selectedIndex;
    	if ( panel==0 ){
    		var valeur:XMLListCollection = new XMLListCollection(fichierXML.contact[critere]);		
    		drop2.dataProvider=valeur;
    	}
    	else if ( panel==1){
    		var valeur:XMLListCollection = new XMLListCollection(fichierXML2.organisme[critere]);
    		drop2.dataProvider=valeur;
    	}
    }
     
    protected function drop2_changeHandler(event:IndexChangeEvent):void
    {
     
    	var valeur:XMLListCollection = new XMLListCollection();
    	valeur.filterFunction = filtre1;
    	valeur.refresh();
    	dataGrid.dataProvider=valeur;
    }
     
    private function filtre1(obj:Object):Boolean {
    	var critere:String=drop1.selectedItem;
    	var var1:String=drop2.selectedItem;
    	return obj.contact[critere]==var1;
    } 
     
    protected function refresh_clickHandler(event:MouseEvent):void{
    	dataGrid.dataProvider=fichierXML.contact;	
    }
    Voilà tout ce que j'ai j'espère que sa vous aidera

  12. #12
    Membre éclairé Avatar de ToniConti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2009
    Messages : 245
    Par défaut
    Bonjour,

    C'est une implémentation que je fais souvent et je me dis que faire partager ma façon de faire (fonctionnelle) pourrait aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <mx:Script>
      <![CDATA[
     
      private function filtre1(item:Object):Boolean
      {
        var validite:Boolean = true;
     
        if(cbForce.selectedItem && cbForce.selectedItem.FORCE_DE_VENTE != "Tous")
          validite &&= (item.FORCE_DE_VENTE == cbForce.selectedItem.FORCE_DE_VENTE);
        if(cbEditeur.selectedItem && cbEditeur.selectedItem.EDITEUR != "Tous")
          validite &&= (item.EDITEUR == cbEditeur.selectedItem.EDITEUR);
        if(cbClient.selectedItem && cbClient.selectedItem.CLIENT != "Tous")
          validite &&= (item.CLIENT == cbClient.selectedItem.CLIENT);
        if(cbDebut.selectedItem && cbDebut.selectedItem.DEBUT != "Tous")
          validite &&= (item.DEBUT == cbDebut.selectedItem.DEBUT);
        if(cbTaux.selectedItem && cbTaux.selectedItem.TAUX != "Tous")
          validite &&= (item.TAUX == cbTaux.selectedItem.TAUX);
     
        return validite;
      }
     
      ]]>
    </mx:Script>
     
    //Mes filtres
    <mx:HBox paddingBottom="15">
      <mx:ComboBox id="cbForce" labelField="FORCE_DE_VENTE" change="provider.refresh()" width="100" />
      <mx:ComboBox id="cbEditeur" labelField="EDITEUR" change="provider.refresh()" width="100" />
      <mx:ComboBox id="cbClient" labelField="CLIENT" change="provider.refresh()" width="100" />
      <mx:ComboBox id="cbDebut" labelField="DEBUT" change="provider.refresh()" width="100" labelFunction="formatComboFR" />
      <mx:ComboBox id="cbTaux" labelField="TAUX" change="provider.refresh()" width="100" />
    </mx:HBox>
     
    //Ma Datagrid
    <mx:DataGrid id="liste1" width="100%" height="100%" dataProvider="{provider}" allowMultipleSelection="true" >
      <mx:columns>
        <mx:DataGridColumn dataField="FORCE_DE_VENTE" headerText="Force de vente" width="100" />
        <mx:DataGridColumn dataField="EDITEUR" headerText="Editeur" width="100" />
        <mx:DataGridColumn dataField="CLIENT" headerText="Client" width="100" />
        <mx:DataGridColumn dataField="DEBUT" headerText="Date début" width="100" labelFunction="formatGridFR" />
        <mx:DataGridColumn dataField="TAUX" headerText="Taux" width="100" />
      </mx:columns>
    </mx:DataGrid>
    Cette solution gère les cas de :
    - bug de sélection dans les combobox (cbForce.selectedItem && ...)
    - possibibilité de tout avoir (chaque combobox contient la valeur "Tous")
    - plusieurs filtres combinés

    A remarquer aussi la façon que le provider de la DataGrid est déclaré qu'une seule fois
    ainsi que l'évènement "change" des combobox qui vont provoquer le refresh du provider directement.

    Attention le provider doit être déclaré bindable comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      [Bindable] private var provider:XMLListCollection;
    J'espère que ceci aidera, bon courage

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Par défaut
    Merci de ta réponse je regarderais ça ce week end car mes cours on repris et j'ai pas trop de temps, je vous tien au courant pour les tests merci encore

Discussions similaires

  1. Combobox par SELECT sur fichier XML
    Par zouzou99 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 16/04/2008, 07h00
  2. Perl + Twig => operations sur fichier XML
    Par tsunamijf dans le forum Modules
    Réponses: 4
    Dernier message: 04/03/2008, 10h45
  3. Requête sur fichier XML
    Par migutz dans le forum VB.NET
    Réponses: 1
    Dernier message: 09/11/2007, 15h34
  4. [XML] Quizz basé sur fichier XML
    Par Heilong dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 29/10/2007, 14h16
  5. [AJAX] requête sur fichier.xml => erreur 405 sous IE !
    Par jeje13009 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 26/03/2007, 21h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo