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

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

Добавлено: 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('Ошибка').  ! Ошибка ! Почему ??!! :(   

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

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

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

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

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

Добавлено: 20 Июнь 2019, 0: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('Ошибка').  


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

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

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

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

Добавлено: 20 Июнь 2019, 11:05
kreator
У меня вот такой вопрос. А как процедура должна догадаться о структуре очереди? Предполагаю, что поскольку процедура ничего об этом не знает get идёт по пойнтеру.

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

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

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

Добавлено: 20 Июнь 2019, 11:53
finsoftrz
Ага, если делать get по другим полям, отличным от физической сортировки, автоматически формируется альтернативная сортировка по этим полям. Что-то наподобии индекса. Но это с какой-то версии клариона стало. В clarion6 работает.