Задание начального значения при сортировке / сортировке, начиная с середины - ход выполнения

Сценарий: у меня есть поле char (имя: приоритет) в моей таблице, где значения хранятся как 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. Есть ли способ разобраться с этим в Progress?

3 ответа

Поскольку вы используете символьное поле, оно обрабатывает числа как строки. Значения ASCII для строк "1", "2" и "3" равны 49, 50 и 51. Progress обрабатывает пробел ("") как ASCII -1. Вот почему бланк идет первым.

Лучше всего использовать два FOR EACH заявления. Сначала сделайте непустые записи:

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

Затем сделайте пустые записи:

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

Если у вас есть бизнес-логика в процедурах / функциях, вы можете запустить ее из FOR EACH циклы, чтобы предотвратить любое дублирование кода.

Так как вы сканируете / все / записи в любом случае, вы можете отсортировать в BY:

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.

Если (только если) в таблице не так много записей, возможно, вы можете скопировать записи в временную таблицу с новым приоритетом и вместо этого отсортировать временную таблицу?

Если у вас есть миллион записей, это может быть не так! Тогда я бы рассмотрел просто добавление нового поля.

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.
Другие вопросы по тегам