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

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4557
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение 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)   
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4557
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

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

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

Сообщение finsoftrz »

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

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

Сообщение finsoftrz »

Не могли где-то воткнуть get по коду перед sort, как в последнем примере?
C6/C11, ШВС, tps/btrieve.
George
Активист
Сообщения: 100
Зарегистрирован: 04 Август 2009, 10:48

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

Сообщение George »

У меня с10.
Получается следующее:
- первый цикл 155 сравнивается с 0 (и записывается);
- второй цикл 100 сравнивается с 155 (и не записывается, так как меньше вроде бы наименьшего :) );
- третий цикл 200 сравнивается с 155 (и записывается);
- четвертый цикл 55 сравнивается с 200 (и не записывается, так как меньше вроде бы наименьшего :) );
- пятый цикл 105 сравнивается с 200 (и не записывается, так как меньше вроде бы наименьшего :) );
- шестой цикл 125 сравнивается с 200 (и не записывается, так как меньше вроде бы наименьшего :) ).
И без разницы с SORT или без SORT.
Как-то так :)
George
Активист
Сообщения: 100
Зарегистрирован: 04 Август 2009, 10:48

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

Сообщение George »

finsoftrz писал(а): 20 Май 2022, 17:48 Тогда нужно смотреть код заполнения очереди.
Вначале очередь заполняется кодами и нулевыми суммами, а потом в нее записываются суммы.
Логика должна быть такая:
1) беру какую-то сумму для определенного кода;
2) определяю по набору соответствующему, например MAX::Kod = 1, самую маленькую сумму, и если новая сумма больше, то меняю ее.
George
Активист
Сообщения: 100
Зарегистрирован: 04 Август 2009, 10:48

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

Сообщение George »

finsoftrz писал(а): 20 Май 2022, 17:52 Не могли где-то воткнуть get по коду перед sort, как в последнем примере?
Нет, get идет после sort.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4557
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Чтобы понять, нужен конкретный код.
C6/C11, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

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

Сообщение kreator »

George писал(а): 20 Май 2022, 17:06 1) Если четко определить и второе поле, то и встанет на такую запись (если найдет).
2) SET и NEXT для QUEUE?
Да, я неправ. Тогда тупо в цикле до нужной записи. Когда найдётся, выходим из цикла. Естественно сортирнуть до цикла.
We are hard at work… for you. :)
Аватара пользователя
morkovin
Ветеран
Сообщения: 908
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

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

Сообщение morkovin »

Если появляются заморочки с QUEUE надо использовать In-Memory.
WBR, morkovin
George
Активист
Сообщения: 100
Зарегистрирован: 04 Август 2009, 10:48

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

Сообщение 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.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4557
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Вначале сортируете очередь, а потом заполняете значения ключевого поля. Ясное дело, что так работать не будет. Надо изменить алгоритм. Например, сделать вторую временную очередь с кодом и максимальным значением.
C6/C11, ШВС, tps/btrieve.
George
Активист
Сообщения: 100
Зарегистрирован: 04 Август 2009, 10:48

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

Сообщение George »

finsoftrz писал(а): 21 Май 2022, 15:06 Вначале сортируете очередь, а потом заполняете значения ключевого поля. Ясное дело, что так работать не будет. Надо изменить алгоритм. Например, сделать вторую временную очередь с кодом и максимальным значением.
В принципе, так и стал делать:
- создаю дополнительную очередь для одного MAX::Kod из основной очереди;
- сортирую ее по MAX::Summa;
- делаю GET(Queue:Max,1), это и будет минимальное значение суммы.

Всем спасибо :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4557
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Я имел ввиду другое. Вторая очередь с сортировкой по коду, в ней фиксируется одно минимальное значение, соответствующее коду. То есть строка по одному коду уникальная.
C6/C11, ШВС, tps/btrieve.
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

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

Сообщение gopstop2007 »

Перед работой с очередью отсортируйте, SORT(Queue,+MAX::Kod,-MAX::Summ), первое значение и будет максимальным
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Ответить