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.