[RESOLVIDO]Enviar Array do flex para o java

37 respostas
R

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?

37 Respostas

fmachado.dev

Bom dia,
Você está usando o que para fazer a comunicação entre os dois?

[]'s

R

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.

AUser

dataGrid.dataProvider
Você deve acessar esse atributo do dataGrid pra que consiga a coleção. Posta seu código…

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

fmachado.dev

é 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

R

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.

fmachado.dev

Vamos ver então, você já conseguiu fazer a configuração do services e do AMF?

R

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.

fmachado.dev

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

R
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}"/>
fmachado.dev

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.

R

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.

fmachado.dev

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

R

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?

fmachado.dev

não precisa, pois ele vai enviar um array de “Objects[]”, e lá você vai ter todas as variáveis.

R

Putz, não consegui aplicar suas dicas :(…

fmachado.dev

mas posta o erro, ou o que aconteceu?

se possível eu te ajudo

Abraços

R

Oi bom dia,
então ele não deu erro, simplesmente não executa.

fmachado.dev

me manda o código que você fez.

R

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?

R

Ah, só lembrando que para cada linha enviada tenho que mandar junto o código da pf da tela.

fmachado.dev

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

R

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);

fmachado.dev

ta, mas o método do java chega a ser executado? ou nem vai pro java?

R

ele vai mas nao executa, acho q meu insert pelo java nao está certo, nao achas?

fmachado.dev

no método salva() você está enviando um objeto parentesco e não um array, dá uma olhada nisso.

R

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?

fmachado.dev

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.

R

Beleza mas onde passo o código da pf no java?

fmachado.dev

você tem que fazer isso no Flex, no seu método “montaObjeto()”

R

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

fmachado.dev

tenta colocar, no lugar de Object[] array,ArrayCollection array

R

tbm nao deu.

fmachado.dev

Tá, mas que erro que aconteceu?

R

Oi agora fechou…
Como faço para colocar como resolvido?

fmachado.dev

Bom, primeiro seria legal postar a solução, e depois é só mudar o título colocando [RESOLVIDO] na frente.

R

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;
		}
Criado 18 de julho de 2011
Ultima resposta 20 de jul. de 2011
Respostas 37
Participantes 3