我对此一无所知,也无法弄清楚。无论如何,我已经创建了一个视图,需要使用x ++中的query / QueryRun等进行过滤。
我要执行的选择语句看起来像这样
while select salestable order by PtsWebDeliveryDate, salesId
where
(SalesTable.SalesStatus == SalesStatus::Delivered && !SalesTable.PtsProdNorwood && SalesTable.CustAccount != acc && SalesTable.InvoiceAccount != acc &&
salestable.PtsWebDeliveryDate >= today() && salestable.PtsWebDeliveryDate <= today()+daysahead)
||
(
SalesTable.SalesStatus == SalesStatus::Backorder && SalesTable.SalesType == SalesType::Sales && !SalesTable.PtsProdNorwood &&
SalesTable.CustAccount != acc && SalesTable.InvoiceAccount != acc &&
(
(salesTable.PtsSalesorderPacked && salestable.PtsWebDeliveryDate >= today() && salestable.PtsWebDeliveryDate <= today()+daysAhead)
||
(!salesTable.PtsSalesorderPacked && salestable.PtsWebDeliveryDate >= d && salestable.PtsWebDeliveryDate <= today()+daysahead))
)
{
//Do stuff
}
如您所见,我有som OR运算符,我需要使用它们。我已经开始在x ++中建立查询,这就是我得到的内容:
q = new Query();
q.addDataSource(TableNum("packlistview"));
q.dataSourceNo(1).addSortField(fn[_OrderBy], _direction);
q.dataSourceNo(1).addRange(fieldNum(PackListView, SalesStatus)).value(queryValue(SalesStatus::Delivered));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsProdnorwood)).value(queryValue(NoYes::No));
q.dataSourceNo(1).addRange(fieldNum(PackListView, CustAccount)).value(queryValue(!acc));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsWebDeliveryDate)).value(queryrange(today(),today()+daysahead));
//OR
q.dataSourceNo(1).addRange(fieldNum(PackListView, SalesStatus)).value(queryValue(SalesStatus::Backorder));
q.dataSourceNo(1).addRange(fieldNum(PackListView, SalesType)).value(queryValue(SalesType::Sales));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsProdnorwood)).value(queryValue(false));
q.dataSourceNo(1).addRange(fieldNum(PackListView, CustAccount)).value(queryValue(!acc));
q.dataSourceNo(1).addRange(fieldNum(PackListView, InvoiceAccount)).value(queryValue(!acc));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsSalesorderPacked)).value(queryValue(false));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsWebDeliveryDate)).value(queryrange(d, today()+daysahead));
//OR
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsSalesorderPacked)).value(queryValue(false));
q.dataSourceNo(1).addRange(fieldNum(PackListView, PtsWebDeliveryDate)).value(queryrange(d, today()+daysahead));
qr = new queryRun(q);
while( qr.next())// && counter < 100
{
//Do stuff
}
那么,如何将OR运算符与此合并?
干杯们:)
您可以使用如下条件生成查询字符串:
.value(strfmt("((Field1 == %1 && Field2 == %2) || Field1 != %3)",
var1, var2, var3, varX, ...));
可能不是很聪明,但是它是标准的方式。您可以对某些变量(例如基本枚举或日期)使用queryValue
函数,以获取每个值的正确查询字符串。
您可以使用逗号分隔的值,然后将csv传递给value函数,如下所示q.dataSourceNo(1).addRange(fieldNum(PackListView,SalesStatus))。value(queryValue(SalesStatus :: Delivered)+“,” +“未结订单”))]
我决定用它做一个临时表,用标准的select语句进行所有过滤,后来我使用x ++查询构建来添加排序和所需的其他内容。这样做效果很好,并且比将长字符串查询注入到queryobjects中更容易实现。
但是感谢您的回答:)
这里是此问题的完整解决方案,我已对其进行了完整记录希望对您有帮助https://shayanarshi.blogspot.com/2020/03/adding-additional-and-to-query-using-x.html