Função que imprime o cabeçalho dos antigos relatórios gerados com SetPrint.
Exemplo da Rotina:
Cabec("Titulo", "Cabec1", "Cabec2", "NomePrograma", "Tamanho", nTipo)
Exemplo 1- Relatório exemplo de Contas a Pagar:
//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"
/*/{Protheus.doc} zTeste
Função de Teste
@type function
@author Terminal de Informação
@since 13/11/2016
@version 1.0
@example
u_zTeste()
/*/
User Function zTeste()
Local cDesc1 := "Este relatório irá imprimir informações do contas a pagar conforme"
Local cDesc2 := "parâmetro informado. Será gerado um arquivo no diretório "
Local cDesc3 := "Spool - zTeste_????.XLS, onde ???? e o nome do usuário."
Private cString := "SE2"
Private Tamanho := "M"
Private aReturn := { "Zebrado",2,"Administração",2,2,1,"",1 }
Private wnrel := "zTeste"
Private NomeProg := "zTeste"
Private nLastKey := 0
Private Limite := 132
Private Titulo := "Título a Pagar - Ordem de "
Private cPerg := "X_zTeste"
Private nTipo := 0
Private cbCont := 0
Private cbTxt := "registro(s) lido(s)"
Private Li := 80
Private m_pag := 1
Private aOrd := {}
Private Cabec1 := " PREFIXO TITULO PARC. TIP EMISSAO VENCTO VENCTO REAL VLR. ORIGINAL PAGO SALDO "
Private Cabec2 := ""
/*
Parâmetros do aReturn
aReturn - Preenchido pelo SetPrint()
aReturn[1] - Reservado para formulário
aReturn[2] - Reservado para numero de vias
aReturn[3] - Destinatário
aReturn[4] - Formato 1=Paisagem 2=Retrato
aReturn[5] - Mídia 1-Disco 2=Impressora
aReturn[6] – Porta ou arquivo 1-Lpt1... 4-Com1...
aReturn[7] - Expressão do filtro
aReturn[8] - Ordem a ser selecionada
aReturn[9] [10] [n] - Campos a processar se houver
*/
//Ordens do relatório
aAdd( aOrd, "Fornecedor" )
aAdd( aOrd, "Titulo" )
aAdd( aOrd, "Emissão" )
aAdd( aOrd, "Vencimento" )
aAdd( aOrd, "Vencto. Real" )
//Cria as perguntas do relatório e chama para a memória
fCriaSX1()
Pergunte(cPerg,.F.)
//Mostra a tela de configuração do relatório
wnrel := SetPrint(cString, wnrel, cPerg, @Titulo, cDesc1, cDesc2, cDesc3, .F., aOrd, .F., Tamanho, .F., .F.)
//Se pressionar -ESC- encerra o programa
If nLastKey == 27
Return
Endif
//Estabelece os padrões para impressão, conforme escolha do usuário
SetDefault(aReturn,cString)
//Verificar se será reduzido ou normal
nTipo := IIF(aReturn[4] == 1, 15, 18)
//Se pressionar -ESC- encerra o programa
If nLastKey == 27
Return
Endif
//Chama função que processa os dados
RptStatus({|lEnd| fImpRel(@lEnd) }, Titulo, "Processando e imprimindo dados, aguarde...", .T. )
Return
/*---------------------------------------------------------------------*
| Func: fImpRel |
| Desc: Função para impressão do relatório |
*---------------------------------------------------------------------*/
Static Function fImpRel(lEnd)
Local nIndice := 0
Local cArq := ""
Local cIndice := ""
Local cFiltro := ""
Local aCol := {}
Local cFornec := ""
Local nValor := 0
Local nPago := 0
Local nSaldo := 0
Local nT_Valor := 0
Local nT_Pago := 0
Local nT_Saldo := 0
Local cArqExcel := ""
Local cAliasImp
Local oExcelApp
Titulo += aOrd[aReturn[8]]
//Se não utilizar banco top connect, executa filtro manualmente na tabela
#IFNDEF TOP
cAliasImp := "SE2"
cFiltro := "E2_FILIAL == '"+xFilial("SE2")+"' "
cFiltro += ".And. E2_FORNECE >= '"+mv_par01+"' "
cFiltro += ".And. E2_FORNECE <= '"+mv_par02+"' "
cFiltro += ".And. E2_TIPO >= '"+mv_par03+"' "
cFiltro += ".And. E2_TIPO <= '"+mv_par04+"' "
cFiltro += ".And. Dtos(E2_VENCTO) >= '"+Dtos(mv_par05)+"' "
cFiltro += ".And. Dtos(E2_VENCTO) <= '"+Dtos(mv_par06)+"' "
//Ordenação por Fornecedor
If aReturn[8] == 1
cIndice := "E2_FORNECE+E2_LOJA+E2_NUM"
//Ordenação por Título
Elseif aReturn[8] == 2
cIndice := "E2_NUM+E2_FORNECE+E2_LOJA"
//Ordenação por Emissão
Elseif aReturn[8] == 3
cIndice := "Dtos(E2_EMISSAO)+E2_FORNECE+E2_LOJA"
//Ordenação por Vencimento
Elseif aReturn[8] == 4
cIndice := "Dtos(E2_VENCTO)+E2_FORNECE+E2_LOJA"
//Ordenação por Vencimento Real
Elseif aReturn[8] == 5
cIndice := "Dtos(E2_VENCREA)+E2_FORNECE+E2_LOJA"
Endif
//Cria arquivo temporário filtrando via AdvPL
cArq := CriaTrab(NIL,.F.)
dbSelectArea(cAliasImp)
IndRegua(cAliasImp,cArq,cIndice,,cFiltro)
nIndice := RetIndex()
nIndice := nIndice + 1
dbSetIndex(cArq+OrdBagExt())
dbSetOrder(nIndice)
//Senão, monta consulta SQL
#ELSE
cAliasImp := "QRY_IMP"
cQuery := "SELECT "
cQuery += "E2_PREFIXO, E2_NUM, E2_PARCELA, E2_TIPO, E2_FORNECE, E2_LOJA, E2_NOMFOR, "
cQuery += "E2_EMISSAO, E2_VENCTO, E2_VENCREA, E2_VALOR, E2_SALDO "
cQuery += "FROM "+RetSqlName("SE2")+" "
cQuery += "WHERE E2_FILIAL = '"+xFilial("SE2")+"' "
cQuery += "AND E2_FORNECE >= '"+mv_par01+"' "
cQuery += "AND E2_FORNECE <= '"+mv_par02+"' "
cQuery += "AND E2_TIPO >= '"+mv_par03+"' "
cQuery += "AND E2_TIPO <= '"+mv_par04+"' "
cQuery += "AND E2_VENCTO >= '"+Dtos(mv_par05)+"' "
cQuery += "AND E2_VENCTO <= '"+Dtos(mv_par06)+"' "
cQuery += "AND D_E_L_E_T_ = ' ' "
cQuery += "ORDER BY "
//Ordenação por Fornecedor
If aReturn[8] == 1
cQuery += "E2_FORNECE,E2_LOJA,E2_NUM"
//Ordenação por Título
Elseif aReturn[8] == 2
cQuery += "E2_NUM,E2_FORNECE,E2_LOJA"
//Ordenação por Emissão
Elseif aReturn[8] == 3
cQuery += "E2_EMISSAO,E2_FORNECE,E2_LOJA"
//Ordenação por Vencimento
Elseif aReturn[8] == 4
cQuery += "E2_VENCTO,E2_FORNECE,E2_LOJA"
//Ordenação por Vencimento Real
Elseif aReturn[8] == 5
cQuery += "E2_VENCREA,E2_FORNECE,E2_LOJA"
Endif
TCQuery cQuery New Alias "QRY_IMP"
#ENDIF
dbGoTop()
SetRegua(0)
//Colunas de impressão
aAdd( aCol, 004 ) //Prefixo
aAdd( aCol, 012 ) //Titulo
aAdd( aCol, 024 ) //Parcela
aAdd( aCol, 031 ) //Tipo
aAdd( aCol, 036 ) //Emissao
aAdd( aCol, 046 ) //Vencimento
aAdd( aCol, 058 ) //Vencimento Real
aAdd( aCol, 070 ) //Valor Original
aAdd( aCol, 090 ) //Pago
aAdd( aCol, 110 ) //Saldo
cFornec := (cAliasImp)->E2_FORNECE+(cAliasImp)->E2_LOJA
//Enquanto houver dados
While !Eof() .And. !lEnd
//Se atingir 55 linhas, imprime cabeçalho
If Li > 55
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
Endif
//Imprime dados do Fornecedor
@ Li, aCol[1] PSay "Cod/Loj/Nome: "+(cAliasImp)->E2_FORNECE+"-"+(cAliasImp)->E2_LOJA+" "+(cAliasImp)->E2_NOMFOR
Li ++
//Enquanto for o fornecedor atual
While !Eof() .And. !lEnd .And. (cAliasImp)->E2_FORNECE+(cAliasImp)->E2_LOJA == cFornec
IncRegua()
//Testa para quebra de linha
If Li > 55
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
Endif
//Se for analítico, imprime os dados do título
If mv_par07 == 2
@ Li, aCol[1] PSay (cAliasImp)->E2_PREFIXO
@ Li, aCol[2] PSay (cAliasImp)->E2_NUM
@ Li, aCol[3] PSay (cAliasImp)->E2_PARCELA
@ Li, aCol[4] PSay (cAliasImp)->E2_TIPO
@ Li, aCol[5] PSay (cAliasImp)->E2_EMISSAO
@ Li, aCol[6] PSay (cAliasImp)->E2_VENCTO
@ Li, aCol[7] PSay (cAliasImp)->E2_VENCREA
@ Li, aCol[8] PSay (cAliasImp)->E2_VALOR PICTURE "@E 99,999,999,999.99"
@ Li, aCol[9] PSay (cAliasImp)->E2_VALOR - (cAliasImp)->E2_SALDO PICTURE "@E 99,999,999,999.99"
@ Li, aCol[10] PSay (cAliasImp)->E2_SALDO PICTURE "@E 99,999,999,999.99"
Li ++
Endif
//Atualiza os totais
nValor += (cAliasImp)->E2_VALOR
nPago += ((cAliasImp)->E2_VALOR-(cAliasImp)->E2_SALDO)
nSaldo += (cAliasImp)->E2_SALDO
nT_Valor += (cAliasImp)->E2_VALOR
nT_Pago += ((cAliasImp)->E2_VALOR-(cAliasImp)->E2_SALDO)
nT_Saldo += (cAliasImp)->E2_SALDO
dbSkip()
EndDo
//Imprime os totais
@ Li, 000 PSay Replicate("-",Limite)
Li ++
@ Li, aCol[1] PSay "TOTAL....."
@ Li, aCol[8] PSay nValor PICTURE "@E 99,999,999,999.99"
@ Li, aCol[9] PSay nPago PICTURE "@E 99,999,999,999.99"
@ Li, aCol[10] PSay nSaldo PICTURE "@E 99,999,999,999.99"
Li +=2
cFornec := (cAliasImp)->E2_FORNECE+(cAliasImp)->E2_LOJA
nValor := 0
nPago := 0
nSaldo := 0
EndDo
//Se o usuário cancelou, finaliza
If lEnd
@ Li, aCol[1] PSay cCancel
Return
Endif
//Imprime o total geral
@ Li, 000 PSay Replicate("=",Limite)
Li ++
@ Li, aCol[1] PSay "TOTAL GERAL....."
@ Li, aCol[8] PSay nT_Valor PICTURE "@E 99,999,999,999.99"
@ Li, aCol[9] PSay nT_Pago PICTURE "@E 99,999,999,999.99"
@ Li, aCol[10] PSay nT_Saldo PICTURE "@E 99,999,999,999.99"
//Se não atingiu o limite, imprime o rodapé
If Li <> 80
Roda(cbCont,cbTxt,Tamanho)
Endif
//Gera arquivo do tipo .DBF com extensão .XLS p/ usuário abrir no Excel
cArqExcel := __RELDIR+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS"
Copy To &cArqExcel
#IFNDEF TOP
dbSelectArea(cAliasImp)
RetIndex(cAliasImp)
Set Filter To
#ELSE
dbSelectArea(cAliasImp)
(cAliasImp)->(dbCloseArea())
#ENDIF
DbSelectArea('SE2')
SE2->(DbSetOrder(1))
SE2->(DbGoTop())
//Mostra o relatório
If aReturn[5] == 1
Set Printer TO
dbCommitAll()
OurSpool(wnrel)
EndIf
//Abrindo planilha MS-Excel
If mv_par08 == 1
__CopyFile(cArqExcel,GetTempPath()+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS")
If ! ApOleClient("MsExcel")
MsgAlert("MsExcel não instalado", "Atenção")
Return
Endif
oExcelApp := MsExcel():New()
oExcelApp:WorkBooks:Open( GetTempPath()+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS" )
oExcelApp:SetVisible(.T.)
oExcel:Destroy()
Endif
Ms_Flush()
Return
/*---------------------------------------------------------------------*
| Func: fCriaSX1 |
| Desc: Função para criar o grupo de perguntas |
*---------------------------------------------------------------------*/
Static Function fCriaSx1()
Local aP := {}
Local i := 0
Local cSeq
Local cMvCh
Local cMvPar
Local aHelp := {}
//Adiciona os parâmetros
aAdd(aP,{"Fornecedor de","C",6,0,"G","","SA2","" ,"" ,"","",""})
aAdd(aP,{"Fornecedor ate","C",6,0,"G","(mv_par02>=mv_par01)","SA2","" ,"" ,"","",""})
aAdd(aP,{"Tipo de","C",3,0,"G","","05" ,"" ,"" ,"","",""})
aAdd(aP,{"Tipo ate","C",3,0,"G","(mv_par04>=mv_par03)","05" ,"" ,"" ,"","",""})
aAdd(aP,{"Vencimento de","D",8,0,"G","","" ,"" ,"" ,"","",""})
aAdd(aP,{"Vencimento ate","D",8,0,"G","(mv_par06>=mv_par05)","" ,"" ,"" ,"","",""})
aAdd(aP,{"Aglutinar pagto.de fornec.","N",1,0,"C","","","Sim","Não","","",""})
aAdd(aP,{"Abrir planilha MS-Excel" ,"N",1,0,"C","","","Sim","Não","","",""})
aAdd(aHelp,{"Informe o código do fornecedor.","inicial."})
aAdd(aHelp,{"Informe o código do fornecedor.","final."})
aAdd(aHelp,{"Tipo de título inicial."})
aAdd(aHelp,{"Tipo de título final."})
aAdd(aHelp,{"Digite a data do vencimento inicial."})
aAdd(aHelp,{"Digite a data do vencimento final."})
aAdd(aHelp,{"Aglutinar os títulos do mesmo forne-","cedor totalizando seus valores."})
aAdd(aHelp,{"Será gerada uma planilha para ","MS-Excel, abrir esta planilha?"})
//Percorre, recriando
For i:=1 To Len(aP)
cSeq := StrZero(i,2,0)
cMvPar := "mv_par"+cSeq
cMvCh := "mv_ch"+IIF(i<=9,Chr(i+48),Chr(i+87))
PutSx1(cPerg,;
cSeq,;
aP[i,1],aP[i,1],aP[i,1],;
cMvCh,;
aP[i,2],;
aP[i,3],;
aP[i,4],;
0,;
aP[i,5],;
aP[i,6],;
aP[i,7],;
"",;
"",;
cMvPar,;
aP[i,8],aP[i,8],aP[i,8],;
"",;
aP[i,9],aP[i,9],aP[i,9],;
aP[i,10],aP[i,10],aP[i,10],;
aP[i,11],aP[i,11],aP[i,11],;
aP[i,12],aP[i,12],aP[i,12],;
aHelp[i],;
{},;
{},;
"")
Next i
Return
Observações:
– Caso tenha dúvidas ou problemas com os exemplos, entre em contato;
– Se tiver sugestões de rotinas, pode entrar em contato;
Referências:
– TDN
