如何启用自定义属性?(可以在课堂上分配,但不显示交易) [英] How do I enable custom attributes? (can assign on class, but not displaying for transaction)

查看:15
本文介绍了如何启用自定义属性?(可以在课堂上分配,但不显示交易)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 Acumatica 2018R2 中定义了几个新屏幕,需要根据分配给事务的类启用属性支持.类屏幕似乎允许附加属性,但事务屏幕不显示任何属性.我在 Stack Overflow 上找到了几个例子,但我看到的唯一线索似乎是,如果无法确定类 id,则不会显示任何属性.但是,在调试时,我看到找到了类 ID.

I defined several new screens in Acumatica 2018R2 and need to enable attribute support according the class assigned to the transaction. The class screen appears to allow attaching attributes, but the transactional screen does not display any attribute. I found several examples on Stack Overflow, but the only clue I see seems to be that if the class id cannot be determined then no attributes will show. However, upon debug, I see that the class id is found.

这是我的测试代码,我尝试将其精简为一个非常基本的测试.

This is my test code where I have tried stripping down to a very basic test.

AA级

using PX.Data;
using System;

namespace Attributes
{
    [Serializable]
    public class AAClass : IBqlTable
    {
        #region ClassID
        [PXDBIdentity]
        [PXUIField(DisplayName = "Class ID")]
        public virtual int? ClassID { get; set; }
        public abstract class classID : IBqlField { }
        #endregion

        #region ClassCD
        [PXDBString(15, IsKey = true, IsUnicode = true, InputMask = "")]
        [PXUIField(DisplayName = "Class CD")]
        public virtual string ClassCD { get; set; }
        public abstract class classCD : IBqlField { }
        #endregion

        #region Descr
        [PXDBString(256, IsUnicode = true, InputMask = "")]
        [PXUIField(DisplayName = "Descr")]
        public virtual string Descr { get; set; }
        public abstract class descr : IBqlField { }
        #endregion

        #region CreatedByID
        [PXDBCreatedByID()]
        public virtual Guid? CreatedByID { get; set; }
        public abstract class createdByID : IBqlField { }
        #endregion

        #region CreatedByScreenID
        [PXDBCreatedByScreenID()]
        public virtual string CreatedByScreenID { get; set; }
        public abstract class createdByScreenID : IBqlField { }
        #endregion

        #region CreatedDateTime
        [PXDBCreatedDateTime()]
        [PXUIField(DisplayName = SSCS.IN.Messages.FldCreatedDateTime)]
        public virtual DateTime? CreatedDateTime { get; set; }
        public abstract class createdDateTime : IBqlField { }
        #endregion

        #region LastModifiedByID
        [PXDBLastModifiedByID()]
        public virtual Guid? LastModifiedByID { get; set; }
        public abstract class lastModifiedByID : IBqlField { }
        #endregion

        #region LastModifiedByScreenID
        [PXDBLastModifiedByScreenID()]
        public virtual string LastModifiedByScreenID { get; set; }
        public abstract class lastModifiedByScreenID : IBqlField { }
        #endregion

        #region LastModifiedDateTime
        [PXDBLastModifiedDateTime()]
        [PXUIField(DisplayName = SSCS.IN.Messages.FldLastModifiedDateTime)]
        public virtual DateTime? LastModifiedDateTime { get; set; }
        public abstract class lastModifiedDateTime : IBqlField { }
        #endregion

        #region Tstamp
        [PXDBTimestamp()]
        public virtual byte[] Tstamp { get; set; }
        public abstract class tstamp : IBqlField { }
        #endregion

        #region NoteID
        [PXNote]
        public virtual Guid? NoteID { get; set; }
        public abstract class noteID : IBqlField { }
        #endregion
    }
}

AAClassMaint

AAClassMaint

using PX.Data;
using PX.Objects.CR;

namespace Attributes
{
    public class AAClassMaint : PXGraph<AAClassMaint, AAClass>
    {

        #region Data Views
        [PXViewName("Classes")]
        public PXSelect<AAClass> Classes;

        [PXViewName("Attributes")]
        public CSAttributeGroupList<AAClass, AATag> Mapping;
        #endregion

    }
}

AAtag

using PX.Data;
using PX.Objects.CR;
using PX.Objects.CS;
using System;

namespace Attributes
{
    [Serializable]
    public class AATag : IBqlTable
    {
        #region TagID
        [PXDBIdentity]
        public virtual int? TagID { get; set; }
        public abstract class tagID : IBqlField { }
        #endregion

        #region TagCD
        [PXDBString(15, IsKey = true, IsUnicode = true, InputMask = "")]
        [PXUIField(DisplayName = "Tag ID")]
        public virtual string TagCD { get; set; }
        public abstract class tagCD : IBqlField { }
        #endregion

        #region MyClassID
        [PXDBInt()]
        [PXSelector(
            typeof(AAClass.classID),
            typeof(AAClass.classCD),
            typeof(AAClass.descr),
            SubstituteKey = typeof(AAClass.classCD)
        )]
        [PXUIField(DisplayName = "My Class ID")]
        public virtual int? MyClassID { get; set; }
        public abstract class myClassID : IBqlField { }
        #endregion

        #region CreatedByID
        [PXDBCreatedByID()]
        public virtual Guid? CreatedByID { get; set; }
        public abstract class createdByID : IBqlField { }
        #endregion

        #region CreatedByScreenID
        [PXDBCreatedByScreenID()]
        public virtual string CreatedByScreenID { get; set; }
        public abstract class createdByScreenID : IBqlField { }
        #endregion

        #region CreatedDateTime
        [PXDBCreatedDateTime()]
        [PXUIField(DisplayName = SSCS.IN.Messages.FldCreatedDateTime)]
        public virtual DateTime? CreatedDateTime { get; set; }
        public abstract class createdDateTime : IBqlField { }
        #endregion

        #region LastModifiedByID
        [PXDBLastModifiedByID()]
        public virtual Guid? LastModifiedByID { get; set; }
        public abstract class lastModifiedByID : IBqlField { }
        #endregion

        #region LastModifiedByScreenID
        [PXDBLastModifiedByScreenID()]
        public virtual string LastModifiedByScreenID { get; set; }
        public abstract class lastModifiedByScreenID : IBqlField { }
        #endregion

        #region LastModifiedDateTime
        [PXDBLastModifiedDateTime()]
        [PXUIField(DisplayName = SSCS.IN.Messages.FldLastModifiedDateTime)]
        public virtual DateTime? LastModifiedDateTime { get; set; }
        public abstract class lastModifiedDateTime : IBqlField { }
        #endregion

        #region Tstamp
        [PXDBTimestamp()]
        public virtual byte[] Tstamp { get; set; }
        public abstract class tstamp : IBqlField { }
        #endregion

        #region NoteID
        [PXNote]
        public virtual Guid? NoteID { get; set; }
        public abstract class noteID : IBqlField { }
        #endregion

        #region Attributes
        public abstract class attributes : IBqlField { }
        [CRAttributesField(typeof(AATag.myClassID))]
        public virtual string[] Attributes { get; set; }
        public virtual int? ClassID
        {
            get { return MyClassID; }
        }
        #endregion

    }
}

AAtagEntry

using PX.Data;
using PX.Objects.CR;

namespace Attributes
{
    public class AATagEntry : PXGraph<AATagEntry, AATag>
    {
        #region Data Views
        [PXViewName("Classes")]
        public PXSelect<AATag> Tags;

        [PXViewName("Answers")]
        public CRAttributeList<AATag> Answers;
        #endregion
    }
}

据我了解有关此主题的各种帖子,主要要求是:

As I understand the various posts for this topic, the key requirements are:

  • 在类维护屏幕中定义映射

  • Define MAPPING in the class maintenance screen

[PXViewName("Attributes")]
public CSAttributeGroupList<AAClass, AATag> Mapping;

  • 在交易输入屏幕中定义答案

  • Define ANSWERS in the transactional entry screen

    [PXViewName("Answers")]
    public CRAttributeList<AATag> Answers;
    

  • 在事务表中包含 NoteID

  • Include NoteID in the transactional table

    将 ATTRIBUTES 添加到事务表,包括 ClassID 字段

    Add ATTRIBUTES to the transactional table, including a field for ClassID

    public abstract class attributes : IBqlField { }
    [CRAttributesField(typeof(AATag.myClassID))]
    public virtual string[] Attributes { get; set; }
    public virtual int? ClassID
    {
        get { return MyClassID; }
    }
    

  • 推荐答案

    正如 HB_Acumatica 在评论中所建议的,问题似乎是 ClassID 字段被定义为整数.

    As HB_Acumatica suggested in the comments, the issue appeared to be with the ClassID fields being defined as integer.

    我删除了原始 ClassID (int) 字段并重命名了 Class DAC 中的 ClassCD(字符串)字段.接下来,我将事务性 DAC 中的 ClassID 字段更改为字符串.问题解决了.事务输入屏幕上的属性选项卡现在显示分配给所选类别的属性.

    I removed the original ClassID (int) fields and renamed the ClassCD (string) fields in the Class DAC's. Next, I changed the ClassID fields in the transactional DAC's to strings. Problem solved. The attribute tab on the transactional entry screens now display the attributes assigned to the class selected.

    经验教训:类"DAC 不应该有一个 ClassID/ClassCD 对,而是一个简单的字符串 ClassID 字段.(通常根据类的类型命名,即 TagClassID)事务表中使用的类 ID 将使用字符串类 ID.

    Lesson learned: A "Class" DAC should not have a ClassID/ClassCD pair, but rather a simple string ClassID field. (Typically named specific to the type of class, i.e. TagClassID) The Class ID used in the transactional tables will then use the string Class ID.

    这篇关于如何启用自定义属性?(可以在课堂上分配,但不显示交易)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆