最新消息:ww12345678 的部落格重装上线,希望大家继续支持。

[译]教程:refresh, reread, research, executeQuery – 使用哪一个?

Uncategorized William 1544浏览 0评论

即便是 x++ 高级开发顾问,仍有很多人对这4种数据源方法感到迷惑。因此作者撰写了该篇博客,来澄清这4个数据源方法的异同,并演示每种方法常见的应用场景。作者已经按照方法对网格中行记录的的影响进行了排序。

常见错误

通常,开发人员按以下顺序调用上述方法中的2个:

formDataSource.refresh()
formDataSource.research()


formDataSource.reread()
formDataSource.research()


formDataSource.research()
formDataSource.executeQuery()


formDataSource.research()
formDataSource.refresh() / formDataSource.reread()

其实所有这些做法都是错误的,或者说至少部分是冗余的。希望在阅读完整的帖子后,您不会再有任何关于这4个方法的错误理解。

Refresh

此方法只是使用缓存中的数据源内容刷新网格控件中显示的数据, 调用refresh()方法不会重新读取数据库中的记录。 因此,如果另一个进程更新了数据库记录,则执行refresh() 不会显示这些更改。

refreshEx

根据一个可选的参数值决定重绘网格行的方式。

-1:更新所有记录

-2(默认值):则更新所有勾选的记录和指定了displayOptions选项的记录

另请注意,refreshEx()仅重绘网格中的字段,因此不在网格中的控件可能仍包含旧值。 但Refresh()方法会更新所有值。

Reread

reread()方法将查询数据库并将当前记录内容重新读入数据源缓存。 但在重绘网格内容之前(例如,当您离开行或重新打开窗体时)将不会更新网格上显示的内容。
如果已通过代码新增或删除记录,则不应使用这个方法刷新网格数据。 为此,您可以利用下面描述的其他方法

reread()、refresh()方法经常联合使用

通常,当您通过某些代码更改当前记录中的某些值时(例如,当用户单击按钮时),并通过调用表缓冲区上的update方法更新数据库时,您可能希望向用户显示更改发生了。在这种情况下,调用reread()方法使用数据库中的值更新数据源窗体缓存(这不会更新屏幕),然后调用refresh()重新重绘网格,并向用户显示更改。

按钮 SaveRecord 属性 == Yes

每个按钮都有一个SaveRecord属性,默认为Yes。 无论何时单击按钮,当前记录中所做的更改都将保存到数据库中。 所以调用reread()不会像某些人预期的那样恢复原始记录值。 如果用户期望如此,应该将该属性设置为No。

Research

调用research()将保持窗体上现有的查询条件的情况下,重新从数据库读取值,将保持用户在窗体上的设置的过滤、排序等条件。

Research(true)

从AX 2009开始,research()方法增加一个可选的布尔类型的参数_retainPosition。 如果调用research(true),则在刷新数据后光标将停留在网格原来的记录上, 这是一个非常有用的功能增强,它解决了光标复位的问题(findRecord方法是替代方法,但性能不佳)。

ExecuteQuery

调用executeQuery()也将重新从数据库查询记录并更新网格中的行。 其与research()方法不同的地方是,如果您需要在代码中更改查询条件并用新的查询条件重新执行查询,则使用ExecuteQuery()方法即可。

formDataSource.queryRun().query() vs formDataSource.query()

需要特别提醒的是,窗体有2个关于查询的对象实例:一个是原始数据源查询(存储在formDataSource.query()中);另一个是当前用户数据源查询,其中包含用户添加的过滤条件(存储在formDataSource.queryRun().query())。当research()方法被调用时,系统内核用formDataSource.queryRun().query()作为基准创建queryRun的新实例。因此,用户在数据源上设置的过滤条件将被保留。这很有用,例如,当多个用户都使用同一窗体时,每个用户都可以按照自己设置的过滤条件显示数据。

此外,调用executeQuery()将使用窗体定义的默认查询条件进行查询,将移除用户设置的过滤条件。
这是每个人在使用research / executeQuery方法时应该充分理解的,以防在更新查询时与用户设置的过滤条件发生冲突。

原文

 

转载请注明:ww12345678 的部落格 | AX Helper » [译]教程:refresh, reread, research, executeQuery – 使用哪一个?

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址