Query 的数据过滤

本文将对query的值过滤做全面的分析和讲解,第一部分讲解过滤时的值的形式,第二部分讲解多字段时的过滤方式。

一.    过滤时的值的形式

query中,过滤的关键就是query.value(_value)中参数_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)                或关系(假设两个值为value1value2,类型为字符串)

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)            与关系(假设两个值为value1value2,类型为字符串):

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));

需要注意的是在过滤date型数据时,表达式中不能使用’<=’’>=’符号。

(3)       过滤date型的数据:

Date2strXpp(date)方法将一个date变量转换为可以在query.value中使用的字符串,需要注意的是在过滤date型数据时,表达式中不能使用’<=’’>=’符号。

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)      单一rangefields过滤

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);

posted @ 2009-04-22 20:17  Fandy Xie  Views(408)  Comments(0Edit  收藏  举报