Доступ к очереди из процедуры

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Доступ к очереди из процедуры

Сообщение Игорь Столяров »

Привет всем ! :)

Подскажите пожалуйста, а в чём может быть проблема c чтением очереди
из процедуры или это в принципе некорректный код ?

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

 Map
   GetMyQueue(*Queue,*String)
 end

MyQueue Queue
Field String(3)
  end
  
  Code
  
  MyQueue.Field = 'AAA'
  Add(MyQueue,MyQueue.Field) 
  ...
  MyQueue.Field = 'AAA'
  Get(MyQueue,MyQueue.Field) 
  If ErrorCode() then Message('Ошибка').  ! Всё пучком, ошибок нет
  ...
  GetMyQueue(MyQueue,MyQueue.Field)
  
GetMyQueue  Procedure(xQueue,xField)
  Code
  xField = 'AAA'
  Get(xQueue,xField) 
  If ErrorCode() then Message('Ошибка').  ! Ошибка ! Почему ??!! :(   
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Доступ к очереди из процедуры

Сообщение Дед Пахом »

Игорь Столяров писал(а): 19 Июнь 2019, 21:33Get(xQueue,xField)
Вот это вот читает очередь по индексу, фактически получается Get(xQueue, 0).
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Доступ к очереди из процедуры

Сообщение Игорь Столяров »

Дед Пахом писал(а): 19 Июнь 2019, 21:48читает очередь по индексу, фактически получается Get(xQueue, 0).
Судя по результату - да, поле воспринимается как значение.
Но ведь в процедуру передаётся ссылка на поле очереди … :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

Доступ к очереди из процедуры

Сообщение vic7tar »

Немножко переделал исходный пример:

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

  PROGRAM

 Map
   GetMyQueue(*Queue, *any, long)
 end

MyQueue Queue
Field String(3) 
num   long.
  
  Code
  
  MyQueue.Field = 'AAA' ; MyQueue.num = 1 ;Add(MyQueue) 
  MyQueue.Field = 'BBB' ; MyQueue.num = 2 ;Add(MyQueue) 
  MyQueue.Field = 'CCC' ; MyQueue.num = 3 ;Add(MyQueue) 
  MyQueue.Field = 'DDD' ; MyQueue.num = 4 ;Add(MyQueue) 
!  ...
  MyQueue.Field = 'BBB'
  Get(MyQueue,MyQueue.Field) 
  If ErrorCode() then Message('Ошибка').  ! Всё пучком, ошибок нет
!  ...
  GetMyQueue(MyQueue, MyQueue.Field , 1)  ; message('Field=' & MyQueue.Field & '  num=' & MyQueue.num) 
  GetMyQueue(MyQueue, MyQueue.num   , 2)  ; message('Field=' & MyQueue.Field & '  num=' & MyQueue.num)

  
GetMyQueue  Procedure(xQueue, xField, vub)

  Code

  case vub
     of 1 ; xField = 'AAA'
     of 2 ; xField = 4
  end

  Get(xQueue, who(xQueue, where(xQueue,xField))) 
  If ErrorCode() then Message('Ошибка').  

C10, Win10x64
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Доступ к очереди из процедуры

Сообщение Игорь Столяров »

Наверно, всё-таки читать очередь по полю можно только при добавлении записей с сортировкой
по этому полю (или явным выполнением операции SORT(QUEUE,QUEUE.FIELD)) перед чтением ?

Идею с Get(xQueue, who(xQueue, where(xQueue,xField))) - понял, спасибо, проверю !
Если работает - то это решает вопрос. :)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Доступ к очереди из процедуры

Сообщение kreator »

У меня вот такой вопрос. А как процедура должна догадаться о структуре очереди? Предполагаю, что поскольку процедура ничего об этом не знает get идёт по пойнтеру.
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Доступ к очереди из процедуры

Сообщение Yufil »

1. Для поиска по ключу вовсе не обязательно сортировать очередь.
2. Есть форма get с идентификатором строки
GET( MyQueue, '+MyQueue.Field' )
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4550
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Доступ к очереди из процедуры

Сообщение finsoftrz »

Ага, если делать get по другим полям, отличным от физической сортировки, автоматически формируется альтернативная сортировка по этим полям. Что-то наподобии индекса. Но это с какой-то версии клариона стало. В clarion6 работает.
C6/C11, ШВС, tps/btrieve.
Ответить