Страница 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), первое значение и будет максимальным