QueryBuildRange中的表达式
生活随笔
收集整理的這篇文章主要介紹了
QueryBuildRange中的表达式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在QueryBuildRange中很容易可以實現這樣的功能:查詢不同客戶編號的客戶,比如查詢編號為A00001或者A00002的客戶。如下代碼所示:
static?void?GeneralQueryBuild(){
????Query?q;
????QueryRun?qr;
????CustTable?cust;
????str?queryCriterion;
????;
????q?=?new?Query();
????queryCriterion?=?'A000001,A000002';
????q.addDataSource(tableNum(custtable)).addRange(fieldnum(custtable,accountnum)).value(queryCriterion);
????qr?=?new?QueryRun(q);
????while(qr.next())
????{
????????cust?=?qr.get(tablenum(custtable));
????????box::info(cust.Address);
????}
????pause;
}
這樣針對一個字段的or條件很容易就實現了,如果是針對兩個字段的或條件那?我們知道一般情況下針對兩個不同的字段建立QueryBuildRange其關系是and關系,比如針對客戶編號和客戶名稱建立不同的QueryBuildRange,如果分別添加value,則得到的結果是既滿足客戶編碼是指定編碼又要滿足客戶名稱是指定名稱的記錄,如下代碼所示(SQL中的like語法可以用統配符*來實現)
static?void?GeneralQueryBuild2()
{
????Query?q;
????QueryRun?qr;
????QueryBuildDataSource?qbds;
????QueryBuildRange?qbrNum;
????QueryBuildRange?qbrName;
????CustTable?cust;
????str?queryNumCriterion;
????str?queryNameCriterion;
????;
????q?=?new?Query();
????queryNumCriterion?=?'A000001,A000002';
????queryNameCriterion?=?'Nanjing*';
????qbds?=?q.addDataSource(tableNum(custtable));
????qbrNum?=?qbds.addRange(fieldnum(custtable,accountnum));
????qbrNum.value(queryNumCriterion);
????qbrName?=?qbds.addRange(fieldNum(custtable,Name));
????qbrname.value(queryNameCriterion);
????qr?=?new?QueryRun(q);
????Box::info(qr.query().dataSourceNo(1).toString());
????while(qr.next())
????{
????????cust?=?qr.get(tablenum(custtable));
????????box::info(cust.Address);
????}
????pause;
}
如果要實現字段間的or條件該怎么玩那?這個問題郁悶了好久,后來找到一篇英文文檔才得到答案,要用到QueryBuildRange中的表達式了。
為了在QueryBuildRange中運用表達式,需要像一般情況下一樣對一個QueryDataSource添加Range,但具體針對哪一個字段添加Range是無所謂的,只要這個字段屬于指定的表即可。
Range的value需要滿足以下條件:
1.整個表達式必須要''引起來而不是"";
2.這個表達式必須用()括起來;
3.每個子表達式必須用各自的()括起來;
4.對于當前表中的字段,用字段名直接引用即可;
5.對于其他表中的字段,引用時需要添加DataSource Name作為前綴;
6.string類型的值需要用""引起來,并且包含在queryValue()中;
7.枚舉類型的值需要用對應的int類型指定;
8.Date類型的值需要用Date2StrXpp()轉化
OK,現在可以實現上面提到的問題了,看代碼吧。
static?void?SpecialQueryBuild2()
{
????Query?q;
????QueryRun?qr;
????QueryBuildDataSource?qbds;
????QueryBuildRange?qbrNum;
????QueryBuildRange?qbrName;
????str?queryCriterion;
????CustTable?cust;
?????;
????q?=?new?Query();
????qbds?=?q.addDataSource(tablenum(custtable));
????qbrNum?=?qbds.addRange(fieldnum(custtable,accountnum));
????queryCriterion?=?strfmt('((%1=="%2")||(%3=="%4"))',
?????????????????????fieldstr(custtable,AccountNum),
?????????????????????queryValue("A00001"),
?????????????????????fieldstr(custtable,Name),queryValue("Nanjing"));
????qbrNum.value(queryCriterion);
????qr?=?new?QueryRun(q);
????while(qr.next())
????{
????????cust?=?qr.get(tablenum(custtable));
????????box::info(cust.Address);
????}
????pause;
}
不過有兩點比較可惜,使用這種方式后,就不能實現SQL中的like語法(因為不能用*作為統配符)和普通QueryBuildRange中的針對同一個字段用","設定多個值的做法了(因為把,翻譯成了普通的字符)。
另外還用到了一個技巧,由于調試器不怎么好用,如果想查看某個QueryRun最終要運行的SQL語句,可以用qr.query().datasourceno(1).tostring()來查看將要運行的SQL語句,雖然是X++語法的,不過看起來也沒什么障礙。
轉載于:https://www.cnblogs.com/Farseer1215/archive/2006/06/07/419276.html
總結
以上是生活随笔為你收集整理的QueryBuildRange中的表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Flex中使用本地共享对象
- 下一篇: 德国世界杯时间表