Navision中的SETCURRENTKEY()C / AL功能如何工作?

时间:2014-08-22 14:16:33

标签: database performance sorting filtering navision

我有以下问题:

  1. SETCURRENTKEY实际上做了什么?
  2. SETCURRENTKEY的好处是什么?
  3. 为什么我会使用SETCURRENTKEY
  4. 我何时会使用SETCURRENTKEY
  5. 使用索引的优点是什么?如何将其与图书馆的旧分类系统示例类似?
  6. 此功能解决了哪种类型的数据库查询效率问题?
  7. 我一直在网上搜索和“IT专业开发者帮助”#39;这个记录不完整的函数的内部Navision文档,我找不到我的问题的正确答案。

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

    有人告诉我这是SETCURRENTKEY的工作原理:

      

    它就像图书馆中的旧分拣卡系统:没有SETCURRENTKEY,您必须通过每个货架并手动过滤掉您想要的书。你会发现随机书籍的混合,你不得不说:"不,不是这一本。是的,这个"。使用SETCURRENTKEY,您可以拥有一个类似于旧系统的索引,您只需根据其“作者”访问书籍或音乐CD即可。或者'艺术家'等

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

2 个答案:

答案 0 :(得分:4)

  1. 使用SETCURRENTKEY,您可以声明使用FINDSET / FINDFIRST / FINDLAST语句查询数据库时要使用的密钥(表索引,可以包含许多字段),以及您将收到的记录顺序用NEXT语句迭代记录集。
  2. 性能。数据库服务器使用选定的密钥(表索引)来检索记录集。最好在代码中明确说明SETCURRENTKEY,因为它会让你思考所需的数据库结构和索引。
  3. 性能,以便您提前知道在迭代记录集时将收到的记录顺序。
  4. 何时使用:
  5. 典型的用途是:

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

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

    对于5.和6.通常,我会建议您熟悉basic database index theory。这就是它,你自己使用图书馆/书籍类比很好地解释了。

答案 1 :(得分:0)

如果在循环中修改关键字段(或过滤后的字段,即使不在关键字段中),则在NAV中执行此操作的标准方法是声明第二个记录变量,使用来自您正在遍历的记录变量,然后更改并修改第二个记录变量。