Страница 1 из 4

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 9:09
George
Привет всем!
Clarion 10 ABC
Есть QUEUE:
Queue:Max QUEUE,PRE(MAX:)
Kod LONG
Summa REAL
END
Необходимо встать на запись с меньшей суммой.
Вот такая конструкция почему-то :) не работает:
SORT(Queue:Max,MAX::Kod,MAX::Summa)
MAX::Kod = KOL::Kod
GET(Queue:Max,MAX::Kod)

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 9:49
VWV
Может код не определен? :

SORT(Queue:Max,MAX::Summa)
GET(Queue:Max,1)
KOL::Kod = ...

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 9:59
Губин Игорь
George писал(а): 20 Май 2022, 9:09 SORT(Queue:Max,MAX::Kod,MAX::Summa)
Да воскурим мануал!

Вначале идёт сортировка по первому ключу, а потом - по второму. Вот и получается, что сортировка по MAX::Summa идёт в рамках сортировки по MAX::Kod

Поменяй их местами

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 12:43
George
Извиняюсь за неточную формулировку задачи :)
Надо определить наименьшую сумму в рамках конкретного MAX::Kod.
Т.е. очередь типа:
Код Сумма
1 100
1 200
1 50
1 300
2 55
2 12
2 100
2 200

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 12:47
Дед Пахом
George писал(а): 20 Май 2022, 9:09 SORT(Queue:Max,MAX::Kod,MAX::Summa)
MAX::Kod = KOL::Kod
GET(Queue:Max,MAX::Kod)
Перед GET очистите поле суммы:

Код: Выделить всё

CLEAR(MAX::Summa) 

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 13:03
George
И этот вариант не работает.

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 13:06
Alex_G
George писал(а): 20 Май 2022, 9:09 Вот такая конструкция почему-то не работает:
SORT(Queue:Max,MAX::Kod,MAX::Summa)
MAX::Kod = KOL::Kod
GET(Queue:Max,MAX::Kod)
Не работает: возвращает ошибку или не то значение?
Проверьте, есть ли в очереди элемент со значением MAX::Kod = KOL::Kod.
Должно работать и без очистки MAX::Summa

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 13:19
George
MAX::Kod = KOL::Kod есть и на него встает, но при этом не на самую меньшую MAX::Summa.

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 13:23
Дед Пахом
Alex_G писал(а): 20 Май 2022, 13:06 Должно работать и без очистки MAX::Summa
Да, и работает как надо, проверил.

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 13:41
finsoftrz
Насколько я понимаю, это некорректный код. Сортировка по 2 полям, а get по одному. Будет создаваться второй индекс (сортировка) , в котором одно поле кода, а второе поле суммы не упорядочено.

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 13:52
George
finsoftrz писал(а): 20 Май 2022, 13:41 Насколько я понимаю, это некорректный код. Сортировка по 2 полям, а get по одному. Будет создаваться второй индекс (сортировка) , в котором одно поле кода, а второе поле суммы не упорядочено.
Скорее всего именно так, но как получить нужный результат?

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 16:06
finsoftrz
Разные варианты есть. На практике самый юзабельный, на мой взгляд, при заполнении этой кьюшки формировать вторую с некими итоговыми значениями. Или после заполнения кьшки перебрать один раз все строки и заполнить вторую кьюшку. В этой второй кьюшке, например, могут быть поля код+минимальное значение, либо код+границы относящихся к нему строк в первой кьюшке и т.п.

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 16:08
finsoftrz
Можно еще служебную строку воткнуть с минимальным значением суммы.

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 16:14
kreator
George, почему не почитать справку? Сделайте в очереди именованные поля. И тогда:

Код: Выделить всё

Que:Name = 'Smith'                       !Initialize the key fields
Que:Zip = 12345
GET(NameQue,'FirstField,SecondField')    !Get the matching record
IF ERRORCODE() THEN STOP(ERROR()) END
Ещё можно сначала сделать set, потом один next.

Позиционирование в QUEUE

Добавлено: 20 Май 2022, 16:52
Дед Пахом
George писал(а): 20 Май 2022, 13:19 MAX::Kod = KOL::Kod есть и на него встает, но при этом не на самую меньшую MAX::Summa.
У меня встаёт на самую меньшую. :idied: