You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扩展SO添加项对话框按替代料描述搜索时DAC投影不生效

SO模块添加项对话框自定义投影DAC替换不生效问题

我尝试扩展销售订单(SO)模块的「添加项」(物料查找)对话框,使其支持按替代物料描述执行搜索,但编写的DAC投影扩展始终无法生效。以下是编写的SO Graph扩展完整代码:

using PX.Data;
using PX.Objects.CR;
using PX.Objects.CS;
using PX.Objects.EP;
using PX.Objects.IN;
using CRLocation = PX.Objects.CR.Standalone.Location;

namespace PX.Objects.SO
{
    public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry>
    {
        public static bool IsActive() => true;
    }


[System.SerializableAttribute()]
[PXProjection(typeof(Select2<
    InventoryItem,
    LeftJoin<INSiteStatus,
        On<INSiteStatus.inventoryID, Equal<InventoryItem.inventoryID>,
        And<InventoryItem.stkItem, Equal<boolTrue>,
        And<INSiteStatus.siteID, NotEqual<SiteAttribute.transitSiteID>>>>>,
    LeftJoin<INSubItem,
        On<INSiteStatus.FK.SubItem>,
    LeftJoin<INSite,
        On2<INSiteStatus.FK.Site,
        And<INSite.baseCuryID, EqualBaseCuryID<Current2<SOOrder.branchID>>>>,
    LeftJoin<INItemXRef,
        On<INItemXRef.inventoryID, Equal<InventoryItem.inventoryID>,
        And2<
            Where<INItemXRef.subItemID, Equal<INSiteStatus.subItemID>,
                Or<INSiteStatus.subItemID, IsNull>>,
            And<Where<CurrentValue<SOSiteStatusFilter.barCode>, IsNotNull,
                And<INItemXRef.alternateType, Equal<INAlternateType.barcode>>>>>>>,

    LeftJoin<INItemPartNumber,
        On<INItemPartNumber.inventoryID, Equal<InventoryItem.inventoryID>,

        // my change here, swapped alternateID to descr
        And<INItemPartNumber.descr, Like<CurrentValue<SOSiteStatusFilter.inventory_Wildcard>>>,

        And2<
            Where<INItemPartNumber.bAccountID, Equal<Zero>,
                Or<INItemPartNumber.bAccountID, Equal<CurrentValue<SOOrder.customerID>>,
                Or<INItemPartNumber.alternateType, Equal<INAlternateType.vPN>>>>,
            And<Where<INItemPartNumber.subItemID, Equal<INSiteStatus.subItemID>,
                Or<INSiteStatus.subItemID, IsNull>>>>>>,
    LeftJoin<INItemClass,
        On<InventoryItem.FK.ItemClass>,
    LeftJoin<INPriceClass,
        On<INPriceClass.priceClassID, Equal<InventoryItem.priceClassID>>,
    LeftJoin<InventoryItemCurySettings,
        On<InventoryItemCurySettings.inventoryID, Equal<InventoryItem.inventoryID>,
        And<InventoryItemCurySettings.curyID, EqualBaseCuryID<Current2<SOOrder.branchID>>>>,
    LeftJoin<BAccountR,
        On<BAccountR.bAccountID, Equal<InventoryItemCurySettings.preferredVendorID>>,
    LeftJoin<INItemCustSalesStats,
        On<CurrentValue<SOSiteStatusFilter.mode>, Equal<SOAddItemMode.byCustomer>,
        And<INItemCustSalesStats.inventoryID, Equal<InventoryItem.inventoryID>,
        And<INItemCustSalesStats.subItemID, Equal<INSiteStatus.subItemID>,
        And<INItemCustSalesStats.siteID, Equal<INSiteStatus.siteID>,
        And<INItemCustSalesStats.bAccountID, Equal<CurrentValue<SOOrder.customerID>>,
        And<Where<INItemCustSalesStats.lastDate, GreaterEqual<CurrentValue<SOSiteStatusFilter.historyDate>>,
            Or<CurrentValue<SOSiteStatusFilter.dropShipSales>, Equal<True>,
            And<INItemCustSalesStats.dropShipLastDate, GreaterEqual<CurrentValue<SOSiteStatusFilter.historyDate>>>>>>>>>>>>,
    LeftJoin<INUnit,
        On<INUnit.inventoryID, Equal<InventoryItem.inventoryID>,
        And<INUnit.unitType, Equal<INUnitType.inventoryItem>,
        And<INUnit.fromUnit, Equal<InventoryItem.salesUnit>,
        And<INUnit.toUnit, Equal<InventoryItem.baseUnit>>>>>>
                            >>>>>>>>>>>>>>>>>,


    Where<CurrentValue<SOOrder.customerID>, IsNotNull,
        And2<CurrentMatch<InventoryItem, AccessInfo.userName>,
            And2<
                Where<INSiteStatus.siteID, IsNull,
                    Or<INSite.branchID, IsNotNull,
                    And2<CurrentMatch<INSite, AccessInfo.userName>,
                        And<
                        Where2<FeatureInstalled<FeaturesSet.interBranch>,
                            Or2<PX.Objects.Common.Bql.SameOrganizationBranch<INSite.branchID, Current<SOOrder.branchID>>,
                                Or<CurrentValue<SOOrder.behavior>, Equal<SOBehavior.qT>>>>>>>>>,
                And2<
                    Where<INSiteStatus.subItemID, IsNull,
                        Or<CurrentMatch<INSubItem, AccessInfo.userName>>>,
                    And2<
                        Where<CurrentValue<INSiteStatusFilter.onlyAvailable>, Equal<boolFalse>,
                            Or<INSiteStatus.qtyAvail, Greater<CS.decimal0>>>,
                        And2<
                            Where<CurrentValue<SOSiteStatusFilter.mode>, Equal<SOAddItemMode.bySite>,
                                Or<INItemCustSalesStats.lastQty, Greater<decimal0>,
                                Or<CurrentValue<SOSiteStatusFilter.dropShipSales>, Equal<True>,
                                And<INItemCustSalesStats.dropShipLastQty, Greater<decimal0>>>>>,
                            And<InventoryItem.isTemplate, Equal<False>,
                            And<InventoryItem.itemStatus, NotIn3<
                 InventoryItemStatus.unknown,
                 InventoryItemStatus.inactive,
                 InventoryItemStatus.markedForDeletion,
                 InventoryItemStatus.noSales>>>>>>>>>>), Persistent = false)]
//[PXSubstitute(GraphType = typeof(SOOrderEntry))]
[PXSubstitute()]
public partial class SOSiteStatusSelectedCst : PX.Objects.SO.SOSiteStatusSelected //IBqlTable
{ }
}

已做操作与现象

  • 已修改BQL查询逻辑,将原查询中对INItemPartNumber.alternateID字段执行LIKE匹配的逻辑,替换为对INItemPartNumber.descr字段做匹配
  • 已尝试将自定义类放在SOOrderEntry_Extension内部和外部,也分别测试了携带/不携带GraphType = typeof(SOOrderEntry)参数的[PXSubstitute()]特性的效果
  • 通过SQL Server Profiler跟踪验证,系统仍在执行原始查询:替换匹配字段为descr的修改未生效,生成的SQL语句仍然使用alternateID字段做匹配
    目前推测可能遗漏了某个基础配置项,求相关解决思路。

内容的提问来源于stack exchange,提问作者Jerry Kurtz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:09:17