Acumatica 独立投影中的未绑定字段

Acumatica 独立投影中的未绑定字段,acumatica,Acumatica,我有一个富文本字段附加到PMQuote和CRQuote DAC。在CRQuote上,用户字段位于独立类和常规类上,可以根据需要工作。但是,Acumatica的报告没有显示HTML格式,因此我创建了一个未绑定的纯文本字段,用于报告和GI中。此字段在PMQuote上正常工作,但在CRQuote上不正常。在CRQuote上,该字段存在,但始终为空。我肯定这与投影有关,但我不确定它应该如何创建 这是PMQuote字段(工作正常) [PXString(IsUnicode=true)] [PXUIField

我有一个富文本字段附加到PMQuote和CRQuote DAC。在CRQuote上,用户字段位于独立类和常规类上,可以根据需要工作。但是,Acumatica的报告没有显示HTML格式,因此我创建了一个未绑定的纯文本字段,用于报告和GI中。此字段在PMQuote上正常工作,但在CRQuote上不正常。在CRQuote上,该字段存在,但始终为空。我肯定这与投影有关,但我不确定它应该如何创建

这是PMQuote字段(工作正常)

[PXString(IsUnicode=true)]
[PXUIField(Visible=false,DisplayName=“范围文本”)]
公共虚拟字符串UsrScopePlainText
{
得到
{
返回PX.Data.Search.SearchService.Html2PlainText(UsrScope);
}
}
公共抽象类usrscopeplantext:PX.Data.BQL.BqlString.Field{}
以下是我在CRQuote上的信息(不工作):

公共类CRQuoteExt:PXCacheExtension
{
#区域UsrScope
[PXDBText(IsUnicode=true,BqlField=typeof(crquotestandaroneext.usrScope))]
[PXUIField(DisplayName=“Scope”)]
公共虚拟字符串UsrScope{get;set;}
公共抽象类usrScope:IBqlField{}
#端区
#区域USR范围明文
[PXString(IsUnicode=true)]
[PXUIField(Visible=false,DisplayName=“范围文本”)]
公共虚拟字符串UsrScopePlainText
{
得到
{
返回PX.Data.Search.SearchService.Html2PlainText(UsrScope);
}
}
公共抽象类usrScopePlainText:IBqlField{}
#端区
}
公共类CRQuoteStandaloneExt:PXCacheExtension
{
#区域UsrScope
[PXDBText(IsUnicode=true)]
[PXUIField(DisplayName=“Scope”)]
公共虚拟字符串UsrScope{get;set;}
公共抽象类usrScope:IBqlField{}
#端区
#区域USR范围明文
[PXString(IsUnicode=true)]
[PXUIField(Visible=false,DisplayName=“范围文本”)]
公共虚拟字符串UsrScopePlainText
{
得到
{
返回PX.Data.Search.SearchService.Html2PlainText(UsrScope);
}
}
公共抽象类usrScopePlainText:IBqlField{}
#端区
}

谢谢

另一种解决方案可能是拥有一个可重用属性,可以附加到任何字段。我认为这比直接在数据访问类中添加逻辑更干净

using PX.Objects.IN;
using PX.Data;
using System;

namespace PX.Objects.IN
{
  public class InventoryItemPlainTextBodyExt : InventoryItem
  {
    [HtmlToText(typeof(InventoryItem.body))]
    [PXDependsOnFields(typeof(InventoryItem.body))]
    [PXUIField(DisplayName="Body (Plain Text)")]
    public virtual string BodyPlainText { get; set; }
    public abstract class bodyPlainText : PX.Data.BQL.BqlString.Field<bodyPlainText> { }
  }
  
  [PXString]    
  public class HtmlToTextAttribute : PXEventSubscriberAttribute, IPXFieldSelectingSubscriber
  {
    protected Type _htmlField;

    public HtmlToTextAttribute(Type htmlField) :base()
    {
      _htmlField = htmlField;
    }
      
    public void FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
    {
      e.ReturnValue = PX.Data.Search.SearchService.Html2PlainText(sender.GetValue(e.Row, _htmlField.Name) as string);
    }
  }
}
使用PX.Objects.IN;
使用PX数据;
使用制度;
命名空间PX.Objects.IN
{
公共类InventoryItemPlainTextBodyExt:InventoryItem
{
[HtmlText(typeof(InventoryItem.body))]
[PXDependsOnFields(typeof(InventoryItem.body))]
[PXUIField(DisplayName=“Body(纯文本)”)]
公共虚拟字符串正文明文{get;set;}
公共抽象类bodyPlainText:PX.Data.BQL.BqlString.Field{}
}
[字符串]
公共类HtmlToxtAttribute:PXEventSubscriberAttribute,IPXFieldSelectingSubscriber
{
受保护类型_htmlField;
公共HtmlToxtAttribute(类型htmlField):base()
{
_htmlField=htmlField;
}
公共无效字段选择(PXCache发送方,PXFieldSelectingEventArgs e)
{
e、 ReturnValue=PX.Data.Search.SearchService.Html2PlainText(sender.GetValue(e.Row,_htmlField.Name)作为字符串);
}
}
}

我不确定发生了什么,但我将上面发布的原始代码放回定制项目中,它开始按预期工作。

UsrScopePlainText字段缺少BqlField属性BqlField不是PXString的一部分,只有PXDBString。即使它是一个非持久性字段,我是否应该在常规类上将其更改为PXDBString?正如我所怀疑的,如果独立类是PXString,则无法创建常规类PXDBString。但是我不能添加BQLField来指向独立类,因为它不是PXString的一部分。这是正确的。我认为您应该在独立的CRQuote DAC(DB表1)上保留PXDBString自定义字段,在CRQuote DAC扩展(不是独立的)上保留PXDBString自定义字段,而不是在UsrScope字段上使用PXDBString,而是使用PXDBScalar属性从独立版本获取值。并确保您的usrScope纯文本字段[dependsOn…]usrScope字段。
public class CRQuoteExt : PXCacheExtension<CRQuote>
{
    #region UsrScope
    [PXDBText(IsUnicode = true, BqlField = typeof(CRQuoteStandaloneExt.usrScope))]
    [PXUIField(DisplayName = "Scope")]

    public virtual string UsrScope { get; set; }
    public abstract class usrScope : IBqlField { }
    #endregion

    #region UsrScopePlainText
    [PXString(IsUnicode = true)]
    [PXUIField(Visible = false, DisplayName = "Scope Text")]
    public virtual String UsrScopePlainText
    {
        get
        {
            return PX.Data.Search.SearchService.Html2PlainText(UsrScope);

        }
    }
    public abstract class usrScopePlainText : IBqlField { }
    #endregion
}

public class CRQuoteStandaloneExt : PXCacheExtension<PX.Objects.CR.Standalone.CRQuote>
{
    #region UsrScope
    [PXDBText(IsUnicode = true)]
    [PXUIField(DisplayName = "Scope")]
    public virtual string UsrScope { get; set; }
    public abstract class usrScope : IBqlField { }
    #endregion

    #region UsrScopePlainText
    [PXString(IsUnicode = true)]
    [PXUIField(Visible = false, DisplayName = "Scope Text")]
    public virtual String UsrScopePlainText
    {
        get
        {
            return PX.Data.Search.SearchService.Html2PlainText(UsrScope);

        }
    }
    public abstract class usrScopePlainText : IBqlField { }
    #endregion
}
using PX.Objects.IN;
using PX.Data;
using System;

namespace PX.Objects.IN
{
  public class InventoryItemPlainTextBodyExt : InventoryItem
  {
    [HtmlToText(typeof(InventoryItem.body))]
    [PXDependsOnFields(typeof(InventoryItem.body))]
    [PXUIField(DisplayName="Body (Plain Text)")]
    public virtual string BodyPlainText { get; set; }
    public abstract class bodyPlainText : PX.Data.BQL.BqlString.Field<bodyPlainText> { }
  }
  
  [PXString]    
  public class HtmlToTextAttribute : PXEventSubscriberAttribute, IPXFieldSelectingSubscriber
  {
    protected Type _htmlField;

    public HtmlToTextAttribute(Type htmlField) :base()
    {
      _htmlField = htmlField;
    }
      
    public void FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
    {
      e.ReturnValue = PX.Data.Search.SearchService.Html2PlainText(sender.GetValue(e.Row, _htmlField.Name) as string);
    }
  }
}