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
- Essa função questiona a pilha de ativação, da linguagem AdvPL, a respeito do nome de uma rotina, função definida pelo usuário ou bloco de código em execução naquele momento. A pilha de ativação é uma estrutura interna que mantém um registro de cada chamada da rotina, função ou bloco de código.
- Número de linha tem relação com o início do arquivo fonte original. Linhas incluem uma diretiva de compilador, processador, linha em branco, comentário e uma continuação da linha. Uma linha de várias declarações é considerada uma única linha.
- Para uma ativação corrente, esse função retorna o nome da rotina ou função definida pelo usuário.
- Para uma ativação anterior, a função retorna o nome ou função definida pelo usuário que chamou a rotina corrente.
- Se a ativação questionada é uma avaliação de bloco de código, ProcName retornará o nome da rotina ou função do usuário que definiu o bloco de código.
- Utilize essa função em conjunto com a ProcLine() para fornecer informações sobre depuração.
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.
1 2 3 4 5 6 7 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
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.
1 2 3 4 5 6 7 8 |
For x := 1 to Len(ProcName()) If ProcName(x) == "FUNCAOPROCURADA" /*SEU CODIGO CASO ENCONTRE*/ Endif Next |