Imagine que você precise criar o seguinte form que busca informações do cadastro de Clientes do Ax (tabela CustTable):
O conteúdo da coluna “Name (account #)” é composto do nome do cliente (CustTable.Name) e do seu código (CustTable.AccountNum) – que está entre parênteses. Uma forma de fazer isto no Ax é criar um método Display no datasource relacionado à tabela CustTable no formulário. Veja como este formulário se pareceria na AOT:
Note que criei um método chamado getNameAndAccNumber no datasource CustTable. Aqui está a sua implementação:
//BP deviation documented
display Name getNameAndAccNumber(CustTable _custTable)
{
return strfmt("%1 (%2)", _custTable.Name, _custTable.AccountNum);
}
Depois disso, criei um controle Grid no formulário e arrastei o método display para dentro do controle Grid. O Ax automaticamente interpreta o tipo de retorno do método (no nosso caso um EDT baseado em String chamado Name) e cria o controle adequado para representar uma informação daquele tipo (no caso, um controle StringEdit). Ao abrirmos as propriedades desse controle, podemos ver como o Ax populou-as no momento em que arrastamos o método para cima do Grid:
Veja que a propriedade DataSource foi populada com o nome do nosso datasource do form (CustTable) e a propriedade DataMethod teve o nome do nosso método display atribuído a ela (getNameAndAccNumber). Note, entratando, que em nenhum momento fomos direcionados a criar o método recebendo aquele parâmetro _custTable, como pode ser visto no código acima. Então, por que fiz isso???
A resposta fica evitende se tentarmos simplesmente retirar o parâmetro, deixando o método da seguinte forma:
//BP deviation documented
display Name getNameAndAccNumber()
{
return strfmt("%1 (%2)", custTable.Name, custTable.AccountNum);
}
Note que esta implementação, além da ausência do parâmetro, é ligeiramente diferente da anterior: agora estamos usando os valores diretamente do datasource (custTable.Name e custTable.AccountNum). Quem é iniciante no desenvolvimento em Ax pode intuitivamente pensar que, fazendo isso, os valores do buffer atualmente selecionado na grid seriam usados para compor o valor de retorno do método. Isso não é verdade! Veja o que aconteceria neste caso:
Os valores mostrados são os mesmos em linhas diferentes do Grid! Ao clicarmos em outras linhas, os valores serão alterados para os correspondetes à linha selecionada. É desnecessário dizer que este comportamento está longe do desejado.
Quando usamos o display method em um controle Grid precisamos receber um parâmetro do mesmo tipo definido para o datasource do form e tudo funcionará conforme o esperado.
Esquecer-se do parâmetro no método display usados em controles Grid é um erro comum entre desenvolvedores iniciantes em Ax (e pra mim não foi diferente). Espero que este post possa ajudar futuros iniciantes :)
