【问题标题】:Acumatica Branch and BranchBAccount extension updating all branch extension records in the companyAcumatica Branch 和 BranchBAccount 扩展更新公司所有分支扩展记录
【发布时间】:2018-04-14 20:52:44
【问题描述】:

我正在尝试将默认分支位置字段添加到分支。该字段将允许用户选择一个分支位置作为默认值,并在未来的几次定制中使用此默认值。我的问题是,当我填充新的扩展字段时,该值保存在所有分支记录上,而不是选定的分支上。

我扩展了 Branch DAC(因为这是存储数据的地方):

//Branch Extension
[PXTable(typeof(Branch.branchID), IsOptional = false)]
public class BranchExtension : PXCacheExtension<Branch>
{
    #region DefaultBranchLocation
    public abstract class defaultBranchLocation : IBqlField { }
    [PXDBInt()]
    [PXUIField(DisplayName = "Default Branch Location")]
    [PXSelector(typeof(FSBranchLocation.branchLocationID),
        DescriptionField = typeof(FSBranchLocation.descr),
        SubstituteKey = typeof(FSBranchLocation.branchLocationCD))]
    public virtual int? DefaultBranchLocation { get; set; }
    #endregion
}

这是我创建的 Branch 扩展表:

<Sql TableName="BranchExtension" TableSchemaXml="#CDATA">
  <CDATA name="TableSchemaXml"><![CDATA[<table name="BranchExtension">
    <col name="CompanyID" type="Int" default="Zero" />
    <col name="BranchID" type="Int" />
    <col name="DeletedDatabaseRecord" type="Bit" />
    <col name="DefaultBranchLocation" type="Int" nullable="true" />
    <index name="BranchExtension_PK" clustered="true" primary="true" unique="true">
      <col name="CompanyID" />
      <col name="BranchID" />
    </index>
  </table>]]></CDATA>
</Sql>

我创建了一个回填脚本(不包括在内)。 为了处理分支页面上使用的投影,我创建了以下 BranchBAccount 扩展:

//BranchBAccount Projection Extension
public class BranchBAccountExtension : PXCacheExtension<BranchMaint.BranchBAccount>
{
    #region DefaultBranchLocation
    public abstract class defaultBranchLocation : IBqlField { }
    [PXDBInt(BqlField = typeof(BranchExtension.defaultBranchLocation))]
    [PXUIField(DisplayName = "Default Branch Location")]
    [PXSelector(typeof(
        Search2<FSBranchLocation.branchLocationID,
            InnerJoin<Branch, On<Branch.branchID, Equal<FSBranchLocation.branchID>>>,
            Where<Branch.branchCD, Equal<Current<BranchMaint.BranchBAccount.branchBranchCD>>>>),
        DescriptionField = typeof(FSBranchLocation.descr),
        SubstituteKey = typeof(FSBranchLocation.branchLocationCD))]
    public virtual int? DefaultBranchLocation { get; set; }
    #endregion
}

对于 aspx,我只是将我的扩展字段添加到分支页面 (CS102000) 作为一般信息 MISC SETTINGS (SHARED) 下的第一个字段。你可以看看它是如何放置的:

...
<px:PXLayoutRule runat="server" StartGroup="True" GroupCaption="Misc Settings (Shared)" ></px:PXLayoutRule>
<px:PXSelector runat="server" ID="edDefaultBranchLocation" DataField="DefaultBranchLocation" CommitChanges="True" AutoRefresh="True" />
<px:PXFormView ID="CommonSettings" runat="server" DataMember="commonsetup" DataSourceID="ds" RenderStyle="Simple">
...

在我的测试公司中,我有 3 个分支机构(分支机构 ID 1、2 和 3)。我导航到 CS102000(分支)并选择其中一个分支(我们会说分支 ID 3)。我添加的默认分支位置字段存在,并且选择器似乎可以按需要工作(无论我选择了哪个分支,只显示其位置)。选择分支位置时不会显示错误。我单击“保存”按钮,一切看起来都很好。也就是说,在我查看任何其他分支记录之前,它们现在具有我选择的分支默认值。更改分支后,屏幕上的所有其他数据都会更改。在数据库中查看时,我的扩展表在分支 1、2 和 3 中具有相同的 DefaultBranchLocation 值。执行 SQL 跟踪表明它只是在运行以下命令:

UPDATE BranchExtension SET [BranchExtension].[DefaultBranchLocation] = @P0 WHERE CompanyID = 2

请注意,它不会过滤关键字段。

我以前从未在扩展表上遇到过这个问题,所以我不确定自己做错了什么。我的猜测是它与投影的扩展有关,但是我的扩展中的字段声明看起来与该投影上声明的正确保存的字段没有什么不同。

非常感谢任何帮助。先感谢您。

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    确实,您的问题与您自定义投影尾部有关。 我建议考虑将您的数据存储在 BAccount 扩展中。然后,如果需要,您可以使用 PXDBScalarAttribute 将字段从 BAccount 映射到分支扩展。 如果您强烈需要避免子选择或者您有其他要求,您可以执行以下 hack:将 BranchID 字段添加到分支扩展并手动处理此字段。

    请参阅下面的两个示例

    public class BranchMaintExt : PXGraphExtension<BranchMaint>
    {
        protected void BranchBAccount_BranchID_CommandPreparing(PXCache sender, PXCommandPreparingEventArgs e)
        {
            if ((e.Operation & PXDBOperation.Command) != PXDBOperation.Select && e.Table != typeof(BranchExtension))
            {
                e.Cancel = true;
            }
            else if ((e.Operation & PXDBOperation.Command) == PXDBOperation.Update && e.Value == null && e.Row != null)
            {
                decimal? ident = PXDatabase.SelectIdentity<PX.Objects.GL.Branch>(typeof(PX.Objects.GL.Branch.branchID).Name);
                if (ident != null && ident.Value > 0)
                {
                    sender.SetValue<BranchBAccountExtension.branchID>(e.Row, Convert.ToInt32(ident));
                    e.Value = ident;
                }
            }
        }
    
        protected void BranchBAccount_BAccountID_CommandPreparing(PXCache sender, PXCommandPreparingEventArgs e)
        {
            if (((e.Operation & PXDBOperation.Command) == PXDBOperation.Update)
                && sender.GetValue<BranchBAccountExtension.branchID>(e.Row) == null && e.Row != null)
            {
                decimal? ident = PXDatabase.SelectIdentity<PX.Objects.GL.Branch>(typeof(PX.Objects.GL.Branch.branchID).Name);
                if (ident != null && ident.Value > 0)
                {
                    sender.SetValue<BranchBAccountExtension.branchID>(e.Row, Convert.ToInt32(ident));
                }
            }
        }
    }
    
    [PXTable(typeof(Branch.branchID), IsOptional = false)]
    public class BranchExtension : PXCacheExtension<Branch>
    {
        #region DefaultBranchLocation
        public abstract class defaultBranchLocation : IBqlField { }
        [PXDBInt()]
        [PXUIField(DisplayName = "Default Branch Location")]
        public virtual int? DefaultBranchLocation { get; set; }
        #endregion
    
        #region BAccountDefaultBranchLocation
        public abstract class bAccountDefaultBranchLocation : IBqlField { }
        [PXDBScalar(typeof(Search<BAccountExtension.bAccountDefaultBranchLocation, Where<BAccount.bAccountID, Equal<Branch.bAccountID>>>))]
        [PXInt()]
        [PXUIField(DisplayName = "Default Branch Location")]
        public virtual int? BAccountDefaultBranchLocation { get; set; }
        #endregion
    }
    
    [PXTable(typeof(BAccount.bAccountID), IsOptional = false)]
    public class BAccountExtension : PXCacheExtension<BAccount>
    {
        #region BAccountDefaultBranchLocation
        public abstract class bAccountDefaultBranchLocation : IBqlField { }
    
        [PXDBInt()]
        [PXUIField(DisplayName = "Default Branch Location")]
        public virtual int? BAccountDefaultBranchLocation { get; set; }
        #endregion
    }
    
    public class BranchBAccountExtension : PXCacheExtension<BranchMaint.BranchBAccount>
    {
        #region BranchID
        public abstract class branchID : PX.Data.IBqlField
        {
        }
        [PXDBInt(BqlField = typeof(PX.Objects.GL.Branch.branchID))]
        [PXUIField(DisplayName = "Branch ID", Visibility = PXUIVisibility.Invisible)]
        public virtual int? BranchID { get; set; }
    
        #endregion
    
        #region DefaultBranchLocation
        public abstract class defaultBranchLocation : IBqlField { }
        [PXDBInt(BqlField = typeof(BranchExtension.defaultBranchLocation))]
        [PXUIField(DisplayName = "Default Branch Location")]
        public virtual int? DefaultBranchLocation { get; set; }
        #endregion
    
        #region BAccountDefaultBranchLocation
        public abstract class bAccountDefaultBranchLocation : IBqlField { }
    
        [PXDBInt]
        [PXUIField(DisplayName = "Default Branch Location")]
        public virtual int? BAccountDefaultBranchLocation { get; set; }
        #endregion
    }
    

    【讨论】:

    • 感谢您的建议。我终于回到了这项任务,并使用你的建议能够让它发挥作用。具体来说,将新的扩展表/字段从 Branch 更改为 BAccount 基本上就完成了。 (我的投影扩展也更新为 BAccountExtension 而不是 BranchExtension)。我希望我知道为什么扩展分支会导致问题,但我很高兴我能够通过相对较小的更改来解决它。
    猜你喜欢
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多