Acumatica 如何为只能访问一个分支的用户返回其他分支的数据?

Acumatica 如何为只能访问一个分支的用户返回其他分支的数据?,acumatica,Acumatica,我觉得很奇怪,Acumatica的基本安装不包含记录库存项目的批准制造商/零件号的功能,因此我将此功能添加到我的定制项目中。该设计允许每个分支机构定义自己的批准制造商和零件号,但我需要允许仅访问一个分支机构的用户查看其他分支机构的批准制造商 我的DAC是SSIManumufacturer(制造商主数据)和SSIMnitemanumufacturer(单个分支机构特定制造商零件号记录),用于库存项目 自定义项已作为新选项卡添加到“库存项”下的网格视图中。在整个系统中,分支机构的访问控制是通过分支机

我觉得很奇怪,Acumatica的基本安装不包含记录库存项目的批准制造商/零件号的功能,因此我将此功能添加到我的定制项目中。该设计允许每个分支机构定义自己的批准制造商和零件号,但我需要允许仅访问一个分支机构的用户查看其他分支机构的批准制造商

我的DAC是SSIManumufacturer(制造商主数据)和SSIMnitemanumufacturer(单个分支机构特定制造商零件号记录),用于库存项目

自定义项已作为新选项卡添加到“库存项”下的网格视图中。在整个系统中,分支机构的访问控制是通过分支机构的用户角色进行的,但我需要允许任何有权访问库存项目的用户查看任何分支机构的所有制造商零件号

我在AsiaBlog中发现了一篇文章,其中提到了使用PXReadBranchRestrictedScope来消除由系统核心自动应用的分支所造成的限制,如果您在所选DAC中具有BranchID属性。有人建议我不要在自定义DAC中使用BranchID,而是使用UsrBranchID,但我怀疑这是我仍然仅限于此视图中的当前分支数据的根本原因

我刚刚开始学习使用构造函数覆盖视图将生成的默认结果,我不确定这个定义是否正确

public PXSelectJoin<SSINItemManufacturer,
    InnerJoin<SSINManufacturer, On<SSINManufacturer.manufacturerID, Equal<SSINItemManufacturer.manufacturerID>>>,
    Where<SSINItemManufacturer.inventoryID, Equal<Current<InventoryItem.inventoryID>>
    >> ItemManufacturerXrefs;

public virtual IEnumerable itemmanufacturerxrefs()
{
    using (new PXReadBranchRestrictedScope())
    {
        PXResult<SSINItemManufacturer> Results = PXSelectJoin<SSINItemManufacturer,
            InnerJoin<SSINManufacturer, On<SSINManufacturer.manufacturerID, Equal<SSINItemManufacturer.manufacturerID>>>,
            Where<SSINItemManufacturer.inventoryID, Equal<Current<InventoryItem.inventoryID>>
            >>.Select(Base);
        yield return Results;
    }
}

构造函数的定义是否正确以利用PXReadBranchRestrictedScope?我是否需要将BranchID添加到我的DAC中,以使此返回租户中库存物品的所有记录?

发现两个问题,解决了问题。首先,PXResultset被定义为只返回1个值的PXResult,随后返回结果的方法需要扩展以更明确地构建要返回的结果

public virtual IEnumerable itemmanufacturerxrefs()
{
    using (new PXReadBranchRestrictedScope())
    {
        PXResultset<SSINItemManufacturer> Results = PXSelectJoin<SSINItemManufacturer,
                        InnerJoin<SSINManufacturer, On<SSINManufacturer.manufacturerID, Equal<SSINItemManufacturer.manufacturerID>>>,
                        Where<SSINItemManufacturer.inventoryID, Equal<Current<InventoryItem.inventoryID>>
                         >>.Select(Base);

        foreach (PXResult<SSINItemManufacturer, SSINManufacturer> result in Results)
        {
            SSINItemManufacturer mfgitem = result;
            SSINManufacturer mfg = result;

            yield return new PXResult<SSINItemManufacturer, SSINManufacturer>(mfgitem, mfg); 
        }
    }
}
其次,在仔细查看AsiaBlog上的帖子后,需要将BranchID实际上是Branch属性添加到DAC的字段中。如果添加了[Branch]属性,则可以将UsrBranchID用作字段名

#region UsrBranchID
[Branch(IsKey = true)]
[PXDefault(typeof(AccessInfo.branchID))]
[PXUIField(DisplayName = Messages.FldUsrBranchID)]
public virtual int? UsrBranchID { get; set; }
public abstract class usrBranchID : PX.Data.BQL.BqlInt.Field<usrBranchID> { }
#endregion
范围覆盖工作得很好。通过在视图上使用构造函数,我可以将所有分支中的数据的可见性授予广告