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

Tamanho de banda


DiabloX3

Pergunta

Pessoal, tenho uma dúvida simples. Estou imprimindo um formulário de nota fiscal no Fortes Report. Minha dúvida é quanto ao conotrole do tamanho da banda Detail.

Imaginemos que por padrão ela não possa exceder uma Height de 200. Então tenho uma banda Header inicialmente com os dados do cabeçalho da nota e logo após essa banda Detail. Defini um autosize False e expandi mas na hora já pensei que não seria conveninente porque para mais de um registro ela duplicaria o tamanho da altura e os itens não sairiam grudadinhos um nos outros. Então andei pesquisando e uma opção que me pareceu agradável foi mexer na propriedade Options da banda e setar boOptimisticPageBreak para True pois segundo documentação diz que

Quebra de página otimista. O cálculo de espaço para forçar a quebra de página é feito somente após a renderização da band. Assim, o usuário pode modificar a altura da band e interferir na decisão da quebra

Seria essa mesma a opção adequada? Eu setei para True mas não vi diferenças.

A lógica de impressão seria mais ou menos essa: se imprimir até 15 itens a banda detail continua com Height de 200 e finaliza a impressão com o Footer (Transportadora etc...). Se possuir menos de 15 então os itens devem sair juntinhos linha abaixo de linha (no exemplo anterior também, claro) mas o que faltar para atingir os 15 itens que dá a altura de 200 pra banda deve ser, digamos assim, "impresso invisivel" só para não desconfigurar a banda Footer e se possuir mais de 15 registros então continuaria em outra Nota Fiscal.

Não consegui fazer esse controle de "travar" a banda detail para sempre sair do mesmo tamanho. Como fazer?

Abraço

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

imagine a banda de Detail com apenas o tamanho de uma unica linha ( altura e comprimento )

o controle dos itens impressos voce faz tipo um contador nesta banda ... use um dos componentes que estão na banda para fazer o controle ( pelo Evento OnPrint do componente )

se ultrapassar um determinado numero de itens, voce zera o contador e dá o comando newpage

Eu prefiro usar para imprimir itens em notas fiscais um Label ou um Memo, o controle fica muito mais facil

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Interessante essa questão do label e memo aí, vou até dar uma verificada também.

Sobre o controlador de registros eu já dei uma pesquisada e até vi um tópico seu falando sobre isso (fazer um controlador a : integer e testar enquanto ele não for = a 10 p.e).

Enquanto postei a dúvida aqui, continuei dando uma procurada e achei algo um tanto interessante também, talvez nos ajude. Testei aqui e parece funcionar.

Coloquei uma banda de detail como já estava fazendo e deixei ela exatamente do tamanho dos RLDBText. Depois coloquei abaixo dela uma ColumnFooter e deixei ela com um Height fixa.

Será que assim dá certo também e agora é só eu controlar o avanço do dataset no onNeedData?

Eu pesquisei também outras 2 possibilidades mas achei que não estão funcionando ou não entendi o que elas fazem realmente.

Uma é a propriedade RealBounds da banda que diz fixar o tamanho desejado.

Outra é a Completion que fala completar com bandas em branco até o ParentPager (também não sei o que seria isso).

Você já testou colocando essa banda em branco? Ou testou alguma dessas propriedades? Funciona?

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Coloquei uma banda de detail como já estava fazendo e deixei ela exatamente do tamanho dos RLDBText. Depois coloquei abaixo dela uma ColumnFooter e deixei ela com um Height fixa.

Será que assim dá certo também e agora é só eu controlar o avanço do dataset no onNeedData?

Sim ... é uma outra maneira de se fazer

Na minha Nota fiscal usei uma banda de Detail de tamanho fixo e coloquei Labels para cada uma das colunas tambem com tamanhos fixos, desta maneira achei mais facil controlar a quantidade de itens que eu colocaria neles para cada pagina

se o numero de itens ultrapassar o limite para cada um dos labels é gerada uma nova pagina

Eu pesquisei também outras 2 possibilidades mas achei que não estão funcionando ou não entendi o que elas fazem realmente.

Uma é a propriedade RealBounds da banda que diz fixar o tamanho desejado.

Outra é a Completion que fala completar com bandas em branco até o ParentPager (também não sei o que seria isso).

Você já testou colocando essa banda em branco? Ou testou alguma dessas propriedades? Funciona?

Não sei te dizer, pois não cheguei a testar isso

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, deve dar certo, só falta fazer um último teste: controlar o onNeedData.

Eu acho estranho no fortes report as bandas detail e subdetail. Se eu colocar um detail e dentro dela um subdetail não mostra itens nenhum (mesmo fazendo as ligações de datasource etc) agora se faço o contrário aí sim consigo ver os itens. Ainda não descobri o porque. Se voce souber (ou se estou implementando algo errado ...)

Mas a dúvida mesmo é a seguinte

procedure Tfrm_gabarito_nf.frGabaritoNFBeforePrint(Sender: TObject;
  var PrintIt: Boolean);
begin
  
  qtd_impressa := 0;
  qry_gabarito_rel.First;

end;
procedure Tfrm_gabarito_nf.RLSubDetail1NeedData(Sender: TObject;
  var MoreData: Boolean);
begin

  while not qry_gabarito_rel.Eof do
  begin
    Inc(qtd_impressa);
    MoreData := qtd_impressa < 16;

    if MoreData then
      qry_gabarito_rel.Next;
  end;

end;

Aí na programação não está totalmente correto pois falta a parte do else para forçar nova página caso passe de 15 itens lançados na nota. Mas como não estou conseguindo imprimir nem os 15 primeiros preciso fazer por partes.

Há erros nessas linhas? Ou nos eventos?

O datasource do TRLReport e do Subdetail não estao setados

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

//Edit - faltou o começo da procedure

Novo código

procedure Tfrm_gabarito_nf.frGabaritoNFNeedData(Sender: TObject;
  var MoreData: Boolean);
begin

  if qry_gabarito_itens.RecordCount > 15 then
  begin
    MoreData := not qry_gabarito_itens.RecordCount < 16;
    if MoreData = False then
      frGabaritoNF.NewPage;
    qry_gabarito_itens.Next;  
  end;

  MoreData := not qry_gabarito_itens.Eof;
  qry_gabarito_itens.Next;
end;

Engraçado que eu tenho 3 registros e só está mostrando 2 ...

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

  • 0

procedure Tfrm_gabarito_nf.frGabaritoNFNeedData(Sender: TObject;
  var MoreData: Boolean);
begin

  if qry_gabarito_itens.RecordCount > 15 then
  begin
    MoreData := not qry_gabarito_itens.RecordCount < 16;
    if MoreData = False then
      frGabaritoNF.NewPage;
    qry_gabarito_itens.Next;  
  end;

  MoreData := not qry_gabarito_itens.Eof;
  qry_gabarito_itens.Next;
end;

if qry_gabarito_itens.RecordCount > 15 then

Veja que se seu recordcount não for maior que 15 esta rotina não será executada

Engraçado que eu tenho 3 registros e só está mostrando 2 ...

Isso porque ele para no ultimo registro da tabela, então voce tem que fazer uma ultima leitura para este registro

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
if qry_gabarito_itens.RecordCount > 15 then

Veja que se seu recordcount não for maior que 15 esta rotina não será executada

Sim, se o dataset tiver mais que 15 registros eu vou forçar uma nova página, senão ele imprimirá os 14 por exemplo em uma única nota fiscal.

Engraçado que eu tenho 3 registros e só está mostrando 2 ...

Isso porque ele para no ultimo registro da tabela, então voce tem que fazer uma ultima leitura para este registro

abraço

fazer uma ultima leitura no evento onNeedData mesmo? Pelo visto ninguém teve essa dúvida no google nem aqui no fórum. O que talvez poderia ser feito é fazer essa leitura em um onNeedData do SubDetail, mas não trabalho com essa banda. Não consegui achar uma solução cabível até o momento para isso. E é o primeiro registro que ele não está mostrando. Quando passo o debug pelo preview ele entra no evento onNeedData pela 1x e depois ele entra denovo quando aperto F9 e daí MoreData já vai para False sem mesmo ter impresso o 1° item. Antes eu achava que era por causa do FormRel.Prepare mas eu tirei e continua a mesma coisa.

Link para o comentário
Compartilhar em outros sites

  • 0
Quando passo o debug pelo preview ele entra no evento onNeedData pela 1x e depois ele entra denovo quando aperto F9 e daí MoreData já vai para False sem mesmo ter impresso o 1° item

Tente assim:

var 
   c : integer = 1;

procedure Tfrm_gabarito_nf.frGabaritoNFNeedData(Sender: TObject;
  var MoreData: Boolean);
begin

   MoreData := (c < qry_gabarito_itens.RecordCount );
   if MoreData then
      begin
         if c > 15 then
            begin
               frGabaritoNF.PreviewModal;
               frGabaritoNF.NewPage;
            end; 
             
            qry_gabarito_itens.Next;
      end
   else
      begin
         frGabaritoNF.PreviewModal;
         exit;
      end;

   inc(c);

end;

procedure Tfrm_gabarito_nf.frGabaritoNFAfterPrint(Sender: TObject);
begin
   c := 1;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

else
      begin
         frGabaritoNF.PreviewModal;
         exit;
      end;

Tive apenas que tirar esse Preview daí porque senão entrava em um laço infinito (não me pergunte porque - no debug não saía dessa linha) visto que eu já chamo o preview no botão Imprimir do formulário de nota, mas infelizmente aconteceu a mesma coisa depois que comentei essa linha .. eu busquei um registro com 4 itens e no visualizar mostra 3.

-edit-

tinha apertado enviar antes de concluir

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

  • 0
Tive apenas que tirar esse Preview daí porque senão entrava em um laço infinito
Estranho .. porque mesmo que entrasse nessa parte do código MoreData estaria false e existe um comando exit

eu busquei um registro com 4 itens e no visualizar mostra 3.

então deixe c = 0

uso esta rotina e não tenho nenhum problema ... funciona perfeitamente

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Se o método PreviewModal for = ao ShowModal do form então o Exit só seria executado depois que eu fechasse o form. Como ele dá o previewmodal e volta pro

MoreData := (c < qry_gabarito_itens.RecordCount );

eu não chego a fechar o form nenhuma vez, por isso ele não entra no exit e sim em um laço infinito.

Sobre o c = 0 continua mostrando 3 itens, mesmo iniciando ele zerado e no AfterPrint.

Como ninguém aqui tem um pouco de paciência e nem muito tempo (não sei se aí com voce é assim também) eles resolveram por hora deixar em apenas uma nota porque caberá todos os itens (não vão vender mais que 15 itens por nota, então vou deixar o relatório ligado ao datasource mesmo e só controlar o tamanho da banda pra aumentar e diminuir. Quando for pegar essa parte denovo eu volto a estudar essa rotina. De qualquer forma agradeço a atenção e a ajuda mais uma vez!

Se puder dá uma olhada no post que te perguntei sobre os flags no tópico Commit X IBX ;)

Abraço

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...