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.