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