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
One Response
Jefferson
03|Nov|2010 1Ótimo post,
Gostaria de saber se é possível fazer group by via código e como.
Leave a reply