valneireis Novato

Registrado: Quarta-Feira, 23 de Setembro de 2009 Mensagens: 4
|
Enviada: Qui Jan 08, 2015 5:56 pm Assunto: Erro ao gravar dados usando Stored Procedure |
|
|
Boa noite pessoal.
Estou com um pequeno problema e não estou conseguindo resolver.
É um modulo de cadastro de clients, BD em Firebird 2.5 com Firedac e XE7.
O problema está ao tentar gravar um valor do campo Limite, usando toda esta parafernalha, estou usando MaskEdit, mas estou aceitando sugestões de outros components para armazenar valores e poder gravá-los na Tabela de Clientes
Vamos a estrutura da Tabela Clientes
CREATE TABLE CLIENTES (
CODCLIENTE INTEGER NOT NULL,
NOME VARCHAR(50),
ENDERECO VARCHAR(35),
BAIRRO VARCHAR(25),
COMPLEMENTO VARCHAR(25),
CIDADE VARCHAR(20),
ESTADO VARCHAR(2),
CEP VARCHAR(10),
RG VARCHAR(1 ,
CPF VARCHAR(1 ,
EMAIL VARCHAR(60),
TELEF1 VARCHAR(14),
TELEF2 VARCHAR(14),
CELULAR VARCHAR(1 ,
CONTATO VARCHAR(25),
OBSERVACAO VARCHAR(40),
PAI VARCHAR(40),
MAE VARCHAR(40),
DTNASCIMENTO DATE,
DTINCLUSAO DATE,
SITUACAO VARCHAR(1),
REFPESSOAL VARCHAR(40),
TELREFPESSOAL VARCHAR(14),
REFCOMERCIAL VARCHAR(45),
LIMITE LIMITE /* LIMITE = NUMERIC(14,2) */
);
Como podemos ver o ultimo campo é a razão de dar tanto erro no meu projeto. Este campo Limite está definido como Numeric(14,2)
Agora vamos a stored procedure, que é bem simples: Ele recebe o valor sequencia, verifica se existe, caso exista, vai para a update, caso contrário, vai para o insert, simples;
Código do Stored Procedure
begin
/* Verifica se existe */
select
Clientes.CodCliente
from
Clientes
where
Clientes.CodCliente = :sequencia
into
:valor;
if (valor is null) then
begin
Insert into Clientes (
Clientes.CodCliente,
Clientes.Nome,
Clientes.Endereco,
Clientes.Bairro,
Clientes.Complemento,
Clientes.Cidade,
Clientes.Estado,
Clientes.Cep,
Clientes.rg,
Clientes.cpf,
Clientes.email,
Clientes.telef1,
Clientes.telef2,
Clientes.celular,
Clientes.Contato,
Clientes.observacao,
Clientes.Pai,
Clientes.Mae,
Clientes.DtNascimento,
Clientes.DtInclusao,
Clientes.Limite,
Clientes.Situacao,
Clientes.RefPessoal,
Clientes.TelRefPessoaL,
Clientes.refcomercial)
Values (
:nCodCliente,
:cNome,
:cEndereco,
:cBairro,
:cComplemento,
:cCidade,
:cEstado,
:cCep,
:cRg,
:cCpf,
:cEmail,
:cTelef1,
:cTelef2,
:cCelular,
:cContato,
:cObservacao,
:cPai,
:cMae,
:dDtNascimento,
:dDtInclusao,
:nLimite,
:cSituacao,
:cRefPessoal,
:cTelRefPessoal,
:cRefComercial
);
end
else
begin
update Clientes set
Clientes.nome = :cNome,
Clientes.Endereco = :cEndereco,
Clientes.bairro = :cBairro,
Clientes.complemento = :cComplemento,
Clientes.cidade = :cCidade,
Clientes.Estado = :cEstado,
Clientes.Cep = :cCep,
Clientes.Rg = :cRg,
Clientes.cpf = :cCpf,
Clientes.email = :cEmail,
Clientes.Telef1 = :cTelef1,
Clientes.Telef2 = :cTelef2,
Clientes.celular = :cCelular,
Clientes.Contato = :cContato,
Clientes.Observacao = :cObservacao,
Clientes.Pai = :cPai,
Clientes.Mae = :cMae,
Clientes.dtnascimento = :dDtNascimento,
Clientes.dtinclusao = :dDtInclusao,
Clientes.limite = :nLimite,
Clientes.Situacao = :cSituacao,
Clientes.RefPessoal = :cRefPessoal,
Clientes.telrefpessoal = :cTelRefPessoal,
Clientes.RefComercial = :cRefComercial
where
Clientes.CodCliente = :sequencia;
end
suspend;
end
Na definição da variavel nLimite da stored procedure também está definida NLIMITE NUMERIC 14 2,
Até ai, aparentemente tudo ok, correto, nãooooo!!!! o problema é que ao gravar este campo ocorre erro. Não sei que erro é este pq, ainda não dominei o sistema de depuração de erros, sei que é dificil, mas consegui isolar o campo que estava dando erro é somente ele.
Código do botão Salvar
// Aqui vai o codigo para salvar os dados
Dm.TsClientes.StartTransaction;
try
Dm.spClientes.Prepare;
Dm.spClientes.Params [0].AsInteger := 7;
Dm.spClientes.Params [1].AsInteger := 7;
Dm.spClientes.Params [2].AsString := TxtNome.Text;
Dm.spClientes.Params [3].AsString := TxtEndereco.Text;
Dm.spClientes.Params [4].AsString := TxtBairro.Text;
Dm.spClientes.Params [5].AsString := TxtComplemento.Text;
Dm.spClientes.Params [6].AsString := TxtCidade.Text;
Dm.spClientes.Params [7].AsString := TxtUf.Text;
Dm.spClientes.Params [8].AsString := TxtCep.Text;
Dm.spClientes.Params [9].AsString := TxtRg.Text;
Dm.spClientes.Params [10].AsString := TxtCpf.Text;
Dm.spClientes.Params [11].AsString := TxtEmail.Text;
Dm.spClientes.Params [12].AsString := TxtTelef1.Text;
Dm.spClientes.Params [13].AsString := TxtTelef2.Text;
Dm.spClientes.Params [14].AsString := TxtCelular.Text;
Dm.spClientes.Params [15].AsString := TxtContato.Text;
Dm.spClientes.Params [16].AsString := TxtObservacao.Text;
Dm.spClientes.Params [17].AsString := TxtPai.Text;
Dm.spClientes.Params [18].AsString := TxtMae.Text;
Dm.spClientes.Params [19].AsDate := StrToDate(TxtDtNascimento.Text);
Dm.spClientes.Params [20].AsDate := now();
Dm.spClientes.Params [21].AsFloat := StrToFloat(LimiteCredito.Text); <====== Aqui é o erro, com certeza.....
Dm.spClientes.Params [22].AsString := 'A';
Dm.spClientes.Params [23].AsString := TxtRefPessoal.Text;
Dm.spClientes.Params [24].AsString := TxtTelRefPessoal.Text;
Dm.spClientes.Params [25].AsString := TxtRefComercial.Text;
// Executa a store procedure
Dm.spClientes.ExecProc();
// Comita as alterações no BD.
Dm.TsClientes.Commit;
ShowMessage('Gravado com sucesso'); <== Mensagem temporária.
except
Dm.TsClientes.Rollback;
ShowMessage('erro'); <==== Mensagem temporária.
end;
Bom galera, é isto, preciso resolver este pequeno probleminha, para dar continuidade ao meu sistema. Detalhe, aceito sugestões de outros components para receber valores, pois o sistema vai ter campo de valor em demasia, mas necessário.
Conto com a colaboração do pessoal para me dar esta força.
Valeu e obrigado
Valnei |
|