Há truques que você pode utilizar quando usar X++ em conjunto do SQL. Esses truques não são muito conhecidos porque eles não são feitos para o uso ‘convencional’ e o editor não ajuda ao não mostrar no Intellisense, mas são bastante úteis.

Recuperando dados sem declarar uma variável do tipo table:
É possível recuperar dados sem declarar uma variável do tipo table, seria algo como:

1
2
3
4
5
6
7
static void Job3(Args _args)
{
    // Sem variáveis!
    ;
    print (select CustTable).AccountNum;
    pause;
}

Ou ainda em algum método:

1
2
3
4
5
public static boolean checkIfCustomerExist(Name     _customerName)
{
    return (select firstOnly CustTable 
             where CustTable.Name == _customerName).RecId != 0;
}

Nesse segundo exemplo, é me retornado um RecID caso um registro seja encontrado, e caso haja registro é diferente de 0 o que retorna true.

Perceba os parênteses em volta da instrução, estes parênteses falam ao compilador para criar um buffer temporário e anonimo para guardar este registro. A instrução usa o nome exato da tabela e é imediatamente seguido pelo nome do campo para pegar o valor.

Caso opte usar este tipo de recurso, o Intellisense não estará disponível para ajudá-lo a procurar os campos porque o editor não conhece esse tipo de buffer anônimo. Esta técnica é muita usada em métodos exist() nas tabelas.

Recuperando o valor de um campo que você apenas sabe o seu ID.

Algumas vezes você não sabe qual é o nome do campo, mas você tem o FieldID. Até em casos como este é possível escrever uma instrução X++ & SQL sem saber o nome de qualquer um dos campos.

Veja o exemplo abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void Job4(Args _args)
{
    CustTable   custTable;
    FieldId     fieldId;
    ;
 
    fieldId = fieldNum(CustTable, AccountNum); // Pode ser passado como parâmetro do método
 
    select custTable; // Pega o primeiro registro
 
    print custTable.(fieldId); // Imprime o AccountNumber
 
    select custTable
        where custTable.(fieldId) == '1101';  // Cláusula where baseada no FieldID
 
    print custTable.Name;
    pause;
}

É possível usar FieldIDs para recuperar valores assim como também em cláusulas , novamente os parênteses são a chave. Ao invés de escrever regularmente o nome do campo, coloque o id entre parênteses. Isto torna possível criar código genérico para tratar qualquer campo de qualquer tabela sem conhecer os tipos de dados no momento da compilação. Se você examinar as classes de importação e exportação você encontrará alguns exemplos que usam o mesmo mecanismo.

Fonte.

[]s
Pichler