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

Clarion, Clarion 7

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

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

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

Сообщение Игорь Столяров » 19 Июнь 2019, 21:33

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

Подскажите пожалуйста, а в чём может быть проблема 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('Ошибка').  ! Ошибка ! Почему ??!! :(   
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2299
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

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

Сообщение Дед Пахом » 19 Июнь 2019, 21:48

Игорь Столяров писал(а):
19 Июнь 2019, 21:33
Get(xQueue,xField)
Вот это вот читает очередь по индексу, фактически получается Get(xQueue, 0).
С уважением, ДП

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

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

Сообщение Игорь Столяров » 19 Июнь 2019, 22:04

Дед Пахом писал(а):
19 Июнь 2019, 21:48
читает очередь по индексу, фактически получается Get(xQueue, 0).
Судя по результату - да, поле воспринимается как значение.
Но ведь в процедуру передаётся ссылка на поле очереди … :(
«V» значит Вендетта !

Аватара пользователя
vic7tar
Старожил
Сообщения: 240
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar » 20 Июнь 2019, 0:12

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

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

  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

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

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

Сообщение Игорь Столяров » 20 Июнь 2019, 6:13

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

Идею с Get(xQueue, who(xQueue, where(xQueue,xField))) - понял, спасибо, проверю !
Если работает - то это решает вопрос. :)
«V» значит Вендетта !

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

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

Сообщение kreator » 20 Июнь 2019, 11:05

У меня вот такой вопрос. А как процедура должна догадаться о структуре очереди? Предполагаю, что поскольку процедура ничего об этом не знает get идёт по пойнтеру.
We are hard at work… for you. :)

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

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

Сообщение Yufil » 20 Июнь 2019, 11:13

1. Для поиска по ключу вовсе не обязательно сортировать очередь.
2. Есть форма get с идентификатором строки
GET( MyQueue, '+MyQueue.Field' )

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1298
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz » 20 Июнь 2019, 11:53

Ага, если делать get по другим полям, отличным от физической сортировки, автоматически формируется альтернативная сортировка по этим полям. Что-то наподобии индекса. Но это с какой-то версии клариона стало. В clarion6 работает.
Рязань решает.

Ответить