Страница 1 из 2

Два вопроса по 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

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

Добавлено: 24 Июль 2017, 2:45
Admin
А задачу в целом описать можете, а то 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

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

Добавлено: 24 Июль 2017, 2:48
Admin
По второму вопросу можно завести ссылку на очередь. Почитайте справку по "Reference Variables"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 08 Июль 2019, 14:34
kreator
Чтобы не плодить ненужные темы, спрошу здесь. Есть какой-нибудь лайфхак посчитать количество записей в очереди по условию? По аналогии с записями по индексу файла/таблицы. Грубо - заменить энное количество циклов на records(бла-бла-бла).

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

Добавлено: 08 Июль 2019, 15:29
Admin
Я такого не знаю. Да и не зачем по моему.

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

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

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

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

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