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
-~----------~----~----~----~------~----~------~--~---

Responder a