Navision中的SETCURRENTKEY()C / AL函数如何工作?

MrS*_*ack 1 database sorting performance filtering navision

我有以下问题:

  1. 什么是SETCURRENTKEY真正做到?
  2. 有什么好处SETCURRENTKEY
  3. 我为什么要使用SETCURRENTKEY
  4. SETCURRENTKEY什么时候使用?
  5. 使用索引的优点是什么?如何将其与图书馆的旧排序系统的示例类似地绑定在一起?
  6. 此功能解决什么类型的数据库查询效率问题?

我一直在Internet上和“ IT Pro Developer帮助”内部Navision文档中进行搜索,以查找该功能记录不良的功能,但找不到对我的问题的正确答案。

我唯一知道的是SETCURRENTKEY为记录变量设置当前键,并根据该键对记录集进行排序。当SETCURRENTKEY仅使用几个键使用时,它可以提高查询性能。我不知道当数据库使用索引而不使用索引时实际发生了什么。

有人告诉我这是如何SETCURRENTKEY工作的:

就像图书馆中的旧分拣卡系统一样:没有,SETCURRENTKEY您将不必经过每个书架并手动过滤出所需的书。您会发现随机书籍混合在一起,您必须说:“不,不是这本书。是,这本书”。有了它,SETCURRENTKEY您可以拥有一个类似于旧系统的索引,在该系统中,您仅可以基于其“作者”或“艺术家”等来阅读书籍或音乐CD。

很好,但我仍然无法正确回答我的问题。

Ivk*_*vka 5

  1. 使用SETCURRENTKEY,您可以声明使用FINDSET / FINDFIRST / FINDLAST语句查询数据库时要使用的键(表索引,可以由许多字段组成),以及使用NEXT语句迭代记录集时将收到的记录顺序。
  2. 性能。数据库服务器使用选定的键(表索引)来检索记录集。最好在代码中明确说明SETCURRENTKEY,因为它可以使您仔细考虑数据库的结构和所需的索引。
  3. 性能,以便您提前知道在遍历记录集时将收到的记录顺序。
  4. 何时使用:

典型的用法是这样的:

RecordVar.SETCURRENTKEY(...)
RecordVar.SETRANGE(Field, ...)
RecordVar.SETFILTER(Field, ...)
RecordVar.SETRANGE(Field, ...)
...
IF RecordVar.FINDSET THEN REPEAT
  // do something with records
UNTIL RecordVar.NEXT = 0;
Run Code Online (Sandbox Code Playgroud)

SETCURRENTKEY是声明性的,仅在执行FINDSET时才生效。在执行FINDSET的那一刻,将使用SETRANGE / SETFILTER声明的过滤器和SETCURRENTKEY声明的键/索引在RecordVar表示的表上查询数据库。

对于5.和6.以及一般而言,我真的建议您熟悉基本的数据库索引理论。就是这样,您自己使用库/书类比很好地解释了。

  • 如果使用SQL Server作为数据库,则SETCURRENTKEY不会指定SQL Server将使用的索引,它只会向SQL语句添加ORDER BY。数据库引擎仍可能决定使用另一个索引。您可以使用探查器来检查SETCURRENTKEY与SQL语句之间的区别。 (4认同)
  • 根据上面的第一条语句,GET(...) 语句不需要 SETCURRENTKEY(...)。 (2认同)