Como bloquear o botão Refresh da tela de Monitoramento de NFe

No artigo de hoje, vamos demonstrar em como bloquear o botão Refresh na tela de Monitoramento de Notas.

Imagina o seguinte cenário, onde os usuários do Faturamento ao clicarem na opção de Monitorar Notas, na segunda tela que é exibida, eles ficarem clicando sem parar no botão Refresh.

 

Isso pode acabar acarretando na mensagem “Rejeição 656 – Consumo Indevido”.

 

Para tentar sanar essa questão, desenvolvemos um paliativo, que na verdade impede que o usuário fique clicando nesse botão, sendo que a partir da segunda vez que ele clica, é exibido uma mensagem de aguardar 10 segundos.

 

O primeiro passo então, foi encontrar o ponto de entrada necessário para fazer esse ajuste, sendo que o utilizado foi o FISMNTNFE.

 

O segundo passo, foi ao construir o ponto de entrada, colocar um breakpoint logo no começo para ver a pilha de chamadas quando é disparado pelo botão, sendo que foi identificado que vem de um bloco de código, conforme print abaixo:

Verificando a pilha de chamadas

Verificando a pilha de chamadas

 

Então foi montado a seguinte lógica:

  1. Criação de uma variável que guarda a última vez que foi clicada no botão
  2. É feito um laço de repetição na pilha de chamadas (buscando o ProcName de cada posição)
  3. Se encontrar o bloco de códigos conforme o print acima, marca a variável lVeioBotao como true
  4. Ao sair do laço de repetição, se veio do botão e não tiver tempo ainda, atualiza a variável
  5. Do contrário, aciona a função zDlgEspera aguardando 10 segundos com uma mensagem personalizada (print abaixo)
Mensagem para aguardar 10 segundos

Mensagem para aguardar 10 segundos

 

E abaixo o código fonte conforme a lógica acima:

//Bibliotecas
#Include "TOTVS.ch"

//Último tempo executado
Static cUltTempo := ""

/*/{Protheus.doc} User Function FISMNTNFE 
Ponto de Entrada acionado na tela de Monitoramento de NFe
@type  Function
@author Atilio
@since 11/07/2024
@see https://tdn.totvs.com/display/public/TSS/FISMNTNFE+-+Monitor+Faixa+da+NF-e
/*/

User Function FISMNTNFE()
    Local aArea      := FWGetArea()
    Local cMensagem  := "Já foi clicado no Refresh nos últimos 10 segundos!
Aguarde mais 10 segundos para tentar novamente!" Local cTitulo := "Aguarde" Local nSegundos := 10 Local cHoraAtual := Time() Local lVeioBotao := .F. Local nAtual := 0 //Enquanto for verdadeiro While .T. //Busca o nome do processo atual cProcAtu := Alltrim(Upper(ProcName(nAtual))) //Se tem processo If ! Empty(cProcAtu) //Se veio do listbox pra atualizar a tela If "ALISTBOX:=GETLISTBOX(" $ cProcAtu lVeioBotao := .T. EndIf //Senão, encerra o laço Else Exit EndIf //Incrementa o contador dos processos nAtual++ EndDo //Somente se veio do botão de Refresh If lVeioBotao //Se o tempo tiver vazio ou for maior que 10 segundos If Empty(cUltTempo) .Or. ElapTime(cUltTempo, cHoraAtual) > "00:00:10" cUltTempo := Time() //Senão, mostra mensagem para esperar ElseIf ! cHoraAtual == cUltTempo u_zDlgEspera(cMensagem, cTitulo, nSegundos) EndIf EndIf FWRestArea(aArea) Return /*/{Protheus.doc} User Function zDlgEspera Função que abre uma dialog sem opção de fechar e sem o -ESC- por um curto período de tempo @type Function @author Atilio @since 11/07/2024 @param cMensagem, Caractere, Mensagem que aparecerá na tela @param cTitulo, Caractere, Título da tela da mensagem @param nSegundos, Numérico, Número de segundos /*/ User Function zDlgEspera(cMensagem, cTitulo, nSegundos) Local aArea := FWGetArea() Local bTimer := {|| oDialog:DeActivate()} Local oDialog Local oPanel Local oSayMsg Default cMensagem := "Aguarde 3 segundos" Default cTitulo := "Atenção" Default nSegundos := 3 //Configura a Dialog oDialog := FWDialogModal():New() oDialog:SetBackground(.F.) oDialog:SetTitle(cTitulo) oDialog:SetEscClose(.F.) oDialog:SetSize(80, 150) oDialog:SetCloseButton(.F.) oDialog:CreateDialog() oDialog:SetTimer(nSegundos, bTimer) //Pega o painel e insere uma mensagem nele oPanel := TPanel():New(/*nRow*/, /*nCol*/, /*cText*/, oDialog:GetPanelMain()) oPanel:Align := CONTROL_ALIGN_ALLCLIENT oSayMsg := TSay():New(1, 1, {|| cMensagem}, oPanel, /*cPicture*/, /*oFont*/, /*uParam7*/, /*uParam8*/, /*uParam9*/, .T., /*nClrText*/, /*nClrBack*/, (oPanel:nWidth)/2 - 1, (oPanel:nHeight)/2 - 1, /*uParam15*/, /*uParam16*/, /*uParam17*/, /*uParam18*/, /*uParam19*/, .T.) //Abre a Dialog oDialog:Activate() FWRestArea(aArea) Return

Referências:

 

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação