Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Violação de acesso em busca por data


Gabriel Cabral

Pergunta

Bom dia, galera..

Problemão aqui...

Estou fazendo uma busca através de uma data informada...

A busca é feita e os dados são informados num grid

até aí tudo certo....

Mas depois quando percorro o grid e escolho um registro e dou um Enter para os campos deste registro surgirem em um outro formulário, ocorre o seguinte erro de violação de acesso.

Project winsuperm.exe raised exception class EAccess Violation with message 'Access violation at address 004E9ED1 in module 'winsuperm.exe'. Read of address 00000000'

O código está desta maneira...

procedure TfrmLocalControleCaixa.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var auxdata: TDate;
begin

  if (Key = VK_DOWN) Then
  begin
    if txtLocalControleCaixa_Data.Focused = True then
    begin
      GridLocalControleCaixa.SetFocus;
      GridLocalControleCaixa.SelectedIndex := 0;
    end;
  end;

  if (Key = VK_RETURN) then
  begin
    if txtLocalControleCaixa_Data.Focused = True then
    begin
      if (StrToDateDef(txtLocalControleCaixa_Data.Text , 0 ) = 0 ) then
      begin
        Application.MessageBox('Data inválida!!!      ', 'WINSUPERM', MB_ICONERROR);
        txtLocalControleCaixa_Data.SetFocus;
        txtLocalControleCaixa_Data.SelectAll;
      end
      else
      begin
        With QueryLocalControleCaixa Do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT * FROM ESTACAI.dbf');
          SQL.Add('WHERE CAIDAT = :pData');
          SQL.Add('ORDER BY CAIDAT DESC, CAIHOR DESC');
          ParamByName('pData').AsDateTime := StrToDate(txtLocalControleCaixa_Data.Text);
          Open;

          //GridLocalControleCaixa.SetFocus;
          GridLocalControleCaixa.SelectedIndex := 0;
        end;
      end;
    end;

    if GridLocalControleCaixa.Focused = True then
    begin
      With QueryLocalControleCaixa Do
      begin
        Close;
       SQL.Clear;
       SQL.Add('SELECT * FROM ESTACAI.dbf');
       SQL.Add('WHERE CAIDAT = :pData');
       ////////////////////// LINHA QUE O ERRO ACUSA///////////////////////
      ParamByName('pData').AsDateTime := StrToDate(GridLocalControleCaixa.SelectedField.AsString);
      ////////////////////// LINHA QUE O ERRO ACUSA///////////////////////
     Open;

    if not(IsEmpty) then
    begin
      auxdata := dm.QueryControleCaixa.FieldByName('CAIDAT').AsDateTime;
      frmControleCaixa.txtControleCaixa_Data.Text := dm.QueryControleCaixa.FieldByName('CAIDAT').AsString;
      frmControleCaixa.txtControleCaixa_Hist.Text := dm.QueryControleCaixa.FieldByName('CAIHIS').AsString;
      frmControleCaixa.txtControleCaixa_Hora.Text := dm.QueryControleCaixa.FieldByName('CAIHOR').AsString;
      frmControleCaixa.txtControleCaixa_ValorEnt.Text := dm.QueryControleCaixa.FieldByName('CAIENT').AsString;
      frmControleCaixa.txtControleCaixa_ValorSai.Text := dm.QueryControleCaixa.FieldByName('CAISAI').AsString;
      frmControleCaixa.txtControleCaixa_Dinheiro.Text := dm.QueryControleCaixa.FieldByName('CAIDIN').AsString;
      frmControleCaixa.txtControleCaixa_CheVis.Text := dm.QueryControleCaixa.FieldByName('CAICHE').AsString;
      frmControleCaixa.txtControleCaixa_ChePre.Text := dm.QueryControleCaixa.FieldByName('CAIPRE').AsString;
      frmControleCaixa.txtControleCaixa_Cartao.Text := dm.QueryControleCaixa.FieldByName('CAICAR').AsString;
      frmControleCaixa.txtControleCaixa_Ticket.Text := dm.QueryControleCaixa.FieldByName('CAIOUT').AsString;
                frmControleCaixa.txtControleCaixa_EmAberto.Text := dm.QueryControleCaixa.FieldByName('CAIABE').AsString;
    end;
            end;

      txtLocalControleCaixa_Data.SetFocus;
      frmLocalControleCaixa.Close;
      frmControleCaixa.txtAuxData.Text := DateToStr(auxdata);
    end;
  end;
end;

A linha que o erro acusa é a ParamByName('pData').AsDateTime := StrToDate(GridLocalControleCaixa.SelectedField.AsString);

O que está havendo??

alguém conseguiria me ajudar???

Muito obrigado

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0
////////////////////// LINHA QUE O ERRO ACUSA///////////////////////

ParamByName('pData').AsDateTime := StrToDate(GridLocalControleCaixa.SelectedField.AsString);

////////////////////// LINHA QUE O ERRO ACUSA///////////////////////

////////////////////// LINHA QUE O ERRO ACUSA///////////////////////

showmessage(GridLocalControleCaixa.SelectedField.AsString); // Veja qual é o valor passado

ParamByName('pData').AsDateTime := StrToDate(GridLocalControleCaixa.SelectedField.AsString);

////////////////////// LINHA QUE O ERRO ACUSA///////////////////////

OBS: voce está passando data e hora ? ou somente data ?

use um showmessge para saber qual é o valor que está sendo passado para o parametro

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, deu erro de violação de acesso denovo...só q agora com outro número...

Project winsuperm.exe raised exception class EAccess Violation with message 'Access violation at address 004E9F18 in module 'winsuperm.exe'. Read of address 00000000'

a caixa de mensagem nem chegou a ser exibida....já entrou o erro quando passava pela linha dela

Link para o comentário
Compartilhar em outros sites

  • 0
Project winsuperm.exe raised exception class EAccess Violation with message 'Access violation at address 004E9F18 in module 'winsuperm.exe'. Read of address 00000000'

a caixa de mensagem nem chegou a ser exibida....já entrou o erro quando passava pela linha dela

showmessage(GridLocalControleCaixa.SelectedField.AsString);

este comando : showmessage(GridLocalControleCaixa.SelectedField.AsString);

deveria mostrar a voce o conteúdo do campo selecionado da sua DBGrid

//GridLocalControleCaixa.SetFocus;
          GridLocalControleCaixa.SelectedIndex := 0;
        end;
      end;
    end;

    showmessage(GridLocalControleCaixa.SelectedField.AsString); 

    if GridLocalControleCaixa.Focused = True then
    begin
      With QueryLocalControleCaixa Do
      begin
        Close;
       SQL.Clear;
       SQL.Add('SELECT * FROM ESTACAI.dbf');
       SQL.Add('WHERE CAIDAT = :pData');
       ////////////////////// LINHA QUE O ERRO ACUSA///////////////////////
      ParamByName('pData').AsDateTime := StrToDate(GridLocalControleCaixa.SelectedField.AsString);
      ////////////////////// LINHA QUE O ERRO ACUSA///////////////////////
     Open;

Observe que voce selecionou o primeiro campo do seu DBgrid ... e se este campo não for data vai dar erro

experimente mudar o showmessage de posição e veja o que ocorre

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Project winsuperm.exe raised exception class EAccess Violation with message 'Access violation at address 004E9F18 in module 'winsuperm.exe'. Read of address 00000000'
Gabriel Cabral, "Access violation ..." é erro típico (para não dizer exclusivo) de acesso a área de memória não alocada para uma variável.

Observe que voce selecionou o primeiro campo do seu DBgrid ... e se este campo não for data vai dar erro
Jhonas, com todas estas informações as vezes "passamos batidos", mas no caso de tentar passar um valor diferente do tipo esperado o comum é ocorrer um erro informando de que a conversão não é válida, algo como "xxx is not a valid date" ou coisa parecida.

Posso estar enganado, mas pelo nome que o colega Grabriel Cabral deu aos componentes:

- frmLocalControleCaixa => o form

- GridLocalControleCaixa => o dbgrid no form

eu acreditaria que a query de nome QueryLocalControleCaixa seria aquela ligada ao componente DBGrid de nome GridLocalControleCaixa. Sendo assim, podemos observar que a query foi aberta no seguimento abaixo, onde a primeira coluna do DBGrid receberá o foco e, por consequência, o próprio DBGrid:

...
      else
      begin
        With QueryLocalControleCaixa Do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT * FROM ESTACAI.dbf');
          SQL.Add('WHERE CAIDAT = :pData');
          SQL.Add('ORDER BY CAIDAT DESC, CAIHOR DESC');
          ParamByName('pData').AsDateTime := StrToDate(txtLocalControleCaixa_Data.Text);
          Open;

          //GridLocalControleCaixa.SetFocus;
          GridLocalControleCaixa.SelectedIndex := 0;
        end;
      end;
    end;
...
Assim, no próximo fragmento de código (onde está ocorrendo o erro), o if..then passará e a query é fechada:
...
    if GridLocalControleCaixa.Focused = True then
    begin
      With QueryLocalControleCaixa Do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT * FROM ESTACAI.dbf');
        SQL.Add('WHERE CAIDAT = :pData');
      ////////////////////// LINHA QUE O ERRO ACUSA///////////////////////
        ParamByName('pData').AsDateTime := StrToDate(GridLocalControleCaixa.SelectedField.AsString);
      ////////////////////// LINHA QUE O ERRO ACUSA///////////////////////
        Open;
...

e aqui, é que penso estar o problema.

Com a query fechada, não há SelectedField a ser utilizado para o parâmetro (o DBGrid não estará mostrando nada neste momento), pois não há fields que possam ter seu valor recuperado.

A sugestão é que seja criada uma variável local para receber o valor deste campo, naquela primeira fração de código, e depois utilizar ela para ser atribuida ao parâmetro. Experimente fazer isto e dê um retorno.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Eu não acredito que era isso <_<

O erro estava na query que eu estava chamando...

eu estava chamando a query errada!!!

Eu estava chamando a query que faz a busca com data ao invés de chamar a query para prencher os campos no outro formulario...

enfim....no código abaixo, onde eu chamo QueryLocalControleCaixa, é pra chamar dm.QueryControleCaixa..

...
    if GridLocalControleCaixa.Focused = True then
    begin
      With QueryLocalControleCaixa Do ////É PRA CHAMAR dm.QueryControleCaixa AO INVÉS DESTA
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT * FROM ESTACAI.dbf');
        SQL.Add('WHERE CAIDAT = :pData');
        ParamByName('pData').AsDateTime := StrToDate(GridLocalControleCaixa.SelectedField.AsString);
        Open;
...

Muito obrigado, Jhonas e Micheus

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...