套件组件 - 自定义日期字段

时间:2016-08-19 22:10:34

标签: acumatica acumatica-kb

我们需要添加一个自定义字段来存储Kit Assembly Start Date,但由于错误“数据库中不存在表:INKitRegister”

,因此无法完成此任务

如果我们需要Date字段而不是文本字段,并使用以下属性修饰我们的自定义字段+在Kit Assembly屏幕上添加了PXDateTimeEdit:

enter image description here

现在,在自定义PXDateTimeEdit中输入一些值时,我们收到一条不太清晰的错误消息:

enter image description here

1 个答案:

答案 0 :(得分:2)

INKitRegister DAC使用PXProjectionAttribute修饰并与INRegister数据库表一起使用 - 因此您收到了报告的错误消息:

[PXPrimaryGraph(typeof(KitAssemblyEntry))]
[PXCacheName(Messages.INKit)]
[PXProjection(typeof(Select2<INRegister, InnerJoin<INTran,
    On<INRegister.kitLineNbr, Equal<INTran.lineNbr>,
        And<INRegister.docType, Equal<INTran.docType>,
        And<INRegister.refNbr, Equal<INTran.refNbr>>>>>>), Persistent = true)]
[Serializable]
public partial class INKitRegister : IBqlTable, ILSPrimary
{
    ...
}

截至目前,Customization Manager不支持投影DAC,我们必须修改一些代码才能在Kit Assembly屏幕上添加自定义字段:

1.在Customization Manager中,按照以下屏幕截图为IN.INRegister DAC添加新字段: enter image description here

  1. 在自定义管理器中添加新的代码文件,选择DAC Extension作为文件类型,INKitRegister作为Base DAC,如下面的屏幕截图所示: enter image description here

  2. 在生成的INKitRegister DAC扩展中声明自定义的UsrTest字段:

    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.Text;
    using PX.Data;
    using PX.Objects.CS;
    using PX.Objects.IN.Overrides.INDocumentRelease;
    using PX.Objects.GL;
    using PX.Objects.CM;
    using System.Diagnostics;
    using PX.Objects;
    using PX.Objects.IN;
    
    namespace PX.Objects.IN
    {
      public class INKitRegisterExt : PXCacheExtension<PX.Objects.IN.INKitRegister>
      {
        #region UsrTest
        public abstract class usrTest: PX.Data.IBqlField
        {
        }
        protected String _BatchNbr;
        [PXDBString(50, BqlField = typeof(INRegisterExt.usrTest))]
        [PXUIField(DisplayName = "Test")]
        public virtual string UsrTest { get; set; }
        #endregion
      }
    }
    
  3. 注意:要获取DB [Type]属性所需的BqlField名称,应在数据类编辑器中打开INRegister自定义字段声明: enter image description here

    1. 发布当前项目

    2. 打开套件组件屏幕的布局编辑器,为在INKitRegister DAC扩展中声明的自定义字段添加输入控件: enter image description here

    3. 发布当前项目并导航到Kit Assembly屏幕以确保是否已成功应用自定义: enter image description here

    4. 要解决“无法将类型A的对象强制转换为B类”错误,您应该验证两件事:

      1. 如果字段属性在INRegister和INKitRegister DAC的扩展名中匹配
      2. 您声明了正确类型的字段
      3. enter image description here

        在这种特定情况下,通过将UsrKAStartDate的类型更改为DateTime来解决问题? (可空):

        using System;
        using System.Collections.Generic;
        using System.Collections;
        using System.Text;
        using PX.Data;
        using PX.Objects.CS;
        using PX.Objects.IN.Overrides.INDocumentRelease;
        using PX.Objects.GL;
        using PX.Objects.CM;
        using System.Diagnostics;
        using PX.Objects;
        using PX.Objects.IN;
        
        namespace PX.Objects.IN
        {
            public class INKitRegisterExt : PXCacheExtension<PX.Objects.IN.INKitRegister>
            {
                #region UsrKAStartDate
                [PXDBDate]
                [PXUIField(DisplayName = "Start Date")]
                public virtual DateTime? UsrKAStartDate { get; set; }
                public abstract class usrKAStartDate : IBqlField { }
                #endregion
            }
        }