AXQuery类

    技术2024-06-30  64

    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)        或关系(假设两个值为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));

    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允许跨公司查询

     

    static void JobDemoAllowCrossCompany(Args _args) { BankAccountTable tabBAT; // saveDataPerCompany == true. Query qry2; QueryBuildDataSource qbds3; QueryRun qrun4; str sCompanyPrevious = " "; int iCountCompanies = 0; int iTableNumBAT; ; qry2 = new Query(); qry2 .allowCrossCompany( true ); qry2 .addCompanyRange( 'dat' ); qry2 .addCompanyRange( 'twf' ); iTableNumBAT = tableNum( BankAccountTable ); qbds3 = qry2 .addDataSource( iTableNumBAT ); //qbds3 .company( 'dat' ); qrun4 = new QueryRun( qry2 ); while ( qrun4 .next() ) { if ( qrun4 .changed( iTableNumBAT ) ) { tabBAT = qrun4 .get( iTableNumBAT ); if ( sCompanyPrevious != tabBAT .dataAreaId ) { print( tabBAT .dataAreaId + " = tabBAT .dataAreaId" ); iCountCompanies++; if ( iCountCompanies >= 2 ) { break; } sCompanyPrevious = tabBAT .dataAreaId; } } } pause; return; }   

     

     

    最新回复(0)