Curso já está completo na nossa plataforma.
Muitas vezes precisamos desenvolver relatórios em AdvPL, seja nativo em PDF, seja uma integração com Word ou até mesmo exportação de dados em Excel.
Pensando nessas demandas que acabamos pegando no dia a dia, montamos esse curso que aborda algumas classes e funções para montagem de relatórios.
Desde listagens simples, assim como relatórios mais elaborados.
No total são 35 aulas, veja abaixo a lista de aulas:
- Aula 01 – Introdução
- Aula 02 – TReport – O que é ReportDef
- Aula 03 – TReport – Criando uma seção com TRSection
- Aula 04 – TReport – Criando células com TRCell
- Aula 05 – TReport – Criando totalizadores com TRFunction
- Aula 06 – TReport – Como funciona a lógica dentro da impressão
- Aula 07 – TReport – Fazendo a quebra do relatório com TRBreak
- Aula 08 – TReport – Diferença de impressão manual ou com BeginQuery
- Aula 09 – TReport – Exemplo de relatório com mais de uma seção
- Aula 10 – FWMSPrinter – Conhecendo a classe de relatórios gráficos
- Aula 11 – FWMSPrinter – Entendendo como funciona o dimensionamento dos componentes
- Aula 12 – FWMSPrinter – Imprimindo texto com SayAlign
- Aula 13 – FWMSPrinter – Imprimindo texto na vertical com Say
- Aula 14 – FWMSPrinter – Imprimindo imagens com SayBitmap
- Aula 15 – FWMSPrinter – Imprimindo QRCode
- Aula 16 – FWMSPrinter – Imprimindo linhas e quadros com os métodos Line e Box
- Aula 17 – FWMSPrinter – Utilizando cores nos textos
- Aula 18 – FWMSPrinter – Pintando uma cor de fundo com FillRect
- Aula 19 – FWMSPrinter – Criando a lógica do cabeçalho, do rodapé e quebra de páginas
- Aula 20 – FWMSPrinter – Gerando a informação zebrada entre as linhas
- Aula 21 – FWMSPrinter – Gerando um relatório com a FWPrintSetup
- Aula 22 – FWMSPrinter – Convertendo relatório antigo TMSPrinter usando lAdjustToLegacy ou com matemática
- Aula 23 – FWMSPrinter – Disparando um email com um pdf gerado pelo FWMSPrinter em anexo
- Aula 24 – Word – Criando um modelo DOT no WORD com DocVariables
- Aula 25 – Word – Definindo as variáveis e gerando o arquivo via AdvPL
- Aula 26 – Word – Gerando um arquivo no formato PDF
- Aula 27 – Excel – Conhecendo as classes FWMSExcel e FWMSExcelXlsx
- Aula 28 – Excel – Adicionando colunas com AddColumn
- Aula 29 – Excel – Adicionando informações com AddRow
- Aula 30 – Excel – Abrindo o arquivo gerado com MsExcel
- Aula 31 – Impressão Térmica – Usando MSCBPrinter
- Aula 32 – Impressão Térmica – Usando arquivo txt (em Windows e Linux)
- Aula 33 – Impressão Térmica – Usando FWMSPrinter
- Aula 34 – Enviando relatórios via WebService com Base64
- Aula 35 – Exercícios
E abaixo, um vídeo de uma aula de exemplo disponível no nosso YouTube:
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Tem algum certificado no final do curso ?
Boa tarde Juarez.
Sim, todos os cursos tem certificados, basta seguir o tutorial no tópico 9 nesse link – https://terminaldeinformacao.com/perguntas-frequentes/
Abraços.
disponibiliza o fonte ??
Boa tarde Rodrigo, tudo bem?
Sim, todos os cursos que disponibilizamos, também é disponibilizado os fontes demonstrados em aulas.
É possível baixá-los sempre na aula de introdução do curso, conforme descrito no tópico 7 nesse link – https://terminaldeinformacao.com/perguntas-frequentes/
Grande abraço.
Boa Tarde Dan, tudo certo?
Estou com um problema aqui em relação a um relatório.
Seguinte: tenho minha pergunta aAdd(vPerg,{“Filial ?” ,”C”, TamSX3(“RA_FILIAL”)[1], 0,”R”,,”SM0″}) // MV_PAR03 que quando vou preencher o campo fala que se eu usar o 01;02;03 ele busca somente as 3 filiais ok.
Agora seu eu colocar 01-05 ele deveria buscar todas as filias neste intervalo da 01 ate a 05. Mas nao faz isto.
Como faço um tratamento nesta situação na minha variavel cCond += ” AND RA.RA_FILIAL IN “+ formatin(%exp:MV_PAR03%,”;”)+” ” ?
********************************
User Function IGPER032
********************************
Local vPerg := {}
Private cNomRel := “IGPER032”
Private rTitRel := “Relatorio para conferencia fatura de plano de saude COOPSAUDE”
Private cPerg := PadR(cNomRel,Len(SX1->X1_GRUPO))
//Perguntas
aAdd(vPerg,{“Da Data ?” ,”D”, 8, 0, “G”,,””}) // MV_PAR01
aAdd(vPerg,{“Ate a Data ?” ,”D”, 8, 0, “G”,,””}) // MV_PAR02
aAdd(vPerg,{“Filial ?” ,”C”, TamSX3(“RA_FILIAL”)[1], 0,”R”,,”SM0″}) // MV_PAR03
U_FtCriaSX1( cPerg, vPerg)
//apresenta perguntsa na tela
If !Pergunte(cPerg,.T.)
Return
EndIf
// Monta a Estrutura do TReport
oReport := ReportDef()
oReport:PrintDialog()
Return
// Monta a Estrutura do TReport
********************************
Static Function ReportDef()
********************************
Private oReport
//Declaração do Objeto TReport
//oReport := TReport():New(/*Nome do Relatório*/, /*Titulo do Relatório*/, /*Pergunte*/, {|oReport| ReportPrint(oReport)}, /*Descricao do relatório*/ )
oReport := TReport():NEW(cNomRel, rTitRel, cPerg, {|oReport| Imprime(oReport)}, rTitRel, .F.)
// Totalizador do Relatório – Totaliza todos os totalizadors que estiver no fonte.
oReport:SetTotalInLine(.F.)
oReport:SetPortrait(.T.) // SetLandscape()
oReport:lParamPage := .F. // Imprime a página de parâmetros
//Declaração das Secções
oSecITEM := TRSection():New(oReport , “Relatorio para conferencia fatura de plano de saude COOPSAUDE” , {} )
TRCELL():NEW(oSecITEM , “RA_FILIAL” ,”SRA”,”FILIAL”,, 2)
TRCELL():NEW(oSecITEM , “RA_MAT” ,”SRA”,”MATRICULA”,, 6)
TRCELL():NEW(oSecITEM , “RA_NOME” ,”SRA”,”NOME”,, 30)
TRCELL():NEW(oSecITEM , “RA_CC” ,”SRA”,”CENTRO DE CUSTO”,, 20)
TRCELL():NEW(oSecITEM , “RA_NASC” ,”SRA”,”DATA NASCIMENTO”,, 12)
TRCELL():NEW(oSecITEM , “RA_ADMISSA” ,”SRA”,”ADMISSÃO”,, 12)
TRCELL():NEW(oSecITEM , “RA_DEMISSA” ,”SRA”,”DEMISSÃO”,, 12)
TRCELL():NEW(oSecITEM , “IDADE” ,”” ,”IDADE”,, 2)
TRCELL():NEW(oSecITEM , “VALOR” ,”” ,”VALOR”,, 14)
oSecITEM:SetLeftMargin(0)
Return oReport
// Função que processa os Dados.
********************************
Static function Imprime(oReport)
********************************
Local cAliTMP := GetNextAlias()
Local cCond := ”
//Local dDataAtu := DtoC(DATE())
Private oSecITEM := oReport:Section(1)
oReport:SetTitle(rTitRel + ” de “+ DtoC(MV_PAR01) +” a “+ DtoC(MV_PAR02))
If Select(cAliTMP)0
(cAliTMP)->(DbCloseArea())
EndIf
if !Empty(%exp:MV_PAR03%)
cCond += ” AND RA.RA_FILIAL IN “+ formatin(%exp:MV_PAR03%,”;”)+” ”
endif
cCond := “%”+ cCond +”%”
oReport:Section(1):BeginQuery()
BeginSQL alias cAliTMP
SELECT
RA_FILIAL,
RA_MAT,
RA_NOME,
RA_CC,
RA_NASC,
RA_ADMISSA,
RA_DEMISSA,
TRUNC(months_between(sysdate, RA_NASC) / 12) AS IDADE,
// MONTA OS VALORES CONFORME FAIXA ETARIA
CASE WHEN (TRUNC(months_between(sysdate, RA_NASC) / 12) >= ’19’ AND TRUNC(months_between(sysdate, RA_NASC) / 12) = ’24’ AND TRUNC(months_between(sysdate, RA_NASC) / 12) = ’29’ AND TRUNC(months_between(sysdate, RA_NASC) / 12) = ’34’ AND TRUNC(months_between(sysdate, RA_NASC) / 12) = ’39’ AND TRUNC(months_between(sysdate, RA_NASC) / 12) = ’44’ AND TRUNC(months_between(sysdate, RA_NASC) / 12) = ’49’ AND TRUNC(months_between(sysdate, RA_NASC) / 12) = ’54’ AND TRUNC(months_between(sysdate, RA_NASC) / 12) = ’59’) THEN 577.00 // DE 59 ANOS OU MAIS R$531,70
END AS VALOR
FROM %table:SRA% RA
WHERE (RA_DEMISSA BETWEEN %exp:MV_PAR01% and %exp:MV_PAR02% OR RA_DEMISSA = ‘ ‘)
AND RA.D_E_L_E_T_ = ‘ ‘
AND RA_PLSAUDE = ‘1’
AND RA_NASC ‘ ‘
%EXP:cCond%
Order by RA_FILIAL, RA_NOME
EndSql
oReport:Section(1):EndQuery()
oSecITEM:Print()
If !Empty(cAliTMP) .and. Select(cAliTMP) 0
dbSelectArea(cAliTMP)
(cAliTMP)->(dbCloseArea())
endif
Return()
Bom dia Gabriel, tudo joia graças a Deus e você?
Então, você pode se basear no exemplo zRel03.prw do curso, onde nós encapsulamos uma expressão dentro de uma variável (linhas 101 até 108 e depois na linha 147).
Você teria que ter um cenário igual no seu caso, onde você faria a seguinte lógica:
a. O parâmetro possui hífen? Se sim será montado uma expressão de “BETWEEN”
b. Se não, o parâmetro possui ponto e vírgula? Se sim será montado uma expressão de “IN”
Um grande abraço.
cara adquiri o curso, gostaria de saber se existe um exemplo de relatório customizavel no protheus como se fosse cum cupom de comprovante, “tipo um layout de cupom fiscal”, exemplo, que consiga customizar para imprimir um pedido de venda nesse formato.
Boa tarde Renan, tudo joia?
Infelizmente relatório no formato de “cupom fiscal” vamos ficar devendo por enquanto.
Vamos adicionar aqui na lista de sugestões de pautas e temas para tentarmos desenvolver em um futuro.
Um grande abraço.