日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QueryBuildRange中的表达式

發布時間:2024/10/8 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中的表达式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。