Buscando registros usando Like com E4X ou FilterFunction, faça sua escolha.
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 version="1.0" encoding="utf-8"?>
-
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
-
verticalAlign="middle" backgroundColor="white" verticalGap="20">
-
-
<mx:Script>
-
<![CDATA[
-
private function filterFunc(item:Object):Boolean
-
{
-
return item.text().toUpperCase().indexOf(stateName.text.toUpperCase())> -1;
-
}
-
-
private function filtrar():void
-
{
-
xmlListE4x.source = dp.country.state.(*.toUpperCase().search(stateName0.text.toUpperCase())> -1);
-
}
-
-
]]>
-
</mx:Script>
-
-
<mx:XML id="dp" source="countries_states.xml"/>
-
-
<mx:XMLListCollection id="xmlListFilterFunc" source="{dp.country.state}" filterFunction="filterFunc" />
-
-
<mx:XMLListCollection id="xmlListE4x" source="{dp.country.state}"/>
-
-
<mx
anel width="322" height="248" layout="absolute" title="Filtro usando Filer Function"> -
<mx:Label text="Name:" x="10" y="10"/>
-
<mx:TextInput id="stateName" width="232" change="xmlListFilterFunc.refresh()" x="60" y="10"/>
-
<mx
ataGrid id="dataGrid" dataProvider="{xmlListFilterFunc}" x="10" y="38" width="282" height="140"> -
<mx:columns>
-
<mx
ataGridColumn id="codeCol" dataField="@code" headerText="Abbr:" width="60" /> -
<mx
ataGridColumn id="nameCol" dataField="*" headerText="Name:" width="240" /> -
</mx:columns>
-
</mx
ataGrid> -
<mx:Label text="Filtered: Showing {xmlListFilterFunc.length} record(s)" visible="{stateName.text.length> 0}" x="10" y="186"/>
-
</mx:Panel>
-
-
<mx:Panel width="322" height="248" layout="absolute" title="Filtro usando Search do E4x">
-
<mx:Label text="Name:" x="10" y="10"/>
-
<mx:TextInput id="stateName0" width="232" change="filtrar()" x="60" y="10"/>
-
<mx:DataGrid id="dataGrid0" dataProvider="{xmlListE4x}" x="10" y="38" width="282" height="140">
-
<mx:columns>
-
<mx:DataGridColumn id="codeCol0" dataField="@code" headerText="Abbr:" width="60" />
-
<mx:DataGridColumn id="nameCol0" dataField="*" headerText="Name:" width="240" />
-
</mx:columns>
-
</mx:DataGrid>
-
<mx:Label text="Filtered: Showing {xmlListE4x.length} record(s)" visible="{stateName0.text.length> 0}" x="10" y="186"/>
-
</mx
anel> -
-
</mx:Application>
O XML usado no dataProvider:
-
<?xml version="1.0" encoding="utf-8"?>
-
<countries>
-
<!-- Taken from: http://canadaonline.about.com/library/bl/blpabb.htm -->
-
<country name="Canada">
-
<state code="AB">Alberta</state>
-
<state code="BC">British Columbia</state>
-
<state code="MB">Manitoba</state>
-
<state code="NB">New Brunswick</state>
-
<state code="NL">Newfoundland and Labrador</state>
-
<state code="NT">Northwest Territories</state>
-
<state code="NS">Nova Scotia</state>
-
<state code="NU">Nunavut</state>
-
<state code="ON">Ontario</state>
-
<state code="PE">Prince Edward Island</state>
-
<state code="QC">Quebec</state>
-
<state code="SK">Saskatchewan</state>
-
<state code="YT">Yukon Territory</state>
-
</country>
-
-
<!-- Taken from: http://www.usps.com/ncsc/lookups/usps_abbreviations.html -->
-
<country name="United States of America">
-
<state code="AL">Alabama</state>
-
<state code="AK">Alaska</state>
-
<state code="AS">American Samoa</state>
-
<state code="AZ">Arizona</state>
-
<state code="AR">Arkansas</state>
-
<state code="CA">California</state>
-
<state code="CO">Colorado</state>
-
<state code="CT">Connecticut</state>
-
<state code="DE">Delaware</state>
-
<state code="DC">District of Columbia</state>
-
<state code="FM">Federated States of Micronesia</state>
-
<state code="FL">Florida</state>
-
<state code="GA">Georgia</state>
-
<state code="GU">Guam</state>
-
<state code="HI">Hawaii</state>
-
<state code="ID">Idaho</state>
-
<state code="IL">Illinois</state>
-
<state code="IN">Indiana</state>
-
<state code="IA">Iowa</state>
-
<state code="KS">Kansas</state>
-
<state code="KY">Kentucky</state>
-
<state code="LA">Louisiana</state>
-
<state code="ME">Maine</state>
-
<state code="MH">Marshall Islands</state>
-
<state code="MD">Maryland</state>
-
<state code="MA">Massachusetts</state>
-
<state code="MI">Michigan</state>
-
<state code="MN">Minnesota</state>
-
<state code="MS">Mississippi</state>
-
<state code="MO">Missouri</state>
-
<state code="MT">Montana</state>
-
<state code="NE">Nebraska</state>
-
<state code="NV">Nevada</state>
-
<state code="MP">Northern Mariana Islands</state>
-
<state code="NC">North Carolina</state>
-
<state code="ND">North Dakota</state>
-
<state code="NH">New Hampshire</state>
-
<state code="NJ">New Jersey</state>
-
<state code="NM">New Mexico</state>
-
<state code="NY">New York</state>
-
<state code="OH">Ohio</state>
-
<state code="OK">Oklahoma</state>
-
<state code="OR">Oregon</state>
-
<state code="PW">Palau</state>
-
<state code="PA">Pennsylvania</state>
-
<state code="PR">Puerto Rico</state>
-
<state code="RI">Rhode Island</state>
-
<state code="SC">South Carolina</state>
-
<state code="SD">South Dakota</state>
-
<state code="TN">Tennessee</state>
-
<state code="TX">Texas</state>
-
<state code="UT">Utah</state>
-
<state code="VA">Virginia</state>
-
<state code="VI">Virgin Islands</state>
-
<state code="VT">Vermont</state>
-
<state code="WA">Washington</state>
-
<state code="WI">Wisconsin</state>
-
<state code="WV">West Virginia</state>
-
<state code="WY">Wyoming</state>
-
</country>
-
</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
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:

