Como pegar um dos campos que veio de retorno de um SQL - Assuntos Gerais - GUJ
Como pegar um dos campos que veio de retorno de um SQL
jrcardoso007 Outubro 17, 2011, 3:28pm #1
Amigos, estou iniciando em flex e estou com uma duvida que acredito não ser muito dificil resolver.
tenho uma function onde passo um sql para a classe getDados.
public function ObterItemSelecionadoComboBox():void
var item:Object = cb_modulo.selectedLabel;
var sql:String = "SELECT cd, descr FROM MODULOS WHERE CD = '" + item.toString()+"'";
banco.getDados2(sql, "PostGres",2);
Esta classe me devolve 2 campos como podem ver. O problema é no result do método getDados2.
public function ResultadoChamaModulo2(event:ResultEvent):void
descr_modulo.text = event.result.toString();
Como eu consigo pegar o campo descr que veio no resultado do evento???
luxu Outubro 17, 2011, 4:10pm #2
se fosse em java seria String descricao = modulo.getDescricao(); em flash deve ser algo parecido…
ssh Outubro 17, 2011, 4:53pm #3
Se fosse em java, sua query SQL deveria ficar armazenada em um ResultSet .
e você usuaria. ResultSet.getString("nome da coluna/ ou numero");
getString para quando o campo é varchar.
horochovec Outubro 18, 2011, 7:49am #4
Não consegui entender sua estrutura, você está trabalhando com Flex e está usando AMF? Porque o Flex não conecta com banco de dados, então sua função: ObterItemSelecionadoComboBox não vai funcionar no Flex, e sim no Java.
Esse trecho também está confuso: banco.getDados2(sql, "PostGres",2);
O que é "banco"?
Para poder ajudar, você vai ter que postar mais código ai, para ao menos tentarmos entender o que você está tentando fazer.
Ivan_Alves Outubro 18, 2011, 9:31am #5
Não entendi muita coisa, por acaso você está retornando um objeto que contém os atributos e quer pegar o atributo 'descricao'?
jrcardoso007 Outubro 18, 2011, 9:52am #6
Amigos, me desculpem, vou tentar ser mais claro.
banco.getDados (é um método em java que utilizo para conectar com o banco de dados e extrair informações)
neste trecho estou conectando com o banco e passando o sql que quero executar. A função ResultadoChamaModulo2 é a que trata o retorno deste método. Estou retornando no metodo getDados um List com os campos (cd, descr) gostaria de pegar pelo result o conteudo do campo descr.
Se acharem necessario, posto a classe completa para terem maior claresa na informação.
jrcardoso007 Outubro 18, 2011, 10:02am #7
Srs. vou tentar ser mais claro nas informações.
Neste método estou conectando com o banco de dados e passando o sql definido para execução, através do método(Java) getDados2.
Este método esta retornando uma List com os dois campos (cd e descr). Este retorno esta sendo tratado pela função ResultadoChamaModulo2 definida na tag abaixo do flex
<mx:method name="getDados2" result="ResultadoChamaModulo2(event)"/>
Eu gostaria de pegar a coluna descr do event.result e atribuir a uma Label. Ex.: label.text = event.resul.descr
Obs. Verifiquei que os dados estão sendo retornado no result do evento, porque consegui colocar as informações em uma grid, para testar a informação.
Ivan_Alves Outubro 18, 2011, 10:41am #8
coloca o método java getDados2 para esclarecer melhor!
horochovec Outubro 18, 2011, 10:43am #9
Primeiro: Essa estrutura que você está montando não é indicada. Você não deve passar suas consultas entre Flex / Java e sim trafegar apenas objetos serializados e tipados. Quem deve se preocupar com sua consulta é o Java e não o Flex que corresponde a sua View.
Segundo: A tua consulta retorna um objeto obtido no Java, o correto é você criar um DTO (ou VO) e trafegar este objeto de forma tipada, por exemplo, você vai ter um objeto do tipo "PessoaDTO" no Java e o mesmo vai retornar para o Flex como PessoaDTO. Caso opte por não trabalhar com objetos (o que não é legal), você pode por no teu método java um retorno direto da String que você deseja, ex:
resultSet.getString("nome da coluna/ ou numero");
E no Flex você pode verificar o retorno dele como:
protected function ResultadoChamaModulo2(event:ResultEvent) : void
label.text = event.result as String;
Provavelmente vai dar certo, mas como eu disse, nada recomendável trabalhar desta forma.
lucasbemo Outubro 18, 2011, 11:06am #10
Eu também aconselho você remover essa parte que esta passado o SQL dentro do Flex, você deve passar SQL no código java, é na camada java que deve se preocupar com o SQL. Isso não é legal nem boa prática(dica: procure saber sobre design pattern ).
vlw, abrç.
jrcardoso007 Outubro 18, 2011, 11:32am #11
Ok amigos, obrigado pelas dicas, vou estar alterando o local do meu sql e colocar diretamento no java. E aproveitar e dar uma olhada nos designer patter como sugerido.
Estou inserindo abaixo o método getBancos conforme solicitado pelo Ivan para deixar mais claro, mas de qualquer forma ja vou fazer as alterações sugeridas tambem.
public List getDados(String sql, String banco, int campos)
executaSQL(sql, banco);
List lista_final = new ArrayList();
HashMap dados = new HashMap();
dados.put("cd",rs.getString("cd"));
lista_final.add(dados);
JOptionPane.showMessageDialog(null, "Erro na criação dos dados HashMap");
return lista_final;
public void executaSQL(String sql, String banco)
Conecta(banco);
JOptionPane.showMessageDialog(null, "Erro no comando SQL" + e);
horochovec Outubro 18, 2011, 11:35am #12
Realmente o código precisa ser refatorado, tá cheio de JOptionXYZ… Isso ai não funciona com Flex
Ivan_Alves Outubro 18, 2011, 11:50am #13
A sim está usando HashMap que também não é o mais recomendado porém vamos analisar, você envia de volta para o flex uma List de HashMaps cada uma com os atributos que você colocou como 'cd' então no Result você faz
var minhaLista:ArrayCollection = event.result as ArrayCollection; //uma List em Java representa um ArrayCollection no Flex //verifique se ele possui algum elemento if(minhaLista != null && minhaLista.lenght>0){ //você pode acessar os atributos passados para sua HashMap através da sua chave que no caso ai tem 'cd' por exemplo //o primeiro dado passado para sua lista Alert.show(minhaLista.getItemAt(0).cd.toString()); //use um loop caso queira passar visualizar todos }
tenta arrumar seu código ai de acordo com as dicas do pessoal ai de cima depois tenta isso ai, flw!
jrcardoso007 Outubro 18, 2011, 12:37pm #14
Ivan, muito obrigado cara.
Realmente deu certo fazendo como indicou. Ja estou acertando o código conforme o pessoal indicou.
Agora só mais uma coisa. Voce comentou que usar o HashMap, não é o mais indicado.
Qual seria a maneira mais indicada de passar o retorno do sql neste caso???
E você saberia me indicar um livro bom que trata o assunto java e Flex juntos???
Ivan_Alves Outubro 18, 2011, 1:10pm #15
Não sei se é o seu caso mais comigo por exemplo eu crio minha tabela no banco de dados de acordo com as minhas classes por exemplo seu eu quero representar um produto eu crio assim:
public class Produto{ private int id; private String descricao; //.... //metodos gets e setters }
e no banco crio uma tabela com os campos id e descrição
na maioria dos casos quando faço uma consulta quero buscar os dados de uma tabela, podendo assim guarda-los em um objeto do tipo 'Produto' e assim envia-los para o flex seja em uma List ou apenas 1 objeto.
No flex também quero utiliza-los como o tipo 'Produto' então crio uma classe Produto lá também com os mesmos atributos e faço as devidas referencias, então as uso normalmente geralmente setando elas com 'Bindable' entre outros.
Nesse site tem um exemplo talvez você entenda melhor
http://blog.digows.com/en/integrando-adobe-flex-blazeds-springframework-hibernate-uma-soluo-opensource-para-sistemas-web-parte-1/
horochovec Outubro 18, 2011, 1:28pm #16
É interessante que os objetos trafegados não sejam sua camada de domínio. Pode parecer custoso e até estranho, mas isso permite uma maior segurança da sua aplicação e também facilita em caso de algum construtor diferente, alguma implementação em algum "set", etc. O contra disso é a conversão dos objetos de tráfego Flex <-> Java em objetos na camada de domínio para serem persistidos