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
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... ).

R.: perdão não tinha entendido direito...

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'

R: ok..

e apenas confirmando: a consulta QueryTodas já está ativa (aberta) quando o procedimento é realizado. Não está?!
R: sim..antes de começar sem codigo ela é aberta veja:

....
QueryTodas.ParamByName('dataI').AsDate := DateTimePicker1.Date;
QueryTodas.ParamByName('dataF').AsDate := DateTimePicker2.Date;
QueryTodas.Open;

  //aqui começa micheus
try
    //TabTmp.DatabaseName := QueryTodas.DatabaseName;
      TabTmp.DatabaseName := 'c:\temp'; // ou 'c:\windows\temp'
      TabTmp.TableName := 'TmpTable.db';
      TabTmp.TableType := ttParadox;
....
Informe os resultados.
R: não esta criando o arquivo temporaria...veja o erro:
TABLE DOES NOT EXIST. 
FILE: C:\TEMP\TMPTABLE.DB
SEGUE baixo como esta a parte do seu codigo:
....
QueryTodas.ParamByName('dataI').AsDate := DateTimePicker1.Date;
QueryTodas.ParamByName('dataF').AsDate := DateTimePicker2.Date;
QueryTodas.Open;

  //aqui começa codigo micheus
try
    //TabTmp.DatabaseName := QueryTodas.DatabaseName;
      TabTmp.DatabaseName := 'c:\temp'; // ou 'c:\windows\temp'
      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 parte do Micheus


FrReport3.ShowReport;
Application.ProcessMessages;
Aguarde.visible:=FALSE;
end;

Grato

t+

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Eder, desculpe-me a demora em postar a resposta.

Seguinte, criei uma tabela com a estrutura da sua para os testes e descobri que o problema está com a criação do índice. Por algum motivo (que nem vou tentar decifrar), o componente/drive não estão operando corretamente com um campo tipo float.

Para contornar o problema, criaremos a tabela e populamos ela. Após isto, faremos uso de instrução SQL para a criação do índice. Definiremos uma variável local para criar a query dinamicamente:

var
  ...
  QryTmp :TQuery;
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 TabTmp.Exists then
        TabTmp.DeleteTable;

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

      TabTmp.CreateTable;
      TabTmp.Open;
      try
        CopiaResultados(QueryTodas);

       // criação do componente query dinamicamente
        QryTmp := TQuery.Create(Self);
        try
          QryTmp.DatabaseName := TabTmp.DatabaseName;
         // instrução SQL para criação do índice
          QryTmp.SQL.Add('create DESC index idxValor on TmpTab (VALOR_FRETE_TOTAL)');
          QryTmp.ExecSQL;
        finally
          QryTmp.Free;
        end;
      // definimos o índice para a tabela
        TabTmp.IndexName := 'idxValor';

        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;

Bom, em meus testes isto resolveu o problema. Confira como ficará com você.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Guest ederdias
Eder, desculpe-me a demora em postar a resposta.
R.: Oba sem problemas...também tava ocupado esta semana...nem entrei no forum...hoje é que entrei.....rs.

Seguinte, criei uma tabela com a estrutura da sua para os testes e descobri que o problema está com a criação do índice. Por algum motivo (que nem vou tentar decifrar), o componente/drive não estão operando corretamente com um campo tipo float.

Para contornar o problema, criaremos a tabela e populamos ela. Após isto, faremos uso de instrução SQL para a criação do índice. Definiremos uma variável local para criar a query dinamicamente:

R: Ok. fiz o que me indicou...porem o erro persiste, agora diferente....

erro:

TABLE DOES NOT EXIST
file or directory does not exist.
file: C:\XXX\YYY\TmpTab.db
      C:\XXX\YYY\TmpTab.dbf
      C:\XXX\YYY\TmpTab.txt
      C:\XXX\YYY\TmpTab.
nesta linha:
QryTmp.ExecSQL;

Não esta criando a tabela né??.....TmpTab.db

Grato

Bom final de seman..

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0
nesta linha:

QryTmp.ExecSQL;

Não esta criando a tabela né??.....TmpTab.db

É parece que não :angry:

Eder, baixe este exemplo anexo e coloque em uma pasta qualquer (de preferência no mesmo disco em que a sua base está - mas não ma mesma pasta, porque tem um arquivo com o mesmo nome que o seu) compile ele e execute para ver no que dá. Por aqui funciona perfeitamente.

Abraços

TstGeraTable.zip

Link para o comentário
Compartilhar em outros sites

  • 0
É parece que não

Eder, baixe este exemplo anexo e coloque em uma pasta qualquer (de preferência no mesmo disco em que a sua base está - mas não ma mesma pasta, porque tem um arquivo com o mesmo nome que o seu) compile ele e execute para ver no que dá. Por aqui funciona perfeitamente.

Abraços

Arquivo(s) anexado(s)

TstGeraTable.zip ( 3.02KB ) Downloads: 1

R.: Oba Micheus...Bdia..

Este arquivo eu bauxei...mas ele esta com problema......parece corrompido. :blush:

Haaa...não consegui responder a sua mensagem privada...mas entendi e já fiz o que me pediu... :)

valeu

Link para o comentário
Compartilhar em outros sites

  • 0

Depois de várias tentativas...

deu certo.. :)

valeu Micheus pela solução :D

Grande abraço e muito grato

codigo que resolveu o problema:

If Combobox1.Text = 'TODAS' then
  begin
  //determina o nr de filiais do ranking
    FrDbDataSet3.RangeEndCount:=StrToInt(EditNrClientes.text);
    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';
  // Esta consulta faz a totalização por unidade de origem e une resultados
    QueryTodas.Close;
    QueryTodas.SQL.Text := Txt;
    QueryTodas.ParamByName('dataI').AsDate := DateTimePicker1.Date;
    QueryTodas.ParamByName('dataF').AsDate := DateTimePicker2.Date;
    QueryTodas.Open;
    try
    // Criação de tabela temporária para viabilizar agrupamento por unidades
      TabTmp.DatabaseName := QueryTodas.DatabaseName;
      TabTmp.TableName := 'TmpTab.db';
      TabTmp.TableType := ttParadox;

      if TabTmp.Exists then
        TabTmp.DeleteTable;

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

      TabTmp.IndexDefs.Clear;
      TabTmp.CreateTable;
      try
        TabTmp.Open;
        try
        // popula a tabela temporária com os dados da consulta anterior - em QueryTodas
          CopiaResultados(QueryTodas);
        finally
          TabTmp.Close;
        end;

//*** AQUI FICOU O QUE PASSEI POR ÚLTIMO - INÍCIO

      // reaproveitamos a QueryTodas para fazer o somatório dos campos, agrupados 
      // por UNIDADE e ordenados em ordem decrescente do campo 1 (VALOR_FRETE_TOTAL)
        QueryTodas.Close;
        QueryTodas.SQL.Clear;
        QueryTodas.SQL.Add('select SUM(VALOR_FRETE_TOTAL) as VALOR_FRETE_TOTAL,');
        QueryTodas.SQL.Add(       'SUM(CONTADOR_TOTAL) AS CONTADOR_TOTAL,');
        QueryTodas.SQL.Add(       'SUM(KG_CALCULO_TOTAL) AS KG_CALCULO_TOTAL,');
        QueryTodas.SQL.Add(       'SUM(VALOR_N_FISCAL_TOTAL) AS VALOR_N_FISCAL_TOTAL,');
        QueryTodas.SQL.Add(       'UNIDADE');
        QueryTodas.SQL.Add('from TmpTab');
        QueryTodas.SQL.Add('group By UNIDADE');
        QueryTodas.SQL.Add('order by 1 desc');
        QueryTodas.Open;

//*** FIM ***********************************

      // O relatório deve mostrar os dados retornados pelo dataset QueryTodas
        FrReport3.ShowReport;

      finally
       QueryTodas.Close;
       TabTmp.DeleteTable;
      end;
    finally
      QueryTodas.Close;
    end;
    Application.ProcessMessages;
    Aguarde.visible:=FALSE;
   //aqui termina
  End;
END;

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...