Acumatica - 复合主键

Acumatica - Composite primary key

有master-child table并且主记录在OrderNbr和RevisionNbr上有组合键, 在 UI 我们想为两个字段都显示选择器 订单号选择器的 OrderNbr 和最大修订号 基于所选订单号的修订号选择器 UI。

也在 UI 我们有创建新修订的功能,我们如何通过代码创建修订,当我为两个字段定义 IsKey= true 并尝试时,我收到多部分查询错误保存数据

Graph.primaryView.Insert()
ForEach(UIRow){
      Graph.ChildView.Insert
}
Graph.Persist();

注意 MAster table 在 SQL 服务器中有 Identity 列有 Key

更新- Parent Table DAC -

#region TestSuiteID
public abstract class testSuiteID:PX.Data.IBqlField {
}
protected int? _TestSuiteID;
[PXDBIdentity()]
public virtual int? TestSuiteID {
  get {
    return this._TestSuiteID;
  }
  set {
    this._TestSuiteID = value;
  }
}
#endregion
#region TestSuiteCD
public abstract class testSuiteCD:PX.Data.IBqlField {
}
protected string _TestSuiteCD;
[PXDBString(50, IsKey = true, IsUnicode = true, InputMask = ">CCCCCCCCCCCCCCC")]
[PXDefault()]
[PXUIField(DisplayName = "Test Group ID")]
[PXSelector(typeof(EWQCTestSuite.testSuiteCD), typeof(EWQCTestSuite.testSuiteCD), typeof(EWQCTestSuite.revisionNo), typeof(EWQCTestSuite.name))]
public virtual string TestSuiteCD {
  get {
    return this._TestSuiteCD;
  }
  set {
    this._TestSuiteCD = value;
  }
}
#endregion
#region RevisionNo
public abstract class revisionNo:PX.Data.IBqlField {
}
protected int? _RevisionNo;
[PXDBInt(IsKey=true)]
[PXDefault(1)]
[PXUIField(DisplayName = "Revision No")]
public virtual int? RevisionNo {
  get {
    return this._RevisionNo;
  }
  set {
    this._RevisionNo = value;
  }
}
#endregion

Child Table Dac -

#region TestSuiteVariableID
public abstract class testSuiteVariableID:PX.Data.IBqlField {
}


protected int? _TestSuiteVariableID;
[PXDBIdentity(IsKey = true)]
public virtual int? TestSuiteVariableID {
  get {
    return this._TestSuiteVariableID;
  }
  set {
    this._TestSuiteVariableID = value;
  }
}
#endregion

#region TestSuiteID
public abstract class testSuiteID:PX.Data.IBqlField {
}
protected int? _TestSuiteID;
[PXDBInt()]
[PXDBDefault(typeof(EWQCTestSuite.testSuiteID))]
[PXParent(typeof(Select<EWQCTestSuite, Where<EWQCTestSuite.testSuiteID, Equal<Current<EWQCTestSuite.testSuiteID>>>>))]
public virtual int? TestSuiteID {
  get {
    return this._TestSuiteID;
  }
  set {
    this._TestSuiteID = value;
  }
}
#endregion

注意 - Child table 没有 MAster 选项卡 CD 和修订号列,因为我添加了标识列 fr 参考并且 PXParent 带有标识列。 两个Dac还有其他的字段我这里没有添加。

我面临的其他问题是当我删除记录时出现主键引用错误(默认删除主数据视图上的 acumatica 删除按钮)

多部分查询错误通常与在执行时解析为多个父级的主从(父子)查询有关。子 DAC 应该有一个 PXParent 属性,其中包括所有关键字段上的 where 子句。

[PXParent(typeof(Select<Master,
                 Where<Master.key1, Equal<Current<Child.key1>>,
                 And<Master.key2, Equal<Current<Child.key2>>>>>>))]

您应该确保 DAC 中的所有 BQL 查询和具有此类关系的图形都包含一个 where 过滤器或所有键上的 on join 子句。还要确保 DAC 中的所有关键字段都具有 IsKey=true 并且匹配的数据库字段创建为数据库中的关键字段。

对于复合键 ..不要使用 PXGraph,而是使用 PXRevisionableGraph。 该图是制造模块的一部分,支持复合键。 您的所有密钥都应使用 AcctSubAttribute

继承的属性进行修饰