2017-06-30 14 views
1

グリッドコントロールでテーブルバッファを使用して、フォームのtempDBに初めて追加されたリアルタイムで(しかし、永続的であり、その後の追加はその後もうまくいった)。Dynamics AX 2012 - Grid Control linkPhysicalTableInstance to TempTable、最初に挿入されたレコードがグリッドに表示されない、後で正常に表示

ダイナミックコミュニティMSDNのDAX伝説のMartinDrábとBrandon Weiseの助けを借りて問題を解決しましたが、私は他人を助ける場合にはSOに投稿しています。 Dynamics AXのコンテンツをSOに追加することにコミュニティが傷つくと思います。また、物理テーブルがtempDBにどのようにリンクし、フォームのデータソースとの関係についていくつかの学習があります。

オリジナルスレッド:https://community.dynamics.com/ax/f/33/t/225120

問題:

  • 私は、Grid Controlを含む、実行時に新しいフォームを生成ウィザードを持っています。
  • ウィザードはtempテーブルの1つへの参照をフォームに渡します。このテーブルでは、ランタイムフォームのデータソースinit()メソッドでlinkPhysicalTableInstanceを使用します。
  • GridControlには、レコードをtmpテーブル参照に挿入する新しいレコードボタンが追加されています。
  • 新しいレコードが正しく参照一時テーブルに保存され、グリッドに表示ランタイムフォームが閉じているときとをリニューアルオープンしたが、すぐに挿入した後、グリッド内のない表示をしています。
  • ランタイムフォームが作成された後、レコードが挿入されて閉じられると、後続のランタイムフォームは、再オープンする必要なく、すぐに新しいレコードの挿入を表示します。いくつかのコードスニペット。

なぜこの動作は、データが一時テーブルに挿入されるのは初めてですが、その後の実行時フォームの実行では正常に表示されるのはなぜですか?

 args     = new Args(formstr(RunTimeFormName)); 
     formRun    = classFactory.formRunClass(args); 
     formRun    .parmRuntimeFormsGridTmpDS(sysWizard.ReferenceToWizardsTableTmp()); // Passing a reference for Wizards tmpTable to form 
     formRun    .init(); 
     formRun    .run(); 
     formRun    .wait(); 
     formRun    .detach(); 

ランタイムフォームのparmDataSourceMethod:上記のように、最初の時間を

void clicked() 
{ 
    int64            numRows; 
    ; 
    // Refresh records loaded in grid DS to ensure correct number of records for setting initial index number 
// Note: SomeId is passed in Args() record, its passing fine as is the number of rows count - and replacing with a static value has no effect. 

    select count(RecId) from ReferenceToWizardsTableTmp 
     where ReferenceToWizardsTableTmp.SomeId == someId; 
    numRows           = ReferenceToWizardsTableTmp.RecId; 
    ReferenceToWizardsTableTmp.Comment     = "Comment " + int642str(numRows + 1); 
    ReferenceToWizardsTableTmp.Filename     = ""; 
    ReferenceToWizardsTableTmp.someId     = someId; 
    ReferenceToWizardsTableTmp.insert(); 

    element           .Task(#TaskF5); 
// super(); 
} 

public void parmRuntimeFormsGridTmpDS(CommentsGridTmp _ReferenceToWizardsTableTmp) 
{ 
    ReferenceToWizardsTableTmp = _ReferenceToWizardsTableTmp; 
} 
DataSource init() method: 
public void init() 
{ 
    super(); 
    RuntimeFormsGridTmpDS.linkPhysicalTableInstance(ReferenceToWizardsTableTmp); 
} 

ランタイムフォームの新規作成]ボタンは、メソッドをクリックし、実行時のフォームの作成

実行時フォームが作成され、レコードが挿入されても表示されません。フォームを再度開くと、挿入されたデータが正常に表示されます。また、フォームを再度開いた後、挿入された新しいレコードがリアルタイムでグリッドに表示されます。 私は元々linkToPhysicalTableと何か関係があり、グリッドフィールドで表示するレコードを探す必要があると想定していました...

ちなみに、より良い回答や説明があれば、気軽に投稿してください。私は初期化するように作用する前にlinkPhysicalTableInstance動作にバッファの参照(delete_from tmptable文が同じ効果を持っており、安価である)、上のSELECT文を実行することにより、私は実用的なソリューションを持っている

答えて

1

ソリューション

それが空であるにもかかわらずバッファ参照。

バッファが適切に存在するため、linkPhysicalTableInstance操作は最初の実行で成功し、フォームDSに書き込まれた変更は永続的になり、呼び出し側ウィザードのバッファ参照に反映されます。追加で

(ブランドンワイズから):

あなたのコード内の階層をジャンプすることが起こる場合は、ここに注意する小さな落とし穴があります。私は調査

のための有用であることが分かっ https://community.dynamics.com/ax/b/dynamicsaxexperience/archive/2016/01/24/2012-unexpected-degeneration-of-insert-recordset-into-tempdb-buffer

技術(これらのためのブランドン・ワイズとMartin単調にクレジット)

  1. .linkPhysicalTableInstance(..)を使用して変更することを思えん が既に初期化された後のフォームデータソースに関連付けられた基礎となる一時テーブルは、何らかの奇妙な動作を引き起こします。 .getPhysicalTableName() が正しくリンクされていることを示すことができる場合でも、これは に該当します。

    フォームを作成し、 を呼び出すには.init()を呼び出しますが、まだ.run()は呼び出さない方法があります。次に、 .linkPhysicalTableInstance()を使用して、新しく作成したテンポラリテーブル をデータソースの基礎となる外部の一時テーブルバッファにリンクします。 他の言葉では、既に作成した 一時テーブルをフォームのデータソースに移植するのではなく、フォームにtemp テーブルを作成させてから、呼び出し元がその一時テーブルを.linkPhysicalTableInstance()を使用して バッファに移植させます。次にレコードを挿入し、 を呼び出し、次に.run()を呼び出します。必要に応じて、.run()の後に データソースの形式で.executeQuery()を呼び出します。

    私は初期化と操作を通じて テーブル名を印刷するscattergun的なアプローチを取って、 ながら、2つの表は、最終的に、彼らはそこに得るための回り道を取る、同じテーブル 名前で正しくリンクします。

    デバッグ、SQL Server Management Studioを使用してからながら
  2. は、一時テーブルの内容を点検:

    セットトランザクション分離レベルは、コミットされていない読んで。

    select * from tempdb..t107946_BE044A13A9C24283897CA1B59607CBD2;

    テーブル名が .getPhysicalTableName()ですが、正確にわからなくても少し試行錯誤するだけで簡単に見つけることができます。 tempdb.sys.tablesの* を選択します。テーブルはもちろん "t"で始まり、 テーブル番号から始まります。しばしばそれは最近作成されたものなので、 create_dateでソートすると、それはトップに浮かれますが、もちろん のプールもあります。

  3. Methods on a Form Data Sourceデータソースを通じてレコードを操作するときに使用できる方法を確認してください。

関連する問題