Visão geral o artigo “Expressions in query ranges”, Axaptapedia.

Construção de uma query simples:

1
2
3
  query = new Query();
  dsInventTable = query.addDataSource(tableNum(InventTable));
  queryBuildRange = dsInventTable.addRange(fieldNum(InventTable, DataAreaId));

Critério simples:
Pesquisar o registro onde o itemID é B-R14.

  queryBuildRange.value(strFmt('(ItemId == "%1")', queryValue("B-R14")));

Pesquisando registros onde o tipo é um serviço:

queryBuildRange.value(strFmt('(ItemType == %1)', any2int(ItemType::Service)));

Pesquisando registros onde o tipo é um serviço ou o itemID é B-R14.

  queryBuildRange.value(strFmt('((ItemType == %1) || (ItemId == "%2"))', any2int(ItemType::Service), queryValue("B-R14")));

Pesquisando registros onde a data da modificação é depois de 01/01/200.

  queryBuildRange.value(strFmt('(ModifiedDate > %1)', Date2StrXpp(01012000)));

Critérios complexos combinando condição OU e E

Pesquisando todos os registros aonde o tipo é um serviço ou item e que o ProjCategoryId for igual a Spares.

  queryBuildRange.value(strFmt('((%1 == %2) || ((%1 == %3) && (%4 == "%5")))',
    fieldStr(InventTable, ItemType),
    any2int(ItemType::Service),
    any2int(ItemType::Item),
    fieldStr(InventTable, ProjCategoryId),
    queryValue("Spares")));

Condições WHERE referenciando a campos de multiplas tabelas

Para o exemplo abaixo, nós construimos uma query que consiste em um JOIN the dois datasources usando um EXIST JOIN.

  query = new Query();
  dsInventTable = query.addDataSource(tableNum(InventTable), tableStr(InventTable));
  dsInventItemBarCode = dsInventTable.addDataSource(tableNum(InventItemBarCode), tableStr(InventItemBarCode));
  dsInventItemBarCode.relations(true);
  dsInventItemBarCode.joinMode(JoinMode::ExistsJoin);
 
  // Add our two ranges
  queryBuildRange1 = dsInventTable.addRange(fieldNum(InventTable, DataAreaId));
  queryBuildRange2 = dsInventItemBarCode.addRange(fieldNum(InventItemBarCode, DataAreaId));

Procurar todos os registros aonde o código de barras existir para um item e foi modificado depois que o item foi modificado.

  queryBuildRange2.value(strFmt('(ModifiedDate > InventTable.ModifiedDate)'));

Perceba que SE nós tivéssemos adicionado nosso dataSource InventTable usando o seguinte código:

  dsInventTable = query.addDataSource(tableNum(InventTable), "InventTableCustomName"); // Perceba que nós estamos modificando um nome diferente para o DataSource

Então a query deve aparecer como:

  queryBuildRange2.value(strFmt('(ModifiedDate > InventTableCustomName.ModifiedDate)'));

Conditional joins

Nós iremos modificar levemente o exemplo anterior, para remover a adição automatica do relacionamento para o Join.

  query = new Query();
  dsInventTable = query.addDataSource(tableNum(InventTable), "InventTable");
  dsInventItemBarCode = dsInventTable.addDataSource(tableNum(InventItemBarCode), "InventItemBarCode");
  dsInventItemBarCode.joinMode(JoinMode::ExistsJoin);
 
// Add our two ranges
  queryBuildRange1 = dsInventTable.addRange(fieldNum(InventTable, DataAreaId)); 
  queryBuildRange2 = dsInventItemBarCode.addRange(fieldNum(InventItemBarCode, DataAreaId));

Usando as tecnicas acima, é possível criar queries com quase o mesmo tanto de flexibilidade como usando comandos SQL diretamente.

[]s
Pichler