PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Auxilio para Stored Procedure usando Firedac #506342

05/01/2015

0

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(18),
CPF VARCHAR(18),
EMAIL VARCHAR(60),
TELEF1 VARCHAR(14),
TELEF2 VARCHAR(14),
CELULAR VARCHAR(18),
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
Valnei Reis

Valnei Reis

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar