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

Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 11:55
BlazeBio
У меня такой код

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

.form test
.fields
   podr  
   vsego
.endfields
Количесвто МЦ по плану
--------------------------------------------------------
Мат. ценность                         |  Количество
--------------------------------------------------------
.{------------------------------------------------------
! начало цикла по номеру склада
.{======================================================
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   |  @@@@@@@@@@
======================================================  
.}
------------------------------------------------------

! Конец цикла по номеру склада
!Всего:                              | @@@@@@@@@@@@
.}
.endform

.linkform 'Itogi' prototype is 'test'
.fields
podr
vsego  
.endfields
.var   
summa_1:double   
.endvar
.fields   
summa_1
.endfields
Количесвто МЦ по плану
--------------------------------------------------------
Мат. ценность                |  Количесвто
                             |
--------------------------------------------------------
.{--------------------------------------------------------
! начало цикла по номеру склада
.begin  summa_1:=summa_1+vsego;  end.
.{========================================================
@@@@@@@@@@@@@@@@@@@@@@@      |  @@@@@@@@@@@@@@@@
========================================================
.}
--------------------------------------------------------
.}
! Конец цикла по номеру склада
Всего:                       |@@@@@@@@@@@@@@@@@@
.endform
В интерфейсе описание и вызов такие

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

form Itogi("Itogi.out");

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

		cmReport:
		{
		   var summa:double;
		   _loop ppspecif where((pptitle.atl_nrec==ppspecif.cpptitle))
		   {
			if getfirst ppkatstan where((ppspecif.cppkatstan==ppkatstan.atl_nrec))=tsok
			{
				Itogi.Write(ppkatstan.name);			
			}
			    summa:=ppspecif.Fdec+ppspecif.Sdec+ppspecif.Tdec; 
			    Itogi.Write(summa);
		   }
		   Itogi.PutEvent(feBreak);
		   Itogi.PutEvent(feBreak);
		   Itogi.ShowFile('');
		}
При нажатии кнопки cmReport вылазит окно отчетов, где надпись "Видимых отчетов нет".
Если вызывать форму-прототип, то открывается сразу же отчет, но в форме прототипе у меня не получается объявить переменную, описанную в форме-прототипе, полем, компилятор ругается, что переменную. нельзя объявить полем. В доке не очень понятно всё описано. Там пример вызова только для формы прототипа.

Поммогите разобраться как правильно вызвать из интерфейса отчет?

Re: Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 12:02
m0p3e
прототип называется test, а в интерфейсе поток пишется в Itogi.

Re: Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 12:17
BlazeBio
Как организовать этот поток?(я в отчетах плаваю :grin: )

Re: Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 12:34
m0p3e
form test('OUT\%USER%\itogi.out');
или
form Itogi('OUT\%USER%\itogi.out',test);

Re: Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 13:32
BlazeBio
Сделал form test('OUT\%USER%\itogi.out'). Появилось два отчёта test и Itogi. Открыл Itogi. Но итоговая сумма "Всего 0". Почему?

Re: Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 14:09
BlazeBio
Почему-то работает отчет Itogi, если описать его так.

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

.linkform 'Itogi' prototype is 'test'
.fields
podr
vsego  
.endfields
.var   
summa_1:double
summa_2:double   
.endvar
.fields   
summa_1
.endfields
Количестыо МЦ по плану(линкформ)
--------------------------------------------------------
Мат. ценность                |  Количество
                             |
--------------------------------------------------------
!.begin summa_1:=22222; end.
!--------------------------------------------------------
.begin summa_1:=0; end.
.{
! начало цикла по номеру склада
.{
!.begin  summa_1:=summa_1+vsego;  end.
.begin summa_2:=vsego; summa_1:=summa_1+summa_2; end.
========================================================
@@@@@@@@@@@@@@@@@@@@@@@      |  @@@@@@@@@@@@@@@@
.}
========================================================
.}
--------------------------------------------------------
! Конец цикла по номеру склада
!.begin summa_1:=summa_1+vsego; end.
Всего:                       |@@@@@@@@@@@@@@@@@@
.endform
Всё формируется нормально. Но, если не формировать отчёт, а нажать "закрытие окна" (в простонародье крест) или кнопку escape, то повторно кнопка(cmReport) не хочет открываться . Всё снова работает, если закрыть и открыть интерфейс с кнопкой cmReport заново.
Почему происходит такое "залипание", вызывается же другой интерфейс с отчётами?

Re: Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 15:39
edward_K
В начале(даже не вывода, а сбора информации - чтобы пользователь не ждал появления окна со списком отчета)
outf.reinit
if outf.error
{ message('отчет не выбран!')
exit;
}

Re: Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 15:43
edward_K
суммирование кстати не работает потому как идет ошибка преобразования строки в double. В прототипе лучше vsego описать как double или суммировать как double(trim(vsego)).

Re: Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 16:30
BlazeBio
Компилятор ругается, что нет такого поля или метода outf.reinit. Как быть? :?:

Re: Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 17:21
edward_K
outf замените на Itogi - слегка ж надо додумывать. В 90% в текстах галки идет именно Outf - но это ж всего лишь название класса. А ссылку на этот класс можно даже передавать в другой фейс

Re: Как правильно вызвать отчет?

Добавлено: 04 окт 2010, 17:33
BlazeBio
Заменил outf на test. Всё заработало :)

Re: Как правильно вызвать отчет?

Добавлено: 07 окт 2010, 12:23
BlazeBio
У меня почему-то при повторном вызове отчёта, суммируются данные. И так сколько вызовешь столько и суммирует. Может где-то нужно почистить что-нибудь вроде буффера?

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

cmRep:
{			   test.SetGroup('Итоговые по МЦ'); 
			 	   	   test.reinit;
						if test.error
						{ message('отчет не выбран!')
						exit;
						}
						var summa:double;
						_loop ppspecif where((wnrec==ppspecif.cpptitle))
						{
						 _loop ppkatstan where((ppspecif.cppkatstan==ppkatstan.atl_nrec))
						 {
							 vsegodec:=ppspecif.Fdec+ppspecif.Sdec+ppspecif.Tdec;
						     test.Write(ppkatstan.name);
							 test.Write(vsegodec);
						 }
						}
						test.PutEvent(feBreak);
						test.ShowFile('');
}

Re: Как правильно вызвать отчет?

Добавлено: 07 окт 2010, 13:08
BlazeBio
Ой, не то глянул :oops: .Это работает, просто забыл подчистить временную таблицу (она не в этой части).

Re: Как правильно вызвать отчет?

Добавлено: 11 окт 2010, 11:14
BlazeBio
Не найден файл \\srv31\gal810ora\EXE\OUT\alenichevasv\Gruppa.out

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

Re: Как правильно вызвать отчет?

Добавлено: 11 окт 2010, 11:36
m0p3e
А у вас временные файлы в EXE хранятся и все пользователи имеют туда доступ на запись???