Страница 4 из 4
Позиционирование в QUEUE
Добавлено: 22 Май 2022, 17:12
George
gopstop2007 писал(а): ↑22 Май 2022, 8:01
Перед работой с очередью отсортируйте, SORT(Queue,+MAX::Kod,-MAX::Summ), первое значение и будет максимальным
Мне нужно искать не максимальное, а минимальное значение.
А вообще задача сформировать список из пяти максимальных значений из набора чисел.
Т.е. есть набор чисел, который берется последовательно из БД, заранее в какой последовательности какие числа будут неизвестно, отсортировать нельзя. Необходимо из этого набора сформировать список из 5 наибольших значений.
Позиционирование в QUEUE
Добавлено: 23 Май 2022, 12:50
Alex_G
George писал(а): ↑21 Май 2022, 12:56
finsoftrz писал(а): ↑20 Май 2022, 19:57
Чтобы понять, нужен конкретный код.
Код: Выделить всё
Код такой:
Queue:Max QUEUE,PRE(MAX:)
Kod USHORT
Summa1 REAL
END
1) вначале формирую пустую очередь:
CreateQueueMax ROUTINE
FREE(Queue:Max)
LOOP I# = 1 TO RECORDS(Queue:Kolvo)
GET(Queue:Kolvo,I#)
IF ~ERRORCODE()
LOOP J# = 1 TO 5
CLEAR(Queue:Max)
MAX::Kod = KOL::Kod
ADD(Queue:Max)
END
END
END
2) затем иду по БД и выбираю KOL::Summa1$, чтобы потом занести в наименьшее из 5-ти значений по коду MAX::Kod:
SORT(Queue:Max,MAX::Kod,MAX::Summa1)
MAX::Kod = KOL::Kod
GET(Queue:Max,MAX::Kod)
IF ~ERRORCODE()
IF ROUND(KOL::Summa1$,0.01) > ROUND(MAX::Summa1,0.01)
MAX::Summa1 = ROUND(KOL::Summa1$,0.01)
PUT(Queue:Max)
END
END
По получаемым результатам выходит, что GET(Queue:Max,MAX::Kod) позиционирует на ту запись, где был последний PUT.
Чудеса, конечно встречаются, но, чтобы понять, что "глючит", я бы выдал в отладочную печать состав Queue:Max с 1 по последнюю после сортировки (или перед GET), чтобы убедиться в упорядочении очереди в заданном порядке.
Позиционирование в QUEUE
Добавлено: 23 Май 2022, 14:18
Admin
Господа, не забываем оформлять код в теги
[code]
[/code]
Позиционирование в QUEUE
Добавлено: 23 Май 2022, 15:50
finsoftrz
Да все уже разобрались. Там вначале стоит sort по незаполненному полю, а поле заполняется позже. Результат очевиден.
Позиционирование в QUEUE
Добавлено: 23 Май 2022, 16:15
finsoftrz
Ну и еще не было понимания, что get выполняет альтернативную сортировку на момент первого вызова.
Позиционирование в QUEUE
Добавлено: 24 Май 2022, 11:25
Alex_G
finsoftrz писал(а): ↑23 Май 2022, 16:15
Ну и еще не было понимания, что get выполняет альтернативную сортировку на момент первого вызова.
Не только выполняет альтернативную сортировку, но и кэширует ее.
"Если ОЧЕРЕДЬ не была отсортирована по полю (полям), используемому в качестве ключевого параметра (параметров), ключ указывает «альтернативный порядок сортировки», который затем кэшируется".
Как вариант решения задачи без использования дополнительной очереди:
после сортировки SORT(Queue:Max,MAX::Kod,MAX::Summa1) вставить SORT(Queue:Max,MAX::Kod), которая не меняет порядок сортировки, но "сбрасывает" кэш "альтернативной сортировки". Проверил на тесте - у меня работает
Позиционирование в QUEUE
Добавлено: 24 Май 2022, 13:26
finsoftrz
Тоже проверил, не сбрасывает. В общем-то странно, в доке не видно пути сброса альтернативной сортировки. То есть сделал get первый раз, пока не очистишь очередь, альтернативная сортировка висит в памяти. Разумно было бы все альтернативные сортировки сбрасывать при выполнении sort.