Страница 3 из 4
Позиционирование в QUEUE
Добавлено: 20 Май 2022, 17:45
finsoftrz
Если вначале сделать get до sort, то результат неправильный.
То есть альтернативная сортировка строится на основании дефолтной.
Вопрос по версии клариона остается, так как я помню, что подобная проблема вылезала. Возможно во времена с5 или с55.
Код: Выделить всё
form_r routine
DATA
lor:queue queue, pre()
lor:kod long
lor:sum real
.
CODE
lor:kod=1
lor:sum=100
add(lor:queue)
lor:kod=1
lor:sum=50
add(lor:queue)
lor:kod=2
lor:sum=100
add(lor:queue)
lor:kod=2
lor:sum=49.2
add(lor:queue)
lor:kod=2
lor:sum=50
add(lor:queue)
lor:kod=2
get(lor:queue,lor:kod)
stop(lor:sum)
sort(lor:queue,lor:kod,lor:sum)
lor:kod=2
get(lor:queue,lor:kod)
stop(lor:sum)
Позиционирование в QUEUE
Добавлено: 20 Май 2022, 17:48
finsoftrz
А, написано, что С10...
Позиционирование в QUEUE
Добавлено: 20 Май 2022, 17:48
finsoftrz
Тогда нужно смотреть код заполнения очереди.
Позиционирование в QUEUE
Добавлено: 20 Май 2022, 17:52
finsoftrz
Не могли где-то воткнуть get по коду перед sort, как в последнем примере?
Позиционирование в QUEUE
Добавлено: 20 Май 2022, 18:12
George
У меня с10.
Получается следующее:
- первый цикл 155 сравнивается с 0 (и записывается);
- второй цикл 100 сравнивается с 155 (и не записывается, так как меньше вроде бы наименьшего

);
- третий цикл 200 сравнивается с 155 (и записывается);
- четвертый цикл 55 сравнивается с 200 (и не записывается, так как меньше вроде бы наименьшего

);
- пятый цикл 105 сравнивается с 200 (и не записывается, так как меньше вроде бы наименьшего

);
- шестой цикл 125 сравнивается с 200 (и не записывается, так как меньше вроде бы наименьшего

).
И без разницы с SORT или без SORT.
Как-то так

Позиционирование в QUEUE
Добавлено: 20 Май 2022, 18:19
George
finsoftrz писал(а): 20 Май 2022, 17:48
Тогда нужно смотреть код заполнения очереди.
Вначале очередь заполняется кодами и нулевыми суммами, а потом в нее записываются суммы.
Логика должна быть такая:
1) беру какую-то сумму для определенного кода;
2) определяю по набору соответствующему, например MAX::Kod = 1, самую маленькую сумму, и если новая сумма больше, то меняю ее.
Позиционирование в QUEUE
Добавлено: 20 Май 2022, 18:21
George
finsoftrz писал(а): 20 Май 2022, 17:52
Не могли где-то воткнуть get по коду перед sort, как в последнем примере?
Нет, get идет после sort.
Позиционирование в QUEUE
Добавлено: 20 Май 2022, 19:57
finsoftrz
Чтобы понять, нужен конкретный код.
Позиционирование в QUEUE
Добавлено: 20 Май 2022, 20:26
kreator
George писал(а): 20 Май 2022, 17:06
1) Если четко определить и второе поле, то и встанет на такую запись (если найдет).
2) SET и NEXT для QUEUE?
Да, я неправ. Тогда тупо в цикле до нужной записи. Когда найдётся, выходим из цикла. Естественно сортирнуть до цикла.
Позиционирование в QUEUE
Добавлено: 21 Май 2022, 6:18
morkovin
Если появляются заморочки с QUEUE надо использовать In-Memory.
Позиционирование в QUEUE
Добавлено: 21 Май 2022, 12:56
George
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
Добавлено: 21 Май 2022, 15:06
finsoftrz
Вначале сортируете очередь, а потом заполняете значения ключевого поля. Ясное дело, что так работать не будет. Надо изменить алгоритм. Например, сделать вторую временную очередь с кодом и максимальным значением.
Позиционирование в QUEUE
Добавлено: 21 Май 2022, 16:28
George
finsoftrz писал(а): 21 Май 2022, 15:06
Вначале сортируете очередь, а потом заполняете значения ключевого поля. Ясное дело, что так работать не будет. Надо изменить алгоритм. Например, сделать вторую временную очередь с кодом и максимальным значением.
В принципе, так и стал делать:
- создаю дополнительную очередь для одного MAX::Kod из основной очереди;
- сортирую ее по MAX::Summa;
- делаю GET(Queue:Max,1), это и будет минимальное значение суммы.
Всем спасибо

Позиционирование в QUEUE
Добавлено: 21 Май 2022, 18:32
finsoftrz
Я имел ввиду другое. Вторая очередь с сортировкой по коду, в ней фиксируется одно минимальное значение, соответствующее коду. То есть строка по одному коду уникальная.
Позиционирование в QUEUE
Добавлено: 22 Май 2022, 8:01
gopstop2007
Перед работой с очередью отсортируйте, SORT(Queue,+MAX::Kod,-MAX::Summ), первое значение и будет максимальным