Задание начального значения при сортировке / сортировке, начиная с середины - ход выполнения
Сценарий: у меня есть поле 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.