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

Kit Assembly - Custom Date Field

我们需要添加一个自定义字段来存储套件组装开始日期,但由于错误 "Table does not exist in database: INKitRegister"

而无法完成此任务

如果我们需要日期字段而不是文本字段并使用以下属性装饰我们的自定义字段 + 在套件组装屏幕上添加 PXDateTimeEdit:

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

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

[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.In 自定义管理器按照下面的屏幕截图为 IN.INRegister DAC 添加新字段:

  1. 在自定义管理器中添加新代码文件,选择 DAC 扩展作为文件类型,INKitRegister 作为基础 DAC,如下面的屏幕截图所示:

  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
      }
    }
    

注意:要获取DB[Type]属性所需的BqlField名称,应在数据Class编辑器中打开INRegister自定义字段声明:

  1. 发布当前项目

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

  3. 发布当前项目并导航到套件组装屏幕以确保自定义是否已成功应用:

要解决 "Unable to cast object of type A to type B" 错误,您应该验证两件事:

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

在这种特定情况下,通过将 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
    }
}