Criar etiqueta no Delphi FastReport - Pulando etiquetas


Continuação do artigo abaixo
https://anaprogramadorajunior.blogspot.com.br/2015/12/criar-etiqueta-no-fastreport.html

Vamos falar de impressão de etiquetas, impressão escolhendo a quantidade de etiquetas a serem impressas e a quantidade a ser pulada (Digamos que já foi utilizada as 4 primeiras etiquetas)
O nosso problema seria algo semelhante a um usuário utilizou algumas etiquetas da folha, e precisamos "pular" esses espaços, para não precisar reimprimir em uma nova folha. 

Vou utilizar um TClientDataSet "cdsProdutos" para pegar os produtos ( Pré cadastrados ) mas vocês fazem as devidas conexões de banco de dados! 
Já o TClientDataSet "CDSEtiquetas" irá precisar ser um TClientDataSet mesmo para jogarmos nossa informação a ser impressa nele! 

Vamos precisar de:
  • 2 - TClientDataSet
  • 3 - TBitBtn
  • 1 - TfrxReport
  • 1 - TfrxDBDataset
  • 1 - TDataSource
  • 1 - TDBGrid
  • 1 - TEdit
  • 1 - TLabel
Vamos renomear os 3 botões
Um botão com "Imprimir", outro com "Visualizar" e o ultimo com "Fechar";

Renomeie os TClientDataSet como "cdsProdutos" e o outro como "cdsEtiquetas";

Na tabela cdsEtiquetas crie os campos 
  • DESCRICAO - tipo = Varchar(100)
  • CODBARRAS - Tipo = Varchar(25)
Na tabela cdsProdutos crie os campos 
  • DESCRICAO - tipo = Varchar(100)
  • CODBARRAS - Tipo = Varchar(25)
  • QUANTIDADE - Tipo = Integer
Em seguida vamos colocar os outros componentes da seguinte forma:
O campo "Inicio com etiquetas em branco" irá determinar a quantidade de etiquetas que iremos pular no começo.
Vincule ao TDBGrid a tabela cdsProdutos que contem o campo "Quantidade".
Adicione os campo ao TDBGrid bloqueia a edição em todos campo exceto o da "Quantidade";
De um duplo clique sobre o  TDBGrid Abrira uma tela com os campo que estão adicionados em tela, selecione todos exceto o "Quantidade" e nas propriedades marque "ReadOnly" como "True"

Agora vamos ao código:

1º Passo: Vamos criar a procedure EtiquetasEmBranco, será importante para criar etiquetas em branco no inicio (As já utilizadas)
procedure TFSistema.EtiquetasEmBranco;
var
  li: Integer;
begin
  for li := 0 to StrToInt(edEmBranco.Text) - 1 do begin
    cdsEtiquetas.Append;
    cdsEtiquetas.Post;
  end;
end;
Aqui fazemos um laço de repetição For para criar a quantidade de registro de acordo com a quantidade digitada no campo de "Inicio com etiquetas em branco"

2º Passo: Criaremos a procedure CriarOuLimpar para criar o nosso cliente ou limpar em caso de reimpressão sem sair da tela.
procedure TFSistema.CriarOuLimpar;
begin
  if cdsEtiquetas.Active then
    cdsEtiquetas.EmptyDataSet
  else
    cdsProdutos.CreateDataSet;
end;

3º Passo: Já no botão "Visualizar" vem a magica vamos utilizar nossas procedures e fazer a visualização da nossa etiqueta: 
procedure TFSistema.btnVisualizarClick(Sender: TObject);
begin
  if cdsEtiquetas.IsEmpty then begin
    Application.MessageBox(Pchar('Seleção sem registros'), Pchar(Caption), MB_ICONINFORMATION + MB_OK + MB_DEFBUTTON1 + MB_SYSTEMMODAL);
    Exit;
  end;
  if Ler_Arquivo('Etiquetas_6x16.fr3') then begin
    CriarOuLimpar;
    EtiquetasEmBranco;
    PreencherOsProdutos;
    frxTable.DataSet := cdsEtiquetas; {Joga a tabela de etiquetas para o relaório}
    if Sender = btnVisualizar then
      frxReport.ShowReport
    else begin
      frxReport.PrepareReport;
      frxReport.Print;
    end;
  end;
end;

4º Passo: E coloque o mesmo evento para o botão "Imprimir" não é necessário replicar o código e só colocar o mesmo evento no botão 

Resultados



4 comentários:

  1. Desculpe a demora, eu tinha feito algo parecido, o código ficou assim:

    if dsEtiqueta.IsEmpty then
    begin
    Application.MessageBox('Nenhum dado foi retornado! Verifique os parâmetros de impressão','Erro',mb_Ok+mb_IconError);
    end
    else
    begin
    cdsRel.Close;
    cdsRel.CreateDataSet;
    while not dsEtiqueta.Eof do
    begin
    for i:=1 to j do {j é a quantidade}
    begin
    cdsRel.Insert;
    cdsRelCC_COD.AsString:= dsEtiquetaCC_COD.AsString; {codigo do produto}
    cdsRelCC_DESC.AsString:= dsEtiquetaCC_DESC.AsString; {descricao do produto}
    cdsRel.Post;
    end;
    dsEtiqueta.Next;
    end;
    relEtiqueta.PrepareReport();
    relEtiqueta.ShowReport();
    end;

    Então utilizei dois datasets, enquanto a quantidade for menor ou igual ao que o usuário digitar o dsEtiqueta irá inserir as informações no cdsRel, e o cdsRel passa as informações para o relatório.

    Muito obrigado pela ajuda! Seu blog é show!

    ResponderExcluir
  2. Boa tarde Ana Paula Novello, foi mostrado um exemplo nesse tópico com etiquetas que a pessoa escolhe a quantidade que vai ficar em branco, eu queria que a cada vez que imprimisse ela pulava uma linha, como faço isso, eu fiz assim mais não esta dando certo!

    procedure TFm_livros.EtiquetasEmBranco;
    var
    li,cont: Integer;
    begin

    for li := 0 to cont -1 do
    begin
    dm.cdsEtiquetas.Append;
    dm.cdsEtiquetas.Post;
    cont:=cont+1;
    end;
    end;

    ResponderExcluir
  3. Bom dia Diogo! Não seria pular a quantidade de etiquetas que completa a linha?
    Ex: Se a linha tem 4 etiquetas então se pula as 4 etiquetas ou em caso de etiqueta em rolo que é uma por linha?

    ResponderExcluir