Fórum É possível ?? #307602

03/01/2006

0

Pessoal, to me batendo a um bom tempo com geradores de relatórios.
RDPrint, VDOPrint, Rave...

O negócio é que tenho extrema necessidade de impressão rápida nas
matriciais. Vou começar a explorar o Fortes agora, mas de antemão
gostaria de saber se é possível fazer um lance aqui que tenho muito
nos meus relatórios:

Um pesquisa mestre-detalhe assim:

Valor - Detalhes

5,00 - 1500 3000 5000 1254 1252 1251
..........6235 8457 5214 9874 6252 1251
..........1252 5874

6,20 - 3500 3000 5000 1254 1252 1251
..........6235 8457 5214 9874 6252 1251
..........1252 5874

( esses pontinhos são a margem )


Tive grande dificuldade para( e não consegui ) fazer isso no Rave, e
acabei desistindo pela lerdeza nas matriciais.
O RDPrint que comprei trabalha beleza, só que para gerar 30 páginas
disso ai passa quase 40 segundos !! E não é a lógica, porque no Rave
o mesmo código passa 5 segundos para gerar 60 ! E no VDOPrint é
mandado automáticamente ( tudo bem não tem visualização ). è que ele gera tudo primeiro para depois mandar para impressora, mesmo desativando o preview.

A pergunta no Fortes é :
Tem como jogar o Mestre no lado e na mesma linha dos
detalhes, que iniciam com uma margem.
Se poderem me ajudar beleza, serei um novo adpto do Fortes.

Vcs conhecem algum outro Gerador que funciona para matriciais ( com Preview ) blz ??

Obrigado.
Laelson Correia


Laelsonc

Laelsonc

Responder

Posts

04/01/2006

Joni Nunes

Caro colega, utilizo RDPrint para impressão de relatórios que geram mais 600 páginas sendo que esses relatórios possuem várias variações pois são relatórios contábeis, projeções, extrato de movimentos e não tenho problemas com performance. Dos componentes que eu e a equipe que trabalho pesquisamos (Fortes, Rave, RDPrint e outros) escolhemos o RDPrint.

Não querendo por um dúvida sua capacidade, mas sim como aprendizado e curiosidade, disponibilize o seu código para eu e outros colegas de profissão dar uma olhada e ver se podemos colaborar de uma forma mais efetiva.

Abraço.

Joni Nunes
Analista de Sistemas
jonifoz@yahoo.com.br


Responder

Gostei + 0

04/01/2006

Laelsonc

OK, obrigado por se disponibilizar a ajudar.

Coloco o código ai embaixo e gostaria que analizasse(m).
Coloquei ai só o ´1° Relatório´, Mas vai até o ´10° Relatório´ só mudando os parâmentros iniciais, são todos iguais.

Obs.: Para gerar a visualização desse relatório tah demorando 42 segundos, e sem a visualização o mesmo. Como vcs poderam ver, ele é mestre-detalhe como o exemplo na mensagem acima.

Uso dois loops, um para pegar o mestre e outro para gerar o detalhe na mesma linha e em colunas diferentes.



// Inicio...
with impressao do
begin
abrir; // inicializa o arquivo de impressao...
if setup then // abre tela para escolha da impressora e modelo...
begin


//-----------------------------------------------------------------------------
conta := 0;
cabecalho := ´´;
Linha := 1;
Limite_Linha := 62;


//******************************************************//
// 1° RELATÓRIO
//*****************************************************//
n_premio := ´1´;
n_tipo := ´M´;
cabecalho := ´----------- 1° Prêmio -----------´;

with MD.DESCARGA_MESTRE do
begin
Close;
SQL.Clear;
SQL.Add(´select desc_descarga from desc_temp where desc_id=´´+desc_id+´´ and desc_jogopremio=´´+n_premio+´°´ and desc_jogotipo=´´+n_tipo+´´ group by desc_descarga order by desc_descarga Desc;´);
Open;
end;

//Se tiver registros continue
if MD.DESCARGA_MESTRE.RecordCount > 0 then begin

if (Linha < 59) and (Linha > 5) then begin
end;

if Linha < Limite_Linha then begin
inc(Linha); inc(Linha);
impc(Linha,40, cabecalho, [Expandido,Negrito]); //AQUI É O CABEÇALHO
inc(Linha); inc(Linha);
end;

//LOOP MAIS IMPORTANTE - M1

while not MD.DESCARGA_MESTRE.Eof do begin

//Consulta os jogos com esse valor ( detalhes )
with MD.DESCARGA_DETALHE do
begin
Close;
SQL.Clear;
SQL.Add(´select desc_temp_jogo,desc_descarga from desc_temp where desc_id=´´+desc_id+´´ and desc_jogopremio=´´+n_premio+´°´ and desc_jogotipo=´´+n_tipo+´´ and desc_descarga=´´+TrocaVirgPPto(MD.DESCARGA_MESTRE.FieldByName(´desc_descarga´).AsString)+´´;´);
Open;
end;

if Linha > Limite_Linha then begin
novapagina; // Rodapé e Cabeçalho
end;

//Aqui eu imprimo o Valor -
imp(Linha,01, FormatFloat(´#,,0.00´,StrToFloat(MD.DESCARGA_MESTRE.FieldByName(´desc_descarga´).AsString))+´ - ´);

Inicio := 10; //Começar desse valor
Col := 9; // Numero de colunas
F := 1; //Incrementador
Total := MD.DESCARGA_DETALHE.RecordCount;

while not MD.DESCARGA_DETALHE.Eof do begin

if (F < Total) and (F < Col) then begin
imp(Linha,Inicio, MD.DESCARGA_DETALHE.FieldByName(´desc_temp_jogo´).AsString);
F := F + 1;
Inicio := Inicio + 8;
end else begin
imp(Linha,Inicio, MD.DESCARGA_DETALHE.FieldByName(´desc_temp_jogo´).AsString);
Inicio := 10;
F := 1;
Total := Total - Col;
inc(Linha);

if Linha > Limite_Linha then begin
novapagina; // Rodapé e Cabeçalho
end;


end;

MD.DESCARGA_DETALHE.next;
//FINALIZA OS JOGOS
end;

imp(Linha,01,´--------------------------------------------------------------------------------´);
inc(Linha);

MD.DESCARGA_MESTRE.next;
//FINALIZA VALOR
end;

cabecalho := ´´;
end; //Fim do If



//******************************************************//
// 2 ° RELATÓRIO
//*****************************************************//
...

Vai até o 10°.


//****************************************//
//
//****************************************//




fechar; // Finaliza e inicia impressao ou preview
end else
showmessage(´|--------------------------- Relatório Cancelado ---------------------------|´);
end;


Responder

Gostei + 0

04/01/2006

Laelsonc

Alguma sugestão ?


Responder

Gostei + 0

05/01/2006

Laelsonc

Alguem poderia olhar o meu código por favor ? Só pra dar uma opinião se esta certo.


Responder

Gostei + 0

05/01/2006

Emerson Nascimento

colega, creio que o seu problema de lentidão se dê por conta da abertura e fechamento dos datasets dentro da montagem do relatório. meus relatórios são praticamente instantâneos, mas eu preparo as informações antes de iniciar a impressão do relatório.


Responder

Gostei + 0

05/01/2006

Laelsonc

OK. Valeu pela dica, mas o problema é mais embaixo. Malhei o RDPrint e me redimo... rsrs.

Fiz uns testes sem o relatório e vejo que a demora é mesmo na qry do detalhe. É lá o problema de lentidão.

Daria pra alguem me dizer se existe outra maneira de fazer este Mestre-Detalhe com uma performance melhor ? Tipo os do datasource.
Uso o Zeos com Mysql.

Só pra lembrar ai como é:

5,00 - 1500 2511 2652 6587 9512
.............5487 1254 6874 1357

9,50 - 1500 2511 2652 6587 9512
.............5487 1254 6874 1357


....

Por favor, nem que seja pra dizer que tah tudo errado..rsr


Responder

Gostei + 0

05/01/2006

Emerson Nascimento

eu faria isso numa única query.


Responder

Gostei + 0

05/01/2006

Laelsonc

Cara, agradeço mesmo pela ajuda, mas não sei como fazer esse consulta Mestre-Detalhe numa mesma qry. Dá pra vc me dar um exemplo ?


Responder

Gostei + 0

05/01/2006

Emerson Nascimento

tente assim. dessa forma não é necessária uma tabela detalhe e nem utilizar recursos com recordcount e outras variáveis:

with MD.DESCARGA_MESTRE do
begin
  Close;
  SQL.Text := ´select ´+
              ´  desc_descarga, desc_temp_jogo ´+
              ´from ´+
              ´  desc_temp ´+
              ´where ´+
              ´  desc_id = ´+QuotedStr(desc_id)+
              ´  and desc_jogopremio = ´+QuotedStr(n_premio)+
              ´  and desc_jogotipo = ´+QuotedStr(n_tipo)+
              ´order by ´+
              ´  desc_descarga desc ´;
  Open;
end;

// ******************************* //
// * Se tiver registros continue * //
// ******************************* //
// não utilize recordcount se você não precisa saber
// exatamente o número de registros. se a necessidade
// é apenas saber se a tabela está vazia, utilize
// .isempty ou .eof
if not MD.DESCARGA_MESTRE.IsEmpty then
begin
  if (Linha < 59) and (Linha > 5) then
  begin
  end;

  if Linha < Limite_Linha then
  begin
    inc(Linha); inc(Linha);
    impc(Linha,40, cabecalho, [Expandido,Negrito]); //AQUI É O CABEÇALHO
    inc(Linha); inc(Linha);
  end;

  // variável para controlar a mudança de registro ´mestre´
  sMestre := ´@.x´;
  Col := 9; // Numero de colunas
  //Inicio := 10; //Começar desse valor (desnecessario)

  //LOOP MAIS IMPORTANTE - M1
  while not MD.DESCARGA_MESTRE.Eof do
  begin
    if Linha > Limite_Linha then
    begin
      novapagina; // Rodapé e Cabeçalho
      sMestre := ´@.x´; // assim repete o "desc_descarga" na nova página
    end;

    //Aqui eu imprimo o Valor de "desc_descarga"
    if MD.DESCARGA_MESTRE.FieldByName(´desc_descarga´).AsString <> sMestre then
    begin
      sMestre := MD.DESCARGA_MESTRE.FieldByName(´desc_descarga´).AsString;
      imp(Linha,01,FormatFloat(´#,,0.00´,StrToFloat(sMestre))+´ - ´);
      F := 1; //Incrementador
    end;

//    Total := MD.DESCARGA_DETALHE.RecordCount; // variavel desnecessaria
//    além de desnecessária, tornava o sistema mais lento...

    imp(Linha,10 + (8 * (F - 1)), MD.DESCARGA_MESTRE.FieldByName(´desc_temp_jogo´).AsString);

    Inc(F);

    if F >= Col then
    begin
      inc(Linha);
      F := 1;
    end;

    MD.DESCARGA_MESTRE.next;

    if MD.DESCARGA_MESTRE.FieldByName(´desc_descarga´).AsString <> sMestre then
    begin
      imp(Linha,01,´--------------------------------------------------------------------------------´);
      inc(Linha);
    end;
    //FINALIZA VALOR
  end;

  cabecalho := ´´;
end; //Fim do If


obs.: não testei esse código.


Responder

Gostei + 0

05/01/2006

Laelsonc

Cara, to fazendo os primeiros testes aqui e tah show de bola !!!
Até agora to tonto..rsrsrs

Valeus, assim que terminar te falo ok.


Responder

Gostei + 0

05/01/2006

Laelsonc

Cara, como disse tah muito show.
Você fez tudo !! Muito obrigado.

Só não to, a princípio, conseguindo controlar a distância entre as colunas porque so tras oito, quando mudo para nove ela sai da página. E em algumas linhas ela salta duas vezes.

[b:e75a630d88]Mas muito obrigado rapaz.[/b:e75a630d88]

:D Laelson Correia


Responder

Gostei + 0

06/01/2006

Emerson Nascimento

para o numero de colunas correto, altere o trecho de código:
    if F >= Col then 
    begin 
      inc(Linha); 
      F := 1; 
    end;


para:
    if F > Col then 
    begin 
      inc(Linha); 
      F := 1; 
    end;


uma coisa: o salto de linhas pode ser comprometido dependendo do número de colunas da sua página.
se seu formulário for de 80 colunas, numa impressora de 80 colunas, poderá haver um ´estouro´ na largura dependendo das informações impressas e isso gera um salto de linha automático. mas é um problema fácil de avaliar e resolver.

outra coisa: o tempo para a geração do relatório melhorou?


Responder

Gostei + 0

06/01/2006

Laelsonc

Sim, o tempo melhorou. Como vc disse, ficou quase instantâneo !!
Vou só terminar, porque são dez ´joguinhos´ desse código, dentro do mesmo relátório, mudando apenas os parâmentros, daí avalio o final. Mas creio que melhor do que isso vai ser mesmo difícil. Sinceramente ainda to tentando entender como funciona essa lógica, aquele lance com a variável ´sMestre := ´@.x´;´ não entendi até agora..rsrs. :roll:

Mas isso é para com o tempo. É bom saber que existe jeito pra tudo na programação. Bom saber que existe pessoas dispostas a ajudar.

Eu ja havia alterado o lance das colunas, mas mesmo assim continua. Vou olhar com mais cuidado o que pode ser, daí te aviso.

Eu vou mecher nele hoje a tarde porque tenho compromissos pela manhã.
Obrigado.

Laelson Correia


Responder

Gostei + 0

06/01/2006

Emerson Nascimento

só mais uma coisa: você não precisa ter dez joguinhos desse código se a única diferença estiver nos parâmetros passados para a query; faça tudo dentro de um laço for..next e tenha somente um ´conjunto´ do código:

// "i" é uma variável do tipo shortint
for i := 1 to 10 do
begin
  // esse "case" poderia ser substituido por um array...
  case i of
    1: begin
         cabecalho := ´cabecalho para jogo 1´
         desc_id := ´valor 1´;
         n_premio := ´valor 1´;
         n_tipo := ´valor 1´;
       end;
    2: begin
         cabecalho := ´cabecalho para jogo 2´
         desc_id := ´valor 2´;
         n_premio := ´valor 2´;
         n_tipo := ´valor 2´;
       end;
    3: begin
         cabecalho := ´cabecalho para jogo 3´
         desc_id := ´valor 3´;
         n_premio := ´valor 3´;
         n_tipo := ´valor 3´;
       end;
    4: begin
         cabecalho := ´cabecalho para jogo 4´
         desc_id := ´valor 4´;
         n_premio := ´valor 4´;
         n_tipo := ´valor 4´;
       end;
    5: begin
         cabecalho := ´cabecalho para jogo 5´
         desc_id := ´valor 5´;
         n_premio := ´valor 5´;
         n_tipo := ´valor 5´;
       end;
    6: begin
         cabecalho := ´cabecalho para jogo 6´
         desc_id := ´valor 6´;
         n_premio := ´valor 6´;
         n_tipo := ´valor 6´;
       end;
    7: begin
         cabecalho := ´cabecalho para jogo 7´
         desc_id := ´valor 7´;
         n_premio := ´valor 7´;
         n_tipo := ´valor 7´;
       end;
    8: begin
         cabecalho := ´cabecalho para jogo 8´
         desc_id := ´valor 8´;
         n_premio := ´valor 8´;
         n_tipo := ´valor 8´;
       end;
    9: begin
         cabecalho := ´cabecalho para jogo 9´
         desc_id := ´valor 9´;
         n_premio := ´valor 9´;
         n_tipo := ´valor 9´;
       end;
    else
       begin
         cabecalho := ´cabecalho para jogo 10´
         desc_id := ´valor 10´;
         n_premio := ´valor 10´;
         n_tipo := ´valor 10´;
       end;
  end;

  with MD.DESCARGA_MESTRE do
  begin
    Close;
    SQL.Text := ´select ´+
                ´  desc_descarga, desc_temp_jogo ´+
                ´from ´+
                ´  desc_temp ´+
                ´where ´+
                ´  desc_id = ´+QuotedStr(desc_id)+
                ´  and desc_jogopremio = ´+QuotedStr(n_premio)+
                ´  and desc_jogotipo = ´+QuotedStr(n_tipo)+
                ´order by ´+
                ´  desc_descarga desc ´;
    Open;
  end;

  // ******************************* //
  // * Se tiver registros continue * //
  // ******************************* //
  // não utilize recordcount se você não precisa saber
  // exatamente o número de registros. se a necessidade
  // é apenas saber se a tabela está vazia, utilize
  // .isempty ou .eof
  if not MD.DESCARGA_MESTRE.IsEmpty then
  begin
    if (Linha < 59) and (Linha > 5) then
    begin
    end;

    if Linha < Limite_Linha then
    begin
      inc(Linha); inc(Linha);
      impc(Linha,40, cabecalho, [Expandido,Negrito]); //AQUI É O CABEÇALHO
      inc(Linha); inc(Linha);
    end;

    // variável para controlar a mudança de registro ´mestre´
    sMestre := ´@.x´;
    Col := 9; // Numero de colunas
    //Inicio := 10; //Começar desse valor (desnecessario)

    //LOOP MAIS IMPORTANTE - M1
    while not MD.DESCARGA_MESTRE.Eof do
    begin
      if Linha > Limite_Linha then
      begin
        novapagina; // Rodapé e Cabeçalho
        sMestre := ´@.x´; // assim repete o "desc_descarga" na nova página
      end;

      //Aqui eu imprimo o Valor de "desc_descarga"
      if MD.DESCARGA_MESTRE.FieldByName(´desc_descarga´).AsString <> sMestre then
      begin
        sMestre := MD.DESCARGA_MESTRE.FieldByName(´desc_descarga´).AsString;
        imp(Linha,01,FormatFloat(´#,,0.00´,StrToFloat(sMestre))+´ - ´);
        F := 1; //Incrementador
      end;

  //    Total := MD.DESCARGA_DETALHE.RecordCount; // variavel desnecessaria
  //    além de desnecessária, tornava o sistema mais lento...

      imp(Linha,10 + (7 * (F - 1)), MD.DESCARGA_MESTRE.FieldByName(´desc_temp_jogo´).AsString);

      Inc(F);

      if F > Col then
      begin
        inc(Linha);
        F := 1;
      end;

      MD.DESCARGA_MESTRE.next;

      if MD.DESCARGA_MESTRE.FieldByName(´desc_descarga´).AsString <> sMestre then
      begin
        imp(Linha,01,´--------------------------------------------------------------------------------´);
        inc(Linha);
      end;
      //FINALIZA VALOR
    end;

  end; // fim do if
end; // fim do for



Responder

Gostei + 0

06/01/2006

Laelsonc

Simplesmente demais. Tudo certo, tudo ok.

Valeu amigo. Quaannndooo vc poder comentar esse código, acho que vai ajudar muita gente assim como eu.

Do mais, obrigado mesmo.


Responder

Gostei + 0

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

Aceitar