Axapta Dynamics AX 2012-网格控件将PhysicalTableInstance链接到可诱惑的,插入的第一条记录不会出现在网格中,随后会很好

Axapta Dynamics AX 2012-网格控件将PhysicalTableInstance链接到可诱惑的,插入的第一条记录不会出现在网格中,随后会很好,axapta,dynamics-ax-2012,Axapta,Dynamics Ax 2012,该问题与在AX 2012中使用表格缓冲区和网格控件有关,第一次添加到表单tempDB的内容不会实时显示,而是持久性的,随后的添加工作正常 在DAX传奇人物Martin Dráb和Brandon Weise的帮助下,我在Dynamics社区MSDN上解决了这个问题,但我在上面发布了这样的帖子,以防它帮助了其他人,因为我找不到任何接近的内容,我不认为在上面添加更多Dynamics AX内容会伤害社区。还有一些关于物理表如何链接到tempdb以及它们与表单数据源的关系的知识 原始线程: 问题: 我有一

该问题与在AX 2012中使用表格缓冲区和网格控件有关,第一次添加到表单tempDB的内容不会实时显示,而是持久性的,随后的添加工作正常

在DAX传奇人物Martin Dráb和Brandon Weise的帮助下,我在Dynamics社区MSDN上解决了这个问题,但我在上面发布了这样的帖子,以防它帮助了其他人,因为我找不到任何接近的内容,我不认为在上面添加更多Dynamics AX内容会伤害社区。还有一些关于物理表如何链接到tempdb以及它们与表单数据源的关系的知识

原始线程:

问题:

我有一个向导,它在运行时生成一个新表单,其中包含一个网格控件。 向导将对其一个临时表的引用传递给窗体,在该窗体中,我在运行时窗体的datasource init方法中使用linkPhysicalTableInstance。 GridControl有一个AddNewRecord按钮,它将记录插入到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:

public void parmRuntimeFormsGridTmpDS(CommentsGridTmp _ReferenceToWizardsTableTmp)
{
    ReferenceToWizardsTableTmp = _ReferenceToWizardsTableTmp;
}
DataSource init() method:
public void init()
{
    super();
    RuntimeFormsGridTmpDS.linkPhysicalTableInstance(ReferenceToWizardsTableTmp);
}
运行时窗体的新按钮单击方法:

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();
}
如上所述,第一次创建运行时表单并插入记录时,它不会显示。重新打开表单将显示插入的数据。此外,重新打开表单后,插入的任何新记录都会实时显示在网格中。 我最初认为这与linkToPhysicalTable有关,网格字段在其中查找要显示的记录

顺便说一下,如果您有更好的答案或解释,请随时提供。

解决方案

我有一个可行的解决方案,在执行linkPhysicalTableInstance操作之前,我在缓冲区引用上运行select语句。一个delete_from tmptable语句具有相同的效果,而且更便宜,它可以在缓冲区引用为空的情况下初始化缓冲区引用

linkPhysicalTableInstance操作在第一次运行时成功,因为缓冲区正确存在,写入表单DS的更改现在是持久的,并反映在调用向导的缓冲区引用中

除Brandon Weise外:

如果您碰巧在代码中跳层,这里有一个小问题需要注意。

我发现对调查有用的技术

这要归功于布兰登·韦斯和马丁·德拉布

似乎使用.linkPhysicalTableInstance。。更改与表单数据源关联的基础临时表的步骤 已经初始化,会产生一些奇怪的行为。这似乎是 即使可以使用.getPhysicalTableName进行演示,也应为true 它们是正确连接的

有一种技术可以帮助您创建表单,并且 调用.init,但尚未调用。运行。然后使用 .linkPhysicalTableInstance链接新创建的临时表 将数据源作为外部临时表缓冲区的基础。在里面 换句话说,不要试图移植你已经创造出来的 将临时表放入窗体的数据源中,让窗体创建临时表 表,然后让调用方将该临时表移植到自己的临时表中 缓冲区使用.linkPhysicalTableInstance。然后插入记录, 然后打电话,跑。如有必要,在表单上调用.executeQuery 之后的数据源。运行

我采取了漫无目的的印刷方法 在整个初始化和操作过程中,以及 这两个表最终确实与同一个表正确链接 名字,他们绕道去那里

在调试时,使用以下命令从SQL Server Management Studio检查临时表的内容:

将事务隔离级别设置为“读取未提交”

从tempdb..t107946_BE044A13A9C24283897CA1B59607CBD2中选择*

如果表名来自 .getPhysicalTableName,但即使您不确切知道, 只要稍加尝试,就很容易找到它。挑选* 来自tempdb.sys.tables;当然,表格将以t和开始 桌子号码。通常它是最近创建的,所以 按create_date desc排序会将其浮动到顶部,当然 可能会有很多

检查工作时可以使用的方法 通过数据源与记录进行交互