• 0
Sign in to follow this  
overbits

Relatório Com O Resultado De Uma Subconsulta Numa Ttable

Question

Oi...

Será que alguém já teve este problema?

Eu possuo uma aplicação, onde me exibe uma FormQualquer para realizar uma consulta ou filtragem dos dados numa TTable...

OBS: Tenho no data module a table devidamente configurada com seus índices primários e secundários e etc. Funcionando perfeitamente...

Durante a pesquisa há vários processos... O primeiro, escolho o Alias num ComboBox... Logo apó escolho a tabela .DB a ser utilizada, daí digito num edit o campo desta tabela onde desejo realizar a filtragem e por fim outro edit onde coloco o valor a ser encontrado. Clico num botão e é realizada a filtragem sem problemas mostrando-as num DBGrid...

Daí fiz uma implementação pequena onde filtro por data o resultado dessa relação mostrada no DBGrid com mais dois edits e outro botão eu clico e está feita a filtragem por data já com o resutado daquela pesquisa anterior mostradas no mesmo DBGrid, até tenho mais um botão onde realizo a impressão do resultado mediante um FormQuicReport e funciona perfeitamente...

Agora vem a bronca...

Depois de ser feita a pesquisa por data... Eu não consigo ordenar e imprimir a Table1 existente na FormPesquisa, fiz mais três botões onde ordeno por descrição...Por valor...POr nome...

Eles até funcionam...Ordenam numa boa... Com um IndexNames..Só que faz isso com a Tabela inteira...Quer dizer os dados inteiros e não só com o resultado que tá na grid...

Já tentei no evento da Grid com TitleClick, funciona também..Mas mostra todos os dados da Tabela... Tentei colocar uma query setada pro mesmo datasource que está a table1 mas não adianta.

Não sei se fui claro... Mas resumindo há como ordenar os dados deois de ser feita uma subconsulta?

Ah esqueci de dizer que o damodule fica isolado não acesso ele...

A form pesquisa tem um componente Table1, um datasource, uma dbgrid

Toda operação e realizada nesta table1 que está na form e não no datamodule.

Share this post


Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 0
...

Depois de ser feita a pesquisa por data... Eu não consigo ordenar e imprimir a Table1 existente na FormPesquisa, fiz mais três botões onde ordeno por descrição...Por valor...POr nome...

Eles até funcionam...Ordenam numa boa... Com um IndexNames..Só que faz isso com a Tabela inteira...Quer dizer os dados inteiros e não só com o resultado que tá na grid...

Já tentei no evento da Grid com TitleClick, funciona também..Mas mostra todos os dados da Tabela... Tentei colocar uma query setada pro mesmo datasource que está a table1 mas não adianta.

overbits, uma coisa é certa: se você seleciona "qualquer" tabela da lista, pode aplicar um filtro qualquer, ordenar por qualquer campo e você está utilizando paradox, então usar um TTable pode não ser uma boa opção. Isso porque para ordenar pelos campos desejados, deverá haver um índices criado para este campo - se você ordena por todos, então terá um índice para cada campo.

De qualquer modo, você tem mantido os filtros quando aplica a nova ordenação (índice)? Voce está utilizando os dois filtros juntos: campo escolhido e data na mesma string Filter?

Voce já tentou implementar isto utilizando uma query, aonde você ajusta dinamicamente sua SQL para aplicar os filtros (cláusula WHERE) e ordenação (cláusula ORDER BY)?

Share this post


Link to post
Share on other sites
  • 0
...

De qualquer modo, você tem mantido os filtros quando aplica a nova ordenação (índice)? Voce está utilizando os dois filtros juntos: campo escolhido e data na mesma string Filter?

Voce já tentou implementar isto utilizando uma query, aonde você ajusta dinamicamente sua SQL para aplicar os filtros (cláusula WHERE) e ordenação (cláusula ORDER BY)?

No código da filtragem das datas eu coloquei assim:

(No evento onclick de um botão qualquer)
begin
  inherited;
  if (Edit_Data_Inicial.Text <> ' ') and (Edit_Data_Final <> ' ') then
  begin
    inherited;
    Table1.IndexName:= ´SI_DataDePagamento´;
    Table1.SetRange([Edit_Data_Inicial.text], [Edit_Data_Final.Text]);
    Table.Filtered:= True;
  end;
end;

Daí mostra no DBGrid o resultado da filtragem sem problemas em ordem cronológica...

Lembrando que já havia feito uma filtragem antes dessa acima, por um campo quanquer da tabela e esse resultado também estava na DBGrid, daí quando clico no botão ele não faz uma nova filtragem não... Ele pega o que já está como resultado na DBGrid e realiza a filtragem com o valor dad datas que eu informei em Edit_Data_Iniciall e Edit_Data_Final... Daí criei mais 3 botôes pra realizar uma ordenação depois dessa filtragem por datas, Por Nome... Por Valor... Por Tipo... E ao invés de continuar efetuando o processo com o resultado mostrado na DBGrid ele faz na tabela inteira...

Eu queria ordenar o resultado de uma filtragem anterior, com o resultado mostrado e não na tabela toda...

Essa form que criei é como uma central de pesquisa no prgrama inteiro...

Mas consegui fazer isso usando uma Table só, um DataSource só...

Já tentei de tudo e só falta isso pra finalizar.. Se tiver que colocar um componente Query tudo bem pra cada botão que eu quizer pra ordenar... Já aé implementei isso..Mas continua me voltado o resultado da tabela completa (5800 registros) e não uma filtragem por mês que eu fiz anteriormente.

Share this post


Link to post
Share on other sites
  • 0
...

De qualquer modo, você tem mantido os filtros quando aplica a nova ordenação (índice)? Voce está utilizando os dois filtros juntos: campo escolhido e data na mesma string Filter?

Voce já tentou implementar isto utilizando uma query, aonde você ajusta dinamicamente sua SQL para aplicar os filtros (cláusula WHERE) e ordenação (cláusula ORDER BY)?

No código da filtragem das datas eu coloquei assim:

(No evento onclick de um botão qualquer)
begin
  inherited;
  if (Edit_Data_Inicial.Text <> ' ') and (Edit_Data_Final <> ' ') then
  begin
    inherited;
    Table1.IndexName:= ´SI_DataDePagamento´;
    Table1.SetRange([Edit_Data_Inicial.text], [Edit_Data_Final.Text]);
    Table.Filtered:= True;
  end;
end;

Daí mostra no DBGrid o resultado da filtragem sem problemas em ordem cronológica...

Lembrando que já havia feito uma filtragem antes dessa acima, por um campo quanquer da tabela e esse resultado também estava na DBGrid, daí quando clico no botão ele não faz uma nova filtragem não... Ele pega o que já está como resultado na DBGrid e realiza a filtragem com o valor dad datas que eu informei em Edit_Data_Iniciall e Edit_Data_Final... Daí criei mais 3 botôes pra realizar uma ordenação depois dessa filtragem por datas, Por Nome... Por Valor... Por Tipo... E ao invés de continuar efetuando o processo com o resultado mostrado na DBGrid ele faz na tabela inteira...

Eu queria ordenar o resultado de uma filtragem anterior, com o resultado mostrado e não na tabela toda...

Essa form que criei é como uma central de pesquisa no prgrama inteiro...

Mas consegui fazer isso usando uma Table só, um DataSource só...

Já tentei de tudo e só falta isso pra finalizar.. Se tiver que colocar um componente Query tudo bem pra cada botão que eu quizer pra ordenar... Já aé implementei isso..Mas continua me voltado o resultado da tabela completa (5800 registros) e não uma filtragem por mês que eu fiz anteriormente.

overbits, não ficou claro ainda se você utiliza a propriedade Filter, apesar de você ativar o filtro ((Table.Filtered:= True;). O uso de SetRange está vinculado ao índice que você está utilizando. Eu não estou certo, mas aplicado o Range e setando o filtro (Filter := 'CAMPO >= VALOR ...'), a combinação de ambos deveria funcionar. Voce está utilizando a propriedade Filter também? Como você está inicializando ela?

De qualquer modo, já que você pretende aplicar filtro sobre filtro, acho que a melhor opção seria implementar isso utilizando uma query.

Abraços

Share this post


Link to post
Share on other sites
  • 0
overbits, não ficou claro ainda se você utiliza a propriedade Filter, apesar de você ativar o filtro ((Table.Filtered:= True;). O uso de SetRange está vinculado ao índice que você está utilizando. Eu não estou certo, mas aplicado o Range e setando o filtro (Filter := 'CAMPO >= VALOR ...'), a combinação de ambos deveria funcionar. Voce está utilizando a propriedade Filter também? Como você está inicializando ela?

De qualquer modo, já que você pretende aplicar filtro sobre filtro, acho que a melhor opção seria implementar isso utilizando uma query.

Abraços

Sim, apesar de no Object Inpector, nas propiedades da Table1 está setada "Filtered = False"... No código, em cada chamada de evento onclick dos botões que realizam a filtragem/consulta sempre tem "Table1.Filtered:= True"...

Em relação a filtragem ou ordenação tá Ok, mas meu problema é quando chega no último passo, que seria ordenar o resultado filtrado entre as datas que coloco...

Por exemplo:

- Meu primeiro evento, digamos assim, seria filtrar um determinado campo numa tabela...

É filtrado e exibdo na DBGrid o resultado...

- Meu segundo passo é colocar Data Inicial e a Data Final par que o mesmo resultado mostrado na DBGrid, seja filtrado agora entre essas datas... O que ocorre sem maiores problemas...

- O terceiro passo, seria ordenar o resultado anterior da maneira que eu desejar, mediante o clique num botão...

Aí é que acontece o problema... Ordenar até ordena, só que ao invés de ordenar com o resultado que já tenho no DBGrid, a ordenação é completa... Ou seja, tudo que tenho armazenado na Table1, e não só aquela faixa de dados antes filtrada/ordenada e mostrada no DBGrid...

O mesmo acontecendo quando eu coloco uma Query1, setada até mesmo, para o mesmo DataSource que a Tabla1 utiliza.

Se existisse uma maneira de ordenar só com o resultado obtido anteriormente, resolveria meu problema, pode ser até utilizando uma Query.

Só falta esse detalhe para que minha bronca seja solucionada... Sendo ou não, obrigado antecipadamente.

Share this post


Link to post
Share on other sites
  • 0
..., mas meu problema é quando chega no último passo, que seria ordenar o resultado filtrado entre as datas que coloco...

Por exemplo:

- Meu primeiro evento, digamos assim, seria filtrar um determinado campo numa tabela...

É filtrado e exibdo na DBGrid o resultado...

- Meu segundo passo é colocar Data Inicial e a Data Final par que o mesmo resultado mostrado na DBGrid, seja filtrado agora entre essas datas... O que ocorre sem maiores problemas...

- O terceiro passo, seria ordenar o resultado anterior da maneira que eu desejar, mediante o clique num botão...

Aí é que acontece o problema... Ordenar até ordena, só que ao invés de ordenar com o resultado que já tenho no DBGrid, a ordenação é completa... Ou seja, tudo que tenho armazenado na Table1, e não só aquela faixa de dados antes filtrada/ordenada e mostrada no DBGrid...

O mesmo acontecendo quando eu coloco uma Query1, setada até mesmo, para o mesmo DataSource que a Tabla1 utiliza.

Se existisse uma maneira de ordenar só com o resultado obtido anteriormente, resolveria meu problema, pode ser até utilizando uma Query.

Só falta esse detalhe para que minha bronca seja solucionada... Sendo ou não, obrigado antecipadamente.

overbits, é meio complicado achar/sugerir uma solução deste tipo quando não se tem a situação em mãos, mas vou tentar explicar algo que penso poderia ser uma alternativa.

Neste exemplo, o dataset que você mostra no DBGrid seria uma query (QryConsulta). Então, criaríamos alsguns procedimentos:

procedure TForm1.PreparaFiltro1;
  begin
    QryConsulta.Close;
    QryConsulta.SQL.Clear;
    QryConsulta.SQL.Add('SELECT *');
    QryConsulta.SQL.Add('FROM NOME_TABELA');
    QryConsulta.SQL.Add('WHERE CONDICAO_1 = :Condicao1');
   // ... outras condições iniciais, se houver, adicionar aqui
  end;
  
  procedure TForm1.PreparaFiltro2;
  begin
   // prepara o filtro inicial
    PreparaFiltro1;
   // inclui o novo filtro sobre o primeiro resultado
    QryConsulta.SQL.Add('  AND DAT_CONDICAO_2 BETWEEN :DAT_INICIO AND :DAT_TERMINO');
  end;
  
  procedure TForm1.PreparaOrdenacao(SortFields :string);
  begin
   // verifica se a última linha da query contém a cláusula ORDER BY
    if Pos(QryConsulta.SQL[QryConsulta.SQL.Count -1]) > 0 then
     // se já existe, altera o conteúdo
      QryConsulta.SQL[QryConsulta.SQL.Count -1] := 'ORDER BY '+SortFields
    else
     // se não existe, adiciona
      QryConsulta.SQL.Add('ORDER BY '+SortFields);
  end;
Ao aplicar o 1º filtro:
procedure TForm1....
  begin
    PreparaFiltro1;
    PreparaOrdenacao('CAMPO_ORDENAR'); // se hover mais que um, basta concatenar separando com ","
    QryConsulta.ParamByName('Condicao1').Value := VALOR_CONDICAO1;
    QryConsulta.Open;
  end;
Ao aplicar o 2º filtro:
procedure TForm1....
  begin
    PreparaFiltro2;
    PreparaOrdenacao('CAMPO_ORDENAR'); // se hover mais que um, basta concatenar separando com ","
    QryConsulta.ParamByName('Condicao1').Value := VALOR_CONDICAO1;
    QryConsulta.ParamByName('DAT_INICIO').AsDateTime := VALOR_DAT_INICIO;
    QryConsulta.ParamByName('DAT_TERMINO').AsDateTime := VALOR_DAT_TERMINO;
    QryConsulta.Open;
  end;

Ao mudar a ordenação, teria que ser verificado que filtros já forma aplicados.

O parâmetro 'CAMPO_ORDENAR' passado em PreparaOrdenacao seria uma variável que é inicializada quando um campo é selecionado, deste modo ao modificar a ordenação, após inicializar esta variável, basta verificar que filtro foi aplicado e chamar o respectivo procedimento (que não defini nome) para ser aplicado do 1º ou 2º filtro;

Espero que isso possa lhe auxiliar numa solução.

Abraços

Edited by Micheus

Share this post


Link to post
Share on other sites
  • 0

Valeu Micheus...

Vou tentar modificar o que eu tinha feito utilizando mais a Query ao invés da Table...

Tava funcionando rápido, só com esse detalhe de não ordenar uma faixa de dados que já estava numa dbgrid como eu queria.

Vamos ver como fica... Eu posto aqui de novo para dizer que solucionou o caso...

Desde já te agradeço.

Share this post


Link to post
Share on other sites
  • 0
Vou tentar modificar o que eu tinha feito utilizando mais a Query ao invés da Table...

Tava funcionando rápido, só com esse detalhe de não ordenar uma faixa de dados que já estava numa dbgrid como eu queria.

Vamos ver como fica... Eu posto aqui de novo para dizer que solucionou o caso...

Não esqueça do backup do que você tem hoje em funcionamento (mesmo que precário). ;)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this