You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dynamics 365 F&O中InMemory表作窗体数据源无数据显示问题

问题描述

从外部服务获取数据并插入InMemory临时表Table_movieTemp,将该表作为窗体Form_MovieSearch的数据源。按钮点击事件代码如下:

[FormControlEventHandler(formControlStr(Form_MovieSearch, FormCommandButtonControl1), FormControlEventType::Clicked)]
public static void FormCommandButtonControl1_OnClicked(FormControl sender, FormControlEventArgs e)
{
    FormDataSource Form_MovieSearch_ds = formRun.dataSource();
    System.Collections.IEnumerable  data =  ClassLibrary1.Program::CallRestService();
    var enumerator = data.getEnumerator();

    while(enumerator.moveNext())
    {
        MovieRentalService.TmdbMovie item = enumerator.get_current();
        Table_movieTemp.Description = item.Description;
        Table_movieTemp.ReleaseDate = today();
        Table_movieTemp.Title = item.Title;
        Table_movieTemp.Rating = item.Rating;
        Table_movieTemp.existsAlready = Table_Movie::exist(item.Title);
        insertList.add(movieTemp);
    }
    ttsbegin;
    insertList.insertDatabase();
    ttscommit;

    while select Table_movieTemp
    {
        info(strFmt("Name: %1,", Table_movieTemp.Title));
    }
}

已通过while select验证数据插入临时表成功,调用窗体数据源的executeQuery()方法:

FM_MovieSearch_ds.executeQuery();

但窗体仍无数据显示。尝试通过传递临时表缓冲区并调用setTmpData解决,调用代码:

formRun.BindTable(movieTemp);

窗体中的BindTable方法实现:

public void BindTable(FM_MovieTemp _movieTempBuffer)
{
    _movieTempBuffer.setTmpData(_movieTempBuffer);
}

代码可编译且无运行时错误,但窗体依旧无法显示数据,需排查问题所在。

问题排查与修复

1. 临时表缓冲区变量不一致

代码中存在变量名混乱:循环内赋值的是Table_movieTemp,但添加到insertList的是movieTemp,后续传递给BindTable的也是movieTemp,三者并非同一实例;同时循环内未创建新的缓冲区,会导致所有数据覆盖为最后一条记录。

修复:统一变量名,循环内每次创建新的临时表缓冲区实例:

while(enumerator.moveNext())
{
    MovieRentalService.TmdbMovie item = enumerator.get_current();
    // 每次循环初始化新的临时表记录缓冲区
    Table_movieTemp tmpMovie;
    tmpMovie.Description = item.Description;
    tmpMovie.ReleaseDate = today();
    tmpMovie.Title = item.Title;
    tmpMovie.Rating = item.Rating;
    tmpMovie.existsAlready = Table_Movie::exist(item.Title);
    insertList.add(tmpMovie);
}

2. BindTable方法逻辑错误

当前BindTable方法用传入的缓冲区给自己调用setTmpData,完全无法实现数据绑定到窗体数据源的效果。正确逻辑是获取窗体数据源的临时表缓冲区,将外部数据绑定到上面。

修复BindTable方法:

public void BindTable(Table_movieTemp _movieTempBuffer)
{
    // 获取窗体数据源对应的临时表缓冲区
    Table_movieTemp formTmpTable = this.dataSource(formDataSourceStr(Form_MovieSearch, Table_movieTemp)).table();
    // 将外部临时表的数据绑定到窗体数据源的临时表
    formTmpTable.setTmpData(_movieTempBuffer);
    // 重新执行查询刷新窗体显示
    this.dataSource(formDataSourceStr(Form_MovieSearch, Table_movieTemp)).executeQuery();
}

3. 调用BindTable时传递正确的临时表实例

批量插入后,需确保传递给BindTable的是包含所有数据的临时表实例。修改按钮点击事件的末尾代码:

ttsbegin;
insertList.insertDatabase();
ttscommit;

// 传递完整的临时表实例给窗体绑定
formRun.BindTable(Table_movieTemp);

4. 确认临时表与窗体配置

  • 确保Table_movieTemp的TableType属性设置为InMemory
  • 窗体数据源的AllowEdit、AllowDelete等属性未限制数据显示
  • 窗体网格控件已正确绑定到临时表的对应字段

内容的提问来源于stack exchange,提问作者Kai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:45:38