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

Можно ли совместить две очереди посредством референса?

Добавлено: 08 Август 2014, 15:58
kreator
С8.0.9759. Есть типовая очередь:

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

GLO:ReportQueue      QUEUE,TYPE,PRE()
GLO:RQField1           STRING(255)
GLO:RQField2           STRING(255)
GLO:RQField3           STRING(255)
GLO:RQField4           STRING(255)
GLO:RQField5           STRING(255)
GLO:RQField6           STRING(255)
GLO:RQField7           STRING(255)
GLO:RQField8           STRING(255)
GLO:RQField9           STRING(255)
GLO:RQField10          STRING(255)
GLO:RQField11          STRING(255)
GLO:RQField12          STRING(255)
GLO:RQField13          STRING(255)
GLO:RQField14          STRING(255)
GLO:RQField15          STRING(255)
GLO:RQField16          STRING(255)
GLO:RQField17          STRING(255)
GLO:RQField18          STRING(255)
GLO:RQField19          STRING(255)
GLO:RQField20          STRING(255)
                     END
Есть процедура Отчёта (стандартная), отчёт строится по локальной очереди, которая описана так:

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

LOC:Queue            GLO:ReportQueue
Но данные формируются в другой процедуре, и передаются в процедуру отчёта через заголовок (очередь Q, описанная также, как и локальная LOC:Queue). То, что данные передаются, я проверил. Хотелось бы не перегонять данные из Q в LOC:Queue, а сделать банальный референс. Но вот так не идёт:

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

LOC:Queue &= Q
Что не так я делаю?

Re: Можно ли совместить две очереди посредством референса?

Добавлено: 08 Август 2014, 16:13
Дед Пахом
LOC:Queue &GLO:ReportQueue

Re: Можно ли совместить две очереди посредством референса?

Добавлено: 08 Август 2014, 16:33
kreator
Дед Пахом писал(а):LOC:Queue &GLO:ReportQueue
Так программа вылетает по Exception при вызове отчёта. GLO:ReportQueue - Type, и её не существует, видимо, и ссылка на неё не имеет смысла, наверно.

Re: Можно ли совместить две очереди посредством референса?

Добавлено: 08 Август 2014, 16:50
Admin
Q как описана?
Должна быть по моему как (*GLO:ReportQueue Q)

Re: Можно ли совместить две очереди посредством референса?

Добавлено: 08 Август 2014, 18:35
Дед Пахом
kreator писал(а):
Дед Пахом писал(а):LOC:Queue &GLO:ReportQueue
Так программа вылетает по Exception при вызове отчёта. GLO:ReportQueue - Type, и её не существует, видимо, и ссылка на неё не имеет смысла, наверно.
Ну правильно, вылетает, раз ты не написал присвоение LOC:Queue &= Q внутри процедуры.

Re: Можно ли совместить две очереди посредством референса?

Добавлено: 11 Август 2014, 10:11
kreator
Дед Пахом писал(а):Ну правильно, вылетает, раз ты не написал присвоение LOC:Queue &= Q внутри процедуры.
Написал, но вылетает ещё до этого присвоения.
Admin писал(а):Q как описана?
Должна быть по моему как (*GLO:ReportQueue Q)
GLO:ReportQueue Q. Очереди всегда передаются по адресу, звёздочка не нужна. И я проверил - с Q всё в порядке.
Меня всё же смущает вот такое объявление:

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

LOC:Queue            &GLO:ReportQueue                      
В хелпе вот такой пример:

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

Queue1  QUEUE
ShortVar  SHORT
LongVar1  LONG
LongVar2  LONG
       END

QueueRef  &QUEUE               !Reference a QUEUE, only

Queue1Ref &Queue1              !Reference to a QUEUE defined exactly as Queue1, only

LongRef   &LONG                !Reference a LONG, only

LongRef2  &LONG                !Reference a LONG, only

CODE

QueueRef &= Queue1            !Assign QUEUE reference

Queue1Ref &= Queue1           !Assign QUEUE reference

IF Queue1Ref &= QueueRef      !Are they referencing the same QUEUE?

 MESSAGE('Both Pointing at same QUEUE')

END

IF SomeCondition              !Evaluate some condition

 LongRef &= Queue1.LongVar1   !and reference an appropriate variable

ELSE

 LongRef &= Queue1.LongVar2

END

LongRef += 1                  !Increment either LongVar1 or LongVar2

                              !depending upon which variable is referenced

IF LongRef2 &= NULL           !Detect unreferenced reference variable and 

 LongRef2 &= LongRef          !create a second reference to the same data

END

LongRef &= ADDRESS(Queue1.LongVar1)   !Reference assign the address of

                                      !a simple data type

Ни о чём.

Re: Можно ли совместить две очереди посредством референса?

Добавлено: 11 Август 2014, 16:17
Дед Пахом
не пойму, такая проблема найти, где к Loc:Queue идёт обращение, и перед этим присвоить ей нужную очередь?

Re: Можно ли совместить две очереди посредством референса?

Добавлено: 11 Август 2014, 20:03
PavelNK
где исходники?

Re: Можно ли совместить две очереди посредством референса?

Добавлено: 12 Август 2014, 9:59
kreator
Решил проблему, отказался от LOC:Queue. Откуда, вообще, выросла проблема? Clarion (в частности, С8.0) не видит переменных, передаваемых через заголовок. Мало того, что в дизайнере не видит (в дизайнере отчётов, например), но и при компиляции ругается. Решил использовать локальную переменную. Теперь вернул всё взад, и ни на что не ругается. Такая же фигня происходит, когда ввожу новые глобальные переменные, Clarion их не видит (в редакторе, например), приходится работать через панель "Data/Tables". Через некоторое время эти переменные становятся видимыми в редакторе. Резюме. Надо переползать с восьмёрки, срочно. А то - вроде, мелкая проблема, а времени теряется масса.