X for Dummies

Como combinar dois datasources usando Union Query em X++

Publicado em AX2009, AX2012, Tutoriais, X++, 11/02/2014, por Edvandro Santos

0


Um dos grandes avanços do AX desde a versão 2009 é a introdução da operação Union que foi adicionada como propriedade aos objetos QueryQueryType.

Ele pode assumir dois valores:

  1. Join – Join normal;
  2. Union – instrução UNION similar ao T-SQL.

Ao utilizar a opção Union, diversos datasources semelhantes – número de campos que serão retornados e tipos dos campos que serão retornados – podem ser adicionados ao nó principal da query. Quando trabalhados dessa forma, todos os datasources – menos o primeiro – apresentam a propriedade UnionType:

  1. Union – remove registros duplicados
  2. UnionAll – inclui registros duplicados

– Ao utilizar union query você trabalha com o buffer da primeira tabela referenciada no datasource. Não é possível customizar o nome dos campos usados na union query;

– Queries que utilizam union o sistema leva em consideração da cláusula Order by referente ao primeiro datasource. Todos os demais serão ignorados;

– Apesar do MSDN dizer que não é possível criar union query via X++, isso é um mito.

Abaixo segue um exemplo de como combinar dois datasources usando union query em X++:

 static void TestUnionQuery(Args _args)
 {
 Query query;
 QueryBuildDataSource qbdsCustTable;
 QueryBuildDataSource qbdsVendTable;
 QueryRun queryRun;
 CustTable custVendTable;
 Map mapTableBranches = new Map(types::Integer, typeId2Type(typeId(TableId)));
 SysDictTable dictTable;
 ;

// The map is used to match the UnionBranchID with a table id
 mapTableBranches.insert(1, tableNum(CustTable));
 mapTableBranches.insert(2, tableNum(VendTable));

query = new Query();
 query.queryType(QueryType::Union);

qbdsCustTable = query.addDataSource(tableNum(CustTable));
 qbdsCustTable.unionType(UnionType::UnionAll); // Include duplicate records
 qbdsCustTable.fields().dynamic(false);
 qbdsCustTable.fields().clearFieldList();
 qbdsCustTable.fields().addField(fieldNum(CustTable, AccountNum));
 qbdsCustTable.fields().addField(fieldNum(CustTable, Name));

qbdsVendTable = query.addDataSource(tableNum(VendTable));
 qbdsVendTable.unionType(UnionType::UnionAll); // Include duplicate records
 qbdsVendTable.fields().dynamic(false);
 qbdsVendTable.fields().clearFieldList();
 qbdsVendTable.fields().addField(fieldNum(VendTable, AccountNum));
 qbdsVendTable.fields().addField(fieldNum(VendTable, Name));

queryRun = new QueryRun(query);
 queryRun.prompt();

while (queryRun.next())
 {
 custVendTable = queryRun.getNo(1);
 dictTable = SysDictTable::newTableId(mapTableBranches.lookup(custVendTable.unionAllBranchId));

info(strFmt("Cliente / Fornecedor: %1, Nome: %2 (Tabela %3)", custVendTable.AccountNum, custVendTable.Name, dictTable.name()));
 }
 }
 

Para saber mais:

Até a próxima!


Autor

Edvandro Santos

Desenvolvedor de software desde 2005, é certificado em JAVA e MCP em Microsoft Dynamics AX 2009. Com projetos desenvolvidos para IBOPE, IG, NOKIA, Huawei e Siemens, nerd assumido e fã de rock 'n roll, quadrinhos, sci-f e blues.