2017-07-03 12 views
1

Acumatica Frameworkを使用してグラフを作成していますが、データベースの変更を保存しようとしていますが、保存時にエラーが表示されます。親子を保存する

私は典型的な親子関係(マスター/詳細)の関係を持ち、すべてを正しく設定する必要があります。

子どもDACはPXDBDefaultとPXParentエントリを有する:ヘッダで

 [PXDBInt()] 
     [PXDBDefault(typeof(DCRuleHeader.ruleHeaderID))] 
     [PXParent(typeof(Select<DCRuleHeader, Where<DCRuleHeader.ruleHeaderID, Equal<Current<DCRule.ruleHeaderID>>>>))] 
     public virtual int? RuleHeaderID 
     { 
      get 
      { 
       return this._RuleHeaderID; 
      } 
      set 
      { 
       this._RuleHeaderID = value; 
      } 
     } 

、IDは、データベース内の同一であり、次のようにDACにキーとして定義:

[PXDBIdentity(IsKey = true)] 
    [PXUIField(Enabled = false)] 
    public virtual int? RuleHeaderID 
    { 
     get 
     { 
      return this._RuleHeaderID; 
     } 
     set 
     { 
      this._RuleHeaderID = value; 
     } 
    } 

表示もそれに応じて構成されている:

public class RulesMaint : PXGraph<RulesMaint, DCRuleHeader> 
    { 

     public PXSelect<DCRuleHeader> RuleHeader; 
     public PXSelect<DCRule, Where<DCRule.ruleHeaderID, Equal<Current<DCRuleHeader.ruleHeaderID>>>> Rules; 
     public PXAction<DCRuleHeader> ViewRule; 

しかし、以下のコードはworkiありません私は上記をしようとするとNG

RulesMaint rulesGraph = PXGraph.CreateInstance<RulesMaint>(); 
DCRuleHeader newHeader = rulesGraph.RuleHeader.Insert(); 
... 
DCRule rule = rulesGraph.Rules.Insert(); 
... 
rulesGraph.Actions.PressSave(); 

は、私はエラー

は、フレームワークは、すべて自分自身を処理し、自動的に子オブジェクトの親IDを設定しない「エラーが空にすることはできません 『RuleHeaderID』」取得しますか?それはPXDBDefaultの目的ではありませんか?

+0

をダウンロードすることができ、完全なカスタマイズは、あなたがこの質問でそれを追加することを忘れていますか? –

+0

また、PXDBIdentityをヘッダのPXDBInt(IsKey = true)で置き換えて、DCRuleにIsKey = trueを追加してみてください。PXDBInt –

+0

ご意見ありがとうございます。インスタンスを渡していないのは、デフォルト値を挿入するだけだからです。インスタンスも渡してみましたが、同じエラーです。 –

答えて

2

Acumatica ERPでフォームの詳細ビューで親子DACを操作する方法の例を次に示します。 親::のは、以下の方法で親と子のためのSQLテーブル作成してみましょう物乞いのために

/****** Object: Table [dbo].[SOCustomParentTable] Script Date: 07/03/2017 12:55:17 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[SOCustomParentTable](
    [CompanyID] [int] NOT NULL, 
    [ParentID] [int] IDENTITY(1,1) NOT NULL, 
    [Description] [nvarchar](255) NULL, 
    [SomeOtherField] [nvarchar](50) NULL, 
    [ParentCD] [nvarchar](15) NOT NULL 
) ON [PRIMARY] 

GO 

と子

/****** Object: Table [dbo].[SOCustomChildTable] Script Date: 07/03/2017 12:54:39 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[SOCustomChildTable](
    [CompanyID] [int] NOT NULL, 
    [ChildID] [int] IDENTITY(1,1) NOT NULL, 
    [ParentID] [int] NOT NULL, 
    [Description] [nvarchar](255) NULL, 
    [SomeOtherField] [nvarchar](50) NULL 
) ON [PRIMARY] 

GO 

は今、私たちはSQLテーブルの準備ができているとのは、以下のようDAC年代を作成してみましょうクラス:

親:

using System; 
using PX.Data; 

namespace DemoParentChild 
{ 
    [Serializable] 
    public class SOCustomParentTable: IBqlTable 
    { 


    #region ParentID 

    [PXDBIdentity()] 
    public int? ParentID { get; set; } 

    public class parentID : IBqlField{} 

    #endregion 


    #region Description 

    [PXDBString(255, IsUnicode = true, InputMask = "")] 
    [PXUIField(DisplayName = "Description")] 
    public string Description { get; set; } 

    public class description : IBqlField{} 

    #endregion 


    #region SomeOtherField 

    [PXDBString(50, IsUnicode = true, InputMask = "")] 
    [PXUIField(DisplayName = "Some Other Field")] 
    public string SomeOtherField { get; set; } 

    public class someOtherField : IBqlField{} 

    #endregion 


    #region ParentCD 

    [PXDBString(15,IsKey = true, IsUnicode = true, InputMask = "")] 
    [PXUIField(DisplayName = "Parent ID")] 
    public string ParentCD { get; set; } 

    public class parentCD : IBqlField{} 

    #endregion 

    } 
} 

と子:

using System; 
using PX.Data; 

namespace DemoParentChild 
{ 
    [Serializable] 
    public class SOCustomChildTable: IBqlTable 
    { 


    #region ChildID 

    [PXDBIdentity(IsKey=true)] 
    public int? ChildID { get; set; } 

    public class childID : IBqlField{} 

    #endregion 


    #region ParentID 

    [PXDBInt()] 
    [PXDBDefault(typeof(SOCustomParentTable.parentID))] 
    [PXParent(typeof(Select<SOCustomParentTable, Where<SOCustomParentTable.parentID, Equal<Current<SOCustomChildTable.parentID>>>>))] 
    public int? ParentID { get; set; } 

    public class parentID : IBqlField{} 

    #endregion 


    #region Description 

    [PXDBString(255, IsUnicode = true, InputMask = "")] 
    [PXUIField(DisplayName = "Description")] 
    public string Description { get; set; } 

    public class description : IBqlField{} 

    #endregion 


    #region SomeOtherField 

    [PXDBString(50, IsUnicode = true, InputMask = "")] 
    [PXUIField(DisplayName = "Some Other Field")] 
    public string SomeOtherField { get; set; } 

    public class someOtherField : IBqlField{} 

    #endregion 

    } 
} 

とのは、以下のグラフでFormDetailタイプのページを作成してみましょう私たちの仕事を終了する:

using System; 
using PX.Data; 

namespace DemoParentChild 
{ 
    public class tmp : PXGraph<tmp> 
    { 

    public PXSave<SOCustomParentTable> Save; 
    public PXCancel<SOCustomParentTable> Cancel; 
    public PXPrevious<SOCustomParentTable> Prev; 
    public PXNext<SOCustomParentTable> Next; 


    public PXSelect<SOCustomParentTable> MasterView; 
    public PXSelect<SOCustomChildTable,Where<SOCustomChildTable.parentID,Equal<Current<SOCustomParentTable.parentID>>>> DetailsView; 

    } 
} 

それでは、このすべてが動作しているかを理解しましょう。 ParentIDはSQLのIdentityで、DACのPXDBIdentityに設定されていますが、ParentCDを目に見えるKeyとして使用するため、DACのKeyとして設定されていません。 Childクラスでは、ChildIDはPXDBIdentityに設定されていますが、ユーザーに表示可能なキーを表示する必要はないため、Keyに設定されています。 は、子クラスで、私たちは親/子関係を作成するために、次のいる:

PXDefaultは、現在の親のIDに子供のParendIDを設定しているとPXParentは、現在の子と親との関係を作成している
[PXDBInt()] 
[PXDBDefault(typeof(SOCustomParentTable.parentID))] 
[PXParent(typeof(Select<SOCustomParentTable, Where<SOCustomParentTable.parentID, Equal<Current<SOCustomChildTable.parentID>>>>))] 
public int? ParentID { get; set; } 

一般的に、チャイルドのカウントを知るために、親の子カウンタとラインカウンタの行番号が作成されています。

あなたが挿入するようにインスタンスを提供していないあなた挿入コードでhere

+0

グレートポスト。言及しなければならないことの1つは、親からの自動生成されたキーフィールドから子値が設定されている場合、PXDBDefaultとPXDefaultの使用です。たとえばSOLine.OrderNbrを見てください。 – Brendan

+0

@ブレンダンええ、あなたは正しいです。私は答えを更新しました –

関連する問題