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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
George
Активист
Сообщения: 100
Зарегистрирован: 04 Август 2009, 10:48

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

Сообщение George »

    gopstop2007 писал(а): 22 Май 2022, 8:01 Перед работой с очередью отсортируйте, SORT(Queue,+MAX::Kod,-MAX::Summ), первое значение и будет максимальным
    Мне нужно искать не максимальное, а минимальное значение.
    А вообще задача сформировать список из пяти максимальных значений из набора чисел.
    Т.е. есть набор чисел, который берется последовательно из БД, заранее в какой последовательности какие числа будут неизвестно, отсортировать нельзя. Необходимо из этого набора сформировать список из 5 наибольших значений.
    Alex_G
    Бывалый
    Сообщения: 61
    Зарегистрирован: 09 Ноябрь 2009, 13:04
    Поблагодарили: 2 раза

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

    Сообщение 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), чтобы убедиться в упорядочении очереди в заданном порядке.
    Аватара пользователя
    Admin
    Администратор
    Сообщения: 3959
    Зарегистрирован: 05 Июль 2005, 15:59
    Откуда: Хабаровск
    Благодарил (а): 25 раз
    Поблагодарили: 22 раза
    Контактная информация:

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

    Сообщение Admin »

    Господа, не забываем оформлять код в теги
    [code]
    [/code]
    Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
    Аватара пользователя
    finsoftrz
    ✯ Ветеран ✯
    Сообщения: 4561
    Зарегистрирован: 06 Ноябрь 2014, 12:48
    Благодарил (а): 6 раз
    Поблагодарили: 34 раза

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

    Сообщение finsoftrz »

    Да все уже разобрались. Там вначале стоит sort по незаполненному полю, а поле заполняется позже. Результат очевиден.
    C6/C11, ШВС, tps/btrieve.
    Аватара пользователя
    finsoftrz
    ✯ Ветеран ✯
    Сообщения: 4561
    Зарегистрирован: 06 Ноябрь 2014, 12:48
    Благодарил (а): 6 раз
    Поблагодарили: 34 раза

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

    Сообщение finsoftrz »

    Ну и еще не было понимания, что get выполняет альтернативную сортировку на момент первого вызова.
    C6/C11, ШВС, tps/btrieve.
    Alex_G
    Бывалый
    Сообщения: 61
    Зарегистрирован: 09 Ноябрь 2009, 13:04
    Поблагодарили: 2 раза

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

    Сообщение Alex_G »

    finsoftrz писал(а): 23 Май 2022, 16:15 Ну и еще не было понимания, что get выполняет альтернативную сортировку на момент первого вызова.
    Не только выполняет альтернативную сортировку, но и кэширует ее.
    "Если ОЧЕРЕДЬ не была отсортирована по полю (полям), используемому в качестве ключевого параметра (параметров), ключ указывает «альтернативный порядок сортировки», который затем кэшируется".
    Как вариант решения задачи без использования дополнительной очереди:
    после сортировки SORT(Queue:Max,MAX::Kod,MAX::Summa1) вставить SORT(Queue:Max,MAX::Kod), которая не меняет порядок сортировки, но "сбрасывает" кэш "альтернативной сортировки". Проверил на тесте - у меня работает
    Аватара пользователя
    finsoftrz
    ✯ Ветеран ✯
    Сообщения: 4561
    Зарегистрирован: 06 Ноябрь 2014, 12:48
    Благодарил (а): 6 раз
    Поблагодарили: 34 раза

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

    Сообщение finsoftrz »

    Тоже проверил, не сбрасывает. В общем-то странно, в доке не видно пути сброса альтернативной сортировки. То есть сделал get первый раз, пока не очистишь очередь, альтернативная сортировка висит в памяти. Разумно было бы все альтернативные сортировки сбрасывать при выполнении sort.
    C6/C11, ШВС, tps/btrieve.
    Ответить