Curso – Relatórios em AdvPL

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

8 Responses

  1. Juarez disse:

    Tem algum certificado no final do curso ?

  2. Rodrigo Correia disse:

    disponibiliza o fonte ??

  3. Gabriel disse:

    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.

  4. renan disse:

    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.

Deixe uma resposta

Terminal de Informação