Acumatica 如何将站点ID(Whse)选择仅限于当前分支机构?

Acumatica 如何将站点ID(Whse)选择仅限于当前分支机构?,acumatica,Acumatica,虽然只将记录限制在INSite.branchhid=AccessInfo.branchhid是很容易想到的,但需要更复杂一些。我认为在查看DAC以供内部网查找时,我找到了一个简单的解决方案: #region SiteID public abstract class siteID : PX.Data.BQL.BqlInt.Field<siteID> { } protected Int32? _SiteID; [IN.SiteAvail(typeof(IN

虽然只将记录限制在INSite.branchhid=AccessInfo.branchhid是很容易想到的,但需要更复杂一些。我认为在查看DAC以供内部网查找时,我找到了一个简单的解决方案:

    #region SiteID
    public abstract class siteID : PX.Data.BQL.BqlInt.Field<siteID> { }
    protected Int32? _SiteID;
    [IN.SiteAvail(typeof(INTran.inventoryID), typeof(INTran.subItemID))]
    [PXDefault(typeof(INRegister.siteID))]
    [PXForeignReference(typeof(FK.Site))]
    [InterBranchRestrictor(typeof(Where<SameOrganizationBranch<INSite.branchID, Current<INRegister.branchID>>>))]
    public virtual Int32? SiteID
    {
        get
        {
            return this._SiteID;
        }
        set
        {
            this._SiteID = value;
        }
    }
    #endregion
这样我就可以将列表限制在当前分支上,但我也很难做到这一点。在覆盖字段定义所需的扩展中实现PXForeignReference属性时出现的问题

我如何才能以一种可以在Acumatica分支特定记录中高效复制的方式限制当前分支的站点ID?

InterBranchRestrictorAttribute正在检查图表是否在报告中工作,或者在IsReportorPrinterBranchFeatureEnabled中启用的分支间事务功能方法,因此您需要从实现中删除它。 您可以按照以下示例中所示的方式编写自己的PXResrictorAttribute:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = true)]
public class CustomRestrictorAttribute: PXRestrictorAttribute
{
    public CustomRestrictorAttribute(Type where) : base(CustomRestrictorAttribute.EmptyWhere, "Restrictor Message.", Array.Empty<Type>())
    {
      this._interBranchWhere = where;
    }

    protected override BqlCommand WhereAnd(PXCache sender, PXSelectorAttribute selattr, Type Where)
    {
      return base.WhereAnd(sender, selattr, this._interBranchWhere);
    }

    private static readonly Type EmptyWhere = typeof(Where<True, Equal<True>>);

    protected Type _interBranchWhere;
}
并将其应用于DAC字段,如下所示:

[SiteAvail(typeof(SOLine.inventoryID), typeof(SOLine.subItemID))]
[PXParent(typeof(Select<SOOrderSite, Where<SOOrderSite.orderType, Equal<Current<SOLine.orderType>>, And<SOOrderSite.orderNbr, Equal<Current<SOLine.orderNbr>>, And<SOOrderSite.siteID, Equal<Current2<SOLine.siteID>>>>>>), LeaveChildren = true, ParentCreate = true)]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
[PXUIRequired(typeof(IIf<Where<SOLine.lineType, NotEqual<SOLineType.miscCharge>>, True, False>))]
[InterBranchRestrictor(typeof(Where2<SameOrganizationBranch<INSite.branchID, Current<SOOrder.branchID>>,
Or<Current<SOOrder.behavior>, Equal<SOBehavior.qT>>>))]
[CustomInterBranchRestrictor(typeof(Where<INSite.branchID,Equal<Current<SOOrder.branchID>>>))]
protected virtual void SOLine_SiteID_CacheAttached(PXCache cache)
{

}

很好!谢谢在标准DAC上,我只是扩展了所需的DAC,并使用MergeMethod.Append添加新属性。快速,无痛,正是我所需要的。
[IN.SiteAvail(typeof(INTran.inventoryID), typeof(INTran.subItemID))]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = true)]
public class CustomRestrictorAttribute: PXRestrictorAttribute
{
    public CustomRestrictorAttribute(Type where) : base(CustomRestrictorAttribute.EmptyWhere, "Restrictor Message.", Array.Empty<Type>())
    {
      this._interBranchWhere = where;
    }

    protected override BqlCommand WhereAnd(PXCache sender, PXSelectorAttribute selattr, Type Where)
    {
      return base.WhereAnd(sender, selattr, this._interBranchWhere);
    }

    private static readonly Type EmptyWhere = typeof(Where<True, Equal<True>>);

    protected Type _interBranchWhere;
}
[SiteAvail(typeof(SOLine.inventoryID), typeof(SOLine.subItemID))]
[PXParent(typeof(Select<SOOrderSite, Where<SOOrderSite.orderType, Equal<Current<SOLine.orderType>>, And<SOOrderSite.orderNbr, Equal<Current<SOLine.orderNbr>>, And<SOOrderSite.siteID, Equal<Current2<SOLine.siteID>>>>>>), LeaveChildren = true, ParentCreate = true)]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
[PXUIRequired(typeof(IIf<Where<SOLine.lineType, NotEqual<SOLineType.miscCharge>>, True, False>))]
[InterBranchRestrictor(typeof(Where2<SameOrganizationBranch<INSite.branchID, Current<SOOrder.branchID>>,
Or<Current<SOOrder.behavior>, Equal<SOBehavior.qT>>>))]
[CustomInterBranchRestrictor(typeof(Where<INSite.branchID,Equal<Current<SOOrder.branchID>>>))]
protected virtual void SOLine_SiteID_CacheAttached(PXCache cache)
{

}