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

(Resolvido) Ajuda num Relatório


Eder

Pergunta

Ola...preciso montar relatorio que aparentemente é fácil mas não to conseguindo montar a instrução sql.

Seguinte.....no mesmo registro tenho a filial emitente(SIGLA_CTRC) e a Filial Destino(FIL_DEST)

notem que neste caso os valores de faturamento tentem a duplicar no relatorio pois existe um faturamento para duas alternativas(emitente e destino), mas tudo bem..é normal neste caso.

eu preciso montar um relatorio onde mostre o Ranking das filiais no Geral ou seja, tudo que as filiais faturam...

Eu consegui fazer elas separadas ou seja só as FILIAIS EMITENTE(SIGLA_CTRC) com este codigo sql:

Txt:='SELECT SUM(Valor_Frete) as VALOR_FRETE_TOTAL, '+

'SUM(CONTADOR) AS CONTADOR_TOTAL, '+

'SUM(KG_CALCULO) AS KG_CALCULO_TOTAL, '+

'SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL, '+

'SIGLA_CTRC '+

'FROM ctrc '+

'WHERE (SITUACAO_CTRC <> "C") '+

'AND DATA_EMISSAO between :datai and :dataf '+

'Group By SIGLA_CTRC ORDER BY 1 DESC';

e depois o codigo pra FILIAL DESTINO assim:

Txt:='SELECT SUM(Valor_Frete) as VALOR_FRETE_TOTAL, '+
'SUM(CONTADOR) AS CONTADOR_TOTAL, '+
'SUM(KG_CALCULO) AS KG_CALCULO_TOTAL, '+
'SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL, '+
'FIL_DEST '+
'FROM ctrc '+
'WHERE (SITUACAO_CTRC <> "C") '+
'AND DATA_EMISSAO between :datai and :dataf '+
'Group By FIL_DEST ORDER BY 1 DESC';

funcionou direitinho....ficou beleza.

agora preciso juntar tudo as emitentes e destinos e mostrar.....

Como ficaria a instrução sql juntando tudo?

Estou usando para este relatório o Gerador de Relatorios FREEREPORT, pois estes dados no final vou montar gráficos, já esta tudo funcionando....menos esta 3 opção que seria juntar tudo.

Espero que fui claro.... :blush:

muito Grato

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

Posts Recomendados

  • 0
agora preciso juntar tudo as emitentes e destinos e mostrar.....

Como ficaria a instrução sql juntando tudo?

Eder, seria mostrar junto no sentido de que o ranking não faria distinção entre uma e outra - é isto?

Você tentou fazer um Union All das duas consultas SQL. Use o Database Desktop para fazer a consulta e testar o resultado. Você ainda está utilizando o Paradox, não é. Talvez o resultado não fique bom. Neste caso você poderia criar uma tabela temporária adicionando nela os dois resultados. Poderia até utilizar uma tabela em memória se você tiver instalado a biblioteca RxLib.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Ola.

Eder, seria mostrar junto no sentido de que o ranking não faria distinção entre uma e outra - é isto?
R.: sim....sempre levando em consideração....que no mesmo registro existe a filial de origem e a filial de destino, ou seja...neste caso se o peso da carga for 10 kgs vai ter que duplicar ou seja 20 kgs, pois foi manipulado na filial de origem a coleta da mercadoria e depois foi manipulado na filial de destino também os 20 kgs que serão entregues ao destinatario.....então ao todo foi manipulado 10 na origem + 10 na destino = 20 kgs.

no final do relatorio o somatório terá que ser o faturamento x 2(o dobro). Pois eu já consegui montar separado os dois.....na origem e no destino...mas agora tenho que fazer um resultado geral onde mostre saidas/entradas juntos.

Você tentou fazer um Union All das duas consultas SQL. Use o Database Desktop para fazer a consulta e testar o resultado.

R.: não usei não..que eu me lembro nunca usei o Union.......o paradox suporte este comando, poderias dar um exemplo no codigo?

Você ainda está utilizando o Paradox, não é. Talvez o resultado não fique bom
R.: sim uso.....bom..se você acha que não vai ficar 100%....bom ai tenho que mostrar somente os dois relatorios que tenho... :blush:

Neste caso você poderia criar uma tabela temporária adicionando nela os dois resultados. Poderia até utilizar uma tabela em memória se você tiver instalado a biblioteca RxLib.

R.: Bom...eu tenho a RxLib instalada....mas nem imagino como fazer este processo que você menciona....

Mas beleza.....amigão.

o importante que o meu objetivo principal era mostrar hoje sexta feira os dois relatorio de entradas e saidas separados..., e isto já consegui, se a gente conseguir montar este aqui(os dois juntos)....ai é lucro....digo a gente pois, você sempre me ajuda.... :blush:

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Você tentou fazer um Union All das duas consultas SQL. Use o Database Desktop para fazer a consulta e testar o resultado.

R.: não usei não..que eu me lembro nunca usei o Union.......o paradox suporte este comando, poderias dar um exemplo no codigo?

Eder, segue um exemplo. Observe que neste caso, as duas (ou n) consultas devem ter o mesmo número de colunas, preferencialmente o mesmo nome (veja que usei um "AS UNIDADE"). A cláusula ORDER BY fica apenas no final (tem que ver se o Paradox, vai fazer esta ordenação direitinho - tem que testar, use o DBD):

SELECT SUM(Valor_Frete) as VALOR_FRETE_TOTAL, 
       SUM(CONTADOR) AS CONTADOR_TOTAL, 
       SUM(KG_CALCULO) AS KG_CALCULO_TOTAL, 
       SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL, 
       SIGLA_CTRC AS UNIDADE
FROM ctrc 
WHERE (SITUACAO_CTRC <> "C") 
AND DATA_EMISSAO between :datai and :dataf 
Group By SIGLA_CTRC 
UNION ALL
SELECT SUM(Valor_Frete) as VALOR_FRETE_TOTAL,
       SUM(CONTADOR) AS CONTADOR_TOTAL, 
       SUM(KG_CALCULO) AS KG_CALCULO_TOTAL, 
       SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL, 
       FIL_DEST AS UNIDADE
FROM ctrc 
WHERE (SITUACAO_CTRC <> "C") 
  AND DATA_EMISSAO between :datai and :dataf 
Group By FIL_DEST 
ORDER BY 1 DESC
Neste caso você poderia criar uma tabela temporária adicionando nela os dois resultados. Poderia até utilizar uma tabela em memória se você tiver instalado a biblioteca RxLib.
R.: Bom...eu tenho a RxLib instalada....mas nem imagino como fazer este processo que você menciona....SortOnFields, mas eu nunca usei e estou sem tempo para testar agora.

Vamos partir para outra abordagem: criar uma tabela Paradox temporária. Lembra deste post? A idéia é a mesma, mudam os campos e o fato de que você não precisa criar a chave primária, apenas um índice normal (pelo campo a ser ordenado) e coloque nas suas opções: [ixDescending], para que você tenha o resultado ordenado em forma decrescente.

Acho que você consegue implementar, qualquer coisa, eu só poderei ajudar novamente na segunda. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Eder, segue um exemplo. Observe que neste caso, as duas (ou n) consultas devem ter o mesmo número de colunas, preferencialmente o mesmo nome (veja que usei um "AS UNIDADE"). A cláusula ORDER BY fica apenas no final (tem que ver se o Paradox, vai fazer esta ordenação direitinho - tem que testar, use o DBD):

CODE

SELECT SUM(Valor_Frete) as VALOR_FRETE_TOTAL,

SUM(CONTADOR) AS CONTADOR_TOTAL,

SUM(KG_CALCULO) AS KG_CALCULO_TOTAL,

SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL,

SIGLA_CTRC AS UNIDADE

FROM ctrc

WHERE (SITUACAO_CTRC <> "C")

AND DATA_EMISSAO between :datai and :dataf

Group By SIGLA_CTRC

UNION ALL

SELECT SUM(Valor_Frete) as VALOR_FRETE_TOTAL,

SUM(CONTADOR) AS CONTADOR_TOTAL,

SUM(KG_CALCULO) AS KG_CALCULO_TOTAL,

SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL,

FIL_DEST AS UNIDADE

FROM ctrc

WHERE (SITUACAO_CTRC <> "C")

AND DATA_EMISSAO between :datai and :dataf

Group By FIL_DEST

ORDER BY 1 DESC

R.: Deu certo...fez exatamente o que precisava. :D

valeu...muito Agradecido

Abraço :)

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus.....tava montando o relatorio no FreeReport....e ai...tou com um probleminha.

fiz conforme você me disse...no DBD funcionou certinho....

No Freereport sai assim o resultado:

FILIAL----FRETE

==========

BLU 10

SPO 05

BLU 20

SPO 15

Note que ao invés de ele juntar os registros de BLU e SPO ele não juntou....ta separando...

No Freereport na Memo Group eu configurei.

[([QUERYTodas.Unidade])]

deveria funcionar pois UNIDADE você tinha feito um AS:

SIGLA_CTRC AS UNIDADE

POR exemplo se eu optasse por tirar separada....eu faria assim no group(e funciona):

[([QUERYsaida.Sigla_Ctrc])]

ou assim pelo destino

[([QUERYEntrada.Fil_dest])]

Não sei se fui claro....... :blush:

Grato

Link para o comentário
Compartilhar em outros sites

  • 0
tava montando o relatorio no FreeReport....e ai...tou com um probleminha.

fiz conforme você me disse...no DBD funcionou certinho....

No Freereport sai assim o resultado:

FILIAL----FRETE

==========

BLU 10

SPO 05

BLU 20

SPO 15

Note que ao invés de ele juntar os registros de BLU e SPO ele não juntou....ta separando...

também parece que está em ordem crescente, e não decrescente como seria esperado.

você adicionou os campos (fields) ao componente QUERYTodas? O Campo Unidade está na lista de fields?

Vou ficar devendo, porque não trabalho com o Freereport. Espero que outro colega possa lhe ajudar com isto. Do contrário, avalie a possibilidade do arquivo temporário.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

OPA..

Corrigindo(tinha colocado incorreto a ordem):

1º BLU 1.139

2º SPO 1.452

3º SPO 1.157

4º BLU 1.235

você adicionou os campos (fields) ao componente QUERYTodas? O Campo Unidade está na lista de fields?

R.: sim adicionei

Vou ficar devendo, porque não trabalho com o Freereport. Espero que outro colega possa lhe ajudar com isto. Do contrário, avalie a possibilidade do arquivo temporário.

R.: oK...

Micheus...tava pensando....como foi feito na instrução.......assim:

SIGLA_CTRC AS UNIDADE
e depois logo abaixo:
FIL_DEST AS UNIDADE

ai acho que ele acaba mostrando os dois ....pois é o que ta acontecendo....

ele mostra primeiro o Blu em seguido o Spo.....

pois existe a origem e o destino..e tava verificando ele mostra certinho separadamente....

seu eu tirar um relatorio só da origem ou só do destino, os dados são exatamente iguais a este resultado..certinho.

Ele não junta......só falta juntar mesmo...

quanto a eu usar o Freereport, acredito que se eu for fazer no quick é quase o mesmo esquema....até acredito que ele vai dar o mesmo resultado(problema).

Aqui no forum......praticamente ninguém mexe com Freereport, pois já coloquei post aqui e quase ninguém respondeu...

Vou tentar um forum que mexe exclusivamente com FreeReport.

Demais..muito obrigado.

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Corrigindo(tinha colocado incorreto a ordem):

1º BLU 1.139

2º SPO 1.452

3º SPO 1.157

4º BLU 1.235

Eder, só para confirmar: sua consulta resulta apenas nestes 4 registros?

Se sim, então deve estar ocorrendo o que eu imaginava quando coloquei em meu primeiro post: "Você ainda está utilizando o Paradox, não é. Talvez o resultado não fique bom."

É que se eu não me engano (por isso havia mencionado), o Paradox não faz a ordenação após obtenção do resultado do UNION. Isto quer dizer que, das quatro linhas obtidas, o 1 e 2º correspondem a ordenação da primeira parte do UNION (1º SELECT), enquanto que 3º e 4º a segunda parte (2º SELECT). você pode conferir isto, separando os dois e executando um um de cada vez no DBD.

Micheus...tava pensando....como foi feito na instrução.......assim:

SIGLA_CTRC AS UNIDADE
e depois logo abaixo:
FIL_DEST AS UNIDADE

ai acho que ele acaba mostrando os dois ....pois é o que ta acontecendo....

ele mostra primeiro oBlu em seguido o Spo.....

pois existe a origem e o destino..e tava verificando ele mostra certinho separadamente....

seu eu tirar um relatorio só da origem ou só do destino, os dados são exatamente iguais a este resultado..certinho.

Ele não junta......só falta juntar mesmo...

então, acho que é aquilo que citei acima, você poderia conferir conforme sugeri.

quanto a eu usar o Freereport, acredito que se eu for fazer no quick é quase o mesmo esquema....até acredito que ele vai dar o mesmo resultado(problema).
com certeza, não trata-se de uma questão da ferramenta de relatórios, mas sim da consulta (o resultado dela). Voce ainda tem a opção de utilizar a tabela temporária. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Eder, só para confirmar: sua consulta resulta apenas nestes 4 registros?

Se sim, então deve estar ocorrendo o que eu imaginava quando coloquei em meu primeiro post: "Você ainda está utilizando o Paradox, não é. Talvez o resultado não fique bom."

R.:são mais registros....de outras filiais, só passei da filial BLU e SPO como modelo...mas todos com a mesma linha. quanto ao Paradox sim é ele mesmo....

É que se eu não me engano (por isso havia mencionado), o Paradox não faz a ordenação após obtenção do resultado do UNION. Isto quer dizer que, das quatro linhas obtidas, o 1 e 2º correspondem a ordenação da primeira parte do UNION (1º SELECT), enquanto que 3º e 4º a segunda parte (2º SELECT). você pode conferir isto, separando os dois e executando um um de cada vez no DBD.

R.: sim foi o que imaginei..

então, acho que é aquilo que citei acima, você poderia conferir conforme sugeri.

R>: sim fiz o teste...e realmente se processada em separado ele processa certinho....mas quando faço junto o codigo com o Union All ai.....não funca...direito. :blush:

QUOTE

quanto a eu usar o Freereport, acredito que se eu for fazer no quick é quase o mesmo esquema....até acredito que ele vai dar o mesmo resultado(problema).

com certeza, não trata-se de uma questão da ferramenta de relatórios, mas sim da consulta (o resultado dela).

R.: sim...com certeza.

Voce ainda tem a opção de utilizar a tabela temporária.

R.: pois é...acho que só sobrou ela....rs. :blush:

poderias me ajudar?? :blush:

valeu...grande abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Eder, dá uma olhada lá no penúltimo parágrafo do post#4. Veja se consegue implementar aquela idéia.

R.: Ola...carinha....Francamente,.......me enrrolei todo. achei muito dificil o esquiminha, e alem disto minha tabela é muito grande tem 95 campos (muito grande).

vou ficar apenas nas opções de imprimir separando primeiro da filial de origem e depois imprimir da filial de destino, não vou juntar não, uma que não teria mta finalidade não, parece que em separado da mais visão da ideía......e também demoraria muito pra entender o esquema dos temporários e implementar a idéia, mesmo assim...muito grato pela ajuda até aqui....

abraços :blush:

Link para o comentário
Compartilhar em outros sites

  • 0
...me enrrolei todo. achei muito dificil o esquiminha, e alem disto minha tabela é muito grande tem 95 campos (muito grande).
95... :o

..e também demoraria muito pra entender o esquema dos temporários e implementar a idéia, mesmo assim...muito grato pela ajuda até aqui....
é só impressão. Ainda não me dei por vencido... :D

Bom, para começar, você não tem que gerar a tabela com os 95 campos. Esta tabela seria para receber apenas o resultado das suas duas consultas, as quais tem apenas 5 campos:

- VALOR_FRETE_TOTAL;

- CONTADOR_TOTAL;

- KG_CALCULO_TOTAL;

- VALOR_N_FISCAL_TOTAL;

- UNIDADE.

Vamos lá...

Adicione um componente TTable ao seu projeto e dê o nome TabTmp (p. ex.). Ele será utilizado para a criação da tabela temporária, bem como será populado com os dados das duas consultas.

Para criar a estrutura da tabela temporária igual as das tabelas QUERYsaida e QUERYentrada usaremos a propriedade FieldDefs de uma delas (já aberta) - isto simplifica muito as coisas (mesmo que houvessem 95 campos a copiar).

O código parece grande e complexo, mas é apenas impressão devido aos comentários (retire-os e verá que é bem enxuto):

// no local onde será chamado o relatório para ser mostrado
procedure TForm1....
  procedure CopiaResultados(DataSet :TDateSet);
  var
    Idx :Integer;
  begin
    DataSet.First;
    while not DataSet.EOF do
    begin
      TabTmp.Append;
      for Idx := 0 to DataSet.FieldDefs.Count -1 do
        TabTmp.Fields[Idx].Assign(DataSet.Fields[Idx]);
      TabTmp.Post;
      DataSet.Next;
    end;
  end;

begin
 // as consultas devem estar abertas para termos
 // a estrutura dos campos disponíveis para cópia
  QUERYsaida.Open;
  QUERYentrada.Open;

  try
   // estas propriedades podem ser setadas
   // em design-time. Neste caso, remova elas daqui
    TabTmp.DatabaseName := qryPesq.DatabaseName;
    TabTmp.TableName := 'TmpTable.db';
    TabTmp.TableType := ttParadox;

   // se o arquivo existir, deve ser eliminado
    if FileExists(TabTmp.DatabaseName +'\' +TabTmp.TableName) then
      TabTmp.DeleteTable;

   // limpamos qualquer definição de campos que haja
    TabTmp.FieldDefs.Clear;
   // copiamos a estrutura de campos a ser copiada
    TabTmp.FieldDefs.Assign(qryPesq.FieldDefs);

   // limpamos qualquer definição de índices que haja
    TabTmp.IndexDefs.Clear;
   // chave primária
    TabTmp.IndexDefs.Add('', 'UNIDADE', [ixPrimary]); 
   // chave secundária a ser utilizada para a listagem em
   // ordem decrescente de valores, conf. definição da chave
    TabTmp.IndexDefs.Add('FRETE_TOTAL_IDX', 'VALOR_FRETE_TOTAL', [ixDescending]);

   // Criamos a tabela com a estrutura e índices definidos acima
    TabTmp.CreateTable;

   // selecionamos a chave desejada - ordem decrescente de valores
    TabTmp.IndexName := 'FRETE_TOTAL_IDX';
    TabTmp.Open;

   // inserimos os dados da consulta Saída na tabela temporária
    CopiaResultados(QUERYsaida);
   // inserimos os dados da consulta Entrada na tabela temporária
    CopiaResultados(QUERYentrada);

   // Neste ponto a tabela TabTmp contém todos os registros 
   // dasduas consultas e estará listado em ordem decrescente
   // devido a definição do índice utilizado.
   // Resta agora fazer a chamada ao relatório configurado
   // para mostrar todos os registros desta tabela
   ...

    TabTmp.Close;
  finally
    QUERYsaida.Close;
    QUERYentrada.Close;
  end;
end;

Experimente e qualquer dúvida é só avisar.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

OLA...Bom Dia!

é só impressão. Ainda não me dei por vencido...

R.: Eba...então vamos lá..

Carinha...seguinte...tentei montar o esqueminha..mas tenho algumas duvidas..

eu uso este codigo no botão pra gerar o relatorio(neste caso o relatorio tem aquele probleminha de não juntar):

{...abaixo mostra o relatorio das filiais SAIDAS/ENTRADA JUNTOS...}

If Combobox1.Text = 'TODAS' then
  begin
//determina o nr de filiais do ranking
     FrDbDataSet3.RangeEndCount:=StrToInt(EditNrClientes.text);
//codigo gerador...do rel.
TXT:= 'SELECT SUM(Valor_Frete) as VALOR_FRETE_TOTAL, '+
'SUM(CONTADOR) AS CONTADOR_TOTAL, '+
'SUM(KG_CALCULO) AS KG_CALCULO_TOTAL, '+
'SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL, '+
'SIGLA_CTRC AS UNIDADE '+
'FROM ctrc '+
'WHERE (SITUACAO_CTRC <> "C") '+
'AND DATA_EMISSAO between :datai and :dataf '+
'Group By SIGLA_CTRC '+
'UNION ALL '+
'SELECT SUM(Valor_Frete) as VALOR_FRETE_TOTAL, '+
'SUM(CONTADOR) AS CONTADOR_TOTAL, '+
'SUM(KG_CALCULO) AS KG_CALCULO_TOTAL, '+
'SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL, '+
'FIL_DEST AS UNIDADE '+
'FROM ctrc '+
'WHERE (SITUACAO_CTRC <> "C") '+
'AND DATA_EMISSAO between :datai and :dataf '+
'Group By FIL_DEST '+
'ORDER BY 1 DESC';
    QueryTodas.Close; 
    QueryTodas.SQL.Text := Txt;
    QueryTodas.ParamByName('dataI').AsDate := DateTimePicker1.Date;
    QueryTodas.ParamByName('dataF').AsDate := DateTimePicker2.Date;
    QueryTodas.Open;
       FrReport3.ShowReport;
       Application.ProcessMessages;
       Aguarde.visible:=FALSE;
       end;

Note que é um codigo que esta num botão...ele tem um if se o usuario escolher TODAS(significa tudo junto entrada e saida).

neste caso eu teria que juntar o seu codigo dentro deste if junto com o meu??

se for...poderia juntar pra mim....pois não entendi direito pois no seu codigo tem uma procedure que processa junto dentro...

Grato

Link para o comentário
Compartilhar em outros sites

  • 0

Opa....

Eder, preciso de mais informações.

Se selecionado todas, você monta a QueryTodas, beleza.

R> SIM só ela...

Mas, se não for todas, como fica?

R> bom ai eu uso a QueryEntrada e QuerySaida.....uma de cada vez......tipo eu coloquei assim no combobox....

If Combobox1.text = 'saida' then

saida

If Combobox1.text = 'entrada' then

entrada

e agora então tem a todas:

If Combobox1.text = 'todas' then

...seu codigo.......

- É uma de cada vez?

- você tem um relatório para cada situação?

R> sim..fiz assim pra não ficar encalhado no relatorio, pelo menos a saida e a entrada ta prontinho, só falta a todas, neste caso o programa já esta funcionando ...e os usuarios já usam...só não habilitei ainda a TODAS no combobox....

Eu costumo fazer assim com If´s para cada situação......acho que fica mais fácil pra mim ententer o codigo e não me perder nele. :blush:

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Eder, testa aí para ver no que dá:

procedure TForm1.Button1Click(Sender :TObject);
 // acrescentamos este procedimento dentro da procedure do botão
  procedure CopiaResultados(DataSet :TDateSet);
  var
    Idx :Integer;
  begin
    DataSet.First;
    while not DataSet.EOF do
    begin
      TabTmp.Append;
      for Idx := 0 to DataSet.FieldDefs.Count -1 do
        TabTmp.Fields[Idx].Assign(DataSet.Fields[Idx]);
      TabTmp.Post;
      DataSet.Next;
    end;
  end;

begin
  ... // aqui fica o código que você já tinha
  If Combobox1.Text = 'TODAS' then
  begin
    ...
    QueryTodas.ParamByName('dataI').AsDate := DateTimePicker1.Date;
    QueryTodas.ParamByName('dataF').AsDate := DateTimePicker2.Date;
    QueryTodas.Open;
    try
      TabTmp.DatabaseName := QueryTodas.DatabaseName;
      TabTmp.TableName := 'TmpTable.db';
      TabTmp.TableType := ttParadox;

      if FileExists(TabTmp.DatabaseName +'\' +TabTmp.TableName) then
        TabTmp.DeleteTable;

      TabTmp.FieldDefs.Clear;
      TabTmp.FieldDefs.Assign(QueryTodas.FieldDefs);

      TabTmp.IndexDefs.Clear;
      TabTmp.IndexDefs.Add('', 'UNIDADE', [ixPrimary]);
      TabTmp.IndexDefs.Add('FRETE_TOTAL_IDX', 'VALOR_FRETE_TOTAL', [ixDescending]);

      TabTmp.CreateTable;

      TabTmp.IndexName := 'FRETE_TOTAL_IDX';
      TabTmp.Open;
      try

        CopiaResultados(QueryTodas);

        FrReport3.ShowReport;
      finally
        TabTmp.Close;
        TabTmp.DeleteTable;
      end;
    finally
      QueryTodas.Close;
    end;
    Application.ProcessMessages;
    Aguarde.visible:=FALSE;
  end;
... // aqui continua a parte do seu código
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Eder, esqueci de duas coisas:

1) Este novo dataset (o TTable) deve ser o utilizado no relatório, não o QueryTodos;

2) Se há a possibilidade de mais que um usuário retirar este relatório, talvez tenhamos que obter um nome temporário para o arquivo, ao invés de usar fixo.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Ola.....desculpa a demora tive que formatar minha máquina..... :blush:

e depois instalar tudo de novo.....demorou pra caramba...

mas vamos lá.

Eder, esqueci de duas coisas:

1) Este novo dataset (o TTable) deve ser o utilizado no relatório, não o QueryTodos;

R> não entendi esta parte.....o código que você passou então muda?

2) Se há a possibilidade de mais que um usuário retirar este relatório, talvez tenhamos que obter um nome temporário para o arquivo, ao invés de usar fixo.

R> este rel. só será usado por uma pessoa..... :)

Grato

Link para o comentário
Compartilhar em outros sites

  • 0
Eder, esqueci de duas coisas:

1) Este novo dataset (o TTable) deve ser o utilizado no relatório, não o QueryTodos;

R> não entendi esta parte.....o código que você passou então muda?

Não. Mas, como você já tem o relatório pronto, eu quiz salientar que você deverá definir como dataset de origem de dados para ele a tabela TabTmp (ou como você a tenha chamado) e não a QueryTodas, como eventualmente você possa ter utilizado.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Eder, provavelmente é porque houve erro na criação da tabela (CreateTable).

Pode ser em função do código que postei:

if FileExists(TabTmp.DatabaseName +'\' +TabTmp.TableName) then
        TabTmp.DeleteTable;
esse file exists está errado para o caso em que DatabaseName não é o nome de um diretório, mas sim um Alias. este código deve substituir mas corretamente as duas linhas anteriores:
try
        TabTmp.Open;
        TabTmp.Close;
        TabTmp.DeleteTable;
      except
      end;
caso a tabela seja aberta com sucesso - ela existe. Logo, deletamos ela. De qualquer modo, você observou se por acaso, o arquivo chegou a ser gerado? Assim, remotamente é complicado tentar acertar (eu testei um caso aqui, com essas características, e funcionou). Deve haver alguma coisa pegando... Tente, comentar a parte que gera os índices:
TabTmp.IndexDefs.Clear;
     // TabTmp.IndexDefs.Add('', 'UNIDADE', [ixPrimary]);
     // TabTmp.IndexDefs.Add('FRETE_TOTAL_IDX', 'VALOR_FRETE_TOTAL', [ixDescending]);

      TabTmp.CreateTable;

     // TabTmp.IndexName := 'FRETE_TOTAL_IDX';
      TabTmp.Open;

e veja se ela será criada sem problemas.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
De qualquer modo, você observou se por acaso, o arquivo chegou a ser gerado?

Assim, remotamente é complicado tentar acertar (eu testei um caso aqui, com essas características, e funcionou). Deve haver alguma coisa pegando...

Tente, comentar a parte que gera os índices:

CODE

TabTmp.IndexDefs.Clear;

// TabTmp.IndexDefs.Add('', 'UNIDADE', [ixPrimary]);

// TabTmp.IndexDefs.Add('FRETE_TOTAL_IDX', 'VALOR_FRETE_TOTAL', [ixDescending]);

TabTmp.CreateTable;

// TabTmp.IndexName := 'FRETE_TOTAL_IDX';

TabTmp.Open;

e veja se ela será criada sem problemas.

R.: Ola..fiz o que você me sugeriu.....e não deu certo não,

alias o erro deu que o arquivo não existe:

Table does not exists: TmpTable.db

ele não cria o arquivo.... :(

parte do codigo testado:

//aqui começa codigo Micheus, menos a procedura que esta acima...
try
      TabTmp.DatabaseName := QueryTodas.DatabaseName;
      TabTmp.TableName := 'TmpTable.db';
      TabTmp.TableType := ttParadox;

      TabTmp.Open;
      TabTmp.Close;
      TabTmp.DeleteTable;

      TabTmp.FieldDefs.Clear;
      TabTmp.FieldDefs.Assign(QueryTodas.FieldDefs);

      TabTmp.IndexDefs.Clear;
      //TabTmp.IndexDefs.Add('', 'UNIDADE', [ixPrimary]);
      //TabTmp.IndexDefs.Add('FRETE_TOTAL_IDX', 'VALOR_FRETE_TOTAL', [ixDescending]);

      TabTmp.CreateTable;

      //TabTmp.IndexName := 'FRETE_TOTAL_IDX';
      TabTmp.Open;
      Try

        CopiaResultados(QueryTodas);

        FrReport3.ShowReport;
      finally
        TabTmp.Close;
        TabTmp.DeleteTable;
      end;
    finally
      QueryTodas.Close;
    end;
    Application.ProcessMessages;
    Aguarde.visible:=FALSE;
  end;
          //aqui termina codigo Micheus...
FrReport3.ShowReport;
Application.ProcessMessages;
Aguarde.visible:=FALSE;
end;

:blush:

Link para o comentário
Compartilhar em outros sites

  • 0

Eder, primeiramente, para evitar problemas quando conseguir-mos resolver esta "pendenga", você deve corrigir a parte do DeleteTable. Observe que eu disse para você substituir as duas linhas pela sequencia com try..except.. end; e você não fez exatamente como eu mostrei (onde está o try... <_<).

Depois, só para ter certeza de que não há qualquer problema com acesso (na criação do arquivo), você poderia substituir (temporariamente) a linha:

TabTmp.DatabaseName := QueryTodas.DatabaseName;

por:

TabTmp.DatabaseName := 'c:\temp\'; // ou 'c:\windows\temp'

e apenas confirmando: a consulta QueryTodas já está ativa (aberta) quando o procedimento é realizado. Não está?!

Informe os resultados.

Abraços

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,2k
    • Posts
      651,9k
×
×
  • Criar Novo...