Função para Interromper Rotina

Bom dia,

Alguem sabe me dizer se existe alguma função que interrompe o processo da rotina,

Exemplo: coloquei um PE em uma parte do sistema, vou fazer uma verificação pelo IF, se for verdadeiro ele passa, se não ele vai aparecer uma mensagem e interromper
Unica forma que encontrei foi usando a função FINAL()

3 curtidas

Bom dia, Se tiver um loop, pode usar o UserException.

Exemplo:

UserException(` `"Falha na atualizacao: "` `+ TCSQLError())`
2 curtidas

Se eu entendi bem, você quer somente interromper a partir do if aquela continuação do PE? ou a rotina como um todo?

Se for do ponto de entrada a resposta simples seria: use um “return”. que simplesmente ela irá ignorar o restante do processamento.

Acredito que o simples sirva bem para você, exemplo:

#INCLUDE “TOTVS.CH”
#INCLUDE “protheus.ch”
user function PONTO_DE_ENTRADA()
IF validacao == .F.
Alert( ‘Validação Falsa, rotina interrompida’ )
Return
Else
//Aqui continua a rotina caso a validacao == .T.
Return

Isso vai depender do PE que esta usando, normalmente usamos o PE XXXXTOK, que é o tudo OK, e espera um retorno .T. ou .F., permitindo ou não continuar com a Inclusão. alteração ou exclusão do registro.
Se for uma rotina em MVC tem outras particularidades.
Poste qual é a rotina e o PE que esta usando, assim podemos ajudar melhor.

Estou usando o PE MNTA280K

O que estou querendo fazer não é o que o PE espera, então o return, não daria certo

Exemplo: esse PE é acionado quando aperto em um botão especifico, quero colocar um IF pra caso entrar no if ele só não fazer nada, com o uso da função FINAL ele fecha completamente a rotina
Fonte atual;

User Function MNTA280K()
   if  TQB->TQB_VALID$'A'
	 	FWAlertErro("Não é permitido fechar SS sem validação","SS ainda não foi validada")
  FINAL("SS ainda não foi validada")
   endif
Return

Se está utilizando o ponto de entrada MNTA280K o mesmo espera que retorno seja um boleano.

Faça sua validação se não for vallido, exiba sua mensagem FWAlertErro e retorne .F…

Não use o FINAL, pois se houver algum processo que precise de um rollback será perdido, pois final fecha o sistema.

Ajuste no código que passou:

User Function MNTA280K()
Local lReturn as logical

lReturn := .T.

if TQB->TQB_VALID$‘A’
FWAlertErro(“Não é permitido fechar SS sem validação”,“SS ainda não foi validada”)
lReturn := .F.
endif

Return lReturn

Ja tentei, inclusive, to até com chamado aberto pra corrigir o PE, mas MNT geralmente demora muito pra sair :smiling_face_with_tear:

Você tem compilado o PE MNTA400N ? Pergunto isso porque na documentação diz que para o uso do P.E. MNTA280k é necessário ter ele também.

DT PE MNTA280K Permite impedir o fechamento da tela de Finalização de S.S. - Linha Microsiga Protheus - TDN

DT PE MNTA400N - Define apresentação de tela de finalização de S.S. no Retorno de O.S. (MNTA400) - Linha Microsiga Protheus - TDN

2 curtidas

Cara, eu tenho compilado, mas mesmo assim não funciona :smiling_face_with_tear: vou realizar mais alguns testes ainda

Essa função é interessante, mas, ela derruba o sistema por completo rsrs
Queria que só impedisse o usuario de acessar a rotina especifica

O PE é ativado antes de acessar a rotina, dando o return ou retornando .F. ele acessa a rotina depois, preciso que ele não acesse a rotina, então minha duvida é se existe alguma função que somente pare tudo que o sistema esteja fazendo, sem derrubar a conexão da rotina

Exemplo: apertei em uma rotina, o sistema so mostra a mensagem, e antes de entrar no browser da rotina ele para por conta dessa função

Voce não pode substituir diretamente no menu de MNTA280 para por exemplo MyMT280

Seu fonte ficaria algo assim:

User Function MyMT280()
     If (Sua condição)
         MNTA280()
     Else
         Alert("Acesso não permitido")
     EndIf
 Return
1 curtida

não havia pensado nisso :hushed:, vou testar mas acredito que vá resolver

Amigo, so usar um fif simples, se for processar fica no if, senao segue pro else e encerra, se uma o Final por exemplo vai derrubar a conexão do usuario.

Olá,

O recomendado é utilizar a função Final:
https://tdn.totvs.com/display/public/framework/Final

Que inclusive é a função padrão do Protheus para isso, ela vai exibir a mensagem e finalizar thread.


Uma outra opção, menos elegante é gerar exceção via UserException:
https://tdn.totvs.com/display/tec/UserException

Porém ela gera um error.log e pode parecer ao usuário final que se trata de um erro e não uma tratativa, além disso, ela vai gerar logs de erro no console etc.

2 curtidas