Como fazer um contador de até em réguas de processamento

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:

  1. Na sua User Function, chamar uma função estática de processamento, através de Processa(), MsNewProcess() ou outras réguas / barras de processamento
  2. 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
  3. 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
  4. Após isso, defina o tamanho da régua com essa variável nTotal
  5. 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.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta