Fórum Erro Parametro[Não consigo achar a solução] #511864
24/02/2015
0
Estou usando:
Banco de Dados: Firebird
Conexão: Adoconnection
Objeto: TADODataSet -------> Name: QueryCadClientes
Objeto: TADOCommand ----> Name: CmdCadClientes
Erro: o aplicativo esta usando um valor incorreto para a operação atual
Abaixo meu código:
Código botão incluir
procedure TFrmCadClientes.BtnIncluirClick(Sender: TObject);
begin
HabilitarEdit;
HabilitarMascara;
HabilitarMemo;
EdtNumeroAtivoInativo.SetFocus;
MskDataCadastro.Text := DateToStr(Date);
BtnIncluir.Enabled := false;
BtnGravar.Enabled := true;
BtnCancelar.Enabled := true;
BtnPesquisar.Enabled := false;
BtnSair.Enabled := false;
QueryCadClientes.Close;
QueryCadClientes.CommandText := 'SELECT MAX(CODIGO)+1 AS COD FROM CADCLIENTES';
QueryCadClientes.Open;
QueryCadClientes.Insert;
EdtCodigo.Text := IntToStr(QueryCadClientes.FieldByName('COD').AsInteger + 1);
end;
Código Botão Gravar
procedure TFrmCadClientes.BtnGravarClick(Sender: TObject);
begin
if EdtNomeRazao.Text='' then
begin
Mess(FrmCadClientes.Handle,'Dados em Branco!Preencha os Dados Corretamente!!!', mb_iconinformation or mb_ok);
EdtNomeRazao.SetFocus;
exit;
end;
TRY
FrmPrincipal.ConexaoBd.BeginTrans;
if f_operacao='I' then
begin
QueryCadClientes.Close;
CmdCadClientes.CommandText:='INSERT into CADCLIENTES (SITUACAO,DATACADASTRO,DATAULTIMAALTERACAO,NOMERAZAO, ';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+'ENDERECO,NUMERO,BAIRRO,CODIGOCIDADE,NOMECIDADE,ESTADO,CEP,COMPLEMENTO,';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+'RGIE,CODIGOCPFCNPJ,NUMEROCPFCNPJ,DATANASCIMENTO,TELEFONE1,TELEFONE2,TELEFONE3,CELULAR,EMAIL,CONTATO,LIMITE,OBSERVACOES) ';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+'values (:PSITUACAO,:PDATACADASTRO,:PDATAULTIMAALTERACAO,:PNOMERAZAO,:PAPELIDOFANTASIA,:PENDERECO,:PNUMERO,:PBAIRRO,:PCODIGOCIDADE,:PNOMECIDADE,:PESTADO,:PCEP,:PCOMPLEMENTO,';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+':PRGIE,:PCODIGOCPFCNPJ,:PNUMEROCPFCNPJ,:PDATANASCIMENTO,:PTELEFONE1,:PTELEFONE2,:PTELEFONE3,:PCELULAR,:PEMAIL,:PCONTATO,:PLIMITE,:POBSERVACOES )';
QueryCadClientes.Open;
end
else
begin
QueryCadClientes.Close;
CmdCadClientes.CommandText:='UPDATE CADCLIENTES SET ';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+'CODIGO=:PCODIGO,SITUACAO=:PSITUACAO,DATACADASTRO=:PDATACADASTRO,DATAULTIMAALTERACAO=:PDATAULTIMAALTERACAO,NOMERAZAO=:PNOMERAZAO,APELIDOFANTASIA=:PAPELIDOFANTASIA,ENDERECO=:PENDERECO,NUMERO=:PNUMERO,BAIRRO=:PBAIRRO,';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+'CODIGOCIDADE=:PCODIGOCIDADE,NOMECIDADE=:PNOMECIDADE,ESTADO=:PESTADO,CEP=:PCEP,COMPLEMENTO=:PCOMPLEMENTO,RGIE=:PRGIE,CODIGOCPFCNPJ=:PCODIGOCPFCNPJ,NUMEROCPFCNPJ=:PNUMEROCPFCNPJ,';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+'DATANASCIMENTO=:PDATANASCIMENTO,TELEFONE1=:PTELEFONE1,TELEFONE2=:PTELEFONE2,TELEFONE3=:PTELEFONE3,CELULAR=:PCELULAR,EMAIL=:PEMAIL,CONTATO=:PCONTATO,LIMITE=:PLIMITE,OBSERVACOES=:POBSERVACOES ';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+'Where CODIGO=:PCODIGO';
QueryCadClientes.Open;
end;
with CmdCadClientes.Parameters do
begin
if f_operacao<>'I' then
ParamByName('PCODIGO').Value := EdtCodigo.Text;
ParamByName('PSITUACAO').Value := EdtNumeroAtivoInativo.Text;
ParamByName('PDATACADASTRO').Value := MskDataCadastro.Text;
ParamByName('PDATAULTIMAALTERACAO').Value := MskUltimaAlteracao.Text;
ParamByName('PNOMERAZAO').Value:=EdtNomeRazao.Text;
ParamByName('PAPELIDOFANTASIA').Value := EdtApelidoFantasia.Text;
ParamByName('PENDERECO').Value := EdtEndereco.Text;
ParamByName('PNUMERO').Value := EdtNumero.Text;
ParamByName('PBAIRRO').Value := EdtBairro.Text;
ParamByName('PCODIGOCIDADE').Value := EdtCidade.Text;
ParamByName('PNOMECIDADE').Value := EdtNomeCidade.Text;
ParamByName('PESTADO').Value := EdtEstado.Text;
ParamByName('PCEP').Value := MskCep.Text;
ParamByName('PCOMPLEMENTO').Value := EdtComplemento.Text;
ParamByName('PRGIE').Value := EdtRgIe.Text;
ParamByName('PCODIGOCPFCNPJ').Value := EdtNumeroCpfCnpj.Text;
ParamByName('PNUMEROCPFCNPJ').Value := MskCpfCnpj.Text;
ParamByName('PDATANASCIMENTO').Value := MskDataNascimento.Text;
ParamByName('PTELEFONE1').Value := MskTelefone1.Text;
ParamByName('PTELEFONE2').Value := MskTelefone2.Text;
ParamByName('PTELEFONE3').Value := MskTelefone3.Text;
ParamByName('PCELULAR').Value := MskCelular.Text;
ParamByName('PEMAIL').Value := EdtEmail.Text;
ParamByName('PCONTATO').Value := EdtContato.Text;
ParamByName('PLIMITE').Value:=StrToFloat(Converte2(EdtLimiteCredito.Text));
ParamByName('POBSERVACOES').Value := MemoObservacoes.Text;
CmdCadClientes.Prepared:=True;
CmdCadClientes.Execute;
CmdCadClientes.Prepared:=False;
end;
FrmPrincipal.ConexaoBd.CommitTrans;
LimpaCampos;
DesabilitarEdit;
DesabilitarMascara;
DesabilitarMemo;
EXCEPT
FrmPrincipal.ConexaoBd.RollbackTrans;
Mess(FrmCadClientes.Handle,'Falha na Gravação...',mb_iconinformation or mb_ok);
END;
BtnPesquisar.Enabled := true;
BtnIncluir.Enabled := true;
BtnSair.Enabled := true;
BtnAlterar.Enabled:=false;
BtnGravar.Enabled:=false;
BtnCancelar.Enabled:=false;
end;
Bruno Henrique
Curtir tópico
+ 0Posts
24/02/2015
Bruno Henrique
Gostei + 0
15/06/2015
Felipe Tomm
Conseguiu alguma solução?
Gostei + 0
15/06/2015
Ricardo Araujo
Gostei + 0
15/06/2015
Felipe Tomm
Eis o erro que retorna: O aplicativo está utilizando um valor incorreto para a operação atual.
Já realizei alguns debugs, mas não consegui encontrar o momento do erro.
Para deixar mais a par da aplicação, ela realiza a importação dos XML das NFe. Esse erro acontece somente com alguns xml, e quando acontece, o simples fato de fechar a aplicação e mandar importar o xml, funciona normalmente.
Portanto, esse erro é temporário. Não consegui identificar um padrão para ele.
Alguma sugestão? Obrigado..
Gostei + 0
16/06/2015
Renato Rubinho
Por segurança, tente atribuir o tipo de dado no campo e passar no formato esperado pelo banco.
// inteiro
ParamByName('PCODIGO').AsInteger := StrToInt(EdtCodigo.Text);
// Data - mais provavel de o problema estar aqui
ParamByName('PDATACADASTRO').AsDateTime := StrToDateTime(MskDataCadastro.Text + ' 00:00:00');
Gostei + 0
16/06/2015
Felipe Tomm
Rubinho, voce tem alguma ideia do meu problema?
Agora pela tarde verifiquei todas minhas variáveis com os campos das tabelas, não teria nenhum problema em relação ao tipo de dados.
Tenho duas coisas que acredito ser:
->Algum problema de cache ou buffer em que a aplicação se perde;
->Erro lógico. Apesar de já ter verificado, vou verificar mais a fundo em busca de algum erro.
Como sou um tanto leigo ainda em delphi, tenho uma dúvida quanto a utilização das query. Em vários posts vejo alguns dizendo que dependendo do teu select, o correto é usar open, em outros casos ExecSQL. Enfim, qual a sequencia mais indicada para insert? Close -> Prepared:= true -> ExecSQL.
Obrigado..
Gostei + 0
17/06/2015
Renato Rubinho
Nunca usei ADOCommand, mas não vejo porque usar o QueryCadClientes junto.
Dá uma olhada nesse Link que tem um exemplo
Teoricamente é algo pareceido com o abaixo para funcionar.
if f_operacao='I' then
begin
// tira QueryCadClientes.Close;
//adiciona essas 2 linhas
CmdCadClientes.Close;
CmdCadClientes.Parameters.Clear;
CmdCadClientes.CommandText:='INSERT into CADCLIENTES (SITUACAO,DATACADASTRO,DATAULTIMAALTERACAO,NOMERAZAO, ';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+'ENDERECO,NUMERO,BAIRRO,CODIGOCIDADE,NOMECIDADE,ESTADO,CEP,COMPLEMENTO,';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+'RGIE,CODIGOCPFCNPJ,NUMEROCPFCNPJ,DATANASCIMENTO,TELEFONE1,TELEFONE2,TELEFONE3,CELULAR,EMAIL,CONTATO,LIMITE,OBSERVACOES) ';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+'values (:PSITUACAO,:PDATACADASTRO,:PDATAULTIMAALTERACAO,:PNOMERAZAO,:PAPELIDOFANTASIA,:PENDERECO,:PNUMERO,:PBAIRRO,:PCODIGOCIDADE,:PNOMECIDADE,:PESTADO,:PCEP,:PCOMPLEMENTO,';
CmdCadClientes.CommandText:=CmdCadClientes.CommandText+':PRGIE,:PCODIGOCPFCNPJ,:PNUMEROCPFCNPJ,:PDATANASCIMENTO,:PTELEFONE1,:PTELEFONE2,:PTELEFONE3,:PCELULAR,:PEMAIL,:PCONTATO,:PLIMITE,:POBSERVACOES )';
// adiciona essa linha
CmdCadClientes.ParamCheck:=False;
// tira essa linha QueryCadClientes.Open;
end
Gostei + 0
17/06/2015
Ricardo Araujo
Depois que você fecha aplicação e entrar novamente o ponteiro que estava na memoria foi limpa.
Gostei + 0
18/06/2015
Felipe Tomm
Correto! Estou verificando toda a aplicação e ajustando algumas partes do código.
Até quanto a questao da memória, encontrei uma procedure bem bacana, que limpa a memória utilizada pela aplicação a hora que voce chamar ela.
Caso alguem ache interessante, segue abaixo:
procedure Tfrm_danfe.TrimAppMemorySize;
var
MainHandle : THandle;
begin
try
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID) ;
SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF) ;
CloseHandle(MainHandle) ;
except
end;
Application.ProcessMessages;
end;
De momento, muito obrigado pelo teu retorno. Estarei postando em breve algum resultado.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)