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

时间:2017-03-15 12:32:43

标签: sorting progress-4gl openedge

场景:我的表中有一个字段(名称:优先级),其中值存储为1,2,3和空格(“”)。

for each mytable no-lock by priority:

此查询按此顺序排序:空白,1,2,3。

for each mytable no-lock by priority desc:

并且,此查询对如下记录进行排序:3,2,1和空白。

但是我需要对这样的记录进行排序:1,2,3然后是空白。按升序但跳过空白并从1开始。 有没有办法对此进行排序?

3 个答案:

答案 0 :(得分:2)

由于您使用的是字符字段,因此将数字视为字符串。字符串的ASCII值" 1"," 2"和" 3"是49,50和51.进度将空白("")视为ASCII -1。这就是空白出现的原因。

您最好的选择是使用两个document.getElementById("result1").value = xnumb; 语句。首先进行非空白记录:

FOR EACH

然后做空白记录:

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

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

答案 1 :(得分:1)

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

如果你有数百万的记录,这可能不是它!然后我会考虑简单地添加一个新字段。

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.

答案 2 :(得分:1)

由于您正在扫描/所有/记录,您可以在BY:

中进行排序