Utilizando a função ProcName()


A função ProcName() retorna o nome da rotina ou função, definida pelo usuário, corrente ou anterior. Esta função pode muito ser útil quando queremos condicionar nosso fonte a executar algo se ele passar por alguma função dentro de uma rotina padrão ou customizada. Sintaxe ProcName ( [ nAtivacao] ) --> cRet Parâmetros/Elementos

Nome Tipo Descrição Obrigatório Referência
nAtivacao Numérico Indica um valor numérico que especifica qual ativação será questionada. Sendo: 0- Refere-se à ativação corrente; 1-Refere-se à ativação anterior, etc. No entanto, caso nenhum valor seja especificado, o padrão será zero (0).
Retorno cRet (caracter) = Retorna o nome de uma rotina, função ou bloco de código em execução no momento, na forma de uma string. Observações Como exemplo, quero usar um determinado ponto de entrada que é utilizado tanto para incluir, quanto alterar ou excluir, mas só quero que minha rotina execute quando passar por um determinado processamento. Exemplificando melhor: Irei utilizar o ponto de entrada AT400GRV, este P.E. é chamado apos a inclusão, alteração ou exclusão de um orçamento no módulo Gestão de Serviços. Mas só irei executar se eu passar pela função AT400PROC.
User Function AT400GRV
	If FunName() = "TECA400"
		If Alltrim(ProcName(3))!="AT400PROC"
		    MSMM(AB3->AB3_CODOBS, Nil, Nil, M->AB3_OBS, 1, Nil, Nil, "AB3","AB3_CODOBS")
		Endif
	Endif
Return
Ou por exemplo:
User Function M410STTS()

Private _cArea		:= GetArea()
Private _cAreaSC6	:= SC6->(GetArea())
Private _nRecSC6
Private _cPedido

For x := 1 to Len(ProcName())
	
	If ProcName(x) == "A410DEVOL" //se encontrar a função A410DEVOL, fará alguma ação
				
		dbSelectArea("SC6")
		_nRecSC6	:= RecNo()
		_cPedido	:= SC6->C6_NUM
		
		dbSetOrder(1)
		dbSeek( xFilial("SC6") + _cPedido )
		
		While !Eof() .and. SC6->C6_NUM == _cPedido .and. SC6->C6_FILIAL == xFilial("SC6")
			
			dbSelectArea("SD1")
			dbSetOrder(1)
			If dbSeek( xFilial("SD1") + SC6->C6_NFORI + SC6->C6_SERIORI + SC6->C6_CLI + SC6->C6_LOJA + SC6->C6_PRODUTO + SC6->C6_ITEMORI )
				
				dbSelectArea("SC6")
				RecLock("SC6",.F.)
				SC6->C6_NUMSERI := SD1->D1_MSERIAL
				MsUnlock()
				
			Endif
			
			dbSkip()
			
		EndDo
		
		Goto _nRecSC6		
	Endif
	
Next

RestArea(_cAreaSC6)
RestArea(_cArea)

Return
Caso não saiba qual posição encontra-se o processo, você pode utilizar o FOR conforme exemplo acima.
For x := 1 to Len(ProcName())
	
	If ProcName(x) == "FUNCAOPROCURADA"
	
	/*SEU CODIGO CASO ENCONTRE*/
	
	Endif
Next