【问题标题】:Using approval for customize screen in Acumatica在 Acumatica 中使用自定义屏幕的批准
【发布时间】:2019-02-18 04:56:45
【问题描述】:

我在我的 Acumatica 项目中添加了许多自定义屏幕,我想对这些添加批准,所以我找到并遵循了本指南:

How to work with Assignment and Approval Maps in Acumatica via Automation Steps?

这是我的代码: 我的 DAC:

[PXEMailSource]
[PXPrimaryGraph(typeof(ProductMaint))]
[Serializable]
public class PSSAProduct : IBqlTable, IAssign
{
    #region ProductID
    [PXDBIdentity(IsKey = true)]
    [PXUIField(DisplayName = "Product ID")]
    public virtual int? ProductID { get; set; }
    public abstract class productID : IBqlField { }
    #endregion

    #region ProductCD
    [PXDBString(50, IsUnicode = true)]
    [PXUIField(DisplayName = "Product ID")]
    public virtual string ProductCD { get; set; }
    public abstract class productCD : IBqlField { }
    #endregion

    #region ProductName
    [PXDBString(50, IsUnicode = true, InputMask = "")]
    [PXUIField(DisplayName = "Product Name")]
    public virtual string ProductName { get; set; }
    public abstract class productName : IBqlField { }
    #endregion

    #region Active
    [PXDBBool()]
    [PXDefault(true, PersistingCheck = PXPersistingCheck.Nothing)]
    [PXUIField(DisplayName = "Active")]
    public virtual bool? Active { get; set; }
    public abstract class active : IBqlField { }
    #endregion    

    #region OwnerID
    public abstract class ownerID : IBqlField { }
    [PXDBGuid()]
    [PX.TM.PXOwnerSelector()]
    [PXUIField(DisplayName = "Owner")]
    public virtual Guid? OwnerID { get; set; }
    #endregion

    #region WorkgroupID
    public abstract class workgroupID : IBqlField { }
    [PXDBInt()]
    [PXSelector(typeof(Search<EPCompanyTree.workGroupID>), SubstituteKey = typeof(EPCompanyTree.description))]
    [PX.TM.PXCompanyTreeSelector]
    [PXUIField(DisplayName = "Workgroup", Enabled = false)]
    public virtual int? WorkgroupID { get; set; }
    #endregion

    #region Hold
    [PXDBBool()]
    [PXUIField(DisplayName = "Hold", Visibility = PXUIVisibility.Visible)]
    [PXDefault(true)]
    //[PXNoUpdate] <- Saw this in the PO code, but had to remove so user could save stat of the Hold checkbox
    public virtual bool? Hold { get; set; }
    public abstract class hold : IBqlField { }
    #endregion

    #region Approved
    public abstract class approved : IBqlField { }
    [PXDBBool]
    [PXDefault(false, PersistingCheck = PXPersistingCheck.Nothing)]
    [PXUIField(DisplayName = "Approved", Visibility = PXUIVisibility.Visible, Enabled = false)]
    public virtual bool? Approved { get; set; }
    #endregion


    #region Rejected
    public abstract class rejected : IBqlField { }
    [PXBool]
    [PXDefault(false, PersistingCheck = PXPersistingCheck.Nothing)]
    public bool? Rejected { get; set; }
    #endregion

    #region Status
    [PXDBString(1)]
    [PXDefault(PSSAProduct.Statuses.Hold)]
    [PXUIField(DisplayName = "Status", Visibility = PXUIVisibility.SelectorVisible, Enabled = false)]
    [Statuses.List]
    public virtual string Status { get; set; }
    public abstract class status : IBqlField { }
    #endregion
}

我的图表:

public class ProductMaint : PXGraph<ProductMaint, PSSAProduct>
{
    public PXSelect<PSSAProduct> PSSAProductView;

    public PXSelect<PSSASetupApproval> SetupApproval;

    public EPApprovalAutomation<PSSAProduct, PSSAProduct.approved, PSSAProduct.rejected, PSSAProduct.hold, PSSASetupApproval> Approval;
}

我的设置类:

    [Serializable]
    public class PSSASetup : IBqlTable
    {
        #region SARequestApproval
        [EPRequireApproval]
        [PXDefault(false, PersistingCheck = PXPersistingCheck.Null)]
        [PXUIField(DisplayName = "SARequest Approval")]
        public virtual bool? SARequestApproval { get; set; }
        public abstract class sARequestApproval : IBqlField { }
        #endregion
    }

还有我的设置 apprval 类:

    [Serializable]
    public class PSSASetupApproval : IBqlTable, IAssignedMap
    {
        #region ApprovalID
        [PXDBIdentity(IsKey = true)]
        [PXUIField(DisplayName = "Approval ID")]
        public virtual int? ApprovalID { get; set; }
        public abstract class approvalID : IBqlField { }
        #endregion

        #region AssignmentMapID
        [PXDefault()]
        [PXDBInt()]
        [PXSelector(typeof(Search<EPAssignmentMap.assignmentMapID, Where<EPAssignmentMap.entityType, Equal<AssignmentMapType.AssignmentMapTypeProduct>>>),
              DescriptionField = typeof(EPAssignmentMap.name))]
        [PXUIField(DisplayName = "Assignment Map ID")]
        public virtual int? AssignmentMapID { get; set; }
        public abstract class assignmentMapID : IBqlField { }
        #endregion

        #region AssignmentNotificationID
        [PXDBInt()]
        [PXSelector(typeof(PX.SM.Notification.notificationID), SubstituteKey = typeof(PX.SM.Notification.name))]
        [PXUIField(DisplayName = "Pending Approval Notification")]
        public virtual int? AssignmentNotificationID { get; set; }
        public abstract class assignmentNotificationID : IBqlField { }
        #endregion

        #region IsActive
        [PXDBBool()]
        [PXDefault(typeof(Search<PSSASetup.sARequestApproval>), PersistingCheck = PXPersistingCheck.Nothing)]
        [PXUIField(DisplayName = "Is Active")]
        public virtual bool? IsActive { get; set; }
        public abstract class isActive : IBqlField { }
        #endregion
    }

    public static class AssignmentMapType
    {
        public class AssignmentMapTypeProduct : Constant<string>
        {
            public AssignmentMapTypeProduct() : base(typeof(PSSAProduct).FullName) { }
        }
    }

我的问题是,如果我将 Acumatica 的 DAC 作为 EPApprovalAutomation 的 SourceAssign,它没有错误。但是如果我使用我的 DAC,它会在框架的代码中抛出“Value cannot be null”。

我仔细检查了两个 DAC 之间的区别,但我没有意识到任何事情。

我的 Acumatica 版本是 17R2。

如果你知道,请告诉我我错过了什么。

谢谢大家!

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    通常,此错误“Value cannot be null”与在 DB 中定义的具有 NOT NULL 字段的表有关,或者与尝试持久保存到 DB 时 PXDefault 属性为空的 DAC 有关。

    如果您使用了链接中的示例,并且您使用审计字段创建了数据库表:

    CreatedByID uniqueidentifier NOT NULL,
    CreatedByScreenID char(8) NOT NULL,
    CreatedDateTime datetime NOT NULL,
    LastModifiedByID uniqueidentifier NOT NULL,
    LastModifiedByScreenID char(8) NOT NULL,
    LastModifiedDateTime datetime NOT NULL,
    Tstamp timestamp NULL,
    

    确保您也将它们添加到您的 DAC:

    #region tstamp
    public abstract class Tstamp : IBqlField { }
    [PXDBTimestamp()]
    public virtual byte[] tstamp { get; set; }     
    #endregion
    
    #region CreatedByID
    public abstract class createdByID : IBqlField { }
    [PXDBCreatedByID()]
    public virtual Guid? CreatedByID { get; set; }     
    #endregion
    
    #region CreatedByScreenID
    public abstract class createdByScreenID : IBqlField { }
    [PXDBCreatedByScreenID()]
    public virtual string CreatedByScreenID { get; set; }          
    #endregion
    
    #region CreatedDateTime
    public abstract class createdDateTime : IBqlField { }
    [PXDBCreatedDateTime()]
    public virtual DateTime? CreatedDateTime { get; set; }         
    #endregion
    
    #region LastModifiedByID
    public abstract class lastModifiedByID : IBqlField { }
    [PXDBLastModifiedByID()]
    public virtual Guid? LastModifiedByID { get; set; }        
    #endregion
    
    #region LastModifiedByScreenID
    public abstract class lastModifiedByScreenID : IBqlField { }
    [PXDBLastModifiedByScreenID()]
    public virtual string LastModifiedByScreenID { get; set; }         
    #endregion
    
    #region LastModifiedDateTime
    public abstract class lastModifiedDateTime : IBqlField { }
    [PXDBLastModifiedDateTime()]
    public virtual DateTime? LastModifiedDateTime { get; set; }        
    #endregion
    

    同时检查您的代码这两个可能的 PXDefault 候选:

    1. PSSAProduct DAC 的状态字段中,您使用[PXDefault(PSSAProduct.Statuses.Hold)]。检查您是否正确定义了 PSSAProduct.Statuses。

    2. PSSASetupApproval DAC 的 AssignmentMapID 字段中,PXSelector [PXSelector(typeof(Search&lt;EPAssignmentMap.assignmentMapID, Where&lt;EPAssignmentMap.entityType, Equal&lt;AssignmentMapType.AssignmentMapTypeProduct&gt;&gt;&gt;), DescriptionField = typeof(EPAssignmentMap.name))] 找不到任何记录。您可以使用视图进行测试以确保其正常工作。

    【讨论】:

    • AssignmentMapID 的选择器没有任何记录,因为我无法创建审批图。当我选择实体类型字段(在 EP205015 上)时,它会引发“处理 GraphType 字段期间发生错误:值不能为空。”错误。我确信 7 个默认字段运行良好,因为我通过生成数据库成员(由 Acumatica 开发的功能)和从 POOrder 复制的 Statuses.List 来创建 DAC
    【解决方案2】:

    我设法检查了两个班级之间的差异,然后我找到了答案:我错过了 NoteID 字段

        #region NoteID
        public abstract class noteID : PX.Data.IBqlField
        {
        }
        protected Guid? _NoteID;
        [PXNote(new Type[0], ShowInReferenceSelector = true)]
        public virtual Guid? NoteID
        {
            get
            {
                return this._NoteID;
            }
            set
            {
                this._NoteID = value;
            }
        }
        #endregion
    

    【讨论】:

      猜你喜欢
      • 2018-11-29
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多