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
Sorting 在排序中指定起始值/从中间开始排序-进度openedge_Sorting_Progress 4gl_Openedge - Fatal编程技术网

Sorting 在排序中指定起始值/从中间开始排序-进度openedge

Sorting 在排序中指定起始值/从中间开始排序-进度openedge,sorting,progress-4gl,openedge,Sorting,Progress 4gl,Openedge,场景:我的表中有一个char字段(名称:priority),其中的值存储为1、2、3和空白(“”) 此查询按以下顺序排序:空白、1、2、3 for each mytable no-lock by priority desc: 这个查询对记录进行如下排序:3,2,1和blank for each mytable no-lock by priority: 但是我需要像这样对记录进行排序:1,2,3,然后是空白。以升序排列,但跳过空白,从1开始。 有没有什么方法可以在处理中对其进行排序?因为您使用

场景:我的表中有一个char字段(名称:priority),其中的值存储为1、2、3和空白(“”)

此查询按以下顺序排序:空白、1、2、3

for each mytable no-lock by priority desc:
这个查询对记录进行如下排序:3,2,1和blank

for each mytable no-lock by priority:
但是我需要像这样对记录进行排序:1,2,3,然后是空白。以升序排列,但跳过空白,从1开始。
有没有什么方法可以在处理中对其进行排序?

因为您使用的是字符字段,所以它将数字视为字符串。字符串“1”、“2”和“3”的ASCII值分别为49、50和51。进度将空白(“”)视为ASCII-1。这就是为什么空白是第一位的。< / P> 最好是对每个语句使用两个
。首先,对非空白记录执行以下操作:

FOR EACH mytable NO-LOCK WHERE mytable.priority <> "" BY priority:
FOR EACH mytable NO-LOCK WHERE mytable.priority = "":

如果在过程/函数中有业务逻辑,则可以从
FOR EACH
循环中运行这些逻辑,以防止任何代码重复。

由于使用的是字符字段,因此它将数字视为字符串。字符串“1”、“2”和“3”的ASCII值分别为49、50和51。进度将空白(“”)视为ASCII-1。这就是为什么空白是第一位的。< / P> 最好是对每个
语句使用两个
。首先,对非空白记录执行以下操作:

FOR EACH mytable NO-LOCK WHERE mytable.priority <> "" BY priority:
FOR EACH mytable NO-LOCK WHERE mytable.priority = "":
如果您在过程/函数中有业务逻辑,您可以从
FOR EACH
循环中运行这些逻辑,以防止任何代码重复。

如果(仅当)表中没有那么多记录,您可以将记录复制到具有新优先级的临时表中,并对临时表进行排序

如果你有百万的记录,这可能不是它!然后我会考虑简单地添加一个新的字段。< /P>
DEFINE TEMP-TABLE MyTable NO-UNDO
    FIELD priority AS CHARACTER
    FIELD txt      AS CHARACTER.

CREATE MyTable.
ASSIGN MyTable.priority = "1"
       MyTable.txt      = "First?".

CREATE MyTable.
ASSIGN MyTable.priority = ""
       MyTable.txt      = "Last?".

DEFINE TEMP-TABLE ttMyTable NO-UNDO LIKE MyTable
    FIELD newPriority AS INTEGER
    INDEX sortOrder newPriority.

FOR EACH MyTable NO-LOCK:
    CREATE ttMyTable.
    BUFFER-COPY MyTable TO ttMyTable 
        ASSIGN 
            ttMyTable.newPriority = IF MyTable.priority = "" THEN 99999 ELSE INTEGER(MyTable.priority).
END.

FOR EACH ttMyTable NO-LOCK BY ttMyTable.newPriority:
    DISPLAY ttMyTable.
END.
如果(仅当)表中没有那么多记录,您可以将这些记录复制到具有新优先级的临时表中,并对临时表进行排序

如果你有百万的记录,这可能不是它!然后我会考虑简单地添加一个新的字段。< /P>
DEFINE TEMP-TABLE MyTable NO-UNDO
    FIELD priority AS CHARACTER
    FIELD txt      AS CHARACTER.

CREATE MyTable.
ASSIGN MyTable.priority = "1"
       MyTable.txt      = "First?".

CREATE MyTable.
ASSIGN MyTable.priority = ""
       MyTable.txt      = "Last?".

DEFINE TEMP-TABLE ttMyTable NO-UNDO LIKE MyTable
    FIELD newPriority AS INTEGER
    INDEX sortOrder newPriority.

FOR EACH MyTable NO-LOCK:
    CREATE ttMyTable.
    BUFFER-COPY MyTable TO ttMyTable 
        ASSIGN 
            ttMyTable.newPriority = IF MyTable.priority = "" THEN 99999 ELSE INTEGER(MyTable.priority).
END.

FOR EACH ttMyTable NO-LOCK BY ttMyTable.newPriority:
    DISPLAY ttMyTable.
END.

由于您仍在扫描/all/records,因此可以按以下方式在中排序:

define temp-table tt no-undo
   field priority as character
   .

create tt. tt.priority = "".
create tt. tt.priority = "1".   
create tt. tt.priority = "2".   
create tt. tt.priority = "3".   
create tt. tt.priority = "".

for each tt by ( if tt.priority = "" then "4" else tt.priority ):

   display string( rowid( tt ) ) tt.priority.

end.

由于您仍在扫描/all/records,因此可以按以下方式在中排序:

define temp-table tt no-undo
   field priority as character
   .

create tt. tt.priority = "".
create tt. tt.priority = "1".   
create tt. tt.priority = "2".   
create tt. tt.priority = "3".   
create tt. tt.priority = "".

for each tt by ( if tt.priority = "" then "4" else tt.priority ):

   display string( rowid( tt ) ) tt.priority.

end.

这差不多就是它。确保为最高性能编制了优先级索引。@bupereira实际上我认为索引并不重要。至少不是第一次:将触发表扫描/整个索引搜索。@Drooper这是一个很好的建议。实际上,在我的例子中,使用的查询并不是那么简单和简短,我需要一次得到所有结果indeed@Mahesh在这种情况下,您可以尝试添加一个排序字段,如其他答案中所述。如果无法更改架构,请将记录复制到临时表中,并按原样分配排序字段。然后,你可以在临时表上为每个人使用一个。这几乎可以做到。确保为最高性能编制了优先级索引。@bupereira实际上我认为索引并不重要。至少不是第一次:将触发表扫描/整个索引搜索。@Drooper这是一个很好的建议。实际上,在我的例子中,使用的查询并不是那么简单和简短,我需要一次得到所有结果indeed@Mahesh在这种情况下,您可以尝试添加一个排序字段,如其他答案中所述。如果无法更改架构,请将记录复制到临时表中,并按原样分配排序字段。然后你可以在temp表上为每个表使用一个。实际上,我使用动态查询是因为查询需要根据提供的搜索参数准备,我认为这是不可能的,是吗?事实上,我使用动态查询是因为查询需要根据提供的搜索参数准备,我认为这是不可能的,是吗?