Eu criei um component genérico para obtenção de dados do Banco. Já que o escambo de código aqui é permitido.... segue minha implementação. Basicamente eu criei um objeto de resposta na forma de XML que me informa se a requisição foi bem sucedida ou não.
Ao invés de estourar erros ou exceptions no PHP, eu defino as mensagens no meu objeto resposta e o retorno. A estrutura é mais ou menos esta: <response> <status><![CDATA[ ERROR ]]></status> <message><![CDATA[ Erro inesperado ao retornar dados ]]></message> <data/> </response> No caso de uma requisição bem executada - e espeficamente no caso de um combobox -, a resposta é algo parecido com isto: <response> <status><![CDATA[ OK ]]></status> <message/> <data> <item> <id><![CDATA[ 1 ]]></id> <name><![CDATA[ Banco do Brasil ]]></name> </item> <item> <id><![CDATA[ 2 ]]></id> <name><![CDATA[ Correios ]]></name> </item> </data> </response> E aí eu tenho meu componente base de implementação chamado de DynamicComboBox: <?xml version="1.0" encoding="utf-8"?> <mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml" labelField="name"> <mx:Script> <![CDATA[ import mx.events.ListEvent; import mx.rpc.events.ResultEvent; public static var EVENT:String = "Change"; protected var _selectedId:String = "-1"; public function set selectedId(value:String):void { _selectedId = value; updateSelection(); } public function get selectedId():String { return _selectedId; } public function set url(value:String):void { itemService.url = value; } public function get url():String { return itemService.url; } public function synchronize():void { itemService.cancel(); itemService.send(); } protected function handleItemServiceResult(event:ResultEvent):void { dataProvider = XMLList(XMLList(XML(event.result).data)[0].item); if (_selectedId != "-1") { updateSelection(); } } protected function updateSelection():void { if (this.dataProvider != null) { var items:XMLList = XMLList(this.dataProvider); for (var i:int = 0, len:uint = items.length(); i < len; i++) { var item:XML = XML(items[i]); var id:String = item.hasOwnProperty('id') ? XML(item.id).toString() : XMLList([EMAIL PROTECTED]).toString(); if (_selectedId == id) { this.selectedIndex = i; this.dispatchEvent(new ListEvent(ListEvent.CHANGE, false, false, 0, i)); break; } } } } ]]> </mx:Script> <mx:HTTPService id="itemService" method="POST" useProxy="false" resultFormat="e4x" result="handleItemServiceResult(event)"/> </mx:ComboBox> Com este componente, eu tenho a possibilidade de auto-selecionar items baseado no ID, alterar a URL de pesquisa, etc. Além disto, eu implementei o sistema de notificação de alterações através da aplicação. O que isto significa? Cada componente que herdar de DynamicComboBox, tem um evento relacionado à sua alteração chamado de EVENT. Por exemplo... neste caso específico, a minha resposta é proveniente de uma consulta de Companies (Empresas). Portanto, eu crio meu componente CompanyComboBox e nomeio meu evento para atualização de dados como "ChangeCompany". Minha implementação da subclasse fica assim: <?xml version="1.0" encoding="utf-8"?> <DynamicComboBox xmlns="core.controls.*" xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()" prompt="Select Company"> <mx:Script> <![CDATA[ import core.Environment; import mx.core.Application; public static var EVENT:String = "ChangeCompany"; protected function init():void { var app:Application = Environment.getApplication(); app.addEventListener(CompanyComboBox.EVENT, function (e:Event):void { synchronize(); }); this.url = Environment.getInstance().CORE_URL + "Controls_CompanyComboBox/Item"; this.synchronize(); } ]]> </mx:Script> </DynamicComboBox> Peço desculpas por não expor minha classe Environment, mas ela controle alguns acessos específicos. Basicamente é uma classe Singleton e a utilização dela aqui é para obter a aplicação e a URL base do código base do lado do PHP: public static function getApplication():Application { return Application(Application.application); } public const CORE_URL:String = "http://localhost:20080/aplicacao/web/core_dev.php/"; Eu modifiquei o componente para usar a classe mx:HTTPService do Flex e não o meu componente rpc:Service que trata automaticamente as chamadas que geraram erro. Com toda essa parafernália.... basta apenas implementar as subclasses e tudo funcionará perfeitamente para você. Espero ter ajudado. []s, 2008/9/15 Mário Júnior <[EMAIL PROTECTED]>: > primeiro... tenha certeza q o event.result contenha dados. > segundo.. verifique qual a estrutura do objeto retornado para o resultEvent, > e se estão vindo carregados (não nulos). > > joga um breakpoint no método q vc associa o e.result ao seu arrayCollection. > (tenho 90% de certeza que e.result.dados não existe) > > only. > > um abraço. > > > > 2008/9/15 Jaison <[EMAIL PROTECTED]> >> >> Como vocês fazem pra popular o combobox com os dados vindo do banco? >> >> >> 2008/9/15 Jaison <[EMAIL PROTECTED]> >>> >>> no meu caso não é isso não, pois a variavel ta criada. >>> >>> >>> 2008/9/15 Vinícius Velasco <[EMAIL PROTECTED]> >>>> >>>> Eu nao sei mto de flex nao mas uma vez q isso aconteceu comigo era pq eu >>>> nao tinha criado a variavel arraycollection q no seu caso chama listaAreas >>>> como Bindable >>>> >>>> 2008/9/15 Jaison <[EMAIL PROTECTED]> >>>>> >>>>> pessoal seguinte, eu tenho um metodo que popula um combobox: >>>>> >>>>> public function carregaAreas():void{ >>>>> patologia.retornaAreas.send(); >>>>> } >>>>> >>>>> public function resultadoRetornaAreas(e:ResultEvent):void{ >>>>> listaAreas = ArrayCollection(e.result.dados); >>>>> } >>>>> >>>>> no php ta assim: >>>>> >>>>> function retornaAreas(){ >>>>> $retorno['dados'] =""; >>>>> $i = 0; >>>>> $query = "select * from area ORDER BY nome_area ASC"; >>>>> $resultado = pg_query(conecta(),$query); >>>>> if(pg_num_rows($resultado)>0){ >>>>> while ($linha = pg_fetch_array($resultado)) { >>>>> $retorno['dados'][$i]['id_area'] = >>>>> $linha['id_area']; >>>>> $retorno['dados'][$i]['nome_area'] = >>>>> utf8_decode($linha['nome_area']); >>>>> $i++; >>>>> } >>>>> } >>>>> return $retorno; >>>>> } >>>>> >>>>> no flex ta assim: >>>>> >>>>> <mx:ComboBox x="10" y="43" width="326" dataProvider="{listaAreas}"></ >>>>> mx:ComboBox> >>>>> >>>>> >>>>> minha dúvida: Porque naum popula? eu quero que apareça no combobox o >>>>> nome da area (nome_area) mas naum aparece nada :( Alguem poderia me >>>>> falar onde estou pecando?! :( >>>>> >>>>> abraço Galera! >>>>> >>>>> >>>>> >>>>> -- >>>>> Bel. Vinícius Velasco >>>>> Analista de Desenvolvimento - Ábaco >>>>> MSN: [EMAIL PROTECTED] >>>>> Skype: ircvinicius >>>>> Fone: 66 8411 0245 >>>>> Rondonópolis - Mato Grosso - Brasil >>>>> "Tudo Posso Naquele que me Fortalece" Fil 4:13 >>>> >>>> >>> >>> >>> >>> -- >>> Jaison. >>> msn: [EMAIL PROTECTED] / 48. 84191383 >>> Site: www.portalandroid.org >> >> >> >> -- >> Jaison. >> msn: [EMAIL PROTECTED] / 48. 84191383 >> Site: www.portalandroid.org >> >> > > > > -- > Mário de Souza Júnior > Programador Java / Adobe Flex > (44) 4009-3550 Maringá-PR > http://blog.mariojunior.com > [EMAIL PROTECTED] (gtalk, msn, etc..) > > > > -- Guilherme Blanco - Web Developer CBC - Certified Bindows Consultant Cell Phone: +55 (16) 9166-6902 MSN: [EMAIL PROTECTED] URL: http://blog.bisna.com Rio de Janeiro - RJ/Brazil --~--~---------~--~----~------------~-------~--~----~ Você recebeu esta mensagem porque está inscrito na lista "flexdev" Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com Para sair da lista, envie um email em branco para [EMAIL PROTECTED] Mais opções estão disponíveis em http://groups.google.com/group/flexdev -~----------~----~----~----~------~----~------~--~---