Olá,
O & permite executar um valor em ADVPL, em explicação resumida, ele permite interpretar um trecho de código durante a execução, sem a necessidade de uma compilação, ela possui limitações se comparado a um código compilado.
A macro é muito útil para lhe dar com valores dinâmicos, como os dicionários do Protheus, cada campo pode possuir uma validação e essas validações normalmente são executadas via macro.
cMacro := "ConOut('Xisto')"
&cMacro
Esse exemplo vai chamar a função ConOut com o parâmetro Xisto, veja que o conteúdo de uma string acaba sendo executado como um código normal.
O $ é um operador de contido, ele permite verificar se uma string está contida em outra. Você pode comparar esse operador com o método includes da String do Javascript.
if "Xisto" $ "XistoX"
endif
Esse exemplo vai retornar verdadeiro, pois a string Xisto
está contida em XistoX
.
No exemplo abaixo, o IF está verificando se o conteúdo presente na variável cCampo
está contido na string "A5_PRODUTO/A5_NOMEFOR"
.
If cCampo $ ("A5_PRODUTO/A5_NOMEFOR")
Já nesse exemplo, está sendo verificado se _nOpcx
(convertido para string) está contido em "346"
, caso essa condição seja verdadeira, a variável lRet
receberá a macro da variável cLineOK
, a variável cLineOK
provavelmente possui uma string com o nome de uma função, como "U_LinhaOk()"
, ao chamar a macro desse valor, a função U_LinhaOk
será executada.
If Str(_nOpcx,1,0)$"346"
lRet := &cLineOK
Documentações:
https://tdn.totvs.com/pages/viewpage.action?pageId=6063087
https://tdn.totvs.com/display/tec/Operadores+Comuns