Два вопроса по Queue

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аскер
Новичок
Сообщения: 6
Зарегистрирован: 23 Июль 2017, 17:55

Два вопроса по Queue

Сообщение Аскер » 23 Июль 2017, 18:11

Всем привет!
Помогите разобраться с очередями!
Вопрос первый. Как организовать цикл по записям очереди MyQueue с полями Client, Param1, Param2, где заданы значения параметров Param1 и Param2, а надо получить список клиентов Client с данными параметрами? Я подозреваю, что надо использовать оператор GET(Очередь, ключ), но что такое ключ в очереди - не сумел постичь!

Второй вопрос касается работы с определенным множеством однотипных очередей: MyQueue1, MyQueue2... MyQueue64.
На сколько я понимаю, здесь в пору обратиться к операторам What-Where-Who. Но как динамически указывать первым параметром метки Очередей? Например, как согласно значению MyVal# (1-64) добавлять новые записи в эти 64 очереди?
Clarion 6

Аватара пользователя
Admin
Администратор
Сообщения: 3473
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Два вопроса по Queue

Сообщение Admin » 24 Июль 2017, 2:45

А задачу в целом описать можете, а то 64 очереди это как то сильно!
По первому вопросу примерно так:

Код: Выделить всё

dataqueue   queue
clent         string(100)
param1        long
param2        long
            end
  code
  ! сортируем для последовательного перебора и поиска
  sort(dataqueue, dataqueue.param1, dataqueue.param2)
  ! будем искать запись с такими параметрами
  dataqueue.param1 = 10
  dataqueue.param2 = 2
  ! встаем на первую запись
  get(dataqueue, dataqueue.param1, dataqueue.param2)
  ! нашли?
  if not errorcode()
    ! перебираем с первой найденной записи
    loop w# = position(dataqueue) to records(dataqueue)
      ! поулучить запись
      get(dataqueue, w#)
      ! если закончились записи с нужными параметрами
      if dataqueue.param1 <> 10 or dataqueue.param2 <> 2 then break end

      ! здесь перебираются нужные поля dataqueue.client

    end
  end
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3473
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Два вопроса по Queue

Сообщение Admin » 24 Июль 2017, 2:48

По второму вопросу можно завести ссылку на очередь. Почитайте справку по "Reference Variables"
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аскер
Новичок
Сообщения: 6
Зарегистрирован: 23 Июль 2017, 17:55

Два вопроса по Queue

Сообщение Аскер » 24 Июль 2017, 7:34

Admin писал(а):
24 Июль 2017, 2:45
А задачу в целом описать можете, а то 64 очереди это как то сильно!
На окне размещены 64 списка данных по кодонам (единицам генетического кода) привязанных к своим соответствующим очередям, данные которых рассчитываются динамически во время открытия этого окна.

Аскер
Новичок
Сообщения: 6
Зарегистрирован: 23 Июль 2017, 17:55

Два вопроса по Queue

Сообщение Аскер » 24 Июль 2017, 8:01

Спасибо, Admin, за помощь!
Код примера очень наглядный и работоспособный!
Но все равно остался вопрос, что значит конструкция Get(Очередь, ключ)? Как ею пользоваться?

Аватара пользователя
Admin
Администратор
Сообщения: 3473
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Два вопроса по Queue

Сообщение Admin » 24 Июль 2017, 9:35

Аскер писал(а):
24 Июль 2017, 8:01
Но все равно остался вопрос, что значит конструкция Get(Очередь, ключ)? Как ею пользоваться?
Поиск записи. В "ключевое" поле заносим что то и делаем GET по полю.
В примере же, есть.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3473
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Два вопроса по Queue

Сообщение Admin » 24 Июль 2017, 9:38

Ахаха. У меня тоже вопрос с к спецам. А на кой черт у нас есть такой GET? Я про + и -

Код: Выделить всё

GET(QUEUE,+Q:Field1,+Q:Field2)
Из доки только одно видно что последующая сортировка по этим полям будет быстрее.
В исходниках Clarion примеров использования почти нет. А где есть они непонятны.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Yufil
Ветеран движения
Сообщения: 1151
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Два вопроса по Queue

Сообщение Yufil » 24 Июль 2017, 10:12

Я всегда считал, что +Field отправляет на первую запись по ключу, а -Field - на последнюю. И никогда не доверял этой функции :)

kreator
✯ Ветеран ✯
Сообщения: 3412
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Два вопроса по Queue

Сообщение kreator » 24 Июль 2017, 10:30

Аскер писал(а):
24 Июль 2017, 8:01
Но все равно остался вопрос, что значит конструкция Get(Очередь, ключ)? Как ею пользоваться?
Это банальная конструкция типа "get(LOC:Queue, LOC:Queue.LOC:FirstField1, LOC:Queue.LOC:FirstField3, LOC:Queue.LOC:FirstField2)". Реальные названия переменных в очереди можно заменить на именованные поля, тогда по хелпу это "GET(queue,name)".
.
We are hard at work… for you. :)

gopstop2007
✯ Ветеран ✯
Сообщения: 1269
Зарегистрирован: 25 Март 2009, 21:55

Два вопроса по Queue

Сообщение gopstop2007 » 24 Июль 2017, 10:39

Admin писал(а):
24 Июль 2017, 9:38
Ахаха. У меня тоже вопрос с к спецам. А на кой черт у нас есть такой GET? Я про + и -

Код: Выделить всё

GET(QUEUE,+Q:Field1,+Q:Field2)
Из доки только одно видно что последующая сортировка по этим полям будет быстрее.
В исходниках Clarion примеров использования почти нет. А где есть они непонятны.
По моему, так как в очереди ключей нет :), по этому для "ускорения" поиска можно осуществлять с конца очереди или с начала
при этом не забываем про SORT()
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

Аватара пользователя
Admin
Администратор
Сообщения: 3473
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Два вопроса по Queue

Сообщение Admin » 24 Июль 2017, 10:58

Yufil писал(а):
24 Июль 2017, 10:12
Я всегда считал, что +Field отправляет на первую запись по ключу, а -Field - на последнюю. И никогда не доверял этой функции
При тестировании не получается. И с минусом и с плюсом отдает первую запись в очереди попадающую под условие.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

kreator
✯ Ветеран ✯
Сообщения: 3412
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Два вопроса по Queue

Сообщение kreator » 08 Июль 2019, 14:34

Чтобы не плодить ненужные темы, спрошу здесь. Есть какой-нибудь лайфхак посчитать количество записей в очереди по условию? По аналогии с записями по индексу файла/таблицы. Грубо - заменить энное количество циклов на records(бла-бла-бла).
We are hard at work… for you. :)

Аватара пользователя
Admin
Администратор
Сообщения: 3473
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Два вопроса по Queue

Сообщение Admin » 08 Июль 2019, 15:29

Я такого не знаю. Да и не зачем по моему.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4211
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Два вопроса по Queue

Сообщение Игорь Столяров » 10 Июль 2019, 16:58

kreator писал(а):
08 Июль 2019, 14:34
посчитать количество записей в очереди по условию
Я недавно делал что-то похожее, но видимо это то, что Вы называете "энное количество циклов". Точнее цикла всего два.
Задача: есть неведомая очередь с неведомыми полями.
Нужно: посчитать кол-во записей с заданным значением в нужном поле. Т.е. RecordsCount# = GetMyQueue(Queue,'TOVAR','СОСИСЬКА')

Пробегаем по всем записям Queue, внутри по всем полям Queue. Через Who/What получаем имя поля и его значение.
Если имя поля и значение совпадает с искомым - увеличиваем счётчик. Всё. Работает везде - далее не заморачивался … :)
«V» значит Вендетта !

kreator
✯ Ветеран ✯
Сообщения: 3412
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Два вопроса по Queue

Сообщение kreator » 10 Июль 2019, 20:31

Игорь Столяров писал(а):
10 Июль 2019, 16:58
Я недавно делал что-то похожее, но видимо это то, что Вы называете "энное количество циклов". Точнее цикла всего два.
Это как организовать. Есть некая большая очередь. И надо считать количество записей согласно значению, скажем, одного поля. Не обязательно всю очередь просматривать. Просто для файлов/таблиц есть records по индексу/ключу. И меня не скорость волнует, а удобство. Одна функция вместо цикла. Для очереди ведь есть get по условному индексу. Почему records таким же образом нет? Додумались ведь как-то до этой функции records (по очереди).
We are hard at work… for you. :)

Ответить