【问题标题】:How do I extend CustomerPaymentMethod correctly?如何正确扩展 CustomerPaymentMethod?
【发布时间】:2019-03-07 00:55:05
【问题描述】:

我有一些可以运行的东西,但肯定看起来不正确

Desire:添加一个字段作为 CustomerPaymentMethod 的扩展 代码/表格都在下面

问题: 为什么需要 PaymentMethodID 字段,如果需要,如何填写?

在 DB Table OR Dac 中没有这个就开始了。这在直接访问 AR303010(客户付款方式)时加载/工作,但在来自 AR303000(AR 客户)的 SQL 连接上失败

如果我只是添加到表中,然后得到“无法将 null 插入字段”

如果我添加到 DAC 中,则在 DB 中继续获取 Null(仅在扩展表上)

所以这会运行,但肯定看起来不正确。我希望扩展表上不需要 PaymentMethodID,因为在“CustomerPaymentMethod.cs”的 DAC 中,它没有标记为“IsKey=true”。如果我确实需要它,那么我希望它作为密钥的一部分自动填充

表:

Create Table XPMCustomerPaymentMethodExt (
    [CompanyID] [int] NOT NULL DEFAULT ((0)),
    [PMInstanceID] [int] NOT NULL,
    [BAccountID] [int] NOT NULL,
    [PaymentMethodID] [nvarchar](10) NULL,  /* Problem Child, if not here, fails to load customer screen (AR303000) */
    [CanConsolidate] [bit] NULL,
    [DeletedDatabaseRecord] [bit] NOT NULL DEFAULT ((0)),
 CONSTRAINT [PK_XPMCustomerPaymentMethodExt] PRIMARY KEY CLUSTERED 
(
    [CompanyID] ASC,
    [PMInstanceID] ASC
    )
    )

DAC:

[PXTable(IsOptional = true)]
public class XPMCustomerPaymentMethodExt : PXCacheExtension<PX.Objects.AR.CustomerPaymentMethod>
{
    #region CanConsolidate
    public abstract class canConsolidate : PX.Data.IBqlField
    {
    }
    protected bool? _CanConsolidate = false;
    [PXDBBool]
    [PXDefault(false, PersistingCheck = PXPersistingCheck.Nothing)]
    [PXUIField(DisplayName = "Payments may be consolidated")]
    public virtual bool? CanConsolidate
    {
        get
        {
            return _CanConsolidate;
        }
        set
        {
            _CanConsolidate = value;
        }
    }
    #endregion

    #region PaymentMethodID
    public abstract class paymentMethodID : PX.Data.IBqlField
    {
    }
    protected string _PaymentMethodID; // = Base.PaymentMethodID;
    [PXMergeAttributes(Method = MergeMethod.Merge)]
    [PXDBString(10, IsUnicode = true)]
    //[PXDefault(typeof(CustomerPaymentMethod.paymentMethodID), PersistingCheck = PXPersistingCheck.Nothing)]
    //[PXFormula(typeof(Selector<CustomerPaymentMethod.pMInstanceID, CustomerPaymentMethod.paymentMethodID>))]
    public virtual String PaymentMethodID
    {
        get
        {
            //return Base.PaymentMethodID;
            return _PaymentMethodID;
        }
        set
        {
            // Base.PaymentMethodID = value;
            _PaymentMethodID = value;
        }
    }
    #endregion
}

【问题讨论】:

  • “无法在字段中插入空值”是否正是显示的错误消息?我觉得措辞很奇怪,我怀疑错误消息和跟踪是不同的。
  • SQL(是的,纯测试框,是的,知道完整性违规):删除 XPMCustomerPaymentMethodExt 删除 CustomerPaymentMethod 从扩展名中注释掉整个 PaymentMethodID 字段,同时删除 PaymentMethodID 和 paymentMethodID 直接打开 AR303010(客户付款方式)输入数据,尝试保存来自 SalesDemo 数据集的数据:客户:ABARTENDE 付款方式:VISA 处理器默认值,至 AUTDOTNET 卡号(测试):4111111111111111 到期日期:12/21 名称:abc CVV:123 保存工作正常。表的 P​​aymentMethodID 字段为 NULL
  • 来自客户的问题,连接包括对 PaymentMethodID 的引用(评论太长,从 SQL Profiler 获取):CustomerPaymentMethodInfo_CustomerPaymentMethod_XPMCustomerPaymentMethodExt -> longname LEFT JOIN [XPMCustomerPaymentMethodExt] [longname] ON ([longname].[CompanyID] ] = 2) AND [longname].[DeletedDatabaseRecord] = 0 AND [CustomerPaymentMethodInfo_CustomerPaymentMethod_CustomerPaymentMethod].[PMInstanceID] = [longname].[PMInstanceID] AND [CustomerPaymentMethodInfo_CustomerPaymentMethod_CustomerPaymentMethod].[PaymentMethodID] = [longname].[PaymentMethodID])

标签: extension-methods acumatica


【解决方案1】:

在缓存扩展中找到PXMergeAttributes 并不常见。最接近错误消息"Unable to insert null into field" 的是PXDefault PXPersistingCheck 验证。

当您在某个字段上具有此属性时,尝试为该字段保留 null 值将导致类似于您提到的错误:

[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]

您似乎已将其注释掉,但我认为它仍然存在,因为PXMergeAttributes

[PXMergeAttributes(Method = MergeMethod.Merge)]
[PXDBString(10, IsUnicode = true)]
//[PXDefault(typeof(CustomerPaymentMethod.paymentMethodID), PersistingCheck = PXPersistingCheck.Nothing)]
//[PXFormula(typeof(Selector<CustomerPaymentMethod.pMInstanceID, CustomerPaymentMethod.paymentMethodID>))]

如果Base DAC 字段具有PXDefault 并且您添加属性PXMergeAttributes,则这具有合并Base DACExtension DAC 属性的效果,从而保留PXDefaultBase DAC 并强制执行通过引发验证错误,该字段的值永远不会为空。

【讨论】:

  • 尝试了没有 PXMerge,只有 PDBString。如果必须在扩展上,则希望使用有效数据填充字段。因此,仅使用 PXDBString: Save 有效,但 DB 字段中为 null
  • 自定义这个字段有什么意义?由于您的自定义未发布,客户付款方式是否存在任何问题?
  • 我认为您的问题可能与在数据库中创建随机表有关。您创建了一个新表 XPMCustomerPaymentMethodExt,但将其声明为扩展。当您扩展 DAC 时,您永远不应该创建带有指向它的扩展名的新表。要么扩展 DAC,不创建表,要么创建新表,而不是让 DAC 从 PXCacheExtension 继承,而是从用于新表的 PXCache 继承。两者不匹配会使 ORM 混淆并导致 SQL Join 错误。
  • 因此正确的解决方法是删除 XPMCustomerPaymentMethodExt 表并从 DAC 扩展中删除 PaymentMethodID 字段。如果您使用自定义项目编辑器创建了扩展,它将自动生成数据库脚本(db 脚本)以添加 CanConsolidate 列。如果您手动创建了 DAC 扩展,这似乎是您必须创建/生成匹配的数据库脚本以将 CanConsolidate 列添加到 CustomerPaymentMethod 表的情况。数据库脚本存储在定制项目中。
  • "自定义这个字段有什么意义?" VAR Isv 解决方案,据我了解,不应更改基表,以防止在不同 VAR 之间使用相同名称的冲突。这似乎阻止了将其添加为自定义字段。是的,我在数据库中手动创建了表。参考:“Acumatica-ISV-Solution-Test-Suite-November-2016.pdf”,来自“4)使用扩展程序集和/或 project.xml 中的 Acumatica 自定义引擎的表脚本、DAC 和 BLC 的任何遗留实现自定义包必须转换为扩展类。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
相关资源
最近更新 更多