Bom dia galera, seguinte tenho um array no flex vindo de um data grid, alguém pode me ajudar em como enviar esse array para o java?
[RESOLVIDO]Enviar Array do flex para o java
37 Respostas
Bom dia,
Você está usando o que para fazer a comunicação entre os dois?
[]'s
Bom sou noca na área, não sei se é isso que queres saber mas… uso o Blaze.
Já tenho métodos insert, update, delete, load (para carregar os dados) funcionando normalmente. o problema é que não sei como enviar esse array.
dataGrid.dataProvider
Você deve acessar esse atributo do dataGrid pra que consiga a coleção. Posta seu código…
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.events.CloseEvent;
private function addFiliacao():void {
if (dadosParente == null) {
dadosParente = new ArrayCollection();
}
dadosParente.addItem(montaObjeto());
reset();
}
public function removeFiliacao():void {
Alert.show("Confirma exclusão da permissão?", "", Alert.OK | Alert.CANCEL, this, do_excluir, null, Alert.OK);
}
public function do_excluir(eventObj:CloseEvent):void {
if (eventObj.detail == Alert.OK) {
dadosParente.removeItemAt(dgParente.selectedIndex);
reset();
}
}
private function selecionaFiliacao():void {
var filiacao:Parentesco = Parentesco(dgParente.selectedItem);
ti_nm_parente.text = filiacao.nm_parente;
selecionarItemDoCombo(dgParente.selectedItem.descricao.toString(), cb_relacionamento, "descricao");
if (filiacao.sn_coabita == 'SIM') {
cbx_fg_coabita.selected = true;
} else {
cbx_fg_coabita.selected = false;
}
}
public function selecionarItemDoCombo(label:String, combo:customComboBox, comboKey:String):Object {
for (var i:uint = 0; i < combo.dataProvider.length; i++) {
if (combo.dataProvider[i][comboKey] == label) {
combo.selectedIndex = i;
}
}
return null;
}
private function reset():void {
var pessoa:Parentesco = new Parentesco();
pessoa.parentesco = dadosParente;
ti_nm_parente.text = "";
dgParente.selectedIndex = -1;
}
private function montaObjeto():Parentesco {
var parentesco:Parentesco = new Parentesco();
parentesco.nm_parente = ti_nm_parente.text;
parentesco.descricao = cb_relacionamento.selectedItem.descricao;
if (cbx_fg_coabita.selected == true) {
parentesco.sn_coabita = 'SIM';
} else {
parentesco.sn_coabita = 'NÃO';
}
return parentesco;
}
private function atualizaFiliacao():void {
if (dgParente.selectedIndex >= 0) {
dadosParente.setItemAt(montaObjeto(), dgParente.selectedIndex);
reset();
}
}
private function validaFormFiliacao():void {
if (ti_nm_parente.text == null || ti_nm_parente.text == "") {
Alert.show("Informar o nome da filiação!!", "Info!!");
ti_nm_parente.setFocus();
return;
}
if (cb_relacionamento.selectedIndex < 0) {
Alert.show("Informar selecionar o relacionamento", "Info!!");
cb_relacionamento.setFocus();
return;
}
addFiliacao();
}
]]>
</mx:Script>
Esse é o código para adicionar os valores do combo, do inputtext e do check para enviar para grid
é isso ai que o cara de cima disse,
e no java, o método que recebe esse array, recebe um ArrayCollection (classe do BlaseDS) ou,
se você quiser enviar um array nativo, você tem que acessar o método dataGrid.dataProvider.source().
Abraços
Nossa, com ote disse sou nova nisso, então é meio confusso ainda para mim. você poderiam me dar um exemplo?
Te como deixo no flex e como faço no java.
Vamos ver então, você já conseguiu fazer a configuração do services e do AMF?
Tipo, não conheço muito essa linguagem técnica. Minha tela já está funcionando, como faço insert em mais de uma tabela na mesma tela por exemplo o cadastro de endereço já está ok.
No flex faço isso:
<local:CadEnd id="cadend" pf_cd_pessoafisica="{cadpf.cd_pessoafisica}"
tp_endereco="{cb_tp_endereco.selectedItem.codigo}"
ds_logradouro="{ti_ds_logradouro.text}" nu_logradouro="{ti_nu_logradouro.text}"/>
No java:
public static boolean insertend(int novapf, CadastroEndereco cadend) {
try {
Connection c = ConnectionHelper.getConnection();
String sql_insert = "insert into enderecos (pf_cd_pessoafisica, tp_endereco, ds_logradouro, nu_logradouro "
+ "values (?, ?, ?, ?)";
PreparedStatement pstmt = c.prepareStatement(sql_insert);
pstmt.setInt(1, novapf);
pstmt.setString(2, cadend.gettp_endereco());
pstmt.setString(3, cadend.getds_logradouro());
pstmt.setString(4, cadend.getnu_logradouro());
pstmt.executeUpdate();
pstmt.close();
ConnectionHelper.close(c);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
Agora como fazer com uma lista não sei.
Olha, eu nunca fiz a comunicação entre Flex e Java dessa maneira, me manda as classes “CadEnd” do flex e CadastroEndereco do java
ai vai ficar mais facil de eu te ajudar
abraços
package ABW.ABW1010 {
import mx.collections.ArrayCollection;
[Bindable]
[RemoteClass(alias="br.org.hemosc.abw.entity.CadastroEndereco")]
public class CadEnd {
public function CadEnd() {
}
public var tp_endereco:String;
public var ds_logradouro:String;
public var nu_logradouro:String;
public var ds_complemento:String;
public var ds_bairro:String;
public var cd_cep:String;
public var municipio_cd_municipio:int;
public var pf_cd_pessoafisica:int;
public var fg_principal:String;
public var ds_municipio:String;
}
}
insert no java
public static boolean insertend(int novapf, CadastroEndereco cadend) {
try {
Connection c = ConnectionHelper.getConnection();
String sql_insert = "insert into enderecos (pf_cd_pessoafisica, tp_endereco, ds_logradouro, nu_logradouro, "
+ "ds_complemento, ds_bairro, cd_cep, municipio_cd_municipio, fg_principal) "
+ "values (?, ?, ?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = c.prepareStatement(sql_insert);
pstmt.setInt(1, novapf);
pstmt.setString(2, cadend.gettp_endereco());
pstmt.setString(3, cadend.getds_logradouro());
pstmt.setString(4, cadend.getnu_logradouro());
pstmt.setString(5, cadend.getds_complemento());
pstmt.setString(6, cadend.getds_bairro());
pstmt.setString(7, cadend.getcd_cep());
pstmt.setInt(8, cadend.getmunicipio_cd_municipio());
pstmt.setString(9, cadend.getfg_principal());
pstmt.executeUpdate();
pstmt.close();
ConnectionHelper.close(c);
// System.out.println(novapf);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
no flex
<mx:RemoteObject id="roCadastroEnderecoService" destination="cadendService">
<mx:method name="insertend" result="resultHandlerInsert(event)"/>/>
<local:CadEnd id="cadend" pf_cd_pessoafisica="{cadpf.cd_pessoafisica}"
tp_endereco="{cb_tp_endereco.selectedItem.codigo}"
ds_logradouro="{ti_ds_logradouro.text}" nu_logradouro="{ti_nu_logradouro.text}"
ds_complemento="{ti_ds_complemento.text}" ds_bairro="{ti_ds_bairro.text}"
cd_cep="{ti_cd_cep.text}" municipio_cd_municipio="{Number(ti_cd_municipio.text)}"
fg_principal="{cbx_fg_principal.selected}"/>
AAhhh entendi agora, se você quer enviar um array (só o array) você vai fazer +/- assim
vai criar o remoteOjbect
<s:RemoteObject id="enviaArray" destination="enviaArrayService">
<s:method name="enviarArray" result="onResult(event)"/>
</s:RemoteObject>
depois vai criar o método que envia o Array, usando o seu dataGrid.
public function vouEnviarArray():void {
this.enviaArray.enviarArray(this.dgParente.dataProvider.source();
}
public function onResult(event:ResultEvent):void {
// quando terminar de receber o array.
}
e depois no java, cria o método enviarArray no service que você quiser.
public void enviarArray(array:Array){
// Faz o que tem que fazer com o array
}
espero ter ajudado, se ficou alguma duvida só postar.
Tipo para cada linha do array tenho que enviar o código da pessoa física que não está na grid é possível?
Só não sei como montar o onResult e o enviarArray.
Você pode por o código da pessoa física no seu método montaObjeto();
e o método “enviarArray” do java você faz o que você quiser com o array, vai ser um array com vários objetos “Parentesco”.
e o método onResult(e:resultEvent) é quando terminar de fazer a ação no java, você pode dar uma mensagem de salvo com sucesso, etc.
por exemplo no java.
public boolean enviarArray(Object[] array) {
try{
for (int x = 0; x < array.length; x++) {
// faz a ação com cada objeto aqui.
}
}catch (Exception ex) {
return false;
}
return true;
}
ai, se você quiser, no Flex
public function onResult(e:ResultEvent):void {
if (e.result == false) {
Alert.show("Não funcionou");
} else {
Alert.show("Funcionou");
}
}
Espero ter ajudado
abraços
Bom uma última dúvida para por em prática o código que vc passou.
lá no flex eu faço isso:
<local:CadEnd id="cadend" pf_cd_pessoafisica="{cadpf.cd_pessoafisica}"
tp_endereco="{cb_tp_endereco.selectedItem.codigo}"
ds_logradouro="{ti_ds_logradouro.text}" nu_logradouro="{ti_nu_logradouro.text}"
ds_complemento="{ti_ds_complemento.text}" ds_bairro="{ti_ds_bairro.text}"
cd_cep="{ti_cd_cep.text}" municipio_cd_municipio="{Number(ti_cd_municipio.text)}"
fg_principal="{cbx_fg_principal.selected}"/>
dizendo dizendo de onde vem o q cada item vai receber, como eu faria isso com os dados da grid? Não é precis?
não precisa, pois ele vai enviar um array de “Objects[]”, e lá você vai ter todas as variáveis.
Putz, não consegui aplicar suas dicas :(…
mas posta o erro, ou o que aconteceu?
se possível eu te ajudo
Abraços
Oi bom dia,
então ele não deu erro, simplesmente não executa.
me manda o código que você fez.
entidade do flex
package ABW.ABW1010 {
import mx.collections.ArrayCollection;
[Bindable]
[RemoteClass(alias="br.org.hemosc.abw.entity.Parentesco")]
public class Parentesco {
public function Parentesco() {
}
public var pf_cd_pessoafisica:int;
public var nm_parente:String;
public var sn_coabita:String;
public var codigo:int;
public var descricao:String;
//o array da grid
public var parentesco:ArrayCollection;
}
}
entidade do java
package br.org.hemosc.abw.entity;
import java.io.Serializable;
public class Parentesco implements Serializable {
private static final long serialVersionUID = 1L;
private int pf_cd_pessoafisica;
private String nm_parente;
private String sn_coabita;
private int cd_relacionamento;
private String descricao;
public void setpf_cd_pessoafisica(int pf_cd_pessoafisica) {
this.pf_cd_pessoafisica = pf_cd_pessoafisica;
}
public int getpf_cd_pessoafisica() {
return pf_cd_pessoafisica;
}
public void setsn_coabita(String sn_coabita) {
this.sn_coabita = sn_coabita;
}
public String getsn_coabita() {
return sn_coabita;
}
public void setnm_parente(String nm_parente) {
this.nm_parente = nm_parente;
}
public String getnm_parente() {
return nm_parente;
}
public void setcd_relacionamento(int cd_relacionamento) {
this.cd_relacionamento = cd_relacionamento;
}
public int getcd_relacionamento() {
return cd_relacionamento;
}
public void setdescricao(String descricao) {
this.descricao = descricao;
}
public String getdescricao() {
return descricao;
}
}
Código para passar os dados para grid sem ir para o banco
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.events.CloseEvent;
private function addFiliacao():void {
if (dadosParente == null) {
dadosParente = new ArrayCollection();
}
dadosParente.addItem(montaObjeto());
reset();
}
public function removeFiliacao():void {
Alert.show("Confirma exclusão da permissão?", "", Alert.OK | Alert.CANCEL, this, do_excluir, null, Alert.OK);
}
public function do_excluir(eventObj:CloseEvent):void {
if (eventObj.detail == Alert.OK) {
dadosParente.removeItemAt(dgParente.selectedIndex);
reset();
}
}
private function selecionaFiliacao():void {
var parentesco:Parentesco = Parentesco(dgParente.selectedItem);
ti_nm_parente.text = parentesco.nm_parente;
selecionarItemDoCombo(dgParente.selectedItem.descricao.toString(), cb_relacionamento, "descricao");
if (parentesco.sn_coabita == 'SIM') {
cbx_fg_coabita.selected = true;
} else {
cbx_fg_coabita.selected = false;
}
}
public function selecionarItemDoCombo(label:String, combo:customComboBox, comboKey:String):Object {
for (var i:uint = 0; i < combo.dataProvider.length; i++) {
if (combo.dataProvider[i][comboKey] == label) {
combo.selectedIndex = i;
}
}
return null;
}
private function reset():void {
var pessoa:Parentesco = new Parentesco();
pessoa.parentesco = dadosParente;
ti_nm_parente.text = "";
dgParente.selectedIndex = -1;
}
private function montaObjeto():Parentesco {
var parentesco:Parentesco = new Parentesco();
parentesco.nm_parente = ti_nm_parente.text;
parentesco.descricao = cb_relacionamento.selectedItem.descricao;
if (cbx_fg_coabita.selected == true) {
parentesco.sn_coabita = 'SIM';
} else {
parentesco.sn_coabita = 'NÃO';
}
return parentesco;
}
private function atualizaFiliacao():void {
if (dgParente.selectedIndex >= 0) {
dadosParente.setItemAt(montaObjeto(), dgParente.selectedIndex);
reset();
}
}
private function validaFormFiliacao():void {
if (ti_nm_parente.text == null || ti_nm_parente.text == "") {
Alert.show("Informar o nome da filiação!!", "Info!!");
ti_nm_parente.setFocus();
return;
}
if (cb_relacionamento.selectedIndex < 0) {
Alert.show("Informar selecionar o relacionamento", "Info!!");
cb_relacionamento.setFocus();
return;
}
addFiliacao();
}
]]>
</mx:Script>
no flex
<mx:RemoteObject id="roParentescoService" destination="parenteService" fault="Fault(event)">
<mx:method name="enviarArray" result="resultHandlerEnviarArray(event)"/>
<mx:method name="listaGeralParentesco" result="resultHandlerListaParentesco(event)"/>
</mx:RemoteObject>
<local:Parentesco id="parentesco" pf_cd_pessoafisica="{cadpf.cd_pessoafisica}"/>
public function resultHandlerEnviarArray(event:ResultEvent):void {
if (event.result as Boolean) {
Alert.show(resourceManager.getString('Hemosis', 'incluir_valido'));
} else {
Alert.show(resourceManager.getString('Hemosis', 'incluir_invalido'));
}
}
no java
public boolean enviarArray(Object[] parentesco) {
try {
//for (int x = 0; x < array.length; x++) {
Connection c = ConnectionHelper.getConnection();
String sqlinsert = "insert into parentesco "
+ "(pf_cd_pessoafisica, nm_parente, cd_relacionamento, sn_coabita) "
+ "values (?, ?, ?, ?)";
PreparedStatement pstmt = c.prepareStatement(sqlinsert);
//pstmt.setInt(1, parentesco.getpf_cd_pessoafisica);
//pstmt.setString(2, parentesco.getnm_parente());
//pstmt.setInt(3, parentesco.getcd_relacionamento());
//pstmt.setString(4, parentesco.getsn_coabita());
//pstmt.setArray(2, parentesco.parentesco);
pstmt.executeUpdate();
pstmt.close();
ConnectionHelper.close(c);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
A parte java o que comentei é q não soube como era para montar.
Na entidade do java não coloquei o array, talvez seja por isso?
Ah, só lembrando que para cada linha enviada tenho que mandar junto o código da pf da tela.
E pra mandar o array tem que clicar no botão certo?
me manda a função de click do botão também, ou de qualquer ação que vai enviar
normalmente para salvar faço assim
public function salva():void {
var validatorErrorArray:Array = Validator.validateAll(validacao);
if (validatorErrorArray.length == 0) {
roParentescoService.enviarArray(parentesco);
} else {
Alert.show(resourceManager.getString('Materiais', 'obrigatorios'));
}
só q eu teria q passar o código da pf junto. dai fiz nos outros q era só um registro assim:
roParentescoService.enviarArray(cd_pf, parentesco);
ta, mas o método do java chega a ser executado? ou nem vai pro java?
ele vai mas nao executa, acho q meu insert pelo java nao está certo, nao achas?
no método salva() você está enviando um objeto parentesco e não um array, dá uma olhada nisso.
tá, mas o insert está correto?
eu teria de enviar entao parentesco.parentesco
que seria minha entidade do entidade do java . quem está recebendo a lista certo?
mas na entidade do java eu nao tenho q declarar esse array?
no insert você vai fazer um “for”, que é um laço de repetição, e, para cada objeto você vai fazer o insert.
tipo assim:
for (int x = 0; x < array.length; x++) {
Parentesco parentesco = (Parentesco) array[0];
Connection c = ConnectionHelper.getConnection();
String sqlinsert = "insert into parentesco "
+ "(pf_cd_pessoafisica, nm_parente, cd_relacionamento, sn_coabita) "
+ "values (?, ?, ?, ?)";
PreparedStatement pstmt = c.prepareStatement(sqlinsert);
pstmt.setInt(1, parentesco.getpf_cd_pessoafisica);
pstmt.setString(2, parentesco.getnm_parente());
pstmt.setInt(3, parentesco.getcd_relacionamento());
pstmt.setString(4, parentesco.getsn_coabita());
pstmt.executeUpdate();
pstmt.close();
ConnectionHelper.close(c);
aparentemente o insert está corrento, o que falta é ter o objeto para preencher os valores.
Beleza mas onde passo o código da pf no java?
você tem que fazer isso no Flex, no seu método “montaObjeto()”
entao fiz assim:
roParentescoService.enviarArray(novapf, parentesco.parentesco);
public boolean enviarArray(int novapf, Object[] array) {
try {
for (int x = 0; x < array.length; x++) {
Parentesco parentesco = (Parentesco) array[0];
Connection c = ConnectionHelper.getConnection();
String sqlinsert = "insert into parentesco "
+ "(pf_cd_pessoafisica, nm_parente, cd_relacionamento, sn_coabita) "
+ "values (?, ?, ?, ?)";
PreparedStatement pstmt = c.prepareStatement(sqlinsert);
pstmt.setInt(1, novapf);
pstmt.setString(2, parentesco.getnm_parente());
pstmt.setInt(3, parentesco.getcd_relacionamento());
pstmt.setString(4, parentesco.getsn_coabita());
pstmt.executeUpdate();
pstmt.close();
ConnectionHelper.close(c);
System.out.println(novapf);
}
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
mas dai tá me dando esse erro:
Erro = java.lang.NullPointerException : null
tenta colocar, no lugar de Object[] array,ArrayCollection array
tbm nao deu.
Tá, mas que erro que aconteceu?
Oi agora fechou…
Como faço para colocar como resolvido?
Bom, primeiro seria legal postar a solução, e depois é só mudar o título colocando [RESOLVIDO] na frente.
Aí pessoal segue a solução.
public boolean enviarArray(int novapf, ArrayList<Parentesco> arr) {
try {
for (int x = 0; x < arr.size(); x++) {
Parentesco parentesco = (Parentesco) arr.get(x);
Connection c = ConnectionHelper.getConnection();
String sqlinsert = "insert into parentesco "
+ "(pf_cd_pessoafisica, cd_sequencial, nm_parente, cd_relacionamento, sn_coabita) "
+ "values (?, (select nvl(max(cd_sequencial), 0)+1 from parentesco where pf_cd_pessoafisica = ?), ?, ?, ?)";
PreparedStatement pstmt = c.prepareStatement(sqlinsert);
pstmt.setInt(1, novapf);
pstmt.setInt(2, novapf);
pstmt.setString(3, parentesco.getnm_parente());
pstmt.setInt(4, parentesco.getcd_relacionamento());
pstmt.setString(5, parentesco.getsn_coabita());
pstmt.executeUpdate();
pstmt.close();
ConnectionHelper.close(c);
//System.out.println(novapf);
}
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}