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:
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 44 45 46 47 48 49 50 | <?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:Panel 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:DataGrid id="dataGrid" dataProvider="{xmlListFilterFunc}" x="10" y="38" width="282" height="140"> <mx:columns> <mx:DataGridColumn id="codeCol" dataField="@code" headerText="Abbr:" width="60" /> <mx:DataGridColumn id="nameCol" dataField="*" headerText="Name:" width="240" /> </mx:columns> </mx:DataGrid> <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:Panel> </mx:Application> |
O XML usado no dataProvider:
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | <?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
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:
Deixe Seu Comentário