【问题标题】:Acumatica - Unique CheckAcumatica - 唯一检查
【发布时间】:2020-12-04 09:33:41
【问题描述】:

什么属性可以用来允许唯一值, 我们使用 [PXUniqueCheck(typeof(Name))] 但是如果使用 List 视图并且使用相同的名称更新记录,它允许相同的名称值

更多详情 - 嗨,列标记为 IsKey = True 的名称,我的视图是 ListView,有 2 个字段名称和描述,其中名称具有 IsKey =True 和另一个列 ID 具有 DBIdentity 属性。所以我认为DAC,UI添加行为一切正常 - 添加现有值时,它会使用新添加的值描述更新旧行,因为名称相同。更新行为 - 将名称列更改为与其他相同的值,然后它允许有 2 行具有相同的键,但两行在 UI 上显示相同的描述,但在 DB 中有 2 行具有相同的名称值和不同的描述

DAC -

[System.SerializableAttribute()]
[PXPrimaryGraph(typeof(TestCategoryMaint))]
public class TestCategory : PX.Data.IBqlTable
{

    #region TestCategoryID
    public abstract class testCategoryID : PX.Data.BQL.BqlInt.Field<testCategoryID>
{
    }
    protected int? _TestCategoryID;
    [PXDBIdentity()]
    [LicenseExpiration]
[PXReferentialIntegrityCheck]

public virtual int? TestCategoryID
    {
        get
        {
            return this._TestCategoryID;
        }
        set
        {
            this._TestCategoryID = value;
        }
    }
    #endregion

    #region Name
    public abstract class name : PX.Data.IBqlField
    {
    }
    protected string _Name;
    [PXDBString(50, IsKey = true, IsUnicode = true, InputMask = "")]
    [PXDefault()]        
    [PXUIField(DisplayName = "Test Category")]
    [PXCheckUnique(typeof(name))]
    public virtual string Name
    {
        get
        {
            return this._Name;
        }
        set
        {
            this._Name = value;
        }
    }
    #endregion

    #region Description
    public abstract class description : PX.Data.IBqlField
    {
    }
    protected string _Description;
    [PXDBString(255,IsUnicode =true)]
    [PXUIField(DisplayName = "Description")]
    public virtual string Description
    {
        get
        {
            return this._Description;
        }
        set
        {
            this._Description = value;
        }
    }
#endregion

【问题讨论】:

  • 如果您想要唯一的值,您是否考虑将 IsKey 添加到您的 DAC 字段?听起来您的字段是某种类型的主键
  • Iskey 被添加到引用表中使用的标识列中,而名称是 CD 字段
  • 您可以在 CD 字段上使用 IsKey,并且在其他表中仍然使用标识(无键)列作为参考。 SQL 表键可以与 DAC 键不同,这很好。
  • Dmitry,是的,名称是用 ISKey true 分配的,但仍然使用列表视图,我们可以重现具有相同名称的 2 行,方法是使用与其他行相同的名称更新现有行,然后它在 UI 上显示具有相同值的两行。

标签: unique acumatica


【解决方案1】:

如果没有您尝试的任何代码示例,很难确保答案适合您的问题,但我会尝试在广泛的范围内回答。

在上面的 cmets 的基础上,identify 字段之所以如此特别,是因为它在数据库中被定义为 identity。 DAC 中的相应字段应标记为 PXDBIdentity。在 Acumatica 中,这通常被定义为身份“ID”字段。您显示的应保持唯一的字段往往是代码“CD”字段。

下面的示例显示了如何设置对,并包含常用属性。在此示例中,CD 字段是自动编号的,但并非必须如此。字段本身上的 PXSelector 有助于将其作为唯一值维护,因为它允许您从现有值中进行选择、输入新值或检索键入的值。实际唯一性由标记为 IsKey = true 的所有字段的组合控制。

// This is the Identity field in the database (Use PXDBIdentity)
#region RequisitionID
[PXDBIdentity]
public virtual int? RequisitionID { get; set; }
public abstract class requisitionID
    : PX.Data.BQL.BqlInt.Field<requisitionID> { }
#endregion

// This is the user friendly Code (CD) to be unique (IsKey = true)
#region RequisitionCD
[PXDBString(30, IsKey = true, IsUnicode = true, InputMask = "")]
[PXDefault]
[AutoNumber(typeof(SSRQSetup.requisitionNumberingID),
    typeof(AccessInfo.businessDate))]
[PXSelector(
    typeof(SSRQRequisition.requisitionCD),
    typeof(SSRQRequisition.requisitionCD),
    typeof(SSRQRequisition.descr)
    )]
[PXUIField(DisplayName = Messages.FldRequisitionCD)]
public virtual string RequisitionCD { get; set; }
public abstract class requisitionCD
    : PX.Data.BQL.BqlString.Field<requisitionCD> { }

同样,您可以参考这个组合,以便在与用户交互时使用唯一的 CD 字段,但 ID 值存储在记录中。这是使用 ID 字段在用于规范化数据库的所有表之间共享的最佳实践,并允许更改显示的 (CD) 值,而无需更新可能的数十个其他表。这意味着任何唯一的对象(项目、供应商、客户等)都将保存在其自己的记录中,其中 IsKey 值唯一地标识了确切的对象。如果您需要您的特定表将该值保持为 the 唯一性,那么它将是唯一标记为 IsKey = true 的字段,然后标识字段将用于其他表引用此数据。

要在其他表中使用此键数据,您将存储 ID 字段值,但使用 PXSelector 将 CD 值呈现给用户。这允许在数据库中的相关表中存储一个非常有效的数值,而不是一个可能是几个字符或数千个字符的值(在极端情况下)。

#region RequisitionID
[PXDBInt]
[PXSelector(
    typeof(SSRQRequisition.requisitionID),
    typeof(SSRQRequisition.requisitionCD),
    typeof(SSRQRequisition.descr),
    SubstituteKey = typeof(SSRQRequisition.requisitionCD)
    )]
[PXUIField(DisplayName = Messages.FldRequisitionID)]
public virtual int? RequisitionID { get; set; }
public abstract class requisitionID
    : PX.Data.BQL.BqlInt.Field<requisitionID> { }
#endregion

了解 IsKey 的使用将根据您指定的每个字段驱动唯一性非常重要。 IsKey 只会确保所有标有 IsKey = true 的字段组合的唯一性。 PXSelector 似乎确保字段本身保持唯一性,并且 SubstituteKey 指定的字段在用作选择器时将检索具有您输入的值的记录。我仅在 ID 与 CD 的情况下使用它,但如果您有一些超出此答案范围的用例,您可以尝试使用 PXSelector 和 IsKey。

【讨论】:

  • HI,列用 IsKey = True 标记为 Name,我的视图是 ListView,有 2 个字段 Name 和 Description,其中 Name 具有 IsKey =True,另一个列 ID 具有 DBIdentity 属性。所以我认为DAC,UI添加行为一切正常 - 添加现有值时,它会使用新添加的值描述更新旧行,因为名称相同。更新行为 - 将名称列更改为与其他相同的值,然后它允许有 2 行具有相同的键,但两行在 UI 上显示相同的描述,但在 DB 中有 2 行具有相同的名称值和不同的描述。
  • 请更新您的问题,为您的 DAC 提供代码。任何未标记 IsKey = true 或标记为身份或使用 PXParent 的字段都可以省略。
【解决方案2】:

以下代码将帮助您仅添加唯一值,当您尝试添加重复值时,会引发错误。

[PXCheckUniqueCustomError("Order already exists with Customer Order Nbr {0} and External Ref.Nbr {1}", typeof(SOOrder.customerOrderNbr), typeof(SOOrder.customerRefNbr),  
Where = typeof(Where2<Where<SOOrder.orderType, Equal<Current<SOOrder.orderType>>,
    And<SOOrder.customerOrderNbr, Equal<Current<SOOrder.customerOrderNbr>>,
        And<SOOrder.customerRefNbr, Equal<Current<SOOrder.customerRefNbr>>>>>,
And<SOOrder.status, NotEqual<SOOrderStatus.cancelled>>>))]

【讨论】:

    猜你喜欢
    • 2016-12-12
    • 2020-04-10
    • 2014-04-15
    • 1970-01-01
    • 2023-02-03
    • 2018-09-24
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多