Erro
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...
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
Curtidas 0
Respostas
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
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
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
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
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
11/11/2009
Olá amigo, consegui achar o erro ? Estamos aguardando para concluirmos o chamado, existe mais alguma duvida ?
Att,
Wesley Y
Att,
Wesley Y
GOSTEI 0