Query类 一. 过滤时的值的形式 在query中,过滤的关键就是query.value(_value)中参数_value的格式,该参数的值可以是基本数据类型、表达式、值列表。下面会依次示例它们的使用方法。 //最普通的query如下代码 static void queryBasicDate(Args _args) { Query query; QueryBuildDataSource queryBuildDataSource; QueryBuildRange queryBuildRange; QueryRun queryRun; CustTable custTable; ; query = new Query(); queryBuildDataSource = query.addDataSource(tablenum(CustTable)); queryBuildRange =queryBuildDataSource.addRange(fieldnum(CustTable,AccountNum)); queryBuildRange.value(queryValue("Customer2")); queryRun = new QueryRun(query); if(queryRun.next()) { //相当于While select CustTable Where custTable.AccountNum == Customer2 custTable = queryRun.get(tablenum(CustTable)); info(strfmt("%1-----%2",custTable.Name,custTable.AccountNum)); } pause; } Query的值过滤形式各式个样,其Value形式如下: Static void DavTest(Args _args) { Query query; QueryBuildDataSource qbds; QueryBuildRange qbr; QueryRun queryRun; InventTable inventTable; ; Query = new Query(); Qbds = query.addDataSource(tablenum(InventTable),’InventTable’); …… queryRun = new QueryRun(query); while(queryRun.next()) { inventTable = queryRun.get(tablenum(InventTable)); print inventTable.recId; } Pause; } (1)基本数据类型: Qbr = qbds.addRange(fieldnum(InventTable,ItemId)); Qbr.value(‘I-999’); 或 Qbr = qbds.addRange(fieldnum(InventTable,RecId)); Qbr.value(5646876135); 但为了安全起见,一般将值使用queryvalue()处理后再传递给value()方法,如: qbr.value(queryvalue(‘I-999’) (2) 表达式: Qbr = qbds.addRange(fieldnum(InventTable,ItemId)); Qbr.value(strfmt(‘(%1 == “%2”)’,fieldstr(InventTable,ItemId),queryvalue(‘I-999’)); 到目前,你可能会觉得表达式不过是把简单的问题搞复杂而已,但是,我要说的是,表达式功能很强大,我们会在后面做更详细的介绍。 在使用strfmt来构造表达式的时候有几点要注意: (a) 传递给value方法的参数最外层要用’value’的形式括起来,即用单引号括起来; (b) 表达式中的每一个等式以及整个表达式都要使用小括号括起来,如: ‘((%1 == %2) || (%1 == %3))’ (c) 变量依次在表达式中用%n 的形式表示; (d) 如果被用来做过滤的值是字符串型的,必须用双引号将值所对应的变量括起来,如: Strfmt(‘(%1 == “%2”)’,fieldstr(InventTable,ItemId),queryvalue(‘I-999’)); (3) 值列表: Qbr = qbds.addRange(fieldnum(InventTable,ItemId)); Qbr.value(‘I-999,I-888,I-777’); 二. 多字段时的过滤方式 (1) 单一range单一field单一值过滤: Str exp = ‘I-999’; Qbr = qbds.addRange(fieldnum(InventTable,ItemId)); Qbr.value(exp); 或: Qbr.value(queryvalue(‘I-999’)); 或: Qbr.value(strfmt(‘(%1 == “%2”)’,fieldstr(InventTable,ItemId),queryvalue(‘I-999’)); 或: Exp = ‘(‘ + fieldid2name(tablenum(inventTable),fieldnum(inventTable,Itemid))+ ' = "'+ '11'+'/") || (' +fieldid2name(tablenum(inventTable),fieldnum(inventTable,itemId))+ '=='+'"aa"'+’)’; Qbr.value(exp); (2) 单一range单一field多值过滤: (a) 或关系(假设两个值为value1和value2,类型为字符串): Qbr = qbds.addRange(fieldnum(InventTable,ItemId)) Qbr.value(queryvalue(value1)); Qbr.value(queryvalue(value2)); 或: Qbr = qbds.addRange(fieldnum(InventTable,ItemId)) Qbr.value(queryvalue(value1,value2)); 或: Qbr = qbds.addRange(fieldnum(InventTable,ItemId)) Qbr.value(strfmt(‘((%1 == “%2”) || (%1 == “%3”))’,fieldstr(InventTable,ItemId),queryvalue(value1),queryvalue(value2)); (b) 与关系(假设两个值为value1和value2,类型为字符串): Qbr = qbds.addRange(fieldnum(InventTable,ItemId)) Qbr.value(strfmt(‘((%1 == “%2”) && (%1 == “%3”)),fieldstr(InventTable,ItemId),queryvalue(value1),queryvalue(value2)); (c) 取值范围(value1<=value<=value2) Qbr = qbds.addRange(fieldnum(InventTable,ItemId)) Qbr.value(queryvalue(value1)+’..’+queryvalue(value2)); 或: Qbr = qbds.addRange(fieldnum(InventTable,ItemId)) Qbr.value(strfmt(‘((%1 >= “%2”) && (%1 <= “%3”))’,fieldstr(InventTable,ItemId),queryvalue(value1),queryvalue(value2)); (value1<value<value2) Qbr = qbds.addRange(fieldnum(InventTable,ItemId)) Qbr.value(strfmt(‘((%1 > “%2”) && (%1 < “%3”))’,fieldstr(InventTable,ItemId),queryvalue(value1),queryvalue(value2)); 需要注意的是在过滤date型数据时,表达式中不能使用’<=’或’>=’符号。 (3) 过滤date型的数据: Date2strXpp(date)方法将一个date变量转换为可以在query.value中使用的字符串。Data 类型同样可以使用’>’,’<’或’>=’,’<=’. Str queryExpr = ‘(‘ + Fieldid2name(tablenum(SalesLine),fieldnum(SalesLine,ShippingDateRequested)) + ‘>’ + date2strxpp(tmpDate) + ‘)’; Qbr = Qbds.addRange(fieldnum(SalesLine,ShippingDateRequested)); Qbr.value(strfmt(‘(%1.%2 < %3)’,tablestr(SalesLine), Fieldstr(SalesLine,ShippingDateRequested), Date2strxpp(tmpDate))); 或: Date paymentDateFrom,paymentDateTo; Qbr = qbds.addRange(fieldnum(SalesLine,ShippingDateRequested)); Qbr.value(queryValue(paymentDateFrom)+’..’); 或: Qbr.value(queryValue(paymentDateFrom)+’..’+ Queryvalue(paymentDateTo)); 或: Qbr.value(‘..’+queryvalue(paymentDateTo)); (4) 通配符的使用: Qbr = qbds.addRange(InventTable,ItemId); Qbr.value(strfmt(‘(%1.%2 Like “%3”)’, qbds.name(),fieldstr(InventTable,ItemId),’I*’)); 或: Qbr.value(strfmt(‘(%1 Like “%2”)’, fieldstr(InventTable,ItemId),’I*’)); (5) 过滤多元素也即数组型的EDT数据类型: 在过滤数组型的字段时,可以使用方法fieldId2Ext(fieldId,tableIndex)来添加range,如: Qbds = query.addDateSource(tablenum(CustTable)); Qbr = qbds.addRange(fieldId2Ext(fieldnum(CustTable,Dimension),1)); Qbr.value(strfmt(‘%1’,dimension[1])); qbds.addRange(fieldId2Ext(fieldnum(CustTable,Dimension),2)); Qbr.value(strfmt(‘%1’,dimension[2])); qbds.addRange(fieldId2Ext(fieldnum(CustTable,Dimension),3)); Qbr.value(strfmt(‘%1’,dimension[3])); 这里%1可以用双引号引起来,也可以不引起来。 (6) 单一range多fields过滤 Qbds = query.addDataSource(tablenum(SalesTable),’SalesTable’); qbr = qbds.addRange(fieldnum(SalesTable,SalesId)); qbr.value(strfmt('(((%1.%2 == "%3") && (%1.%4 == "%5")))', qbds.name(),//%1 fieldstr(SalesTable,CustAccount),//%2 "1101",//%3 fieldstr(SalesTable,SalesId),//%4 "SO-100019")); 或 str queryExpr; queryExpr = '((' + tableid2name(tablenum(CustTable))+'.'+fieldid2name(tablenum(CustTable),fieldnum(CustTable,AccountNum)) + '=="'+queryvalue("1101") + '")&&(' + tableid2name(tablenum(CustTable))+'.'+fieldid2name(tablenum(CustTable),fieldnum(CustTable,Name)) + '=="'+queryvalue("Forest Wholesales") + '"))'; query = new Query(); qbds = query.addDataSource(tablenum(CustTable),'CustTable'); qbr = qbds.addRange(fieldnum(CustTable,AccountNum)); qbr.value(queryExpr); 在这两种格式下,需要注意一点:在表达是中需要用到:table.field样式,这里的table的名字指所添加的datasource的名字,如果你添加一个custTable表作为datasource,你将该datasource命名为custTable_1,那么,在你的表达是中就需要写成custTable_1.field。为了进一步说明这一点,上边第二个例子可以写成这样: queryExpr = '((' +"CustTable_1"+'.'+fieldid2name(tablenum(CustTable),fieldnum(CustTable,AccountNum)) + '=="'+queryvalue("1101") + '")&&(' + "CustTable_1"+'.'+fieldid2name(tablenum(CustTable),fieldnum(CustTable,Name)) + '=="'+queryvalue("Forest Wholesales") + '"))'; query = new Query(); qbds = query.addDataSource(tablenum(CustTable),'CustTable_1'); qbr = qbds.addRange(fieldnum(CustTable,AccountNum)); qbr.value(queryExpr); (7) query排序 query也可以根据条件排序,Group by或 Order by. query.dataSourceTable(tablenum(CustTable)).orderMode(OrderMode::Order by)//或Group by queryBuildDataSource.addSortRange(fieldNum(CustTable,AccountNum),SortMode::Descending); 也可以用queryBuildDataSource.joinMode()来设置关联模式。
(8) query允许跨公司查询