你如何在BQL中进行TSQL CHARINDEX或TSQL IN?

时间:2015-05-19 15:38:53

标签: acumatica

我试图确定字段值的前两个字符是否与有限的值列表中的一个匹配,即(" RG"," HC"," LP& #34;等)这些值可能是5-10。我不在乎它是哪一个,只是它是有效的"。

在SQL中我可以用CHARINDEX或IN来做 - 我怎么能用BQL做到这一点?

我可能会做一个SWITCH / CASE但是将它们全部拼出来似乎效率低下。

具体来说,我试图在字段的DBCalced属性中执行此操作:

[PXDBCalced(typeof(Switch<Case<Where<Substring<INItemLotSerial.lotSerialNbr,int1, int2>, In<EDType>>, Substring<INItemLotSerial.lotSerialNbr,int1, int2>>, StringEmpty>), typeof(string))]

上面的内容似乎没有达到我的预期 - 不确定它的用途或如何使用IN&lt;&gt;因为我找不到文件。我将EDType定义为一个常量字符串,所有值都用逗号分隔。

由于

3 个答案:

答案 0 :(得分:1)

我建议不要通过纯BQL语句来处理FieldUpdated事件。您可以从图表中执行此操作,也可以创建将应用于您的字段的自定义属性。您可以通过几种不同的方式创建此自定义属性,但最简单的定义类似于:

private sealed class MyCustomBehaviourAttribute : PXEventSubscriberAttribute, IPXFieldUpdatedSubscriber
{
    public void FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
    {
        // Add your logic here
    }
}

您也可以在源代码内搜索(使用屏幕SM.20.45.70中的find in files功能)并搜索实现IPXFieldUpdatedSubscriber的属性,或者调用FieldUpdated.AddHandler来手动订阅该事件。

答案 1 :(得分:1)

我无法将其纳入评论,但我使用了这个属性:

     [PXDBCalced(typeof(Switch<Case<Where<Substring<INItemLotSerial.lotSerialNbr, int1, int2>, Equal<EDRG>,
                                Or<Substring<INItemLotSerial.lotSerialNbr, int1, int2>, Equal<EDAP>,
                                Or<Substring<INItemLotSerial.lotSerialNbr, int1, int2>, Equal<EDHC>,
                                Or<Substring<INItemLotSerial.lotSerialNbr, int1, int2>, Equal<EDRN>,
                                Or<Substring<INItemLotSerial.lotSerialNbr, int1, int2>, Equal<EDPP>,
                                Or<Substring<INItemLotSerial.lotSerialNbr, int1, int2>, Equal<EDPT>
                                >>>>>
                                >, Substring<INItemLotSerial.lotSerialNbr, int1, int2>>, StringEmpty>), typeof(string))]

EDRG等是常数。

像我说的那样,不是最漂亮,但似乎有效。

答案 2 :(得分:0)

In<T>不应该与参数(例如Required<T>Optional<T>)一起使用,因为它接受一个或多个值作为其第二个操作数,现在可以实现只传递数组以匹配参数。