【问题标题】:Using InMemory table as a form datasource in Dynamics 365 f&o在 Dynamics 365 f&o 中使用 InMemory 表作为表单数据源
【发布时间】:2022-10-13 02:56:46
【问题描述】:

我从外部服务获取数据并将其插入到 inMemory 表 (Table_movieTemp) 中,我将其用作表单 (Form_MovieSearch_ds) 上的数据源:

[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 循环纯粹是为了证明昆虫是成功的。 之后我想我可以在将我的临时表作为数据源的表单上调用 executeQuery:

    FM_MovieSearch_ds.executeQuery();

这不起作用,当我搜索谷歌时,我找到了一个解决方案,我必须传递 TempTable 缓冲区,以便我可以使用“setTmpTable”链接它。 所以我在调用 executeQuery() 之前添加了以下调用:

    formRun.BindTable(movieTemp);

我的表格上的功能:

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

现在我的代码编译并且也不会产生运行时错误,但我仍然没有看到任何数据。有人可以建议我想念什么或做错什么吗?

【问题讨论】:

  • 考虑接受答案或更新您的问题。

标签: axapta dynamics-365-operations


【解决方案1】:

在表单中使用内存表已经有 25 年了,您会在标准应用程序中找到几种用途。

来自客户销售老化统计形式:

void calcAgingStatistics(boolean _research)
{
    CustVendAgingStatistics custVendAgingStatistics = CustVendAgingStatistics::construct(linkedCustVendTable, graphData.loadDefName(), graphData.perInvoiceDate());    
    custVendAgingStatistics.calcStatistic();
    tmpAccountSum.setTmpData(custVendAgingStatistics.tmpAccountsum());    
    if (_research)
    {
        tmpAccountSum_ds.research();
    }
}

另一个很好的例子是here

方法:

  • 在单独的方法中插入记录,返回本地缓冲区。
  • 在调用方法中调用setTmpData 并返回值。
  • 研究数据源

在您的代码中,我看到了InsertRecordList 的使用,不要在内存临时表上使用它,这没有任何意义。 _movieTempBuffer.setTmpData(_movieTempBuffer) 也没有做任何有用的事情,因为它对自己进行操作。

同样好的风格是在onClicked 方法和其他事件方法中做的不多,而是调用适当的方法来完成艰苦的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多