DClick

Buscando registros usando Like com E4X ou FilterFunction, faça sua escolha.


Twitter!

Semana passada tive que fazer um filtro em um datagrid que tinha como dataprovider um xml.

O filtro seria parecido com o like das queries SQL de consulta ao banco de dados. Fazendo a minha busca, encontrei duas opções para concluir essa tarefa: O filterFunction do XmlListCollection e o search do e4x.

As duas implementações são simples e interessantes. Falta testar o desempenho(deixo com vcs...hehehe)

Segue a aplicação implementando as duas soluções:

Seguem os fontes:

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
  3.     verticalAlign="middle" backgroundColor="white" verticalGap="20">
  4.  
  5.     <mx:Script>
  6.         <![CDATA[
  7.             private function filterFunc(item:Object):Boolean
  8.             {
  9.                 return item.text().toUpperCase().indexOf(stateName.text.toUpperCase())> -1;    
  10.             }
  11.            
  12.           private function filtrar():void
  13.           {
  14.              xmlListE4x.source = dp.country.state.(*.toUpperCase().search(stateName0.text.toUpperCase())> -1);
  15.           }
  16.           
  17.         ]]>
  18.     </mx:Script>
  19.  
  20.     <mx:XML id="dp" source="countries_states.xml"/>
  21.  
  22.     <mx:XMLListCollection id="xmlListFilterFunc" source="{dp.country.state}" filterFunction="filterFunc" />
  23.    
  24.     <mx:XMLListCollection id="xmlListE4x" source="{dp.country.state}"/>
  25.    
  26.     <mx :P anel width="322" height="248" layout="absolute" title="Filtro usando Filer Function">
  27.         <mx:Label text="Name:"  x="10" y="10"/>
  28.         <mx:TextInput id="stateName" width="232" change="xmlListFilterFunc.refresh()"  x="60" y="10"/>
  29.         <mx :D ataGrid id="dataGrid" dataProvider="{xmlListFilterFunc}" x="10" y="38" width="282" height="140">
  30.             <mx:columns>
  31.                 <mx :D ataGridColumn id="codeCol" dataField="@code" headerText="Abbr:" width="60" />
  32.                 <mx :D ataGridColumn id="nameCol" dataField="*" headerText="Name:" width="240" />
  33.             </mx:columns>
  34.         </mx :D ataGrid>
  35.         <mx:Label text="Filtered: Showing {xmlListFilterFunc.length} record(s)" visible="{stateName.text.length> 0}" x="10" y="186"/>
  36.     </mx:Panel>
  37.    
  38.     <mx:Panel width="322" height="248" layout="absolute" title="Filtro usando Search do E4x">
  39.         <mx:Label text="Name:"  x="10" y="10"/>
  40.         <mx:TextInput id="stateName0" width="232" change="filtrar()"  x="60" y="10"/>
  41.         <mx:DataGrid id="dataGrid0" dataProvider="{xmlListE4x}" x="10" y="38" width="282" height="140">
  42.             <mx:columns>
  43.                 <mx:DataGridColumn id="codeCol0" dataField="@code" headerText="Abbr:" width="60" />
  44.                 <mx:DataGridColumn id="nameCol0" dataField="*" headerText="Name:" width="240" />
  45.             </mx:columns>
  46.         </mx:DataGrid>
  47.         <mx:Label text="Filtered: Showing {xmlListE4x.length} record(s)" visible="{stateName0.text.length> 0}" x="10" y="186"/>
  48.     </mx :P anel>
  49.  
  50. </mx:Application>

O XML usado no dataProvider:

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <countries>
  3.     <!-- Taken from: http://canadaonline.about.com/library/bl/blpabb.htm -->
  4.     <country name="Canada">
  5.         <state code="AB">Alberta</state>
  6.         <state code="BC">British Columbia</state>
  7.         <state code="MB">Manitoba</state>
  8.         <state code="NB">New Brunswick</state>
  9.         <state code="NL">Newfoundland and Labrador</state>
  10.         <state code="NT">Northwest Territories</state>
  11.         <state code="NS">Nova Scotia</state>
  12.         <state code="NU">Nunavut</state>
  13.         <state code="ON">Ontario</state>
  14.         <state code="PE">Prince Edward Island</state>
  15.         <state code="QC">Quebec</state>
  16.         <state code="SK">Saskatchewan</state>
  17.         <state code="YT">Yukon Territory</state>
  18.     </country>
  19.  
  20.     <!-- Taken from: http://www.usps.com/ncsc/lookups/usps_abbreviations.html -->
  21.     <country name="United States of America">
  22.         <state code="AL">Alabama</state>
  23.         <state code="AK">Alaska</state>
  24.         <state code="AS">American Samoa</state>
  25.         <state code="AZ">Arizona</state>
  26.         <state code="AR">Arkansas</state>
  27.         <state code="CA">California</state>
  28.         <state code="CO">Colorado</state>
  29.         <state code="CT">Connecticut</state>
  30.         <state code="DE">Delaware</state>
  31.         <state code="DC">District of Columbia</state>
  32.         <state code="FM">Federated States of Micronesia</state>
  33.         <state code="FL">Florida</state>
  34.         <state code="GA">Georgia</state>
  35.         <state code="GU">Guam</state>
  36.         <state code="HI">Hawaii</state>
  37.         <state code="ID">Idaho</state>
  38.         <state code="IL">Illinois</state>
  39.         <state code="IN">Indiana</state>
  40.         <state code="IA">Iowa</state>
  41.         <state code="KS">Kansas</state>
  42.         <state code="KY">Kentucky</state>
  43.         <state code="LA">Louisiana</state>
  44.         <state code="ME">Maine</state>
  45.         <state code="MH">Marshall Islands</state>
  46.         <state code="MD">Maryland</state>
  47.         <state code="MA">Massachusetts</state>
  48.         <state code="MI">Michigan</state>
  49.         <state code="MN">Minnesota</state>
  50.         <state code="MS">Mississippi</state>
  51.         <state code="MO">Missouri</state>
  52.         <state code="MT">Montana</state>
  53.         <state code="NE">Nebraska</state>
  54.         <state code="NV">Nevada</state>
  55.         <state code="MP">Northern Mariana Islands</state>
  56.         <state code="NC">North Carolina</state>
  57.         <state code="ND">North Dakota</state>
  58.         <state code="NH">New Hampshire</state>
  59.         <state code="NJ">New Jersey</state>
  60.         <state code="NM">New Mexico</state>
  61.         <state code="NY">New York</state>
  62.         <state code="OH">Ohio</state>
  63.         <state code="OK">Oklahoma</state>
  64.         <state code="OR">Oregon</state>
  65.         <state code="PW">Palau</state>
  66.         <state code="PA">Pennsylvania</state>
  67.         <state code="PR">Puerto Rico</state>
  68.         <state code="RI">Rhode Island</state>
  69.         <state code="SC">South Carolina</state>
  70.         <state code="SD">South Dakota</state>
  71.         <state code="TN">Tennessee</state>
  72.         <state code="TX">Texas</state>
  73.         <state code="UT">Utah</state>
  74.         <state code="VA">Virginia</state>
  75.         <state code="VI">Virgin Islands</state>
  76.         <state code="VT">Vermont</state>
  77.         <state code="WA">Washington</state>
  78.         <state code="WI">Wisconsin</state>
  79.         <state code="WV">West Virginia</state>
  80.         <state code="WY">Wyoming</state>
  81.     </country>
  82. </countries>

Em ambos os casos terá como resultado uma consulta semelhante ao like %...% do SQL.

No primeiro dataGrid é feito o filtro baseado no filterFunction, ao preencher o campo de texto é disparada a função filterFunc(item:Object):Boolean por meio do método xmlListFilterFunc.refresh(), retornando true somente para as linhas do xml que satisfazem a consulta. Ou seja, indexOf(..) > -1.

No segundo dataGrid é pelo E4X que fazemos a consulta. Para cada linha do xml é comparada com o texto digitado no campo. O search funciona igual à função indexOf da classe String. O intessante a observar neste segundo exemplo é que qualquer consulta feita por meio do texto do xml, ou seja, se vc tem como nó do xml <state code="AB">Alberta</state>  o texto é Alberta. Isso é representado no E4X por (*).

Qualquer dúvida será bem vinda.

Abraços

Compartilhe:

  • RSS
  • Twitter
  • del.icio.us
  • Facebook
  • MySpace
  • LinkedIn
  • Google Bookmarks
Por Marcus Nadai em 17/November/2008 | Comentar | Trackback


No Translations

Um comentário para “Buscando registros usando Like com E4X ou FilterFunction, faça sua escolha.”


Olá,
Parabéns pela dica, casou certinho com o que eu preciso porém estou com a seguinte dificuldade recebo minha XML de um HTTPService que alimenta meu dataGrid porém se eu coloco o HTTPService alimentando o <mx:XML recebo o seguinte erro:
Problem finding external XML:

Adicionar comentário

(requerido)
(requerido, não será publicado)