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
相关产品推荐
相关产品推荐

