Caros,
Frequentemente temos que criar métodos do tipo ‘parm’ no DAX via X++ e toda vez é sempre a mesma coisa, criamos a classe, as variáveis e etc… O próximo passo é criar os métodos para que essas propriedades possam ser atribuídas / lidas, e hoje, ao presenciar essa situação novamente eu resolvi criar um script que gera pra mim os métodos dentro da minha classe a partir do Class Declaration. Vamos ao exemplo.

A primeira coisa a se fazer é criar o método que irá tratar o meu texto selecionado, para isso:

Na classe EditorScripts crie um novo método com a estrutura:

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
45
46
public void template_method_createAllParms(Editor editor)
{
    Source          template = "public %1 parm%3(%1 _%2 = %2)\r\n{\r\n    ;\r\n    %2 = _%2;\r\n    return %2;\r\n}";
    str             parmOne, parmTwo;
    int             spacePosition;
    List            linesToCreate = new List(Types::String);
    List            parmsToCreate = new List(Types::String);
    ListEnumerator  listEnum;
    str             currentLine;
 
    ClassBuild      obj;
    TreeNode        parent = TreeNode::findNode(SysTreeNode::pathParent(editor.path()));
    ;
 
    linesToCreate = strSplit(EditorScripts::getSelectedText(editor), '\r\n');
 
 
    if(linesToCreate)
    {
        listEnum = linesToCreate.getEnumerator();
        while(listEnum.moveNext())
        {
            currentLine = strLTrim(listEnum.current());
            if(currentLine)
            {
                spacePosition = strScan(currentLine, " ", 1, strLen(currentLine));
                parmOne = subStr(currentLine, 0, (spacePosition - 1));
                parmTwo = strLTrim(strRTrim(subStr(currentLine, spacePosition, strLen(currentLine))));
                parmTwo = subStr(parmTwo, 0, strLen(parmTwo) -1);
                parmsToCreate.addEnd(strFmt(template, parmOne, parmTwo, str2Capital(parmTwo)));
            }
        }
    }
 
    if(parmsToCreate)
    {
        listEnum = parmsToCreate.getEnumerator();
        obj = new ClassBuild(parent.AOTname(), true);
        while(listEnum.moveNext())
        {
            currentLine = strLTrim(listEnum.current());
            obj.addMethod('name', listEnum.current());
            obj.classNode().AOTcompile();
        }
    }
}

O segundo passo é criar a classe com as variáveis:

1
2
3
4
5
6
7
8
class Class1
{
    str             StringOne;
    int             IntOne;
    real            RealOne;
    date            DateOne;
    NoYes           NoYesEnum;
}

Agora que já temos tudo o que precisávamos, vamos ao funcionamento!

1 -> Abra o ClassDeclaration da classe criada acima;
2 -> Selecione as variáveis que quer criar as propriedades;
3 -> Clique com o botão direito e seguir o caminho: Scripts -> Template -> Method -> CreateAllParms.

Capture

Espere o processo terminar, e no final sua classe ficará assim:

fdsaf

Considerações:

  • Eu não fiz essa classe me preocupando com o que há de mais ‘bonito’ a ser feito, foi algo que me atendeu bem e acredito que atenderá a maioria dos desenvolvedores;
  • Foi feita já em AX 2012 e pode ser usada em qualquer outra versão;
  • Se quiser melhorá-la, fique a vontade, se puder me enviar depois é melhor ainda.

Abração,
Pichler