Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 两个不同的FOR-EACH(BREAK-BY-with-JOIN)循环给出了出乎意料的不同结果?_Sorting_Progress 4gl_Openedge - Fatal编程技术网

Sorting 两个不同的FOR-EACH(BREAK-BY-with-JOIN)循环给出了出乎意料的不同结果?

Sorting 两个不同的FOR-EACH(BREAK-BY-with-JOIN)循环给出了出乎意料的不同结果?,sorting,progress-4gl,openedge,Sorting,Progress 4gl,Openedge,我试图匹配一段代码的排序顺序。以下两个FOR EACH语句中的字段和比较是相同的,除了Item.PID在一个查询中请求特定值,而Item.Bill在另一个查询中请求特定值。但是,这两个查询以不同的顺序返回记录 项目表的主要索引是Comp、PID、ItemID、IndNum。 患者表的主要唯一索引是PatID-Comp,ID FOR EACH Item WHERE Item.Comp = 1 AND Item.Bill > 0 AND Item.P

我试图匹配一段代码的排序顺序。以下两个FOR EACH语句中的字段和比较是相同的,除了Item.PID在一个查询中请求特定值,而Item.Bill在另一个查询中请求特定值。但是,这两个查询以不同的顺序返回记录

项目表的主要索引是Comp、PID、ItemID、IndNum。 患者表的主要唯一索引是PatID-Comp,ID

FOR EACH Item
    WHERE Item.Comp   = 1 
      AND Item.Bill   > 0 
      AND Item.PID    = 123
      AND Item.Store  <> ? 
      AND Item.SecNum  > 0   
      AND Item.TerNum <> ? 
      AND Item.Desc   <> ? 
      AND Item.Date   <> ? 
      AND Item.Code   <> ""
      AND Item.Type    = "P" 
      AND Item.BillDate = 09/14/2016
      AND Item.Method   = "P" 
    NO-LOCK,
    FIRST Patient USE-INDEX PatID
    WHERE Patient.Comp = Item.Comp
      AND Patient.ID = Item.PID
    NO-LOCK
    BREAK BY Item.Comp
          BY Item.Bill
          BY Patient.LName
          BY Patient.FName
          BY Item.PID
          BY Item.Store
          BY Item.SecNum
          BY Item.TerNum
          BY Item.Desc
          BY Item.Date
          BY Item.Code:
  DISPLAY Amt.
END.

FOR EACH Item
    WHERE Item.Comp   = 1 
      AND Item.Bill   = 456
      AND Item.PID    > 0
      AND Item.Store  <> ? 
      AND Item.SecNum  > 0   
      AND Item.TerNum <> ? 
      AND Item.Desc   <> ? 
      AND Item.Date   <> ? 
      AND Item.Code   <> ""
      AND Item.Type    = "P" 
      AND Item.BillDate = 09/14/2016
      AND Item.Method   = "P" 
    NO-LOCK,
    FIRST Patient USE-INDEX PatID
    WHERE Patient.Comp = Item.Comp
      AND Patient.ID = Item.PID
    NO-LOCK
    BREAK BY Item.Comp
          BY Item.Bill
          BY Patient.LName
          BY Patient.FName
          BY Item.PID
          BY Item.Store
          BY Item.SecNum
          BY Item.TerNum
          BY Item.Desc
          BY Item.Date
          BY Item.Code:
  DISPLAY Amt.
END.
第二个返回四条记录,其中Item.Amt字段中的值的顺序如下:

827, 1124, 300, 102.
827, 1124, 102, 300.
从第二个查询的Break By中删除Patient.LName与第一个查询的排序相匹配,但显然不会正确排序我的结果(对于多个患者)。我只是想这可能就是问题所在


编辑-指定字段“金额”属于表“项目”。为表“Patient”添加了索引。

如果不共享表的索引定义,就不可能真正说出发生了什么

但是如果我不得不猜测的话,我会认为使用“第一个病人”很可能是你问题的根源。首先,它不会做你(可能)认为它会做的事情。它返回满足WHERE子句中标准的第一条记录(使用所选或指定的索引),而不考虑BY短语。IOW——patient.lname不起作用来确定哪个患者是“第一个”

您可能会更幸运地更改为“每个患者”并取消使用索引。(因此,您可能还需要在块内添加一些使用函数(如FIRST-OF etc)的逻辑——我不能根据对索引了解的很少来判断。)


查询的“每个项”部分可能会使用不同的索引,因为具有相等匹配的不同字段集。这种匹配驱动了索引选择算法的第一部分。结合FOR FIRST的行为,对于不同的可能排序顺序,您有很多scop。

如果不共享表的索引定义,就不可能真正说出发生了什么

但是如果我不得不猜测的话,我会认为使用“第一个病人”很可能是你问题的根源。首先,它不会做你(可能)认为它会做的事情。它返回满足WHERE子句中标准的第一条记录(使用所选或指定的索引),而不考虑BY短语。IOW——patient.lname不起作用来确定哪个患者是“第一个”

您可能会更幸运地更改为“每个患者”并取消使用索引。(因此,您可能还需要在块内添加一些使用函数(如FIRST-OF etc)的逻辑——我不能根据对索引了解的很少来判断。)


查询的“每个项”部分可能会使用不同的索引,因为具有相等匹配的不同字段集。这种匹配驱动了索引选择算法的第一部分。结合FOR FIRST的行为,对于不同的可能排序顺序,您有大量scop。

进度根据WHERE和BREAK语句确定要使用的最佳索引。更改这些可能会更改所使用的索引,这可能会更改记录的顺序。如果使用动态查询,可以通过index-INFORMATION属性查看选择了哪个索引进度

DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE cForEach AS CHARACTER NO-UNDO.
DEFINE BUFFER bfItem FOR Item.

cForEach = "FOR EACH bfItem".

CREATE QUERY hQuery.
hQuery:SET-BUFFERS(BUFFER bfItem:HANDLE).
hQuery:QUERY-PREPARE(cForEach).
hQuery:QUERY-OPEN().
hQuery:GET-FIRST(NO-LOCK).

MESSAGE hQuery:INDEX-INFORMATION[1] VIEW-AS ALERT-BOX.

进度根据WHERE和BREAK语句确定要使用的最佳索引。更改这些可能会更改所使用的索引,这可能会更改记录的顺序。如果使用动态查询,可以通过index-INFORMATION属性查看选择了哪个索引进度

DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
DEFINE VARIABLE cForEach AS CHARACTER NO-UNDO.
DEFINE BUFFER bfItem FOR Item.

cForEach = "FOR EACH bfItem".

CREATE QUERY hQuery.
hQuery:SET-BUFFERS(BUFFER bfItem:HANDLE).
hQuery:QUERY-PREPARE(cForEach).
hQuery:QUERY-OPEN().
hQuery:GET-FIRST(NO-LOCK).

MESSAGE hQuery:INDEX-INFORMATION[1] VIEW-AS ALERT-BOX.

谢谢你的意见。项的唯一其他索引包括:Comp、Method、BatchNum。患者表有很多索引,但主要的唯一项名为PatID:Comp,ID。因此,不管怎样,应该只返回1名患者,改变顺序的是该患者的项目顺序,也许我应该更清楚。编辑-我尝试了你的建议,但结果仍然是一样的。如果只有一个可能的结果,那么就不需要用USE-index指定索引,也没有必要先使用。我同意这些都是我忽略的错误。但我仍然不确定为什么它们提供了两种不同的输出。我只是尝试在数据库的另一个副本中进行测试,结果都如预期的那样——顺序正确。这两个数据库副本之间的索引没有差异。我们不知道您的数据,也不知道您的索引,如果没有这些信息,就没有确定的答案。感谢您抽出时间,我目前正在处理一个案件,并已向他们披露了这些信息。我想我不能在这里提供信息。当我发现问题/解决方案时,我将在此更新。谢谢您的输入。项的唯一其他索引包括:Comp、Method、BatchNum。患者表有很多索引,但主要的唯一项名为PatID:Comp,ID。因此,不管怎样,应该只返回1名患者,改变顺序的是该患者的项目顺序,也许我应该更清楚。编辑-我尝试了你的建议,但结果仍然是一样的。如果只有一个可能的结果,那么就不需要用USE-index指定索引,也没有必要先使用。我同意这些都是我忽略的错误。但我仍然不确定为什么它们提供了两种不同的输出。我只是尝试在数据库的另一个副本中进行测试,结果都如预期的那样——顺序正确。这两个数据库副本之间的索引没有差异。我们不知道您的数据,也不知道您的索引,如果没有这些信息,就没有确定的方法