2017-04-05 16 views
0

私はINReceiptEntryに拡張グラフを持っています。カスタムDACのビューをセットアップして、キャッシュを生成してオブジェクトを挿入するようにしました。キャッシュに挿入するオブジェクトの1つを生成した後、ViewName.Insert(Object)を使用します。 (同じ結果を持つViewName.Cache.Insert(Object)も使用します)をグラフ拡張のRowPersistingハンドラ内で使用します。これは、通常、データ項目をDACに対応するデータベースデータテーブルに格納するが、DBには何も格納されない。代わりにifステートメントが発生し、オブジェクトが挿入されていないことを示すポップアップが表示されます。ここに私のコード:データベースに保存されていないグラフエクステンションのキャッシュに挿入されたレコード

public class INReceiptEntry_Extension : PXGraphExtension<INReceiptEntry> 
{ 
    public PXSelect<EMPWorkOrderINRegister> WorkOrderINRegisters; 

    #region Event Handlers 

    protected void INRegister_RowPersisting(PXCache cache, PXRowPersistingEventArgs e) 
    { 
     var row = (INRegister)e.Row; 

     var rowExt = PXCache<INRegister>.GetExtension<INRegisterExt>(row); 

     //Get Target Objects 
     foreach (INTranSplit split in PXSelect<INTranSplit, Where<INTranSplit.refNbr, 
      Equal<Required<INRegister.refNbr>>, And<INTranSplit.tranType, Equal<TranType>>>> 
      .Select(Base, Base.CurrentDocument.Current.RefNbr)) 
     { 
      EMPWorkOrderINRegister WOINR = new EMPWorkOrderINRegister(); 
      WOINR.Woid = rowExt.Usrwoid; 
      WOINR.RefNbr = split.RefNbr; 
      WOINR.SplitLineNbr = split.SplitLineNbr; 
      if (WorkOrderINRegisters.Insert(WOINR) == null) 
      { 
       Base.CurrentDocument.Ask("Did not insert WOINR:" + WOINR.RefNbr.ToString() + ", " + WOINR.SplitLineNbr.ToString(), MessageButtons.OK); 
       return; 
      } 
     } 
    } 
    #endregion 
} 

これはカスタムキャッシュに挿入されていない何か?グラフ拡張を使用するか、Persisting関数でこのキャッシュ挿入を実行するのは、なぜこれが失敗するのかと関係がありますか?リクエストにより、

、DAC:

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

namespace Manufacturing 
{ 
[Serializable] 
public class EMPWorkOrderINRegister : IBqlTable 
    { 


    #region Id 

    [PXDBIdentity()] 
    [PXUIField(DisplayName = "Id")] 
    public int? Id { get; set; } 

    public class id : IBqlField { } 

    #endregion 


    #region Woid 

    [PXDBInt()] 
    [PXUIField(DisplayName = "Woid")] 
    public int? Woid { get; set; } 

    public class woid : IBqlField { } 

    #endregion 


    #region RefNbr 

    [PXDBString(15, IsUnicode = true, InputMask = "")] 
    [PXUIField(DisplayName = "Receipt Number")] 
    public string RefNbr { get; set; } 

    public class refNbr : IBqlField { } 

    #endregion 

    #region SplitLineNbr 

    [PXDBInt()] 
    [PXUIField(DisplayName = "Split Line Nbr")] 
    public int? SplitLineNbr { get; set; } 

    public class splitLineNbr : IBqlField { } 

    #endregion 

    #region AvailableSNs 
    [PXString()] 
    [PXUIField(DisplayName = "Available SNs")] 
    public string AvailableSNs { get; set; } 

    public class availableSNs : IBqlField { } 
    #endregion 


    [PXString()] 
    [PXDBScalar(typeof(Search<INTranSplit.lotSerialNbr, Where<INTranSplit.refNbr, Equal<EMPWorkOrderINRegister.refNbr>, 
     And<INTranSplit.splitLineNbr, Equal<EMPWorkOrderINRegister.splitLineNbr>>>>))] 
    public string SelectedSN { get; set; } 
    public class selectedSN : IBqlField { } 

    } 
} 
+0

DACのキーをチェックしましたか?また、フィールドが 'PXDB'属性で装飾されているかどうか?ここでDACのコードを投稿できますか? – Hybridzz

+0

私はDACコードを追加しました。 –

+0

[PXDBIdentity(IsKey = true)]を@RuslanDevとして設定しようとしました。 – Hybridzz

答えて

2

エリックは、キーフィールドの欠如であるあなたのDAC、と一つの大きな問題があります。

INRegister_RowPersistingハンドラの追加の改善領域。 RowPersistingハンドラは、データレコードがデータベースにコミットされる前にデータレコードを検証するか、特定のデータレコードのコミット操作をキャンセルするように設計されています。詳細は、Acumatica Framework API Reference

を参照してください。Persistメソッドをオーバーライドして、欠落しているEMPWorkOrderINRegisterレコードを挿入してから、Persistメソッドを実行してください。また、try-catchステートメントを使用し、基本Persistメソッドが失敗した場合は、InsertedステータスのEMPWorkOrderINRegisterレコードを削除することをお勧めします。

+0

ルスラン、PXDBIdentityフィールドはキーとして機能しますか?どのように私は "Persist"関数をオーバーライドするのですか? Acumaticaに組み込まれているカスタマイズUIで、その関数のオーバーライドを生成するオプションは表示されません。また、ヘルプ(特にAPIリファレンス - >イベントモデル - >イベント)も表示されませんでした。投稿後、Row Persistingに入れるのは良い選択ではないので、私は他の場所に配置しようとしていますが、動作させるのは難しいと思います。 –

+0

PXDBIdentityフィールドは、PXDBIdentityAttributeの*​​ IsKey **プロパティが「True」に設定されている場合にのみ、キーフィールドになります。それ以外の場合、システムはPXDBIdentityフィールドを通常の非キーフィールドのように扱います。上書きされたPersistメソッドの例については、T300トレーニングコースの**ステップ7.4:Persistメソッドのオーバーライド**を確認してください。 Acumatica Customization Guide(http://help.acumatica.com/wiki/ShowWiki.aspx?pageid=6fa2a444-17b4-42f9-9e6a-64e85167626a)のVirtual Method **トピックを上書きすることも検討する価値があります – RuslanDev

+0

それだった! Ruslanにもう一度感謝します。私は他のDACに戻って、PXDBIdentityフィールドでIsKeyを使用していることに気付きました。なぜ、このフィールドに置くのを忘れていたのか分かりません。 –

関連する問題