Erro Parametro[Não consigo achar a solução]

Delphi

Firebird

24/02/2015

Não consigo achar o erro, pressiono run e compila sem erro, quando clico no botão gravar ele me retorna esse erro.Já tentei de tudo

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

Bruno Henrique

Curtidas 0

Respostas

Bruno Henrique

Bruno Henrique

24/02/2015

Uppp
GOSTEI 0
Felipe Tomm

Felipe Tomm

24/02/2015

Estou passando pelo mesmo problema Bruno, porém, não é toda vez que ocorre.

Conseguiu alguma solução?
GOSTEI 0
Ricardo Araujo

Ricardo Araujo

24/02/2015

Qual banco de dados esta usando, pode post o Erro?
GOSTEI 0
Felipe Tomm

Felipe Tomm

24/02/2015

Boa noite barreto. No meu caso utilizo Oracle, mais precisamente 11g com Delphi 7.
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
Renato Rubinho

Renato Rubinho

24/02/2015

Bom dia,

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
Felipe Tomm

Felipe Tomm

24/02/2015

Boa tarde.

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
Renato Rubinho

Renato Rubinho

24/02/2015

Boa tarde,

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
Ricardo Araujo

Ricardo Araujo

24/02/2015

Acho que pode ser quando você realizar varias importação de XML no período no dia, acho que esta acumula a instancia na memoria do micro e começa a dar erro, tem que verifica que esta criando o Objecto e destruindo depois de fazer a importação.
Depois que você fecha aplicação e entrar novamente o ponteiro que estava na memoria foi limpa.
GOSTEI 0
Felipe Tomm

Felipe Tomm

24/02/2015

Boa tarde Barreto.

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
POSTAR