0

我有两种情况,我面临问题。

  1. 我有 3 个 DAC,一个是父级,另外 2 个是子级 DAC。
  2. 我有标签视图,并相应地显示数据。第一个选项卡显示父 DAC 数据。第二和第三显示子 DAC 数据。

我正在创建新项目,现在我按添加(+)按钮并填充父选项卡中的信息,但未在第二和第三选项卡中填充任何数据,当我按下 SAVE 时仅保存父 DAC,未创建第二和第三选项卡行在数据库中,我还想保存第二个和第三个选项卡 DAC,我该怎么办?

另一种情况:我不允许 DAC 更新,我正在设置 DAC.Cahce.AllowUpdated = false; 除了复选框,所有控件都被禁用,为什么?

此外,当我们在第三个选项卡上并单击工具栏导航按钮时,第一个选项卡数据不会刷新,它显示的是以前选择的项目数据。如何解决这个问题?

我们没有将 PXGrid 用于任何子数据,所有 3 个 DAC 之间存在一对一的关系。

    /// Parent View
    public SelectFrom<Parent>.View parentTran;
 
   /// Child view
   public SelectFrom<Child>      .Where<Child.tranId.IsEqual<Parent.nCTranId.AsOptional>>.View
           childAnalysis;


    
    #region TranId

    // Child DAC Field.
    public abstract class tranId:PX.Data.BQL.BqlInt.Field<tranId> {
    }

    [PXDBInt(IsKey = true)]
    [PXDBDefault(typeof(Parent.nCTranId))]
    [PXParent(typeof(Select<Parent, Where<Parent.nCTranId, Equal<Current<tranId>>>>))]
    public virtual int? TranId {
        get; set;
    }
    #endregion
4

1 回答 1

0

看看关于主从关系的 T210。它包含有关插入默认记录的部分,这听起来像是您尝试对您的子 DAC 执行的操作。培训可在Acumatica 网站上的https://openuni.acumatica.com/courses/development/t210-development-customized-forms-and-master-detail-relationship/上找到。具体看第 103 页和第 104 页。

在本节的第 3 步中,您将看到使用 RowInserted 事件插入子记录。由于 RowInserted 事件仅在创建记录时触发,因此可以安全地插入子记录。

请参阅以下代码示例。我尝试尽可能多地使用您的样本,但我将它与培训指南中显示的技术合并。免责声明:它会编译,但我还没有构建充分测试代码的先决条件。

using PX.Data;
using PX.Data.BQL.Fluent;

namespace SSCS.CodeSample
{
    public class CodeSampleEntry : PXGraph<CodeSampleEntry, DACParent>
    {
        #region Data Views
        /// Parent View
        [PXViewName("Parent View - Primary")]
        public SelectFrom<DACParent>.View ParentTran;

        /// Child view
        [PXViewName("Child View")]
        public SelectFrom<DACChild>
            .Where<DACChild.tranId.IsEqual<DACParent.nCTranId.FromCurrent>>
            .View ChildAnalysis;
        #endregion

        // RowInserted Event to Create a Default Child Record
        // See T210 Master-Detail training guide from Acumatica
        protected virtual void _(Events.RowInserted<DACParent> e)
        {
            // Ensure there isn't a child record already
            if (ChildAnalysis.Select().Count == 0)
            {
                // Save state of IsDirty so that we can restore it
                // after inserting the default child record
                // so that we don't force the user to save
                // unless they actually enter data somewhere
                bool oldDirty = ChildAnalysis.Cache.IsDirty;

                // Create an object for the child
                // and fill in any data that should be
                // populated by default
                DACChild newChild = new DACChild();
                newChild.MyData = "My Value";

                // Insert the new child record into the cache
                ChildAnalysis.Insert(newChild);

                // Restore the IsDirty flag
                // The insert above will have marked the view as
                // dirty.  If it wasn't dirty before, it should be
                // treated as if it still isn't
                ChildAnalysis.Cache.IsDirty = oldDirty;
            }
        }

    }

    [PXCacheName("Parent DAC")]
    public class DACParent : IBqlTable
    {
        #region NCTranId
        [PXDBIdentity]
        public virtual int? NCTranId { get; set; }
        public abstract class nCTranId
            : PX.Data.BQL.BqlInt.Field<nCTranId> { }
        #endregion
    }

    [PXCacheName("Child DAC")]
    public class DACChild : IBqlTable
    {
        #region TranId
        [PXDBInt(IsKey = true)]
        [PXDBDefault(typeof(DACParent.nCTranId))]
        [PXParent(typeof(SelectFrom<DACParent>
            .Where<DACParent.nCTranId.IsEqual<DACChild.tranId.FromCurrent>>))]
        public virtual int? TranId { get; set; }
        public abstract class tranId
            : PX.Data.BQL.BqlInt.Field<tranId> { }
        #endregion

        #region MyData
        [PXDBString()]
        [PXUIField(DisplayName = "My Data Field")]
        public virtual string MyData { get; set; }
        public abstract class myData
            : PX.Data.BQL.BqlString.Field<myData> { }
        #endregion
    }
}
于 2020-07-24T13:35:23.053 回答