Alguém ja fez ws em delphi xe3 para android ? [RESOLVIDO]

Pessoal fiz o WS no XE3 para usar com o android, mais vi um pequeno problema, no caso no Insert.

Uso o banco de dados firebird e utilizei os componentes IBDataBase, IBTransaction, DataSetProvider e ClientDataSet.

E no meu insert fiz assim

function TServerMethods1.InsertDados_Vendas(Data_Hora, Maquina, Ted, Concluido, Programa, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, Codigo_Vinculado, Nome_Cliente, Nome_Profissional, Servico_Produto, Nome_sv_pd, Preco, Aceita_Desconto, Aceita_Ajuste, Nome_Terminal, Dia_Semana, Obs_Cancelamento: string; out Erro: string): Boolean; begin Result := False; with CDS_Tabelas do begin try Close; CommandText := Format(' INSERT INTO TERMINAIS_REGISTROS '+ ' (DATA_HORA, '+ ' MAQUINA, '+ ' TED, '+ ' CONCLUIDO, '+ ' PROGRAMA, '+ ' F1, '+ ' F2, '+ ' F3, '+ ' F4, '+ ' F5, '+ ' F6, '+ ' F7, '+ ' F8, '+ ' F9, '+ ' F10, '+ ' CODIGO_VINCULADO, '+ ' NOME_CLIENTE, '+ ' NOME_PROFISSIONAL, '+ ' SERVICO_PRODUTO, '+ ' NOME_SV_PD, '+ ' PRECO, '+ ' ACEITA_DESCONTO, '+ ' ACEITA_AJUSTE, '+ ' NOME_TERMINAL, '+ ' DIA_SEMANA, '+ ' OBS_CANCELAMENTO) '+ ' Values (''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'', '+ ' ''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'', '+ ' ''%s'',''%s'',''%s'',''%s'',''%s'',''%s'',''%s'')', [Data_Hora,Maquina,Ted,Concluido,Programa,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,Codigo_Vinculado,Nome_Cliente,Nome_Profissional,Servico_Produto,Nome_sv_pd,Preco,Aceita_Desconto, Aceita_Ajuste,Nome_Terminal,Dia_Semana,Obs_Cancelamento]); Execute; Close; Result := True; except on E: Exception do Erro := E.Message; end; end; end;

Quando mando executar exte comando la no android grava numa boa, só que na segunda vez que executo ai não grava, tenho que fechar a tela do android e abrir de novo para incluir um novo cadastro neste insert, ai sim grava.

Como não conheço bem esta tecnologia DataSnap do delphi XE3, não sei se é aqui o problema, ou se é la no app android.

No android estou fazendo assim o método para gravar

[code]// ******************Insert vendas **************************
@SuppressLint(“SimpleDateFormat”)
protected void gravarDadosTerminal() {
DSRESTConnection conn = gc.getConnection();
TServerMethods1 sm = new TServerMethods1(conn);
try {
String tipoServico = “”;
String codigoItemS_P = “”;
String totalDesconto = “0”;
String totalAjuste = “0”;
String codAssistente = “0”;
String preco = “0”;
String precodesconto = “0”;
String valorUnitario;
InsertDados_VendasReturns ret;
String CodigoF4, CodigoF9, CodigoF10;
// ret = sm.InsertCountry(editCountry.getText().toString(),
// editCurrency.getText().toString(), “”);
SimpleDateFormat df = new SimpleDateFormat(“dd.MM.yyyy HH:mm”);
Date data = Calendar.getInstance().getTime();
String dataHora = df.format(data);
String idCharCodCli = edtCliente.getText().toString().trim();
String[] idNumCli = idCharCodCli.split("-");
String idCharCodPro = edtProfissional.getText().toString().trim();
String[] idNumPro = idCharCodPro.split("-");

		String idCharCodItem = edtItem.getText().toString().trim();
		String[] idNumItem = idCharCodItem.split("-");

		// QUANDO FOR PACOTE ENTÃO PEGA O CODIGO DO PACOTE
		if (tipoVendas == 3) {
			CodigoF4 = codigoPacote.trim();
			CodigoF9 = codigoCompra.trim();
			CodigoF10 = codigoSessao.trim();
		} else {
			CodigoF4 = idNumItem[0].trim();
			CodigoF9 = "0";
			CodigoF10 = "0";
		}

		String idCharCodAss = edtAssistente.getText().toString().trim();
		String[] idNumAss = idCharCodAss.split("-");

		preco = tvValorUnitario.getText().toString().trim();
		preco = preco.replace("R$", "");
		preco = preco.replace(",", "|");
		preco = preco.replace(".", "");
		preco = preco.replace("|", ".");

		precodesconto = tvValorUniDesconto.getText().toString().trim();
		precodesconto = precodesconto.replace("R$", "");
		precodesconto = precodesconto.replace(",", "|");
		precodesconto = precodesconto.replace(".", "");
		precodesconto = precodesconto.replace("|", ".");

		if (precodesconto.trim().equals("0.00")) {
			valorUnitario = preco;
		} else {
			valorUnitario = precodesconto;
		}

		if (tipoVendas == 1) {
			tipoServico = "Produto";
			codigoItemS_P = "2";
		} else if (tipoVendas == 2) {
			tipoServico = "Serviço";
			codigoItemS_P = "1";
		} else if (tipoVendas == 3) {
			tipoServico = "Pacote_Credito";
			codigoItemS_P = "0";
		}

		if (edtDesconto.getText().toString().trim().equals("")) {
			totalDesconto = "0";
		} else {
			if (retiraChar == 1) {
				// porcentagem
				String idCharPorcentagem = edtDesconto.getText().toString()
						.trim();
				String[] idNumPorcentagem = idCharPorcentagem.split(" ");
				totalDesconto = idNumPorcentagem[0].trim();
			} else if (retiraChar == 2) {
				// porcentagem
				String idCharReal = edtDesconto.getText().toString().trim();
				String[] idNumReal = idCharReal.split(" ");
				totalDesconto = idNumReal[1].trim();
			}
		}

		if (edtAjuste.getText().toString().trim().equals("")) {
			totalAjuste = "0";
		} else {
			if (retiraChar == 1) {
				// porcentagem
				String idCharAPorcentagem = edtAjuste.getText().toString()
						.trim();
				String[] idNumAPorcentagem = idCharAPorcentagem.split(" ");
				totalAjuste = idNumAPorcentagem[0].trim();
			} else if (retiraChar == 2) {
				// porcentagem
				String idCharAReal = edtAjuste.getText().toString().trim();
				String[] idNumAReal = idCharAReal.split(" ");
				totalAjuste = idNumAReal[1].trim();
			}
		}

		if (edtAssistente.getText().toString().trim().equals("")) {
			codAssistente = "0";
		} else {
			codAssistente = idNumAss[0];
		}
		ret = sm.InsertDados_Vendas(dataHora, "Android",
				"0",
				"1",
				"1",
				idNumCli[0].trim(), // F1
				idNumPro[0].trim(), // F2
				codigoItemS_P.trim(), // F3
				CodigoF4.trim(), // F4 QUANDO É PACOTE INCLUI O CODIGO DO
									// PACOTE
				edtQuantidade.getText().toString().trim(), // F5
				totalDesconto.trim(), // F6
				totalAjuste.toString().trim(), // F7
				codAssistente.toString().trim(), // F8
				CodigoF9, // F9 QUANDO PACOTE É O CODIGO DA COMPRA DO
							// TERMINAL
				CodigoF10, // F10 QUANDO PACOTE É O CODIGO DA SESSÃO
				"0", // CODIGO_VINCULADO
				idNumCli[1].trim(), // NOME_CLIENTE
				idNumPro[1].trim(), // NOME_PROFISSIONAL
				tipoServico.trim(), // Tipo 1 produto, 2 serviço
				idNumItem[1].trim(), // NOME_ITEM
				valorUnitario.trim(), // Preco
				aceitaAjuste.trim(), aceitaDesconto.trim(),
				"AZComanda".trim(), // terminal
				"0", // dia semana
				""); // OBS.
		if (!ret.returnValue) {
			System.out.println(ret.Erro);
		} else {
			// Toast.makeText(VendaClienteActivity.this, "Passou aqui",
			// Toast.LENGTH_LONG).show();
			if (tipoVendas == 1) {
				String IdEstoque = ge.novoIDEstoque();
				AtualizaEstoque at = new AtualizaEstoque();
				at.atualizaEstoque(idNumItem[0].trim(), IdEstoque,
						idNumPro[1].trim(), "Venda pelo Terminal", "-",
						"5", "Lançado pelo AZ Comanda - Android",
						edtQuantidade.getText().toString().trim());
			} else if (tipoVendas == 3) {
				atualizaCreditosCliente();
			}
		}

	} catch (DBXException e) {
		e.printStackTrace();
	}
	// Hide keyboard
	InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
	imm.hideSoftInputFromWindow(edtCliente.getWindowToken(), 0);
}[/code]

No logcat do eclipse capturei o cath do codigo ai de cima
[color=red]01-31 18:20:52.759: I/System.out(4849): violation of PRIMARY or UNIQUE KEY constraint “PK_TERMINAIS_REGISTROS” on table “TERMINAIS_REGISTROS”[/color]

Sei que não consegui inserir o proximo porque deu erro na PK da tabela
TERMINAIS_REGISTROS, por isso não esta inserindo o proximo, mais se eu fecho a tela do app android e abro de novo ai funciona, é como se fosse um refresh.

No delphi sempre que usava o CDS no final dava um ApplyUpdates(0) que resolvia depois um Refresh();, mais não sei como fazer agora, tudo é novidade pra mim.

Peço a ajuda dos caros colegas que ja trabalham com esta tecnologia.

Obrigado.

Cara,

Acho que você tem dois problemas ai. O primeiro é esse erro de banco de dados do WS, verifica se não deixou nada para traz ou se não esta passando algum dado inválido. Algum dado nulo ou um valor de um Join que não tem referencia na outra tabela etc

O outro problema é do seu app Android, você não esta fechando suas conexões. Nunca trabalhei com essa classe “DSRESTConnection”, mas você abre ela e não a fecha.

Se é a primeira vez que trabalha com isso, começa fazendo um fluxo simples, como enviar uma string e receber um retorno. Depois implemente sua funcionalidade real. Isso facilitou muito quando comecei com WebServices

Só uma dica:

Faça uma classe para tratamento disso:

    precodesconto = tvValorUniDesconto.getText().toString().trim();  
    precodesconto = precodesconto.replace("R$", "");  
    precodesconto = precodesconto.replace(",", "|");  
    precodesconto = precodesconto.replace(".", "");  
    precodesconto = precodesconto.replace("|", "."); 

Não fique tratando isso no código da regra de negocio, fica muita coisa no código e dificulta muito para a compreensão.

[quote=HenriqueBR]Cara,

Acho que você tem dois problemas ai. O primeiro é esse erro de banco de dados do WS, verifica se não deixou nada para traz ou se não esta passando algum dado inválido. Algum dado nulo ou um valor de um Join que não tem referencia na outra tabela etc

O outro problema é do seu app Android, você não esta fechando suas conexões. Nunca trabalhei com essa classe “DSRESTConnection”, mas você abre ela e não a fecha.

Se é a primeira vez que trabalha com isso, começa fazendo um fluxo simples, como enviar uma string e receber um retorno. Depois implemente sua funcionalidade real. Isso facilitou muito quando comecei com WebServices[/quote]

Obrigado por respoder.

Então, eu segui este tutorial aqui, je verifiquei e não tenho nada que impeça a gravação.

Mais aqui

Pode ser que tenha sentido.

[quote=HenriqueBR]Só uma dica:

Faça uma classe para tratamento disso:

    precodesconto = tvValorUniDesconto.getText().toString().trim();  
    precodesconto = precodesconto.replace("R$", "");  
    precodesconto = precodesconto.replace(",", "|");  
    precodesconto = precodesconto.replace(".", "");  
    precodesconto = precodesconto.replace("|", "."); 

Não fique tratando isso no código da regra de negocio, fica muita coisa no código e dificulta muito para a compreensão.[/quote]Verdade, ja arrumei coloquei numa classe agora. Obrigado pela dica.

[quote=HenriqueBR]Cara,

Acho que você tem dois problemas ai. O primeiro é esse erro de banco de dados do WS, verifica se não deixou nada para traz ou se não esta passando algum dado inválido. Algum dado nulo ou um valor de um Join que não tem referencia na outra tabela etc[/quote]Bom dia Henrique, então hoje com mais calma e mais descansado achei o problema, e estava relacionado aqui no que vc falou mesmo

Na minha tabela o PK é um campo DATA_HORA (Timestamp), e estava gravando assim

//formata data SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm"); Date data = Calendar.getInstance().getTime(); String dataHora = df.format(data); //

Claro que seu eu for analisar é óbvio que não vou conseguir gravar outro dado porque esqueci de colocar o SS dos segundos. Vacilo meu

Ja arrumei aqui

//formata data SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); Date data = Calendar.getInstance().getTime(); String dataHora = df.format(data); //

Obrigado