Os relatórios não personalizáveis podem ser criados utilizando-se a TMsPrinter para os relatórios gráficos e o par de funções SetPrint/SetDefault para os não-graficos.
Independente do método utilizado, os relatórios deste tipo devem utilizar o Cadastro de Perguntas do dicionário de dados da Linha Microsiga Protheus (SX1).
Segue exemplo de uma estrutura de relatório não gráfico:
// NoCustomizableReport.prw
#INCLUDE "TOTVS.CH"
#DEFINE CHRCOMP If(aReturn[4]==1,15,18)
Function NoCustomizableReport()
//----------------------------------------------------------------------------
// Define Variaveis
//----------------------------------------------------------------------------
Local cTitulo := "Titulo do Relatorio" // Titulo do Relatorio
Local cDesc1 := "Descrição 1" // Descrição 1
Local cDesc2 := "Descrição 1" // Descrição 2
Local cDesc3 := "Descrição 1" // Descrição 3
Local cString := "" // Alias utilizado na Filtragem
Local lDic := .F. // Habilita/Desabilita Dicionário
Local lComp := .T. // Habilita/Desabilita o Formato Comprimido/Expandido
Local lFiltro := .T. // Habilita/Desabilita o Filtro
Local cFile := "" // Nome do Arquivo utilizado no Spool
Local cProgName := "" // nome do programa
Private Tamanho := "G" // P/M/G
Private Limite := 220 // 80/132/220
Private aOrdem := {} // Ordem do Relatorio
Private cPerg := "" // Pergunta do Relatorio
Private aReturn := { "Zebrado", 1, "Administracao", 1, 2, 1, "", 1 }
//[1] Reservado para Formulario
//[2] Reservado para N§ de Vias
//[3] Destinatario
//[4] Formato => 1-Comprimido 2-Normal
//[5] Midia => 1-Disco 2-Impressora
//[6] Porta ou Arquivo 1-LPT1... 4-COM1...
//[7] Expressao do Filtro
//[8] Ordem a ser selecionada
//[9]..[10]..[n] Campos a Processar (se houver)
Private lEnd := .F. // Controle de cancelamento do relatorio
Private m_pag := 1 // Contador de Paginas
Private nLastKey := 0 // Controla o cancelamento da SetPrint e SetDefault
//----------------------------------------------------------------------------
// Verifica as Perguntas Seleciondas
//----------------------------------------------------------------------------
//Pergunte(cPerg,.F.) //----------------------------------------------------------------------------
// Envia para a SetPrinter
//----------------------------------------------------------------------------
cFile:=SetPrint( cString, cFile, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrdem,;
lComp, Tamanho, , lFiltro)
If nLastKey==27
DbSelectArea(cString)
DbSetOrder(1)
Set Filter to
Return
Endif
SetDefault(aReturn,cString)
If nLastKey==27
DbSelectArea(cString)
DbSetOrder(1)
Set Filter to
Return
Endif
RptStatus({|lEnd| ImpDet(@lEnd, cFile, cString, cProgName, cTitulo)}, cTitulo)
Return .T.
Static Function ImpDet(lEnd, cFile, cString, cProgName, cTitulo)
Local li := 100 // Contador de Linhas
Local lImp := .F. // Indica se algo foi impresso
Local cbCont := 0 // Numero de Registros Processados
Local cbText := "" // Mensagem do Rodape
//
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
//01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
Local cCabec1 := ""
Local cCabec2 := ""
DbSelectArea(cString)
SetRegua(LastRec())
DbSetOrder(1)
DbSeek(XFilial())
While !EOF() .And. XFilial(cString) == MV_PAR01
lImp := .T.
If lEnd
@ Prow()+1,001 PSay "CANCELADO PELO OPERADOR"
Exit
EndIf
If ( li > 58 )
li := cabec(cTitulo, cCabec1, cCabec2, cProgName, Tamanho, CHRCOMP)
li++
Endif
DbSelectArea(cString)
DbSkip()
cbCont++
IncRegua()
EndDo
If lImp
Roda(cbCont, cbText, Tamanho)
EndIf
Set Device To Screen
Set Printer To
If ( aReturn[5] = 1 )
DbCommitAll()
OurSpool(cFile)
Endif
Ms_Flush()
Return .T.