Fórum É possível ?? #307602
03/01/2006
0
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
Curtir tópico
+ 0Posts
04/01/2006
Joni Nunes
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
Gostei + 0
04/01/2006
Laelsonc
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;
Gostei + 0
04/01/2006
Laelsonc
Gostei + 0
05/01/2006
Laelsonc
Gostei + 0
05/01/2006
Emerson Nascimento
Gostei + 0
05/01/2006
Laelsonc
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
Gostei + 0
05/01/2006
Emerson Nascimento
Gostei + 0
05/01/2006
Laelsonc
Gostei + 0
05/01/2006
Emerson Nascimento
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.
Gostei + 0
05/01/2006
Laelsonc
Até agora to tonto..rsrsrs
Valeus, assim que terminar te falo ok.
Gostei + 0
05/01/2006
Laelsonc
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
Gostei + 0
06/01/2006
Emerson Nascimento
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?
Gostei + 0
06/01/2006
Laelsonc
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
Gostei + 0
06/01/2006
Emerson Nascimento
// "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
Gostei + 0
06/01/2006
Laelsonc
Valeu amigo. Quaannndooo vc poder comentar esse código, acho que vai ajudar muita gente assim como eu.
Do mais, obrigado mesmo.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)