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

Отчеты в FastReport

Добавлено: 24 мар 2010, 14:03
Nikos
Добрый день!
Необходимо разработать печатную форму накладной на отпуск в производство с итогами по странице, а также возможностью указывать комиссию. Т.к. нужны итоги по странице, то решил использовать FastReport, а т.к. комиссии в потоке нет, то создавать поток через свой интерфейс. FRM:

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

.LinkForm 'AktSpis_FR' Prototype is 'MANUFNAKL'
.NameInList 'Акт на списание из производства (FastReport)'
.{
.begin
  RunInterface(AktSpisFRReport, KATSOPRNREC);
  MANUFNAKL.fExit;
end.
.{
.if EXISTNAMELONG
.else
.end
.{
.}
.}
.}
.endform
И собственно сам интерфейс:

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

TABLE STRUCT LOCAL KOMISSIA "Комиссия"(
  DOLZ   : STRING
, NAME   : STRING
);

Interface AktSpisFRReport;

create view mainView
var
  nrecsopr : string;
  com : Commission;
  kolkom : word;
as select * from KATSOPR, SPSOPR, KATMC, KOMISSIA, KATED, KATMOL
where ((
    comp(nrecsopr)   == KATSOPR.NREC
And KATSOPR.CMOLFROM == KATMOL.NREC
And KATSOPR.NREC     == SPSOPR.CSOPR
And SPSOPR.CMCUSL    == KATMC.NREC
And KATMC.CED        == KATED.NAME
));

parameters
  nrecsopr;

datastream MainStream
  (
    [NameOrg]      sGetTune('MyOrg');
    [NUMSOPR]      KATSOPR.NSOPR;
    [DATSOPR]      KATSOPR.DSOPR;
    [FROM_FIO_MOL] KATMOL.NAME;

    table SPSOPR
    (
      [SOPRNREC] SPSOPR.NREC;
      [NAME_TOVAR] KATMC.NAME;
      [NOMENKL]  KATMC.BARKOD;
      [ED_IZM]  KATED.NAME;
      [PRICE]  SPSOPR.PRICE;
      [KOL_FACT]  SPSOPR.KOL;
      [SUMMA] SPSOPR.PRICE * SPSOPR.KOL;
    );

    table KOMISSIA
    (
      [DOLZKOM] KOMISSIA.DOLZ;
      [FIOKOM]  KOMISSIA.NAME;
    );
  )

end;

  handleEvent
    cmInit:
    {
      delete all KOMISSIA;
      LoadVipInterface(com);
      com.InitCommission(501);
      com.ClearSelection;
      com.RunWindowSelection(1);
      if (com.GetSelection <> comp(0))
      {
        if (com.GetCommissionChairMan)
        {
          insert into KOMISSIA set
            NAME := com.GetComponentFIO(0),
            DOLZ := com.GetComponentPost(0);
        }

        kolkom := com.GetComponentsCount;
        if (kolkom >= 1)
        {
          insert into KOMISSIA set
            NAME := com.GetComponentFIO(1),
            DOLZ := com.GetComponentPost(1);
        }
        if (kolkom >= 2)
        {
          insert into KOMISSIA set
            NAME := com.GetComponentFIO(2),
            DOLZ := com.GetComponentPost(2);

        }
        if (kolkom >= 3)
        {
          insert into KOMISSIA set
            NAME := com.GetComponentFIO(3),
            DOLZ := com.GetComponentPost(3);
        }
        if (kolkom >= 4)
        {
          insert into KOMISSIA set
            NAME := com.GetComponentFIO(5),
            DOLZ := com.GetComponentPost(5);
        }
      }

      //nrecsopr := '100000001B733h';
      if tsOk = GetFirst KATSOPR {};
      RunFReport(MainStream, '', false);
      Abort;
    }
  end;

end.
Почти все получилось, осталось 2 проблемы.
1. Если отчет формировать, то все красиво - предлагается выбрать комиссию, затем форму в FastReport, которая формируется. Если же попытаться отредактировать отчет в FastReport (F4), то все зависает - появляется окошко от frm-ки про формирование отчета и помогает только снятие процесса.
2. Как в самом отчете FastReport сделать, чтоб второй MasterData (с комиссией) печатался в самом конце, после всех итогов? Я итоги по странице печатаю в PageFooter, общие итоги - в ReportSummary.

Добавлено: 24 мар 2010, 16:57
LaaLaa
1) Интересный дефект. Записал ПИР 102.96748. Позже посмотрю.

Может дело в том что длинная цепочка запуска VIP-FCOM-LinkForm-VIP-FR модальный дизайнер. Где-то что-то зацикливается.

Попробуйте сократить цепочку. Для того чтобы дизайнировать отчет вызываете AktSpisFRReport через запуск внешнего интерфейса.

2) читайте здесь http://www.tyumbit.ru/gal_forum/viewtopic.php?t=10332

Добавлено: 25 мар 2010, 08:15
Nikos
1. Я так и настраивал отчетные формы, просто если бы не было зависания, то было бы удобнее.
2. С помощью этой статьи я добавил итоги по странице, а вот как добавить комиссию не понял. Сейчас еще раз внимательно прочитаю. Спасибо.

Re: Отчеты в FastReport

Добавлено: 06 май 2011, 11:19
Алексей
Создаю отчет в FR, в редакторе делаю groupheader и ствалю у него свойство "разворачиваемый".
Пока стою в редакторе и проверяю - все замечательно выводится, в отчете нажимаю на группу - она разворачивается.

После сборки в ресурс получаю отчет, жму на группу и пустой экран, только заголовок формы.
Если зайти по ф4 в редактирование и не меняя ничего получить отчет - разворачивание работает.

У кого-нибудь было так? И что делать?

Re: Отчеты в FastReport

Добавлено: 06 май 2011, 12:08
LaaLaa
Алексей писал(а):Создаю отчет в FR, в редакторе делаю groupheader и ствалю у него свойство "разворачиваемый".
Пока стою в редакторе и проверяю - все замечательно выводится, в отчете нажимаю на группу - она разворачивается.

После сборки в ресурс получаю отчет, жму на группу и пустой экран, только заголовок формы.
Если зайти по ф4 в редактирование и не меняя ничего получить отчет - разворачивание работает.

У кого-нибудь было так? И что делать?
Какая версия FReport3.dll у вас установлена?

Попробуйте последнюю версию 8.10.29 ftp://ftp.galaktika.ru/pub/support/gala ... 810290.acd
И более древнюю версию 8.10.26 http://www.onlinedisk.ru/file/657817/

Re:

Добавлено: 06 май 2011, 12:14
LaaLaa
К стати Nikos забыл Вам сообщить, что ПИР 102.96748 "Все зависает если отредактировать отчет FastReport запущенный из FCOM". Решен в текущей версии FReport3.dll 8.10.29. Можете тоже попробовать.

Re: Отчеты в FastReport

Добавлено: 06 май 2011, 12:43
Алексей
LaaLaa писал(а):
Алексей писал(а):Создаю отчет в FR, в редакторе делаю groupheader и ствалю у него свойство "разворачиваемый".
Пока стою в редакторе и проверяю - все замечательно выводится, в отчете нажимаю на группу - она разворачивается.

После сборки в ресурс получаю отчет, жму на группу и пустой экран, только заголовок формы.
Если зайти по ф4 в редактирование и не меняя ничего получить отчет - разворачивание работает.

У кого-нибудь было так? И что делать?
Какая версия FReport3.dll у вас установлена?

Попробуйте последнюю версию 8.10.29 ftp://ftp.galaktika.ru/pub/support/gala ... 810290.acd
И более древнюю версию 8.10.26 http://www.onlinedisk.ru/file/657817/
стоит 28-я версия. на 26 и 29 то же самое... :(

Re: Отчеты в FastReport

Добавлено: 07 май 2011, 06:35
LaaLaa
Алексей писал(а):стоит 28-я версия. на 26 и 29 то же самое... :(
В таком случае нужен доступ к телу пациента (коду отчета), вскрытие покажет.

Re: Отчеты в FastReport

Добавлено: 12 май 2011, 06:53
Алексей
да я закоментил уже весь код в отчёте :) там был то подсчет итожков чтобы вверху выводилась цифра и сам бэнд был разворачиваемый
вот код

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

var total: string;
    
procedure GroupHeader4OnBeforePrint(Sender: TfrxComponent);
begin
  if Engine.FinalPass then                                                           
  total := Get(<t02041."ldv">);                                                      
end;

procedure GroupFooter4OnBeforePrint(Sender: TfrxComponent);
begin
    Set(<t02041."ldv">,SUM(<t02041."summa">,Mdata,1));
end;  

begin
end.
попробуйте кто-нибудь в любом ФР отчёте сделать groupheader разворачиваемый. Это когда отчет получается, жамкаешь на группу и только после этого она показывает содержимое. (правая кнопка на groupheader и галочку напротив "разворачиваемый").
Вот на стадии редактирования и проверки отчёте - всё работает. А после упаковки в ресурс - при нажатии на строку бэнда - пустой экран и только заголовок формы...
упаковывал и випером 5.4.35 который и frres.exe той же серии. мы пока не обновлялись просто.
ДЛЛ указанные выше тоже пробовал разных версий.

Re: Отчеты в FastReport

Добавлено: 12 май 2011, 10:58
LaaLaa
Алексей Вы уверены что в Галактику в итоге попадает ваш финальный вариант модифицированной формы, а не из какого то другого ресурса промежуточный вариант

Проверьте:
1) соответствует ли имя файла вашей форы шаблону <компонент>!!<интерфейс> <поток> название формы.fr3 - может вы перемименовали файл и финальный шаблон не цепляется

2) Убедитесь что формы действительно упаковались, в частности випер в окне сообщений выводит перечень упакованых форм (синими буквами) в случае успеха.
(например известный дефект утилиты упаковки форм frres.exe, она не добавляет файлы в ресурс, если путь заканчивается символом \)

3) что полученный ресурс действительно подключен к репозитарию галактики с правильным приоритетом

4) покрасьте отчет в желтый цвет, скомпилируйте подключите к Галактке, убедитесь что правильно все подключено.

Re: Отчеты в FastReport

Добавлено: 12 май 2011, 11:03
LaaLaa
Если все подключено правильно. Установите обновление FREPORT3.dll версии 8.10.29 и проведите дополнительный тест:
Инструкция для проведения дополнительных тестов

1) На рабочем месте, где воспроизводится проблема,
добавить в файл конфигурации galnet.cfg следующие строки:

{FastReport}
LogConnection = 'file(append="true", filename="D:\путь\FReport4Trace.sil")';
HighResolution = on;

2) Запустить Галактику. Выполнить действия, приводящие к ошибкам.

3) В момент формирования отчетов будет включен отладочный протокол FastReport.
Будет выдано соответствующее предупреждение.

4) После завершения теста - закрыть Галактику.
Результат диагностики будет записан в файл "D:\путь\FReport4Trace.sil"

5) В момент выдачи сообщений о необработанных исключениях
могут также формироваться дополнительные
отладочные протоколы "FReport4Error.Log", "AtlError.log"

6) Файлы "FReport4Trace.sil", "FReport4Error.Log" и "AtlError.log" необходимо прислать нам для анализа.

7) После завершения тестов удалить добавленные строки из файла конфигурации galnet.cfg.
Т.к. сбор диагностической информации замедляет процесс формирования отчетов.

PS: Посмотреть содержимое протокола "FReport4Trace.sil" перед отправкой можно
с помощью программного обеспечения "SmartInspect Redistributable Console"
http://www.gurock.com/smartinspect/resources/

Re: Отчеты в FastReport

Добавлено: 02 дек 2011, 11:37
Алексей
Как сделать в фастрепорте два потока данных, чтобы один был спецификацией другого, ну к примеру Katsopr и spsopr
и в форме использовать бэнды dataset и detail data ?
если ставлю дитэйл - получается какая то фигня. есть подозрения что дитэйл надо описывать на уровне випа...

Re: Отчеты в FastReport

Добавлено: 02 дек 2011, 12:27
LaaLaa
Алексей писал(а):Как сделать в фастрепорте два потока данных, чтобы один был спецификацией другого, ну к примеру Katsopr и spsopr
и в форме использовать бэнды dataset и detail data ?
если ставлю дитэйл - получается какая то фигня. есть подозрения что дитэйл надо описывать на уровне випа...

Совершенно верно. Подчинение данных должно быть описано на уровне VIP кода. В логической таблице интерфейса (create view). В потоке данных (datastream) потом перечисляете все нужные для отчетов таблицы и поля.

Примерно так:

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

Interface AktReport;

  create view  as select * from KatSopr, SpSopr  where (( KatSopr.nRrec == SpSopr.cSopr));

  datastream AktStream
  (
    table KatSopr
    (
       KatSopr.Nrec;
       KatSopr.Nsopr;
       ...
    )
    table SpSopr
    (
      SpSopr.Nrec
      SpSopr.Price;
      SpSopr.Kol;
      [Summa] SpSopr.Price * SpSopr.Kol;
    );
  )
  end;

  handleEvent
    cmInit:
       RunFReport(AktStream, '', false);
  end;

end;
Уже в дизайнере отчета KatSopr назначаете бэнду MasetData, а SpSopr бэнду DetailData. Всего FR поддерживает 6 уровней вложенности бэндов. Если надо блольше то можно использовать SubReport или FastScript.

Re: Отчеты в FastReport

Добавлено: 02 дек 2011, 13:01
Алексей
Блин... я всё правильно делал, просто дитэйл был только на последней записи первого бэнда и я думал там клинит... а надо было галку поставить "печатать если дитэйл пуст"... пятница, 16-00, походу домой пора через магазин :)

З.Ы.: Михали, всё равно спасибо, убедился что я правильно всё делал. :-)

Re: Отчеты в FastReport

Добавлено: 14 дек 2011, 07:56
Алексей
собственно, вывести я вывел, а вот подсчитать итог у меня ну никак не получается...
в наличии две таблицы t1 t2. в каждой есть поле sum
на уровне випа t2 подцеплена к t1 по полю crec
в таблице t1 три записи. в таблице t2 пять записей и все привязаны к последней записи таблицы t1

в отчете расположил банды
groupheader
masterdata
detaildata
groupfooter
выводится отчет :

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

 t1 запись один
 t1 запись два
 t3 запись три
     t2 запись один
     t2 запись два
     t2 запись три
     t2 запись четыре
     t2 запись пять
как сделать так, чтобы при наличии записей в таблице t2 считалась итоговая сумма по полю t1.sum + SUM(t2.sum)
а если записей в t2 нет - то не считалась.


сейчас не могу добится даже обычного подсчета, т.к. фаст репорт почему то даже когда не выводит в detail записи (их нет) - поле SUM(t2.sum) почему то оказывается не пустым.
на форумах где то нашел примерно такое :
Найденное решение (см. также FAQ в комплекте FR_FIB):
1) Если деталь связывается с мастером через параметр DataSource, то
в головной программе к мастер таблице обязательно должен быть прицеплен
компонент TDataSource, иначе связка не работает.
2) Если деталь связывается с мастером через указание в значении параметра
поля мастера: [MasterQuery."ID"], то в скрипте мастер-бэнда надо указать:
DetailQuery.Close;
DetailQuery.Open;
Внимание! В отличие от полей frMemoView, в скрипте не надо указывать
ссылку на диалоговую форму, на которой расположен DetailQuery (и не
спрашивайте меня почему...).
Хотел было в випе убрать подцепку t2 к t1 но только не нашел как в ФР указать по какому полю подцеплять деталь...
в общем - засада, т.к. ФР получается урезанный. нет тех возможностей, что есть в дельфи.