【问题标题】:How does the SETCURRENTKEY() C/AL function in Navision work?Navision 中的 SETCURRENTKEY() C/AL 函数如何工作?
【发布时间】:2014-10-16 10:21:39
【问题描述】:

我有以下问题:

  1. SETCURRENTKEY 究竟做了什么?
  2. SETCURRENTKEY 有什么好处?
  3. 我为什么要使用SETCURRENTKEY
  4. 什么时候使用SETCURRENTKEY
  5. 使用索引有什么优势,我如何将其与图书馆的旧分类系统的示例类似地联系起来?
  6. 该功能解决了哪些类型的数据库查询效率问题?

我一直在 Internet 和“IT Pro 开发人员帮助”内部 Navision 文档中搜索这个记录不充分的功能,但我找不到问题的正确答案。

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

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

这就像图书馆中旧的分类卡系统:没有SETCURRENTKEY,您将不得不遍历每个书架并手动筛选出您想要的书。你会发现一堆随机的书,你不得不说:“不,不是这本。是的,这本”。使用SETCURRENTKEY,您可以拥有一个类似于旧系统的索引,您可以根据其“作者”或“艺术家”等来查找书籍或音乐CD。

没关系,但我仍然无法正确回答我的问题。

【问题讨论】:

    标签: database performance sorting filtering navision


    【解决方案1】:
    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;
    

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

    对于 5. 和 6.,一般来说,我真的建议您熟悉 basic database index theory。就是这样,你自己用图书馆/书的比喻很好地解释了。

    【讨论】:

    • 根据上面的第一条语句,GET(...) 语句不需要 SETCURRENTKEY(...)。
    • 是的。 GET() 将始终使用主键,并忽略应用的任何过滤器。
    • 如果我必须在循环中编辑一个关键字段怎么办?如果我尝试这个,我会得到一些奇怪的结果
    • 如果使用 SQL Server 作为数据库,SETCURRENTKEY 不会指定 SQL Server 将使用哪个索引,它只是在 SQL 语句中添加一个 ORDER BY。数据库引擎可能仍然决定使用另一个索引。您可以使用分析器检查 SETCURRENTKEY 对 SQL 语句有什么不同。
    • 也是如此。更重要的是 - 如果您将 SETCURRENTKEY 用于不存在的键/索引,最新版本的 Dynamics NAV(仅限 SQL)甚至不会抱怨。这对于一次性任务/过程来说很方便,但是出于性能原因,在生产中使用此类代码并由用户每天运行仍然要求提供这些键/索引。但请注意,不要为您用于排序的每个组合创建键,因为它们会不必要地扩展您的数据库。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多