Hoje vou mostrar como fazer a lógica para um contador de uma régua de processamento.
Se você já precisou mostrar alguma informação na régua de processamento, como por exemplo, “Imprimindo registro 1 de 10”, “Imprimindo registro 2 de 10”, “Imprimindo registro 3 de 10”, etc… A lógica seria a seguinte:
- Na sua User Function, chamar uma função estática de processamento, através de Processa(), MsNewProcess() ou outras réguas / barras de processamento
- Dentro dessa função estática, crie duas variáveis, uma que será o número atual e uma que será o total, por exemplo, nAtual e nTotal
- A variável de total, para definir o valor, você precisa saber o fim da régua, para isso, se for uma query, basta após executar chamar o Count To para contar o total de registros que serão processados
- Após isso, defina o tamanho da régua com essa variável nTotal
- Durante o laço de repetição, ao incrementar a posição da régua, mostre o nAtual e o nTotal convertendo eles para caractere
Abaixo o código fonte desenvolvido com a lógica acima:
//Bibliotecas
#Include "TOTVS.ch"
#Include "TopConn.ch"
#Include "RPTDef.ch"
#Include "FWPrintSetup.ch"
//Alinhamentos
#Define PAD_LEFT 0
#Define PAD_RIGHT 1
#Define PAD_CENTER 2
#Define PAD_JUSTIFY 3 //Opção disponível somente a partir da versão 1.6.2 do TOTVS Printer
/*/{Protheus.doc} User Function AFATR01
Exemplo de régua de processamento
@type Function
@author Atilio
@since 27/03/2021
@version version
/*/
User Function AFATR01()
Local aArea := GetArea()
Local aPergs := {}
Private cNotaDe := Space(TamSX3('F2_DOC')[1])
Private cNotaAt := StrTran(cNotaDe, ' ', 'Z')
Private dDataDe := FirstDate(Date())
Private dDataAt := LastDate(dDataDe)
Private cPastaRel := GetTempPath() + "notas\" + Space(50)
//Adiciona as perguntas que serão exibidas
aAdd(aPergs, {1, "Nota De", cNotaDe, "", ".T.", "", ".T.", 90, .F.})
aAdd(aPergs, {1, "Nota Até", cNotaAt, "", ".T.", "", ".T.", 90, .T.})
aAdd(aPergs, {1, "Data De", dDataDe, "", ".T.", "", ".T.", 70, .F.})
aAdd(aPergs, {1, "Data Até", dDataAt, "", ".T.", "", ".T.", 70, .T.})
aAdd(aPergs, {1, "Diretório PDFs", cPastaRel, "", ".T.", "", ".T.", 120, .T.})
//Se a pergunta for confirmada, chama a geração dos relatórios
If ParamBox(aPergs, "Informe os parâmetros", , , , , , , , , .F., .F.)
cNotaDe := MV_PAR01
cNotaAt := MV_PAR02
dDataDe := MV_PAR03
dDataAt := MV_PAR04
cPastaRel := Alltrim(MV_PAR05)
Processa({|| fGeraRel()})
EndIf
RestArea(aArea)
Return
Static Function fGeraRel()
Local aArea := GetArea()
Local nAtual := 0
Local nTotal := 0
Local cQry := ""
Local cArquivo
//Linhas e colunas
Private nLinAtu := 0
Private nLinIni := 012
Private nLinFin := 800
Private nColIni := 012
Private nColFin := 582
//Declarando as fontes
Private cNomeFont := "Arial"
Private oFontDet := TFont():New(cNomeFont, 9, -10, .T., .F., 5, .T., 5, .T., .F.)
Private oFontDetN := TFont():New(cNomeFont, 9, -10, .T., .T., 5, .T., 5, .T., .F.)
Private oFontTit := TFont():New(cNomeFont, 9, -16, .T., .F., 5, .T., 5, .T., .F.)
//Monta a query para buscar os dados conforme os parâmetros
cQry := " SELECT " + CRLF
cQry += " F2_EMISSAO, " + CRLF
cQry += " F2_HORA, " + CRLF
cQry += " F2_DOC " + CRLF
cQry += " FROM " + CRLF
cQry += " SF2010 SF2 " + CRLF
cQry += " WHERE " + CRLF
cQry += " F2_DOC >= '" + cNotaDe + "' " + CRLF
cQry += " AND F2_DOC <= '" + cNotaAt + "' " + CRLF
cQry += " AND F2_EMISSAO >= '" + dToS(dDataDe) + "' " + CRLF
cQry += " AND F2_EMISSAO <= '" + dToS(dDataAt) + "' " + CRLF
cQry += " AND F2_TIPO NOT IN ('B', 'D') " + CRLF
cQry += " AND SF2.D_E_L_E_T_ = ' ' " + CRLF
cQry += " ORDER BY " + CRLF
cQry += " F2_DOC " + CRLF
TCQuery cQry New Alias "QRY_DOC"
TCSetField("QRY_DOC", "F2_EMISSAO", "D")
//Se houver dados
If ! QRY_DOC->(EoF())
//Define o tamanho da régua
nAtual := 0
Count To nTotal
ProcRegua(nTotal)
QRY_DOC->(DbGoTop())
//Se a pasta dos arquivos não existir, cria ela
If ! ExistDir(cPastaRel)
MakeDir(cPastaRel)
EndIf
//Enquanto houver dados
While ! QRY_DOC->(EoF())
//Incrementando a régua
nAtual++
IncProc("Imprimindo nota " + Alltrim(QRY_DOC->F2_DOC) + " (" + cValToChar(nAtual) + " de " + cValToChar(nTotal) + ")...")
/*
Aqui você pode fazer a impressão ou o tratamento dos dados da nf
*/
QRY_DOC->(DbSkip())
EndDo
MsgInfo("Processamento finalizado, confira a pasta com os arquivos!", "Atenção")
//Se não houver, mostra mensagem
Else
MsgStop("Não foi encontrado informações com os filtros informados!", "Atenção")
EndIf
QRY_DOC->(DbCloseArea())
RestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.