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