PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 25 → Relatório com uma ou mais cópias de impressão de pedido - Reporter with 2 copy (2 pages)
Relatório com uma ou mais cópias de impressão de pedido - Reporter with 2 copy (2 pages)
Iniciado por Boller, jul., 10 2025 12:30 AM - 3 respostas
Membro registado
4.618 mensagems
Publicado em julho, 10 2025 - 12:30 AM
Para atender à sua solicitação de gerar um PDF com a explicação detalhada dos quatro exemplos de impressão de relatórios no WinDev, com comentários nas linhas de código e texto em português, mas com o código em inglês (usando WLanguage), vou estruturar o conteúdo de forma clara e organizada. Como não posso gerar diretamente um arquivo PDF, fornecerei o conteúdo formatado que você pode usar para criar o PDF (por exemplo, colando em um editor de texto como Microsoft Word ou Google Docs e exportando como PDF).


O conteúdo incluirá:


• Introdução: Explicação do contexto e suposições.
• Passo a Passo: Detalhamento dos quatro exemplos (perguntar cópia e preview, perguntar cópia sem preview, uma folha sem perguntas, duas cópias sem perguntas).
• Código Comentado: Cada exemplo terá o código em WLanguage com comentários detalhados em português para cada linha.
• Instruções para PDF: Sugestões para criar o arquivo PDF a partir do conteúdo.
Conteúdo para o PDF


Gerenciamento de Impressão de Relatórios no WinDev: Quatro Exemplos
Introdução
Este documento detalha como configurar um relatório no WinDev para imprimir cópias de um pedido com base no número do pedido informado em uma tela. O relatório (RPT_Order) usa uma query (QRY_Order) que filtra dados com base no parâmetro order_number. A tela (WIN_OrderForm) contém um campo de edição (EDT_OrderNumber) e um botão (BTN_Print) para disparar a impressão. O objetivo é implementar quatro cenários diferentes:

1 Exemplo 1: Perguntar se o usuário deseja uma segunda cópia (Sim/Não) e se deseja visualização prévia (preview).

2 Exemplo 2: Perguntar se o usuário deseja uma segunda cópia (Sim/Não), sem preview.

3 Exemplo 3: Imprimir uma única folha sem perguntas.

4 Exemplo 4: Imprimir duas cópias sem perguntas.


O texto está em português, mas o código está em inglês (WLanguage, conforme a versão em inglês do WinDev). Cada exemplo inclui validação do número do pedido, execução da query e impressão do relatório, com comentários detalhados nas linhas de código.
Suposições
• Relatório: RPT_Order usa a query QRY_Order:
SELECT * FROM Orders WHERE Order_Number = {order_number}

• Tela: WIN_OrderForm tem um campo EDT_OrderNumber (numérico ou string) e um botão BTN_Print.
• Ambiente: WinDev 2025, mas compatível com versões anteriores.
• Cópias Diferenciadas: Uma variável global g_sCurrentCopy é usada para exibir “Copy 1” ou “Copy 2” no relatório, quando aplicável.
Configuração Comum
Antes de implementar os exemplos, configure o relatório para suportar a exibição do número da cópia:

1 Variável Global:
◦ No código global do projeto, adicione:
// Declaração de uma variável global para armazenar o número da cópia
◦ GLOBAL
◦ g_sCurrentCopy IS string
◦ END


2 Campo no Relatório:
◦ Abra o relatório RPT_Order no editor de relatórios.
◦ Adicione um controle de texto estático (TXT_Copy) no bloco desejado (ex.: “Report Header”).
◦ No evento “Before printing” de TXT_Copy, adicione:
// Atribui o valor da variável global ao controle de texto
◦ TXT_Copy = g_sCurrentCopy




Exemplo 1:

Perguntar Cópia (Sim/Não) e Preview
Este exemplo pergunta se o usuário deseja uma segunda cópia e se deseja visualizar o relatório antes de imprimir.

Código
// Click event of BTN_Print

PROCEDURE PrintWithCopyAndPreview()
// Valida se o número do pedido foi informado
IF EDT_OrderNumber = "" OR EDT_OrderNumber = 0 THEN
// Exibe mensagem de erro se o campo estiver vazio ou for zero
Error("Please enter a valid order number.")
RETURN
END



// Executa a query para verificar se o pedido existe
IF HExecuteQuery(QRY_Order, hQueryDefault, EDT_OrderNumber) = False THEN
// Exibe mensagem de erro se a query não encontrar dados
Error("No order found for the provided number.")
RETURN
END


// Define o parâmetro da query com o número do pedido
iParameter("order_number", EDT_OrderNumber)


// Pergunta se o usuário deseja visualizar o relatório antes de imprimir
bPreview IS boolean = Confirm("Do you want to preview the report before printing?", "Preview", yesNo)


// Pergunta se o usuário deseja imprimir uma segunda cópia
bSecondCopy IS boolean = Confirm("Do you want to print a second copy?", "Print Copy", yesNo)

// Define o destino com base na escolha de preview
IF bPreview THEN
// Define o destino como visualização prévia
iDestination(iPreview)
ELSE
// Define o destino como impressora
iDestination(iPrinter)
END



// Imprime a primeira cópia
g_sCurrentCopy = "Copy 1" // Define o texto para a primeira cópia
iPrintReport("RPT_Order") // Imprime o relatório
Delay(100) // Pequeno atraso para evitar conflitos na impressora



// Imprime a segunda cópia, se solicitada
IF bSecondCopy THEN
g_sCurrentCopy = "Copy 2" // Define o texto para a segunda cópia
iPrintReport("RPT_Order") // Imprime o relatório novamente
Delay(100) // Pequeno atraso
END



// Exibe mensagem de confirmação
Info("Report printing completed!")
END


Explicação

• Valida o número do pedido e a existência de dados na query.
• Usa Confirm para perguntar sobre preview e segunda cópia.
• Define o destino (iPreview ou iPrinter) com base na escolha do usuário.
• Imprime uma ou duas cópias, usando g_sCurrentCopy para diferenciar as cópias no relatório.
• Inclui Delay(100) para evitar conflitos na impressora.




Exemplo 2:
Ou não Perguntar Cópia (Sim/Não), Sem Preview
Este exemplo pergunta apenas se o usuário deseja uma segunda cópia e imprime diretamente na impressora.
Código

// Click event of BTN_Print
PROCEDURE PrintWithCopyNoPreview()
// Valida se o número do pedido foi informado
IF EDT_OrderNumber = "" OR EDT_OrderNumber = 0 THEN
// Exibe mensagem de erro se o campo estiver vazio ou for zero
Error("Please enter a valid order number.")
RETURN
END


// Executa a query para verificar se o pedido existe
IF HExecuteQuery(QRY_Order, hQueryDefault, EDT_OrderNumber) = False THEN
// Exibe mensagem de erro se a query não encontrar dados
Error("No order found for the provided number.")
RETURN
END


// Define o parâmetro da query com o número do pedido
iParameter("order_number", EDT_OrderNumber)


// Define o destino como impressora
iDestination(iPrinter)


// Pergunta se o usuário deseja imprimir uma segunda cópia
bSecondCopy IS boolean = Confirm("Do you want to print a second copy?", "Print Copy", yesNo)


// Imprime a primeira cópia
g_sCurrentCopy = "Copy 1" // Define o texto para a primeira cópia
iPrintReport("RPT_Order") // Imprime o relatório
Delay(100) // Pequeno atraso para evitar conflitos na impressora


// Imprime a segunda cópia, se solicitada
IF bSecondCopy THEN
g_sCurrentCopy = "Copy 2" // Define o texto para a segunda cópia
iPrintReport("RPT_Order") // Imprime o relatório novamente
Delay(100) // Pequeno atraso
END


// Exibe mensagem de confirmação
Info("Report printing completed!")
END


Explicação
• Valida o número do pedido e a query, como no Exemplo 1.
• Define iPrinter como destino, sem perguntar sobre preview.
• Pergunta apenas sobre a segunda cópia com Confirm.
• Imprime uma ou duas cópias, com g_sCurrentCopy para diferenciar.


Exemplo 3: Não Perguntar, Imprimir Uma Folha
Este exemplo imprime uma única cópia diretamente, sem perguntas.
Código

// Click event of BTN_Print
PROCEDURE PrintSingleCopy()
// Valida se o número do pedido foi informado
IF EDT_OrderNumber = "" OR EDT_OrderNumber = 0 THEN
// Exibe mensagem de erro se o campo estiver vazio ou for zero
Error("Please enter a valid order number.")
RETURN
END


// Executa a query para verificar se o pedido existe
IF HExecuteQuery(QRY_Order, hQueryDefault, EDT_OrderNumber) = False THEN
// Exibe mensagem de erro se a query não encontrar dados
Error("No order found for the provided number.")
RETURN
END


// Define o parâmetro da query com o número do pedido
iParameter("order_number", EDT_OrderNumber)


// Define o destino como impressora
iDestination(iPrinter)


// Imprime uma única cópia
g_sCurrentCopy = "Copy 1" // Define o texto para a cópia
iPrintReport("RPT_Order") // Imprime o relatório



// Exibe mensagem de confirmação
Info("Report printing completed!")
END


Explicação
• Valida o número do pedido e a query.
• Define iPrinter como destino e imprime uma única cópia.
• Usa g_sCurrentCopy para exibir “Copy 1”, embora possa ser omitido se não for necessário diferenciar.



Exemplo 4:

Não Perguntar, Imprimir Duas Cópias
Este exemplo imprime duas cópias diretamente, sem perguntas.
Código

// Click event of BTN_Print
PROCEDURE PrintTwoCopies()
// Valida se o número do pedido foi informado
IF EDT_OrderNumber = "" OR EDT_OrderNumber = 0 THEN
// Exibe mensagem de erro se o campo estiver vazio ou for zero
Error("Please enter a valid order number.")
RETURN
END


// Executa a query para verificar se o pedido existe
IF HExecuteQuery(QRY_Order, hQueryDefault, EDT_OrderNumber) = False THEN
// Exibe mensagem de erro se a query não encontrar dados
Error("No order found for the provided number.")
RETURN
END


// Define o parâmetro da query com o número do pedido
iParameter("order_number", EDT_OrderNumber)


// Define o destino como impressora
iDestination(iPrinter)


// Imprime duas cópias em um loop
FOR i = 1 TO 2
g_sCurrentCopy = "Copy " + NumToString(i) // Define o texto para a cópia atual
iPrintReport("RPT_Order") // Imprime o relatório
Delay(100) // Pequeno atraso para evitar conflitos na impressora
END


Ou

Loop(2)
g_sCurrentCopy = "Copy " + NumToString(i) // Define o texto para a cópia atual
iPrintReport("RPT_Order") // Imprime o relatório
Delay(100) // Pequeno atraso para evitar conflitos na impressora
END


// Exibe mensagem de confirmação
Info("Two copies of the report have been sent to the printer!")
END

Explicação
• Valida o número do pedido e a query.
• Define iPrinter como destino.
• Usa um loop FOR para imprimir duas cópias, com g_sCurrentCopy diferenciando cada uma.
• Inclui Delay(100) para evitar conflitos na impressora.


Configuração do Relatório
Para todos os exemplos, configure o relatório RPT_Order:
• Adicione um controle de texto TXT_Copy no bloco “Report Header”.
• No evento “Before printing” de TXT_Copy:
// Atribui o valor da variável global ao controle de texto
• TXT_Copy = g_sCurrentCopy


Posicione o controle em um local visível (ex.: canto superior direito).
Testes
1 Compilar o Projeto:
◦ Pressione F9 ou use “Project > Compile project”.
2 Executar a Tela:
◦ Abra WIN_OrderForm, insira um número de pedido em EDT_OrderNumber e clique em BTN_Print.
3 Verificar Cada Exemplo:
◦ Exemplo 1: Confirme as perguntas de preview e cópia, e verifique a impressão ou visualização.
◦ Exemplo 2: Confirme a pergunta de cópia e a impressão direta.
◦ Exemplo 3: Verifique que uma cópia é impressa sem perguntas.
◦ Exemplo 4: Verifique que duas cópias são impressas, com “Copy 1” e “Copy 2”.
4 Testar Erros:
◦ Insira um número de pedido inválido para confirmar a mensagem de erro.
◦ Teste com a impressora offline.
Ajustes Opcionais
• Seleção de Impressora:
◦ Adicione iConfigurePrinter() antes de iDestination(iPrinter) para permitir a escolha da impressora.
• Exportar para PDF:
◦ Para gerar PDFs, substitua iDestination(iPrinter) por:
// Define o destino como PDF com nome dinâmico
◦ iDestination(iPDF, "Copy_" + NumToString(i) + "_Order_" + EDT_OrderNumber + ".pdf")

• Número Dinâmico de Cópias:
◦ Adicione um campo EDT_CopyCount na tela e modifique o loop (Exemplo 4):
// Imprime o número de cópias especificado pelo usuário
◦ FOR i = 1 TO EDT_CopyCount
◦ g_sCurrentCopy = "Copy " + NumToString(i)
◦ iPrintReport("RPT_Order")
◦ Delay(100)
◦ END


Conclusao

Os quatro exemplos mostram como configurar a impressão de relatórios no WinDev com diferentes opções de interação com o usuário. O uso de g_sCurrentCopy permite diferenciar cópias, enquanto Delay(100) evita conflitos na impressora. Para uma abordagem mais simples no Exemplo 4, você pode usar iNbCopies(2) em vez de um loop, mas sem personalização das cópias:


iNbCopies(2)

iPrintReport("RPT_Order")



Como Criar o PDF
1 Copiar o Conteúdo:
◦ Copie o texto acima (incluindo títulos, explicações e códigos) para um editor de texto como Microsoft Word, Google Docs ou LibreOffice Writer.
2 Formatar:
◦ Use títulos (ex.: Heading 1 para “Gerenciamento de Impressão de Relatórios no WinDev”, Heading 2 para “Exemplo 1”, etc.).
◦ Aplique formatação de código (ex.: fonte Courier New ou Consolas para os blocos de código).
◦ Ajuste espaçamento e margens para melhor legibilidade.
3 Exportar para PDF:
◦ No Word: Arquivo > Salvar como > PDF.
◦ No Google Docs: Arquivo > Fazer download > PDF.
◦ No LibreOffice: Arquivo > Exportar como PDF.
4 Alternativa no WinDev:
◦ Crie uma janela no WinDev com um controle de texto rico (Rich Text Area) e cole o conteúdo.
◦ Use iPrintRTF ou iDestination(iPDF) para gerar o PDF diretamente no WinDev:
// Gera o PDF com o conteúdo da documentação
◦ iDestination(iPDF, "WinDev_Report_Printing_Guide.pdf")
◦ iPrintRTF(RTA_Documentation)

Notas Finais
• WinDev 2025: Aproveite recursos como geração de código por IA para otimizar o desenvolvimento.
• Testes: Sempre teste com diferentes impressoras e cenários (ex.: sem dados, impressora offline).
• Suporte: Se precisar de ajuda com a query, interface no editor de janelas, ou outras funcionalidades (ex.: envio por e-mail), me avise!
Se quiser que eu adapte o conteúdo (ex.: mais detalhes, outro formato), ou se precisar de ajuda para implementar a geração do PDF diretamente no WinDev, é só pedir!

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
4.618 mensagems
Publicado em julho, 10 2025 - 12:35 AM
Exemplo detalhado





• Relatório: O relatório RPT_Order usa uma query (QRY_Order) que filtra dados com base no parâmetro order_number. Exemplo da query:
SELECT * FROM Orders WHERE Order_Number = {order_number}

• Tela: A tela WIN_OrderForm contém:
◦ Um campo de edição EDT_OrderNumber (numérico ou string) para o usuário inserir o número do pedido (NUM_Pedido).
◦ Um campo de edição EDT_CopyCount (numérico) para especificar o número de cópias a imprimir.
◦ Um botão BTN_Print para disparar a impressão.
• Código Fornecido: O trecho usa LOOP(EDT_CopyCount) para imprimir o número de cópias especificado, com iPrintReport("RPT_Order", NUM_Pedido) e Delay(200).
• Objetivo:
◦ Imprimir o número de cópias definido em EDT_CopyCount sem perguntas ao usuário.
◦ Diferenciar cada cópia com um texto no relatório (ex.: “Copy 1”, “Copy 2”, etc.).
◦ Validar o número do pedido e o número de cópias.
• Ambiente: WinDev 2025, mas compatível com versões anteriores (ex.: WinDev 17 ou superior).
• Requisitos:
◦ Texto explicativo em português.
◦ Código em inglês (WLanguage).
◦ Comentários detalhados em português para cada linha.
◦ Usar o trecho fornecido como base, integrando-o a uma solução completa.
Configuração Inicial
Antes de implementar o código, configure o relatório e a tela para suportar a exibição do número da cópia e a funcionalidade desejada:
1 Variável Global:
◦ No código global do projeto (menu “Project > Project initialization code”), adicione:
// Declaração de uma variável global para armazenar o número da cópia atual
◦ GLOBAL
◦ g_sCurrentCopy IS string
◦ END

◦ Essa variável será usada para exibir “Copy 1”, “Copy 2”, etc., no relatório.
2 Campo no Relatório:
◦ Abra o relatório RPT_Order no editor de relatórios do WinDev.
◦ Adicione um controle de texto estático (TXT_Copy) no bloco desejado (ex.: “Report Header” ou “Report Footer”).
◦ No evento “Before printing” do controle TXT_Copy, adicione:
// Atribui o valor da variável global ao controle de texto para exibir o número da cópia
◦ TXT_Copy = g_sCurrentCopy

◦ Posicione o controle TXT_Copy em um local visível (ex.: canto superior direito) e ajuste a fonte (ex.: Arial, tamanho 10, itálico) para destaque.
3 Query:
◦ Certifique-se de que a query QRY_Order está configurada no editor de queries do WinDev para aceitar o parâmetro order_number. Exemplo:
SELECT * FROM Orders WHERE Order_Number = {order_number}

◦ O parâmetro {order_number} será substituído pelo valor de EDT_OrderNumber (ou NUM_Pedido).
4 Tela:
◦ Na tela WIN_OrderForm, confirme que:
▪ EDT_OrderNumber é um campo de edição para o número do pedido (tipo numérico ou string).
▪ EDT_CopyCount é um campo de edição numérico para o número de cópias (ex.: tipo inteiro, com valor padrão 1).
▪ BTN_Print é o botão que dispara a impressão.
Implementação do Exemplo
O exemplo será implementado no evento de clique do botão BTN_Print na tela WIN_OrderForm. O código valida o número do pedido (EDT_OrderNumber), verifica se a query retorna dados, valida o número de cópias (EDT_CopyCount), e imprime as cópias usando o trecho fornecido, com NUM_Pedido como o parâmetro do relatório. Cada cópia será diferenciada com o texto “Copy 1”, “Copy 2”, etc.
Código


// Click event of BTN_Print
PROCEDURE PrintDynamicCopies()
// Valida se o número do pedido foi informado no campo EDT_OrderNumber
IF EDT_OrderNumber = "" OR EDT_OrderNumber = 0 THEN
// Exibe uma mensagem de erro se o campo estiver vazio ou contiver zero
Error("Please enter a valid order number.")
// Interrompe a execução da procedure
RETURN
END

// Valida se o número de cópias é válido (maior que 0)
IF EDT_CopyCount <= 0 THEN
// Exibe uma mensagem de erro se o número de cópias for inválido
Error("Please enter a valid number of copies (greater than 0).")
// Interrompe a execução da procedure
RETURN
END

// Executa a query QRY_Order com o número do pedido informado
IF HExecuteQuery(QRY_Order, hQueryDefault, EDT_OrderNumber) = False THEN
// Exibe uma mensagem de erro se a query não encontrar dados
Error("No order found for the provided number.")
// Interrompe a execução da procedure
RETURN
END

// Define o parâmetro order_number da query com o valor de EDT_OrderNumber
iParameter("order_number", EDT_OrderNumber)

// Define o destino da impressão como a impressora padrão
iDestination(iPrinter)

// Loop para imprimir o número de cópias especificado em EDT_CopyCount
LOOP(EDT_CopyCount)
// Define o texto da variável global para indicar o número da cópia atual
g_sCurrentCopy = "Copy " + NumToString(Counter)
// Imprime o relatório RPT_Order com o parâmetro NUM_Pedido
iPrintReport("RPT_Order", EDT_OrderNumber)
// Adiciona um atraso de 200 milissegundos para evitar conflitos na impressora
Delay(200)
END

// Exibe uma mensagem informando que as cópias foram enviadas para impressão
Info(NumToString(EDT_CopyCount) + " copies of the report have been sent to the printer!")
END

Explicação Detalhada do Código
• Validação do Número do Pedido:
◦ IF EDT_OrderNumber = "" OR EDT_OrderNumber = 0: Verifica se o campo EDT_OrderNumber está vazio (para strings) ou contém zero (para numéricos). Se verdadeiro, exibe uma mensagem de erro com Error e interrompe a execução com RETURN.
• Validação do Número de Cópias:
◦ IF EDT_CopyCount <= 0: Verifica se o campo EDT_CopyCount contém um valor maior que zero. Se inválido, exibe uma mensagem de erro e interrompe.
• Execução da Query:
◦ HExecuteQuery(QRY_Order, hQueryDefault, EDT_OrderNumber): Executa a query QRY_Order com o valor de EDT_OrderNumber como parâmetro. O modo hQueryDefault usa as configurações padrão da query. Se a query falhar (ex.: nenhum dado encontrado), exibe uma mensagem de erro e interrompe.
• Definição do Parâmetro:
◦ iParameter("order_number", EDT_OrderNumber): Associa o valor de EDT_OrderNumber ao parâmetro order_number da query, garantindo que o relatório use os dados corretos.
• Destino da Impressão:
◦ iDestination(iPrinter): Define a impressora padrão como destino da saída do relatório.
• Loop de Impressão:
◦ LOOP(EDT_CopyCount): Usa a construção LOOP do WLanguage para repetir o bloco de código o número de vezes especificado em EDT_CopyCount. A variável interna Counter (gerada automaticamente pelo WinDev) mantém o índice da iteração (1, 2, 3, etc.).
◦ g_sCurrentCopy = "Copy " + NumToString(Counter): Define a variável global g_sCurrentCopy com o texto “Copy 1”, “Copy 2”, etc., com base no valor de Counter.
◦ iPrintReport("RPT_Order", EDT_OrderNumber): Imprime o relatório RPT_Order, passando EDT_OrderNumber como o parâmetro NUM_Pedido (conforme o trecho fornecido). Isso é equivalente a usar iParameter antes de iPrintReport.
◦ Delay(200): Adiciona um atraso de 200 milissegundos (conforme o trecho fornecido) para evitar que as impressões sejam enviadas simultaneamente, prevenindo erros em algumas impressoras.
• Mensagem de Confirmação:
◦ Info(NumToString(EDT_CopyCount) + " copies..."): Exibe uma mensagem informando o número de cópias enviadas para a impressora, usando NumToString para converter EDT_CopyCount em string.
Configuração da Tela

Na tela WIN_OrderForm, certifique-se de que:
• EDT_OrderNumber: Campo de edição para o número do pedido (ex.: tipo Numeric ou Text).
• EDT_CopyCount: Campo de edição numérico (ex.: tipo Integer, com valor padrão 1 para evitar entradas inválidas). Você pode configurar propriedades como:
◦ Valor mínimo: 1 (no editor de janelas, aba “Details” > “Min value”).
◦ Valor padrão: 1 (aba “Details” > “Default value”).
• BTN_Print: Botão com o evento de clique contendo o código acima.
Testes
1 Compilar o Projeto:
◦ Pressione F9 ou use o menu “Project > Compile project” no WinDev.
2 Executar a Tela:
◦ Abra a tela WIN_OrderForm.
◦ Insira um número de pedido válido em EDT_OrderNumber (ex.: 123).
◦ Insira um número de cópias em EDT_CopyCount (ex.: 2 ou 3).
◦ Clique no botão BTN_Print.
3 Verificar a Saída:
◦ Confirme que o número de cópias especificado em EDT_CopyCount é enviado para a impressora.
◦ Verifique se o controle TXT_Copy no relatório exibe “Copy 1”, “Copy 2”, etc., em cada cópia.
4 Testar Erros:
◦ Insira um número de pedido inválido (ex.: vazio ou zero) e confirme a mensagem de erro.
◦ Insira um valor inválido em EDT_CopyCount (ex.: 0 ou -1) e confirme a mensagem de erro.
◦ Teste com a impressora offline para verificar o comportamento (o WinDev pode exibir um erro da impressora).
5 Testar Diferenciação:
◦ Abra as cópias impressas e confirme que o texto “Copy 1”, “Copy 2”, etc., aparece no local configurado (ex.: canto superior direito).
Ajustes Opcionais
1 Seleção de Impressora:
◦ Para permitir que o usuário escolha a impressora, adicione antes de iDestination(iPrinter):
// Abre a caixa de diálogo para selecionar a impressora
◦ iConfigurePrinter()

2 Exportar para PDF:
◦ Para gerar PDFs em vez de imprimir, substitua o loop por:
// Loop para gerar PDFs com nomes dinâmicos
◦ LOOP(EDT_CopyCount)
◦ g_sCurrentCopy = "Copy " + NumToString(Counter)
◦ iDestination(iPDF, "Copy_" + NumToString(Counter) + "_Order_" + EDT_OrderNumber + ".pdf")
◦ iPrintReport("RPT_Order", EDT_OrderNumber)
◦ Delay(200)
◦ END

◦ Isso cria arquivos como Copy_1_Order_123.pdf, Copy_2_Order_123.pdf, etc.
3 Limite de Cópias:
◦ Para evitar números excessivos de cópias, adicione uma validação:
// Limita o número de cópias a um máximo (ex.: 10)
◦ IF EDT_CopyCount > 10 THEN
◦ Error("The number of copies cannot exceed 10.")
◦ RETURN
◦ END

4 Ajustar o Atraso:
◦ O valor Delay(200) pode ser ajustado (ex.: Delay(100) ou Delay(300)) dependendo da impressora. Teste para encontrar o valor ideal.
Alternativa com `iNbCopies`
Se não for necessário diferenciar as cópias (ex.: sem texto “Copy 1”, “Copy 2”), você pode usar iNbCopies em vez do loop:
// Click event of BTN_Print (Alternative with iNbCopies)
PROCEDURE PrintDynamicCopies()
// Valida se o número do pedido foi informado
IF EDT_OrderNumber = "" OR EDT_OrderNumber = 0 THEN
Error("Please enter a valid order number.")
RETURN
END

// Valida se o número de cópias é válido
IF EDT_CopyCount <= 0 THEN
Error("Please enter a valid number of copies (greater than 0).")
RETURN
END

// Executa a query QRY_Order
IF HExecuteQuery(QRY_Order, hQueryDefault, EDT_OrderNumber) = False THEN
Error("No order found for the provided number.")
RETURN
END

// Define o parâmetro order_number
iParameter("order_number", EDT_OrderNumber)

// Define o destino como impressora
iDestination(iPrinter)

// Define o número de cópias com base em EDT_CopyCount
iNbCopies(EDT_CopyCount)

// Imprime o relatório
iPrintReport("RPT_Order")

// Exibe mensagem de confirmação
Info(NumToString(EDT_CopyCount) + " copies of the report have been sent to the printer!")
END
• Nota: Essa abordagem é mais simples, mas não suporta a diferenciação de cópias com g_sCurrentCopy.
Instruções para Criar o PDF
Para gerar um PDF com este conteúdo:
1 Copiar o Conteúdo:
◦ Copie o texto deste documento (títulos, explicações e códigos) para um editor de texto como Microsoft Word, Google Docs ou LibreOffice Writer.
2 Formatar:
◦ Use títulos (ex.: Heading 1 para “Exemplo: Imprimir Cópias Dinâmicas…”, Heading 2 para “Introdução”, “Código”, etc.).
◦ Aplique uma fonte mono espaçada (ex.: Courier New ou Consolas) para os blocos de código.
◦ Ajuste margens, espaçamento e fontes (ex.: corpo do texto em Arial 12, código em Consolas 10).
3 Exportar para PDF:
◦ No Microsoft Word: Arquivo > Salvar como > PDF.
◦ No Google Docs: Arquivo > Fazer download > PDF.
◦ No LibreOffice Writer: Arquivo > Exportar como PDF.
4 Alternativa no WinDev:
◦ Crie uma janela no WinDev com um controle de texto rico (RTA_Documentation).
◦ Cole o conteúdo neste controle.
◦ Gere o PDF com:
// Gera um PDF com a documentação
◦ iDestination(iPDF, "WinDev_DynamicCopies_Guide.pdf")
◦ iPrintRTF(RTA_Documentation)

Conclusão
Este exemplo implementa a impressão de um número dinâmico de cópias do relatório RPT_Order no WinDev, com base em EDT_CopyCount e usando NUM_Pedido (via EDT_OrderNumber). O código valida o número do pedido e o número de cópias, executa a query, e imprime as cópias com diferenciação via g_sCurrentCopy (ex.: “Copy 1”, “Copy 2”). O uso de LOOP e Delay(200) garante compatibilidade com o trecho fornecido e evita conflitos na impressora. A alternativa com iNbCopies é mais simples, mas não permite personalização das cópias.
Se precisar de mais detalhes, como configurar a query ou an interface no editor de janelas, ou se quiser ajuda para gerar o PDF diretamente no WinDev, é só avisar!

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
4.618 mensagems
Publicado em julho, 10 2025 - 12:37 AM
LOOP(EDT_CopyCount)

iPrintReport("RPT_Order", NUM_Pedido )

Delay(100)

END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
4.618 mensagems
Publicado em julho, 10 2025 - 12:50 AM
Baseado no conteúdo do fórum, sim, existem várias outras formas de implementar impressão de relatórios com múltiplas cópias no WinDev. Vou mostrar as principais alternativas e como criar um relatório condicionado por código:

## Alternativas Principais:

### 1. **Usando `iNbCopies()` (Mais Simples)**

```wlanguage
// Alternativa mais simples - sem diferenciação de cópias
iDestination(iPrinter)
iNbCopies(2) // Define 2 cópias diretamente
iPrintReport("RPT_Order", NUM_Pedido)
```

### 2. **Loop FOR Tradicional**

```wlanguage
// Usando loop FOR em vez de LOOP
FOR i = 1 TO EDT_CopyCount
g_sCurrentCopy = "Copy " + NumToString(i)
iPrintReport("RPT_Order", NUM_Pedido)
Delay(100)
END
```

### 3. **Usando `iSequenceAdd()` para Múltiplos Relatórios**

```wlanguage
// Para imprimir múltiplos relatórios em sequência
iSequenceAdd("RPT_Order", NUM_Pedido)
iSequenceAdd("RPT_Order", NUM_Pedido) // Segunda cópia
iSequencePrint() // Imprime todos em uma única operação
```

## Relatório Condicionado por Código:

Para criar um relatório completamente controlado por código WLanguage:​​​​​​​​​​​​​​​​

// ========================================
// RELATÓRIO COMPLETAMENTE CONDICIONADO POR CÓDIGO
// ========================================

PROCEDURE PrintConditionalReport(nOrderNumber IS int, nCopies IS int = 1, bShowPreview IS boolean = False)

// Declaração de variáveis locais
sReportTitle IS string
sCompanyName IS string = “Minha Empresa Ltda”
nCurrentCopy IS int
bPrintDuplicate IS boolean

// ========================================
// 1. VALIDAÇÕES INICIAIS
// ========================================

// Valida número do pedido
IF nOrderNumber <= 0 THEN
Error(“Número do pedido inválido!”)
RETURN
END

// Valida número de cópias
IF nCopies <= 0 OR nCopies > 10 THEN
Error(“Número de cópias deve ser entre 1 e 10!”)
RETURN
END

// ========================================
// 2. CONSULTA DOS DADOS
// ========================================

// Executa query para buscar dados do pedido
IF NOT HExecuteQuery(QRY_Order, hQueryDefault, nOrderNumber) THEN
Error(“Erro ao consultar dados do pedido!”)
RETURN
END

// Verifica se encontrou dados
IF HOut(QRY_Order) THEN
Error(“Pedido não encontrado!”)
RETURN
END

// ========================================
// 3. CONFIGURAÇÃO CONDICIONAL DO RELATÓRIO
// ========================================

// Define título baseado no tipo de pedido
SWITCH QRY_Order.OrderType
CASE “VENDA”
sReportTitle = “NOTA FISCAL DE VENDA”
CASE “ORCAMENTO”
sReportTitle = “ORÇAMENTO”
CASE “PEDIDO”
sReportTitle = “PEDIDO DE COMPRA”
OTHER CASE
sReportTitle = “DOCUMENTO COMERCIAL”
END

// Verifica se deve imprimir via duplicata (condição de negócio)
bPrintDuplicate = (QRY_Order.TotalValue > 1000.00)

// Ajusta número de cópias baseado em regras de negócio
IF bPrintDuplicate THEN
nCopies = Max(nCopies, 2) // Mínimo 2 cópias para valores altos
END

// ========================================
// 4. CONFIGURAÇÃO DA IMPRESSÃO
// ========================================

// Define destino baseado na escolha do usuário
IF bShowPreview THEN
iDestination(iPreview)
ELSE
iDestination(iPrinter)
END

// Configurações adicionais da impressão
iParameter(“ReportTitle”, sReportTitle)
iParameter(“CompanyName”, sCompanyName)
iParameter(“OrderNumber”, nOrderNumber)

// ========================================
// 5. LOOP DE IMPRESSÃO CONDICIONAL
// ========================================

FOR nCurrentCopy = 1 TO nCopies

```
// Define texto da cópia atual
SWITCH nCurrentCopy
CASE 1
g_sCurrentCopy = "1ª VIA - CLIENTE"
CASE 2
IF bPrintDuplicate THEN
g_sCurrentCopy = "2ª VIA - CONTROLE"
ELSE
g_sCurrentCopy = "CÓPIA " + nCurrentCopy
END
OTHER CASE
g_sCurrentCopy = "CÓPIA " + nCurrentCopy
END

// Configura parâmetros específicos da cópia
iParameter("CopyText", g_sCurrentCopy)
iParameter("CopyNumber", nCurrentCopy)

// Impressão condicional baseada no tipo
IF QRY_Order.OrderType = "ORCAMENTO" THEN
// Para orçamentos, usa relatório específico
iPrintReport("RPT_Budget", nOrderNumber)
ELSE
// Para vendas/pedidos, usa relatório padrão
iPrintReport("RPT_Order", nOrderNumber)
END

// Delay entre cópias (evita problemas na impressora)
IF nCurrentCopy < nCopies THEN
Delay(200)
END
```

END

// ========================================
// 6. FINALIZAÇÃO E FEEDBACK
// ========================================

// Mensagem de confirmação
sMessage IS string = StringBuild(“Relatório impresso com sucesso!%1” + …
“Pedido: %2%1” + …
“Cópias: %3”, …
CR, nOrderNumber, nCopies)

IF bShowPreview THEN
Info(“Visualização do relatório aberta.”)
ELSE
Info(sMessage)
END

// Log da operação (opcional)
Trace(StringBuild(”[%1] Relatório impresso - Pedido: %2, Cópias: %3”, …
DateTimeToString(DateTimeSys()), nOrderNumber, nCopies))

END

// ========================================
// PROCEDIMENTO AUXILIAR - SELEÇÃO INTELIGENTE DE CÓPIAS
// ========================================

PROCEDURE SmartCopySelection(nOrderNumber IS int) : int

LOCAL nSuggestedCopies IS int = 1

// Consulta dados do pedido para sugerir número de cópias
IF HExecuteQuery(QRY_Order, hQueryDefault, nOrderNumber) THEN

```
// Regras de negócio para número de cópias
IF QRY_Order.TotalValue > 5000.00 THEN
nSuggestedCopies = 3 // Valores altos = 3 vias
ELSE IF QRY_Order.TotalValue > 1000.00 THEN
nSuggestedCopies = 2 // Valores médios = 2 vias
END

// Clientes especiais sempre 2 cópias
IF QRY_Order.CustomerType = "VIP" THEN
nSuggestedCopies = Max(nSuggestedCopies, 2)
END
```

END

RESULT nSuggestedCopies

END

// ========================================
// EXEMPLO DE USO NO BOTÃO
// ========================================

// Click event of BTN_Print
PROCEDURE BTN_Print_Click()

LOCAL nCopies IS int
LOCAL bPreview IS boolean

// Obtém sugestão inteligente
nCopies = SmartCopySelection(EDT_OrderNumber)

// Pergunta ao usuário sobre preview
bPreview = Confirm(“Deseja visualizar antes de imprimir?”, “Preview”, YesNo)

// Se não quer preview, pergunta sobre número de cópias
IF NOT bPreview THEN
nCopies = InputNum(“Número de cópias:”, “Impressão”, nCopies, 1, 10)
IF nCopies = 0 THEN RETURN // Usuário cancelou
END

// Chama o procedimento principal
PrintConditionalReport(EDT_OrderNumber, nCopies, bPreview)

END

// ========================================
// CONFIGURAÇÃO NO RELATÓRIO (Before Print do TXT_Copy)
// ========================================

// No evento “Before printing” do controle TXT_Copy no relatório:
TXT_Copy = g_sCurrentCopy

// Formatação condicional
IF Left(g_sCurrentCopy, 3) = “1ª “ THEN
// 1ª via em negrito
TXT_Copy..Font.Bold = True
TXT_Copy..Color = RGBBlue
ELSE IF Left(g_sCurrentCopy, 3) = “2ª “ THEN
// 2ª via em itálico
TXT_Copy..Font.Italic = True
TXT_Copy..Color = RGBRed
ELSE
// Outras cópias em fonte normal
TXT_Copy..Font.Bold = False
TXT_Copy..Font.Italic = False
TXT_Copy..Color = RGBBlack
END


## Principais Vantagens das Diferentes Abordagens:

### **`iNbCopies()` - Mais Simples:**

- **Prós:** Código menor, impressão mais rápida
- **Contras:** Não permite personalizar cada cópia

### **LOOP/FOR - Mais Flexível:**

- **Prós:** Controle total sobre cada cópia, personalização
- **Contras:** Código mais longo, múltiplas chamadas de impressão

### **`iSequenceAdd()` - Profissional:**

- **Prós:** Melhor para relatórios múltiplos, controle de fila
- **Contras:** Mais complexo para casos simples

### **Código Condicional - Completo:**

- **Prós:** Máxima flexibilidade, regras de negócio integradas
- **Contras:** Maior complexidade, mais código para manter

## Resumo das Alternativas:

```wlanguage
// 1. Simples (sem personalização)
iNbCopies(2)
iPrintReport("RPT_Order", NUM_Pedido)

// 2. Com personalização básica
LOOP(nCopies)
g_sCurrentCopy = "Cópia " + Counter
iPrintReport("RPT_Order", NUM_Pedido)
Delay(100)
END

// 3. Sequência (para múltiplos relatórios)
iSequenceAdd("RPT_Order", NUM_Pedido)
iSequenceAdd("RPT_Order", NUM_Pedido)
iSequencePrint()

// 4. Completamente condicional (como no artifact)
```

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/