Ola Pessoal, estou com um empecilho que é o seguinte, minha integração entre o java e o Blaze, esta 100%, ja incluo dados, altero dados e por aeh vai, contudo estou com um problema, que é o seguinte:
Preciso que os dados do BD, populem uma DataGrid, para tal fiz o seguinte:
//Declarei uma variavel para receber uma lista de dados.
[Bindable]
private var dados_cliente:ArrayCollection;
Aqui ele teoricamente receberi a lista q vem do BD, e converteria em uma ArrayCollection
public function ResultadoListaCliente(event:ResultEvent):void
{
dados_cliente = event.result as ArrayCollection; //recebe a lista e converte em um Array Collection
label_status.text="conectado com o banco";
}
e por fim aqui ele deveria listar os campos. no dataField os nomes sao os mesmos da tabela no BD
<mx:DataGrid x="10" y="10" width="610" id="datagrid_cliente" dataProvider="{dados_cliente}">
<mx:columns>
<mx:DataGridColumn headerText="Código" dataField="codigo"/>
<mx:DataGridColumn headerText="Nome" dataField="nome"/>
<mx:DataGridColumn headerText="Endereco" dataField="endereco"/>
<mx:DataGridColumn headerText="E-mail" dataField="email"/>
</mx:columns>
</mx:DataGrid>
Na classe java a lista sai completa, entao deve estar havendo algum empecilho na hora de trabalhar com os dados
Contudo este codigo nao funciona, o que estou fazendo de errado??
Estou utilizando o Flex 3 para desenvolver
Desde ja agradeço a ajuda
Coloque um breakpoint no momento que você recebe a lista.
Execute em modo debug.
E verifica se ela foi preenchida corretamente.
Ao que tudo indica o problema esta ao receber a lista mesmo,
segue o metodo que recebe:
public List listarCliente() {
conexao();
List lista_cliente = new ArrayList();
try {
statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
resultset = statement.executeQuery("select * from cliente");
while (resultset.next()) {
HashMap<String, String> hashmap_cliente = new HashMap<String, String>();
hashmap_cliente.put("codigo", resultset.getString("codigo"));
hashmap_cliente.put("nome", resultset.getString("nome"));
hashmap_cliente.put("endereco", resultset.getString("endereco"));
hashmap_cliente.put("email", resultset.getString("email"));
lista_cliente.add(hashmap_cliente);
// System.out.println(lista_cliente); //OK
}
} catch (SQLException e) {
JOptionPane
.showMessageDialog(null, "Erro de manipulação SQL: " + e);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Exceção Ocorida: " + e);
}
return lista_cliente;
}
Deixei a chave do HashMap, igual ao valor e no dataGrid eu chamo a chave com o mesmo nome que esta no HashMap,
configurei o remote-config.xml Desta maneira:
<destination id="ServicoJavaCliente">
<properties>
<source>br.eti.andrei.bd.ServicoJavaCliente</source>
</properties>
</destination>
consigo chamar o gravarCliente, e todos os outros metodos desta classe, so nao estou conseguindo chamar o listarCliente.
Qual erro ocorre?
Você executou em modo debug?
Executei em modo debug, e o problema esta, neste ponto, pq ele não pega nada.
Não entendi o erro, ja chequei, rechekei, testei de novo, mas a Lista nao chega até o Flex…
Agora não tenho certeza se o BlazeDS irá deserializar o HashMap da maneira como você está esperando, pois nunca tentei com o HashMap. (até porque nem existe um tipo compatível com o HashMap no Flex nativamente ). Existe essa biblioteca: http://www.ericfeminella.com/blog/2006/12/05/as3-hashmap-for-flex/
Você não possui um objeto cliente com essas informações? ( se não possui acho que ficaria bem mais organizado também, até porque o valor do HashMap só pode ser string… você não poderia usar essa solução para muitos casos ).
Em vez de preencher o HashMap você pode preencher esse objeto e inclui-lo em um ArrayList e retornar essa ArrayList para o Flex, no Flex esse ArrayList será deserializado para uma ArrayCollection e você poderá usa-lá como dataProvider.
Tente fazer isso ou você precisa usar com HashMap?
ola Rafael, inclui o codigo em um arrayList o codigo agora ficou assim
public List listarCliente() {
conexao();
List lista_cliente = new ArrayList();
try {
statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
resultset = statement.executeQuery("select * from cliente");
while (resultset.next()) {
ArrayList arraylist_cliente = new ArrayList();
arraylist_cliente.add(resultset.getString("codigo"));
arraylist_cliente.add(resultset.getString("nome"));
arraylist_cliente.add(resultset.getString("endereco"));
arraylist_cliente.add(resultset.getString("email"));
lista_cliente.add(arraylist_cliente);
}
} catch (SQLException e) {
JOptionPane
.showMessageDialog(null, "Erro de manipulação SQL: " + e);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Exceção Ocorida: " + e);
}
return lista_cliente;
}
contudo assim tbem não funciona, estou errando em algo simples pelo que percebo, mas nao estou encontrando o meu erro
Acho que o problema está com conceitos do Java e nem tanto do Flex.
Você está inserindo cada campo como um item da lista.A lista vai ficar assim:
“Nome”
“Endereço”
“Email”
“Nome”
“Endereço”
…
O datagrid precisa ter objetos na lista e não strings(pois cada coluna do grid vai pegar uma dessas propriedades do objeto". Você precisa criar a lista assim (cada linha da linha é um objeto)
“Nome” | “Endereço” | “Email”
“Nome” | “Endereço” | “Email”
Outro problema grave você está criando a lista toda vez dentro do while…
Ficaria algo assim:
[code]ArrayList arraylist_cliente = new ArrayList();
Cliente c;
while (resultset.next()) {
c = new Cliente();
c.codigo =resultset.getString(“codigo”);
c.nome = resultset.getString(“nome”);
c.endereco = resultset.getString(“endereco”);
c.email = resultset.getString(“email”);
lista_cliente.add©;
} [/code]
E ai teria a classe Cliente
[code]public class Cliente {
public var codigo:int;
public var nome:String
…
}[/code]
pode ser que eu esteja meio fora de conceito, mas o que acontece é o seguinte, eu estou começando no flex, começando mesmo.
E estou fazendo um CRUD para ver como as coisas funcionam, contudo estou seguindo as video aulas de flex do professor neri.
No exemplo que ele faz isso da certo, contudo para mim não.
Entao meu primeiro objetivo é colocar o programa para funcionar, e depois ir incrementando funcionalidades enfim, deixando ele mais redondinho.
Não interprete mal o que escrevi, é q estou começando mesmo, e como encontrei muitos tutoriais “furados” na internet, peguei as video aulas… hehehe…
entao meu objetivo agora é colocar a DataGrid para funcionar, depois eu vou incrementando… heheheh
se puder me ajudar com mais alguma coisa, agradeço… realmente quero fazer isso funcionar…
Obrigado
Desculpa… é que olhei o código por cima antes.
Você cria a ArrayList e nela coloca a HashMap, ai sim…
E depois retorna essa ArrayList pro Flex.
Coloque um breakpoint nessa linha:
dados_cliente = event.result as ArrayCollection; //recebe a lista e converte em um Array Collection
E execute em modo debug.
E olhe o que está na proprieade event.result
Ela está nula ou tem a lista criada com objetos nulos?
Sem Problemas Rafael, bem o que eu fiz foi o seguinte:
Peguei e migrei meu projeto para o Flex 4 e funcionou :shock: :shock:
com o HashMap…
Não faço idéia do que pode ter acontecido… mas enfim…
Agora vou ir melhorando isso…
Muito Obrigado