Fórum Erro ao utilizar parametros para um intervalo de datas #13872

11/01/2010

0

---------------------------
Debugger Exception Notification
---------------------------
Project raiox.exe raised exception class EAccessViolation with message 'Access violation at address 00578F78 in module 'raiox.exe'. Read of address 000000B0'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help  
---------------------------
Lucas Souza

Lucas Souza

Responder

Posts

11/01/2010

Lucas Souza

Estou tentando gerar um relatório com intervalo de datas, quando coloco a data na Query tudo certo, mas quando utilizo parametros com Edits dá erro, veja abaixo o código:   dmGeral.QryQuantExames2.ParamByName('datai').AsDate := StrToDate(datai.text);
dmGeral.QryQuantExames2.ParamByName('dataf').AsDate := StrToDate(dataf.text);
qrExamesQuantidade.Preview;   O erro está descrito na primeira interação desse chamado.   Aguardo resposta, lembrando que estou utilizando DBExpress e Firebird
Responder

Gostei + 0

11/01/2010

Wesley Yamazack

Olá amigo,
   Tenta passar os parametros com asString, ao inves de asDate. Pois firebird trabalha com data 11-01-2010, senão estou enganado, tente usar o asString, caso contrario tente fazer um

dmGeral.QryQuantExames2.ParamByName('datai').AsString :=  Formatdatetime('dd-mm-yyyy', DateToStr(EdtDataini.Text));

 Veja se isso não irá resolver teu problema.

Um abraço

Wesley Y
Responder

Gostei + 0

11/01/2010

Lucas Souza

Wesley   Grato pela atenção no atendimento   Tentei fazer como disse, veja abaixo:   dmGeral.QryQuantExames2.ParamByName('datai').AsString :=  Formatdatetime('dd-mm-yyyy', DateToStr(datai.Text));
dmGeral.QryQuantExames2.ParamByName('dataf').AsString :=  Formatdatetime('dd-mm-yyyy', DateToStr(dataf.Text));   Deu o seguinte erro:   [Error] ufrmIntQuantExames.pas(34): There is no overloaded version of 'DateToStr' that can be called with these arguments
[Error] ufrmIntQuantExames.pas(35): There is no overloaded version of 'DateToStr' that can be called with these arguments
[Fatal Error] raiox.dpr(17): Could not compile used unit 'ufrmIntQuantExames.pas'
Responder

Gostei + 0

11/01/2010

Lucas Souza

Wesley   Fiz um teste, em vez de:   dmGeral.QryQuantExames2.ParamByName('datai').AsString :=  Formatdatetime('dd-mm-yyyy', DatetoStr(datai.Text));
dmGeral.QryQuantExames2.ParamByName('dataf').AsString :=  Formatdatetime('dd-mm-yyyy', DatetoStr(dataf.Text));   Uitlizei:   dmGeral.QryQuantExames2.ParamByName('datai').AsString :=  Formatdatetime('dd-mm-yyyy', StrToDate(datai.Text));
dmGeral.QryQuantExames2.ParamByName('dataf').AsString :=  Formatdatetime('dd-mm-yyyy', StrToDate(dataf.Text));     Deu o seguinte erro quando chamo o relatório:   ---------------------------
Debugger Exception Notification
---------------------------
Project raiox.exe raised exception class EAccessViolation with message 'Access violation at address 00578F8B in module 'raiox.exe'. Read of address 000000B0'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help  
---------------------------
Responder

Gostei + 0

12/01/2010

Wesley Yamazack

Olá amigo,
   Fiz um teste aqui com FB, e consegui da seguinte forma.

  SQLQuery1.Params.ParamByName('DATA_PGTO').AsDate := StrToDate(Edit1.Text);
  SQLQuery1.Open;

  Esta funcionando sem problemas, agora access violation, só acontece quando o objeto não esta criado, ou já foi destruído, veja se este DM que você esta usando não esta criado.

  Um abraço

Wesley Y
Responder

Gostei + 0

12/01/2010

Lucas Souza

Wesley   Criei o DM no form que insere as datas:   procedure TfrmIntQuantExames.FormCreate(Sender: TObject);
begin
dmgeral := Tdmgeral.Create(Self); end; end.   E usei o seguinte código no botão que chama o relatório:   procedure TfrmIntQuantExames.Button1Click(Sender: TObject);
begin dmGeral.QryQuantExames2.ParamByName('datai').AsDate :=  StrtoDate(datai.Text);
dmGeral.QryQuantExames2.ParamByName('dataf').AsDate :=  StrtoDate(datai.Text);
dmgeral.cdsQuantExames2.Open;
qrExamesQuantidade.Preview;
end;     Não dá erro algum, somente não retorna nenhum resultado no relatório, se eu colocar a data direto na Query retorna normalmente, veja minha query com os parâmetros:   SELECT DISTINCT a.CODTIPOEXAME, count(*) as total, b.nome,b.numero FROM CHAPAS a, TIPOEXAMES b WHERE a.DATA BETWEEN :datai AND :dataf and a.CODTIPOEXAME = b.COD GROUP BY a.CODTIPOEXAME, b.NOME, b.numero ORDER BY count(*) DESC
Responder

Gostei + 0

12/01/2010

Wesley Yamazack

Olá amigo,

 Faça as seguintes alterações, e me diga os resultados, caso ocorra erro me avise o mesmo.


procedure TfrmIntQuantExames.FormCreate(Sender: TObject);
begin
  Try
    dmgeral := Tdmgeral.Create(Self);
  Except
    on e : Exception do
    begin 
          ShowMessage('Ao Criar DataModule ' + #13 +
                               E.Message + #13 +)
                               E.ClassName + #13 +
    end;
  End;

end;

end.   E usei o seguinte código no botão que chama o relatório:   procedure TfrmIntQuantExames.Button1Click(Sender: TObject);
begin
 Try
    dmGeral.QryQuantExames2.Params.ParamByName('datai').AsDate :=  StrtoDate(datai.Text);
    dmGeral.QryQuantExames2.Params.ParamByName('dataf').AsDate :=  StrtoDate(dataf.Text);

    dmgeral.cdsQuantExames2.Open;
    ShowMessage('Qtd de Registros Encontradosm : ' + IntToStr(dmgeral.cdsQuantExames2.RecordCount) );

    qrExamesQuantidade.Preview; {Pq isso ? Preview ? Que query é esta qrExamesQuantidade? Você esta dando que comando nesta query }


  Except
    on e : Exception do
    begin 
          ShowMessage('Erro ao abrir SQL ' + #13 +
                               E.Message + #13 +)
                               E.ClassName + #13 +
    end;
  End;
end;


Um abraço

Wesley Y


Responder

Gostei + 0

12/01/2010

Lucas Souza

Wesley   Primeiro peço desculpas pela minha inesperiência, por isso contratei esse serviço.   Fiz o que você disse e du vários erros, não se se estou fazendo algo errado. Veja abaixo, numerei as linhas pra você ver os erros. sobre a "qrExamesEfetuados", não é uma Query é o relatório o QReport que chamo pra gerar o relatório.     31 procedure TfrmIntQuantExames.FormCreate(Sender: TObject);
32  begin
33    Try
34    dmgeral := Tdmgeral.Create(Self);
35    Except
36    on e : Exception do
37    begin 
38          ShowMessage('Ao Criar DataModule ' + #13 +
39                               E.Message + #13 +)
40                               E.ClassName + #13 +
41    end;
42    End;
43    end;
44
45    procedure TfrmIntQuantExames.Button1Click(Sender: TObject);
46   begin
47   Try
48
49    dmGeral.QryQuantExames2.Params.ParamByName('datai').AsDate :=  StrtoDate(datai.Text);
50    dmGeral.QryQuantExames2.Params.ParamByName('dataf').AsDate :=  StrtoDate(dataf.Text);
51
52    dmgeral.cdsQuantExames2.Open;
53    ShowMessage('Qtd de Registros Encontradosm : ' + IntToStr(dmgeral.cdsQuantExames2.RecordCount) );
54
55    qrExamesQuantidade.Preview; {Pq isso ? Preview ? Que query é esta qrExamesQuantidade? Você esta dando que comando nesta query }
56
57
58  Except
59    on e : Exception do
60    begin 
61          ShowMessage('Erro ao abrir SQL ' + #13 +
62                               E.Message + #13 +)
63                               E.ClassName + #13 +
64    end;
65  End;
66  end;
67
68
69    end.         veja os erros:       [Error] ufrmIntQuantExames.pas(39): Expression expected but ')' found
[Error] ufrmIntQuantExames.pas(40): Missing operator or semicolon
[Error] ufrmIntQuantExames.pas(41): Expression expected but 'END' found
[Error] ufrmIntQuantExames.pas(62): Expression expected but ')' found
[Error] ufrmIntQuantExames.pas(63): Missing operator or semicolon
[Error] ufrmIntQuantExames.pas(64): Expression expected but 'END' found
[Fatal Error] ufrmPrincipal.pas(79): Could not compile used unit 'ufrmIntQuantExames.pas'
Responder

Gostei + 0

12/01/2010

Wesley Yamazack

Olá amigo, primeiramente gostaria de lhe falar que não precisa pedir desculpas, nós estamos aqui para ajudar seja de forma simples ou não, não importa o erro ou se você esta ou não entendendo, o que fazemos é lhe ajudar, ok ?
  Agora eu que peço desculpas pois o código não esta correto. veja as alterações.


procedure TfrmIntQuantExames.FormCreate(Sender: TObject);
begin
  Try
    dmgeral := Tdmgeral.Create(Self);
  Except
    on e : Exception do
    begin 
          ShowMessage('Ao Criar DataModule ' + #13 +
                               E.Message + #13 +
                               E.ClassName );
    end;
  End;

end;

end.   E usei o seguinte código no botão que chama o relatório:   procedure TfrmIntQuantExames.Button1Click(Sender: TObject);
begin
 Try
    dmGeral.QryQuantExames2.Params.ParamByName('datai').AsDate :=  StrtoDate(datai.Text);
    dmGeral.QryQuantExames2.Params.ParamByName('dataf').AsDate :=  StrtoDate(dataf.Text);

    dmgeral.cdsQuantExames2.Open;
    ShowMessage('Qtd de Registros Encontradosm : ' + IntToStr(dmgeral.cdsQuantExames2.RecordCount) );

    qrExamesQuantidade.Preview; {Dúvida, o seu Quick reports esta apontando para o CDSQuantExames2 certo ? Pois se estiver apontando para Query não ira funcionar}

  Except
    on e : Exception do
    begin 
          ShowMessage('Erro ao abrir SQL ' + #13 +
                               E.Message + #13 +
                               E.ClassName );
    end;
  End;
end;

Um Abraço

Wesley Y
Responder

Gostei + 0

12/01/2010

Lucas Souza

Wesley   Funcionou perfeitamente, grato pela atenção.   Para finalizarmos esse suporte, só me tira duas dúvidas:   01- Porque só funciona com o ClientDataSet e a Query desativada, se colocar como true não retorna resultado nenhum?   02 - Porque se gero um relatório agora, se só gera outro reletório com intervalo de datas diferentes se eu fechar a aplicação e abrir novamente?   Agraço. Um abraço.    
Responder

Gostei + 0

12/01/2010

Wesley Yamazack

Olá amigo em resposta as suas pergunta.
  01- Porque só funciona com o ClientDataSet e a Query desativada, se colocar como true não retorna resultado nenhum?

R : Você esta falando ativar na hora que estiver desenvolvendo, se for isso, é por que você não tem valor nos paremtros da sua query.
  02 - Porque se gero um relatório agora, se só gera outro reletório com intervalo de datas diferentes se eu fechar a aplicação e abrir novamente?

R : Antes de executar teu comando manda dar um CDSCliente.Close, antes de tudo para poder fechar o dataset sacou ?
  Um abraço

Wesley Y
Responder

Gostei + 0

14/01/2010

Lucas Souza

Wesley   Não consegui resolver o problema que te falei sobre não retornar dados na segunda vez que peço o relatório:   Quando coloco o intervalo de datas e peço pra gerar, gera normalmente, de mudo intervalo, gera o mesmo resultado do relatório anterior, mesmo mudando as datas.   Se fecho o form de inserir as datas e abro novamente, aí independente da data não retorna dados nenhum, preciso fechar a aplicação e abrir novamente.   Onde fecho o CDs como você disse?   Fechei no botão de chamar o relatório:       dmgeral.cdsQuantExames2.Close;
    dmGeral.QryQuantExames2.Params.ParamByName('datai').AsDate :=  StrtoDate(datai.Text);
    dmGeral.QryQuantExames2.Params.ParamByName('dataf').AsDate :=  StrtoDate(dataf.Text);
    dmgeral.cdsQuantExames2.Open;
    qrExamesQuantidade.Preview;     Mas parece que é quando fecha o form de inserir as datas, depois reabri-lo que dá o problema.
Responder

Gostei + 0

15/01/2010

Wesley Yamazack

Olá amigo, seguinte, pelo que estou notando, você usa os parametros da query, e manda abrir o clientdataset, você faz o seguinte, ao inves de passar os parametros pra query, passa para o CLientDataSet.

 - Vá no clientdataset, botão direito e fetchparams.
 -
    dmgeral.cdsQuantExames2.Close;
    dmGeral.cdsQuantExames2.Params.ParamByName('datai').AsDate :=  StrtoDate(datai.Text);
    dmGeral.cdsQuantExames2.Params.ParamByName('dataf').AsDate :=  StrtoDate(dataf.Text);
    dmgeral.cdsQuantExames2.Open;
    qrExamesQuantidade.Preview;

Veja se isso irá resolver o teu problema.

Um abraço

Wesley Y
 
Responder

Gostei + 0

15/01/2010

Lucas Souza

Fiz como você disse na última interação, não resolveu não, somente busou dados na primeira vez. Pra buscar novamente, tenho que fechar a aplicação e abrir novamente. 
Responder

Gostei + 0

15/01/2010

Wesley Yamazack

OLá amigo, vamos separar os problemas, derrpente temos o problema no teu relatório, ao inves do clientdataset.

Depois do Open faça o seguinte
 
    dmgeral.cdsQuantExames2.Close;
    dmGeral.QryQuantExames2.Params.ParamByName('datai').AsDate :=  StrtoDate(datai.Text);
    dmGeral.QRYQuantExames2.Params.ParamByName('dataf').AsDate :=  StrtoDate(dataf.Text);
    dmgeral.cdsQuantExames2.Open;
     Showmessage('Total de Registro encontrados : ' + IntToStr(cdsQuantExames2.RecordCount));
     // e veja o que iá aparecer
    qrExamesQuantidade.Preview;

Um abraço

Wesley Y

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar