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

Ard отчет и табличка в памяти

Добавлено: 02 мар 2004, 15:50
Spvl
Подскажите ....
В интерфейсе объявлена таблица в памяти
Строчки в ней заполняются и все это в бровсе показывается. Это все работает
Проблема встала напечатать ARD отчет по этой таблице.
При компиляции отчета он ругается что таблици нет в словаре.
Подскажите собственно как правильно все это организовать.

Re: Ard отчет и табличка в памяти

Добавлено: 02 мар 2004, 16:59
m0p3e
В поиск...

Re: Ard отчет и табличка в памяти

Добавлено: 02 мар 2004, 17:01
Deinis
Объяви ее не в интерфейсе, а в проекте.
Если проекта нету, то точно не знаю можно ли, но попробуй объявить непосредственно в форме.
Например, весь мой ARD-отчет содержит следующие строки

.Begin
// Очистим все временные таблицы и подготовим их для работы в отчете
RunInterface('MyInit_tTables');

// Получим параметры, необходимые для работы отчета
RunInterface('GetReportParam' , PickPlansSch , Schet , ShortSchet , SubSchet , IsNeedSubSchet , BeginDate , EndDate);

// Заполним временную таблицу теми организациями
RunInterface('MyPutOrg');

// Вытащим данные из проводок
RunInterface('My_Oborot',ShortSchet,SubSchet,IsNeedSubSchet,BeginDate,EndDate);

// Выведем данные в отчет
RunInterface('MyProcessDoc',ShortSchet,SubSchet,IsNeedSubSchet,BeginDate,EndDate);

// Очистка и ликвидация временных таблиц из памяти
RunInterface('MyClear_tTables_Dogov');
End.

В начале работы отчета сделай запуск фейса, инициализирующего таблицы в памяти (Init_tTables) с записями типа mtChangeRefCount( #tPlansSch, 1 ); и т.д.
В конце работы отчета сделай запуск фейса, инициализирующего таблицы в памяти (Clear_tTables) с записями типа mtChangeRefCount( #tPlansSch, -1 ); и т.д.

Я писал об этом (да и не я один, поищи на форуме, не поленись):
http://tyumbit.ru/galaktika/read.php?f=6&i=2468&t=2466

Re: Ard отчет и табличка в памяти

Добавлено: 02 мар 2004, 19:12
sth
Деинис прав, объявляй на уровне проекта, в форме не получится.
Еще вариант - в интерфейсе сложи из таблицы в памяти все в какую-нибудь временную таблицу словаря и уже оттуда выковыривай в отчет. Правда помимо очевидного замедления работы при таком подходе, придется еще искать подходящую таблицу в словаре :)
Так что объявление на уровне проекта - самое то.

Re: Ard отчет и табличка в памяти

Добавлено: 07 апр 2004, 11:43
hope
Объясните, пожалуйста, что это за функция mtChangeRefCount? где можно про нее почитать?
и как ее использовать?
Если возможно: с примером.
Спасибо!

Re: Ard отчет и табличка в памяти

Добавлено: 07 апр 2004, 12:17
Deinis
http://tyumbit.ru/galaktika/read.php?f=6&i=2468&t=2466
Если вы что-то делаете с данными в ТП в своем фейсе, знайте, что после закрытия этого своего фейса данные "грохнутся". То есть таблица-то, если она объявлена для всего проекта, видна будет (компилятор не будет ругаться на отсутствие таблицы в словаре), но будет совсем пустой. Чтобы данные не "грохнулись" надо в конце фейса выполнить:
mtChangeRefCount( #tPlansSch, 1 );
Однако, чтобы эти таблицы были ликвидированы ПОСЛЕ окончания всей работы всех фейсов, использующих эту таблицу, обязательно надо выполнить в последнем интерфейсе:
mtChangeRefCount( #tPlansSch, -1 );
Функция mtChangeRefCount меняет кол-во счетчика ссылок на экземпляр ТП.
При значении счетчика <=0 экземпляр ТП удаляется.
Об этом написано в доке по ТП. Сама дока выложена в разделе "Опыт" :)

Re: Ard отчет и табличка в памяти

Добавлено: 08 апр 2004, 10:43
hope
Спасибо за наводку!

Re: Ard отчет и табличка в памяти

Добавлено: 08 апр 2004, 17:44
Vitas
Ох, ну зачем все эти сложности?
Можно ведь написать прототип, привязать его к фейсу, который заполняет ТП и выгружать из этого вейса все это дело в свой прототип. Ну естественно написать линковые формочки. И не нужны ни какие ард-отчеты :))

Re: Ard отчет и табличка в памяти

Добавлено: 08 апр 2004, 18:12
Deinis
Vitas, а можно поподробнее?
Как видно, должно быть задействовано 2 прототипа. Как такую структуру организовать? Как запускать? И пример еще (пусть самый небольшой) :)

Re: Ard отчет и табличка в памяти

Добавлено: 09 апр 2004, 09:20
Vitas
Где видно, что должно быть задействовано два прототипа? :)
//Пример:
//Описание формы

.form test
.fields
user
.endfields
Список пользователей системы
.{
^
.}
.endform
//Интерфейс

interface testForm doaccept;
create view
var x:integer;
as select * from X$USERS;
form test('test.out');
handleEvent
cmInit:
{
x:=testForm.GetFirst;
if x=0 then
test.Write(xu$FullName);
if x=0 then begin
while x=0 do begin
x:=testForm.GetNext;
if x=0 then
test.Write(xu$FullName);
end;
end;
test.PutEvent(feBreak);
test.ShowFile('');
}
end;
end.

А вообще посмотри описание методов форм для интерфейсов и по объекту TForm посмотри.

Re: Ard отчет и табличка в памяти

Добавлено: 09 апр 2004, 12:42
Deinis
>> Где видно, что должно быть задействовано два прототипа? :)

Из фразы: :D
>> Можно ведь написать прототип,...
1-й прототип
>>привязать его к фейсу, который заполняет ТП и выгружать из этого вейса все это дело в свой прототип...
2-й прототип

Однако, теперь ясно. Спасибо за пример и за наводку. :)
Можешь еще пояснить, как и где запускать свои отчетные формы? В каком месте они станут видны?

Re: Ard отчет и табличка в памяти

Добавлено: 09 апр 2004, 12:56
hope
только в Рабочем месте пользователя

Re: Ard отчет и табличка в памяти

Добавлено: 09 апр 2004, 15:31
Vitas
Ну во-первых, разговор шел об одном и том же прототипе :)

Во вторытх, фейс можно подрубить в рабочем месте пользователя, или написать ард-шник, в котором будет только вызываться твой фейс и тогда можно запускать из списка ард-отчетов.

Линковые формы будут видны из твоего фейса. В данно примере сразу при инициализации фейса, но можно приципить как к событиям кнопок так и к событиям из статус-строки, например к cmPrintDoc