UDCs - User Defined Commands (Comandos Definidos Pelo Usuário )
Iniciarei uma série de "posts" sobre os Comandos Definidos Pelo Usuário ou UDCs. Eles servem para pesquisa e substituição mais complexas pelo "pré-processador" do Protheus.
UDCs são um método de converter comandos no estilo da linguagem em instruções. O pessoal de Tecnologia Protheus usam muito esse recurso pra facilitar a vida dos "programadores" da linguagem e são muito utilizados para facilitar a implementação e uso de funções ou de "objetos" que possuem muitos parâmetros onde a grande maioria são opcionais ou não.
Considerando os exemplos para #DEFINE, podemos afirmar que os padrões de capacidade de comparação de #DEFINE são, às vezes, muito limitados. Essa diretiva será útil se precisarmos, apenas, que o "pré-processador" traduza uma seqüência de palavras-chaves separadas por argumentos ou para definir constantes. O grande problema de usar #DEFINE para comandos complexos é que, além de ser sensível a maiúsculas e minúsculas, o usuário do comando deverá garantir que os parâmetros sejam passados EXATAMENTE da forma em que foram declarados.
Para especificar um padrão de busca mais complexo podemos usas as diretivas #COMMAND e #TRANSLATE (bem como #XCOMMAND e #XTRANSLATE, explicarei a diferenças no decorrer da série).
Essas diretivas irão fornecer, ao "pré-processador", recursos de correspondência de padrões.
Usando-as, poderemos especificar um padrão de busca complexo e um padrão de resultado e o "pré-processador" se encarregará de fazer a conversão entre eles. Poderemos até especificar diferentes tipos de argumentos e métodos distintos de convertê-los, além de criar grupos de repetição e "ensinar" ao "pré-processador" como traduzi-los.
Um exemplo bem simples de UDC poderia ser:
#command PACK => __dbPack()
O "pré-processador" ao encontrar o comando PACK (que poderia ser escrito como Pack ou pack, não existe distinção entre maiúsculas e minúsculas: defina um padrão e procure segui-lo, como, por exemplo escrever os comandos das UDC´s sempre em maiúsculo) irá traduzi-lo na chamada à função __dbPack().
A tradução, nesse caso, será feita do Lado esquerdo ao símbolo => para o lado direito.
Poderemos especificar argumentos correspondentes ao lado esquerdo e por quais valores seriam substituídos no lado direito.
Chamaremos os argumentos da esquerda como "marcadores de comparação" e os da direita como "marcadores de resultado".
Existem várias normas de substituição e vamos analisá-las uma a uma no decorrer dessa série.
[]s
иαldσ dj
Baseado no original de Rick Spence (Spence, Rick - Clipper 5.2 / Rick Spence - Makron Books, 1994)
Opa,
ResponderExcluireai camarada.
Vou te dar mais uma dica pra vc deixar seu nome na história.
Eu estou pensando em criar ou pegar uma classe (C ou C# ou C++) que gera PDF e usar no Protheus para gerar um PDF.
Como sou noob, estou encontrando dificuldades.
Vc é o cara, quem sabe queria fazer esse desafio para os proximos posts.
Att,
Anonims