Erro

11/11/2009

Colegas,   Vejam, estou com um problema em um dos sistemas, esse mesmo sistema ja vem funcionando a muito tempo sem nenhum problema... Agora em um único cliente surge um erro ao tentar finalizar a venda, o mais enteressante, só acontece na primeira venda... Então cancela-se a venda, fecha o sistema ao retornar funciona o resto do dia sem problemas... Ja verifiquei tudo ao mei alcance, por isso tÔ pedindo a ajuda de vcs...   Segue anexo a imagem do erro, e abaixo o código de finalização de venda...     procedure TfrmCaixaFinalizaTransacao.acConfirmaTransacaoExecute(
  Sender: TObject);
var
  porta, i, Prazo: integer;
  SolicitaTitulo, SolicitaCheque, SolicitaCliente, SolicitaBoleto: boolean;
  Cheque: TCheque;
  qr: TADOQuery;
  ValorAcrescimo: Currency;
begin
  inherited;
  if Self.Visible and (GridParcela.Floats[ COL_VALOR, GridParcela.RowCount-1 ] > 0) then
  begin
    Application.MessageBox('Valor a pagar ainda não foi zerado', 'Erro', mb_iconerror+mb_ok);
    SetFormaPagamento;
    edForma.SetFocus;
    Exit;
  end;   with GridParcela do
  begin
    for i := 1 to RowCount-2 do
    begin
      SolicitaCheque := False;
      SolicitaCliente := False;       qr := TADOQuery.Create(Self);
      try
        //Verifica se a forma de pagamento exige Titulo, Cheque e cliente
        qr.Connection := dmCaixa.ADOConnection;
        qr.SQL.Add('select fpa_solicita_cheque, fpa_solicita_boleto, fpa_gera_titulo_receber from tb_forma_pagamento_caixa');
        qr.SQL.Add('where fpa_codigo = '+IntToStr(Integer(Objects[COL_FORMA_PAGAMENTO, i])));
        qr.Open;         SolicitaCheque := qr.FieldByName('fpa_solicita_cheque').AsBoolean;
        SolicitaBoleto := qr.FieldByName('fpa_solicita_boleto').AsBoolean;         SolicitaCliente := (SolicitaCheque or SolicitaBoleto or qr.FieldByName('fpa_gera_titulo_receber').AsBoolean);
      finally
        qr.Free;
      end;         //Verifica se a forma de pagamento exige cliente
      if (SolicitaCliente) and (CodCliente = 0) then
      begin
        //Verifica se o cliente existe
        if Cpf = '' then
        begin           //Abre o cadastro do cliente
          Application.CreateForm( TfrmCadCliente, frmCadCliente);
          try
            frmCadCliente.ShowModal;
            CPF := dmCaixa.tbCliente.fieldByName('cli_cnpj_cpf').AsString;
            CodCliente := dmCaixa.tbCliente.fieldByName('cli_codigo').AsInteger;
          finally
            FreeAndNil( frmCadCliente );
          end;
        end;
      end;       //Verifica se a forma de pagamento exige cheque
      if SolicitaCheque then
      begin
        //Lança o cheque
        Application.CreateForm( TfrmCapturaCheque, frmCapturaCheque);
        try
          frmCapturaCheque.Valor := Floats[COL_VALOR, i];
          frmCapturaCheque.Vencimento := Date+AbreSQL('select fpa_prazo_pagamento from tb_forma_pagamento_caixa '+
                                                      'where fpa_codigo = '+IntToStr(Integer(Objects[COL_FORMA_PAGAMENTO, i])),
                                                       dmCaixa.ADOConnection );
          if frmCapturaCheque.ShowModal = mrOk then
          begin
            Cheque := TCheque.Create;
            Cheque.Banco := frmCapturaCheque.Banco;
            Cheque.Agencia := frmCapturaCheque.Agencia;
            Cheque.Conta := frmCapturaCheque.Conta;
            Cheque.Numero := frmCapturaCheque.Numero;
            Cheque.Valor := frmCapturaCheque.Valor;
            Cheque.DataEmissao := Date;
            Cheque.DataDeposito := frmCapturaCheque.Vencimento;
            Cheque.CodCliente := CodCliente;             Objects[ COL_CHEQUE, i] := Pointer(Cheque);
          end;
        finally
          FreeAndNil( frmCapturaCheque );
        end;
      end;
    end;
    if SolicitaCliente then
    begin
      Application.CreateForm( TfrmCaixaTitulosVencidos, frmCaixaTitulosVencidos);
      if not frmCaixaTitulosVencidos.Consultar(Cpf) then
        Exit;
    end;     ValorAcrescimo := 0;
    for i := 1 to GridParcela.RowCount-2 do
      if Trim(GridParcela.Cells[ COL_ITEM, i ]) <> '' then
        if Copy(GridParcela.Cells[COL_FORMA_PAGAMENTO, i], 1, Length(DESCRICAO_JUROS)) = DESCRICAO_JUROS then
          ValorAcrescimo := ValorAcrescimo + GridParcela.Floats[COL_VALOR, i];     with dmCaixa.spFinalizaTransacao do
    begin
      Parameters.ParamByName('@usu_codigo').Value := CodUsuario;
      Parameters.ParamByName('@cst_codigo').Value := CodAberturaCaixa;
      Parameters.ParamByName('@cxa_valor_liquido').Value := StrToFloatDef(EliminaSepMilhar(frmCaixa.edTotal.Text),0);
      Parameters.ParamByName('@cxa_valor_desconto').Value := 0;
      Parameters.ParamByName('@cxa_valor_acrescimo').Value := ValorAcrescimo;
     // Parameters.ParamByName('@cli_codigo').Value := CodCliente;
       if CodCliente = 0 then
        Parameters.ParamByName('@cli_codigo').Value := Null
      else
        Parameters.ParamByName('@cli_codigo').Value := CodCliente;       if FModoDevolucao then
        Parameters.ParamByName('@ttr_codigo').Value := 4
      else
        Parameters.ParamByName('@ttr_codigo').Value := 1;       Parameters.ParamByName('@cxa_codigo').Value := 0;       if CodVendedor = -1 then
        Parameters.ParamByName('@rep_codigo').Value := Null
      else
        Parameters.ParamByName('@rep_codigo').Value := CodVendedor;       Parameters.ParamByName('@cxa_orcamento').Value := Orcamento;       Parameters.ParamByName('@xml_caixa_item').Value := ItemXML;
      Parameters.ParamByName('@xml_caixa_forma_pagamento').Value := ParcelaXML;
      Parameters.ParamByName('@xml_cheques').Value := ChequeXML;       Screen.Cursor := crHourGlass;
      try
        ExecProc;
      finally
        Screen.Cursor := crDefault;
      end;       CodTransacao := Parameters.ParamByName('@cxa_codigo').Value;
    end;     if (Self.Visible) and (Impressora.CupomAberto) then
    begin
      Impressora.IniciarFechamentoCupom;
      for i := 1 to RowCount-2 do
        Impressora.IncluirFormaPagamento( Copy(Cells[ COL_FORMA_PAGAMENTO, i ],7,30),
                                          Floats[ COL_VALOR, i ]);         if TipoTransacao = ttVendaVista then
        TImpressoraMatricial(Impressora).InformaVendedor(frmCaixa.cbVendedor.Text);       if TipoTransacao = ttVendaPrazo  then
        TImpressoraMatricial(Impressora).InformaVendedor(frmCaixa.cbVendedor.Text);       if (Impressora is TImpressoraNaoFiscal) and (Cpf <> '') then
      begin
        Impressora.FinalizarCupom('CLIENTE: '+
                                  dmCaixa.tbCliente.fieldByName('cli_razao_social').AsString);
      end
      else
        Impressora.FinalizarCupom('');
    end;
  end;   ModalResult := mrOk;
end;
      Se possível dar uma verificada pra mim...   Um abraço Aguardo retorno...
Irenildo Carvalho

Irenildo Carvalho

Curtidas 0

Respostas

Wesley Yamazack

Wesley Yamazack

11/11/2009

Olá amigo, olha estou vendo teu código e não tem nenhum erro. Só te digo que o Access Violation não tem outra possiblidade de acontecer a não ser :
1 - Acessando um objeto que não esta criado
2 - Acessando um objeto que já foi destruído.

Fora estes dois casas, não existe !

Faça um teste eu tive um problema a muito tempo atras, usando este Skin que você usa, tente deixar sem o Skin, é só uma dica, na época o windows com o Skin estava dando umas travas na aplicação, quem sabe não é o seu caso, acho difífil, mas não custa tentar.

Outra coisa, qual é a linha exata que acontece o erro ? É na hora que você vai executar a procedure ?

Outra dica, seria você destruir todo objeto que você cria, exemplo Criou o Cheque  : TCheque, ao terminar de usar destroi ele, com freeandnil(Cheque), ou qualquer outro objeto que você cria dinamicamente.

Faça estas dicas, e vemos o que pode ser.


Att,

Wesley Y
GOSTEI 0
Irenildo Carvalho

Irenildo Carvalho

11/11/2009

Olha só,     Cheguei a imaginar também que talvés fosse o Skin, então o removi, mas dar na mesma, agor ao que pude constatar é que, o erro acontece, mas a venda é executada da baixa em estoque, gera titulos, só não fecha o cupom...   Vou fazer o que me sugeriu pra ver se reolver...   um abraço   Agradecido...  
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

11/11/2009

Olá amigo,
   Faça passo a passo, depurando, todas as linhas, até achar o erro, você irá encontrar, e estarei aqui para lhe ajudar, veja se derrepente não é a sua procedure no BD, que esta falantando parametros, ou se você ta usando algum componente que não foi criado.
  Forte abraço


Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

11/11/2009

Olá amigo, consegui achar o erro ? Estamos aguardando para concluirmos o chamado, existe mais alguma duvida ?

Att,

Wesley Y
GOSTEI 0
POSTAR