Страница 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.