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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

Изменил вывод на \\Srv31\gal810ora\exe\trash\OUT\ (у нас все отчёты в trash хранятся) вместо \\Srv31\gal810ora\exe\OUT\, т.е. с form test('OUT\%USER%\Gruppa.out') на form test('TRASH\OUT\%USER%\Gruppa.out'). Вроде как заработало. А какие права на это могут влиять?
Последний раз редактировалось BlazeBio 11 окт 2010, 11:55, всего редактировалось 1 раз.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

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

Сообщение m0p3e »

Файловые права доступа на сервере!
Зачем же в EXE времянки хранить?
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

У нас даже с полными правами у человека не формировался отчёт, только когда изменил на trash, он cмог сформировать отчёт. А как у вас хранятся отчёты? :?:
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

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

Сообщение m0p3e »

EXE только чтение для всех, кроме админов.
Под TMP отдельная папка на сервере.
OUT во временной папке пользователя. OutputFilesDirectory=%APPDATA%\GALAXY\%BaseName%\OUT
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

1 для начала - стандартные отчеты где у этого пользователя создаются?
2 у вас где?
3 есть ли setfilename в фейсе или .f в отчете?
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

edward_K писал(а):1 для начала - стандартные отчеты где у этого пользователя создаются?
2 у вас где?
3 есть ли setfilename в фейсе или .f в отчете?
1,2. У меня и у его вызываются через интефейс, посредством выбора из listbox.
3. А SetFileName не использовал. А нужно?
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

Я в отчётах новичок :-) , поэтому хотел бы узнать такое:
Есть deDoLoop и feBreak (о них скудно и не совсем понятно в доке описано) - как их правильно использовать чтоб войти в нужный цикл, перейти из цикла в цикл? И еще. Как можно указать в интерфейсе конкретное поле, в которое данный момент будет передаваться значение или это возможно только с помощью комбинаций deDoLoop и feBreak?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

читаем vipprogr.chm для PutEventById
feBreak - выйти из цикла;

feDoLoop - войти в цикл (для циклов, где требуется проверка на вход - цикл с параметром checkenter);

feTrue, feFalse - выбор альтернативы для условного оператора или выбор ветви while для оператора выбора.

там и примерчик есть с куском форм и фейса.
febreak в основном для PutEvent. Цикл с chekenter можно и не прерывать - главное пропихнуть точное число полей по этому циклу и все, а вот обычный нужно прервать в нужном месте. Смысл для обычного цикла примерно такой - как только вы в него попали, то для выхода из него нужно послать putevent(febreak), для checkenter нужно посылать для каждой итерации. Если есть несколько вложенных циклов, то управляем каждым по отдельности. А вообще уже пора изучать fastreport.
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

Пример есть и то закомичен почему-то :(

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

!  form := getForm('t', 't.out');
!  if form=nil then
!    exit;
!  for i:=1 to 10 do begin
!    form^.writeInt(i);
!  end;
!  form^.putEventById(feBreak,1);
!  GetReports(form);
"Описание

procedure PutEventById (iEvent: word, iId: word);
procedure Form_PutEventById (iEvent: word, iId: word; p : longInt);
Параметры

iEvent : word - константа события. Доступны следующие константы:

feBreak - выйти из цикла;

feDoLoop - войти в цикл (для циклов, где требуется проверка на вход - цикл с параметром checkenter);

feTrue, feFalse - выбор альтернативы для условного оператора или выбор ветви while для оператора выбора.

iId : word - идентификатор элемента формы, которому передается событие. Идентификатор элемента формы доступен в интерфейсе с префиксом fc.

p : longInt - ссылка на форму. Ссылка создается вызовом метода форм Handle."


Элемент формы - поле что-ли? Куда будет выводится, если я установлю поле fc<имя поля>?
Ну вот к примеру в випе пишу:

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

					_loop Rep(Rep12)
					   {
						   if Rep.nameline=group_line
						   {
							test.Write(Rep.namefrm);
							test.Write(Rep.Vsegofrm);
							//test.PutEvent(feBreak);
							vsegol:=vsegodec+Vsegofrm;
							}
							else
							{
								group_line:=Rep.nameline;
								vsegol:=Vsegofrm;
								test.Write(Rep.namefrm);
								test.Write(Rep.Vsegofrm);
								test.PutEventById(feBreak,fcline);
								test.Write(Rep.nameline);
							}
					  }
					  test.PutEvent(feBreak);
					  test.ShowFile('');

code]
А отчёт такой

[code].linkform 'отчёт по линии' prototype is 'test'
.group 'Итоговые по линиям' 
.set thousand separator = '`'
.fields
   podr
   vsego_p
   line
 .endfields
.var
summa_l:double
summa_1:double
summa_2:double
summa_3:double
.endvar
.fields
summa_l   
summa_1
.endfields
Количество МЦ по линиям (по плану)  
─────────────────────────────┬──────────────────────────
Линия                        │  Количество
                             │
─────────────────────────────┴──────────────────────────
.{
.begin summa_1:=0; end.
.{
.begin summa_l:=0; end.
.{
.begin summa_3:=vsego_p; summa_l:=summa_l+summa_3; end.
─────────────────────────────┬──────────────────────────
@@@@@@@@@@@@@@@@@@@@@@@      │         &'&&&'&&&'&&&'&&&
.}
.begin summa_2:=summa_l; summa_1:=summa_1+summa_2; end.
─────────────────────────────┬──────────────────────────
@@@@@@@@@@@@@@@@@@@@@@@      │     &'&&&'&&&'&&&'&&&'&&&
─────────────────────────────┴──────────────────────────
.}
────────────────────────────────────────────────────────
Всего:                       |   &&&'&&&'&&&'&&&'&&&'&&&
.}
--------------------------------------------------------
.endform
Получается, что станет вывод на поле line? А потом если я снова хочу вернутся в самый внутренний цикл?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

fc????????????? подразумевается имя цикла с checkenter - причем тут поле line? Константа будет сгенерена в процессе компиляции формы в отдельный файл и в ресурс (поэтому в проекте компилите формы перед vip).
Чтобы вернутся в цикл без checkenter вам нужно после febreak отправить столько полей в следующий, сколько содержится после и перед внутренним циклом.
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

А я думал, что циклы без названия. :-o В отдельный файл это как? Я переставил все frm вначало ничего нового не появилось. Как мне выдрать эту fc?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

сделать цикл с checkenter. Для простых PutEventByid применять не нужно - только PutEvent(febreak) и все.
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

Вставил везде checkenter. Теперь при вызове отчёт всё время пуст. Что делать?

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

Количество МЦ по линиям (по плану)  
─────────────────────────────┬──────────────────────────
Линия                        │  Количество
                             │
─────────────────────────────┴──────────────────────────
.{checkenter vsego
.begin summa_1:=0; end.
.{checkenter linia
.begin summa_l:=0; end.
.{checkenter format
.begin summa_3:=vsego_p; summa_l:=summa_l+summa_3; end.
─────────────────────────────┬──────────────────────────
@@@@@@@@@@@@@@@@@@@@@@@     f│         &'&&&'&&&'&&&'&&&
.}
.begin summa_2:=summa_l; summa_1:=summa_1+summa_2; end.
─────────────────────────────┬──────────────────────────
@@@@@@@@@@@@@@@@@@@@@@@     l│     &'&&&'&&&'&&&'&&&'&&&
─────────────────────────────┴──────────────────────────
.}
────────────────────────────────────────────────────────
Всего:                      v|   &&&'&&&'&&&'&&&'&&&'&&&
.}
--------------------------------------------------------
.endform

BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

Подключил созданный *.fnc в интерфейс по вызову отчётов.
Для заполнения сделал так.

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

					_loop Rep ordered by index Rep11
					   {
						   if Rep.nameline=group_line
						    {
							test.PutEventById(feDoLoop,fcvsego);
							test.PutEventById(feDoLoop,fclinia);
							test.PutEventById(feDoLoop,fcformat); 
							test.Write(Rep.namefrm);
							test.Write(Rep.Vsegofrm);
							test.PutEventById(feBreak,fcformat); 
							test.PutEventById(feBreak,fclinia);
							test.PutEventById(feBreak,fcvsego);
							vsegol:=vsegodec+Rep.Vsegofrm;
							}
							else
							{

							test.PutEventById(feDoLoop,fcvsego);
							test.PutEventById(feDoLoop,fclinia);
							test.Write(group_line);
							test.PutEventById(feDoLoop,fcformat); 
							test.Write(Rep.namefrm);
							test.Write(Rep.Vsegofrm);
							test.PutEventById(feBreak,fcformat); 
							test.PutEventById(feBreak,fclinia);
							test.PutEventById(feBreak,fcvsego);
							group_line:=Rep.nameline;
							vsegol:=Rep.Vsegofrm;
							}
					  }
					 test.PutEventById(feDoLoop,fcvsego);
					  test.PutEventById(feDoLoop,fclinia);
					  test.Write(group_line);
						test.PutEventById(feBreak,fcformat); 
						test.PutEventById(feBreak,fclinia);
						test.PutEventById(feBreak,fcvsego);
					  test.PutEventById(feDoLoop,fcvsego);
					  test.PutEventById(feBreak,fcvsego);
					  test.ShowFile('');
Выводятся значения по форматам, по линиям. А вычисляемое поле в linkform с "Всего: v| ..."не выводит вообще, даже нулевое. Исходник отчёта описан выше. Что я упустил? :-(
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

Не варит мозг, запарился

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

.linkform 'Economist1' prototype is 'SF'
.NameInList 'XXX'
.group 'EconomistForm'
.p 64
...
.var
  lostOpravka, lostKercontrol, lostSortnost:double;
endvar.
...
.create view plan as select
  sfplan.*
;
.begin
...
   TblClearBuffer(tblColl);

    TblSFComp(tblColl, nrecColl, mcGrNrec)      
    TblSFComp(tblColl, nrecMC, mcNrec)
    TblSFComp(tblColl, cnrecPers, sfmclistCsfperson)
 
    if tsOk=plan.getfirst sfplan where ((mcNrec == sfplan.cmc and Year(StrToDate(d1,'DD/MM/YY'))==sfplan.yearmc and Month(StrToDate(d1,'DD/MM/YY'))==sfplan.monthmc )) 
    {
    TblSFDouble(tblColl, lostOpravka, plan.sfplan.opravka);      
    TblSFDouble(tblColl, lostKercontrol,plan.sfplan.kercontrol); 
    TblSFDouble(tblColl, lostSortnost, plan.sfplan.sortnost);    
    }
...
end.
.}
выводя последние три поля пустыми в отчёт, хотя если проверить условие в *.vip, то всё работет, а тут в *.frm никак(
Ответить