Отчеты в FastReport

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

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

rmozgov
Сообщения: 7
Зарегистрирован: 09 июн 2016, 14:34
Откуда: Минск

Re: Отчеты в FastReport

Сообщение rmozgov »

Обновилась библиотека генератора отчетов FastReport версия 9.1.22.
Обновление содержит обновленную справку.

Что нового?
✔ Для объекта TfrxPictureView реализована поддержка растрового формата графических изображений — GIF.
✔ Реализована возможность загрузки OLE-объекта из файла, для этого из скрипта необходимо вызвать процедуру LoadFromFile компонента TfrxOLEView.
✔ В класс TfrxDataSet добавлена функция ValueAsMemoryStream для получения значения в объект TMemoryStream.
✔ Доработан обработчик ошибок получения и вычисления данных, возникающих при построении отчета. При ошибочном вычислении значения в объекте Текст — красный фон принимает только та ячейка, в которой возникли ошибки формирования данных.

Обновление доступно по ссылке на FTP:
FREPORT3_DLL_91220.acd - ACD файл.
Последний раз редактировалось rmozgov 16 июн 2017, 17:20, всего редактировалось 1 раз.
rmozgov
Сообщения: 7
Зарегистрирован: 09 июн 2016, 14:34
Откуда: Минск

Re: Отчеты в FastReport

Сообщение rmozgov »

Обновилась библиотека генератора отчетов FastReport версия 9.1.23.
Обновление содержит обновленную справку.

Что нового?
✔ Доработан функционал управления отчетом из VIP-кода для доступа к данным БД из FastReport-отчета с помощью потока данных, созданного по DSQL-запросу. Для этого в параметрах функции FRCreate необходимо передать строку DSQL-запроса до 255 символов или "длинную строку" запроса более 255 символов, созданную функцией sqlAddStr.
✔ Улучшен функционал отправки отчета по почте из VIP-кода. Для функции FRSetParameters с параметром frMailParam реализована передача длинных строк. Поля MailTo, Subject и Body структуры frxSendMailParam могут быть дескрипторами файла.
✔ Доработан функционал отправки отчета по e-mail с помощью кнопки [Отправить]. Добавлена возможность задавать значения по умолчанию в полях «Кому», «Тема» и «Содержание письма». Для этого необходимо добавить в шаблон соответствующие переменные GalaxyMailTo, GalaxyMailSubject, GalaxyMailBody и задать им необходимые значения.
✔ Оптимизирован режим автопечати отчетов с автопометками. В автоотчет выводятся только помеченные записи, автопометка и другие иконки записей не отображаются.
✔ Исправлено формирование штрих-кодов типа bcCode128C и bcCodeEAN128C. При нечетном количестве символов в начало значения добавляется незначащий ноль.

Обновление доступно по ссылке на FTP:
FREPORT3_DLL_91230.acd - ACD файл.
edd
Постоянный обитатель
Сообщения: 170
Зарегистрирован: 29 мар 2005, 17:49

Re: Отчеты в FastReport

Сообщение edd »

почему при компиляции ругается на Нет такой функции, поля или метода : CONTINUEDATASET?

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

[..........]
DataStream FRBookings
(
  table inherited::FRtbl_Bookings
  (
    [e_MnPlanName]  MnPlan.Name;
  );
) 
Handleevent table FRtbl_Bookings 
cmOnProcess: {  
    Var i         : Word;
    Var NewRef    : Comp;
    Var bflag     : boolean;

    if( GetMarkerCount(Markers) = 0  )
    {
        bflag := true;
        InsertMarker(Markers, Indent.NRec);
    }
     for (i:= 0; i < GetMarkerCount(Markers); i++)
    {
      if (Not GetMarker(Markers, i, NewRef))
        Continue;
      if  getfirst Indent  where ((NewRef == Indent.Nrec)) = tsOk
      {
       ContinueDataset;
      }
    }
}
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Отчеты в FastReport

Сообщение edward_K »

Ну видимо потому, что у вас FRtbl_Bookings не DataSet и ему ContinueDataSet не нужен.
Вот так примерно делать с DataSet

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

handleEvent dataset ContDoc
cmPreProcess:
{ if Print_Group>0
  { boPrint_Group_First:=Getfirst_Print_Group
    if not boPrint_Group_First BreakProcess
    else boPrint_SP_First:=Getfirst_Print_SP;
    
    
  }
  else
  { boPrint_Group_First:=getfirst ContDoc=tsok;
    boPrint_SP_First:=getfirst ContDocPersons=tsok;;
  }

}
cmOnProcess:
{ if (boPrint_Group_First)
  {
    boPrint_Group_First := false;
    ContinueDataset;
    
  }
  else  
  { if Print_Group>0
    { if not GetNext_Print_Group
      { BreakProcess;
       //if not boPrint_Group_First BreakProcess
      } 
      else
      { boPrint_SP_First:=Getfirst_Print_SP;
            
        ContinueDataset;
      }
    }
    else
    { if getnext Contdoc<>tsok BreakProcess
      else ContinueDataset;;
    }
  } 
  if getfirst ContDocPersons=tsok {}
  if getfirst Appointments=tsok {}
  }
end;
edd
Постоянный обитатель
Сообщения: 170
Зарегистрирован: 29 мар 2005, 17:49

Re: Отчеты в FastReport

Сообщение edd »

edward_K писал(а):Ну видимо потому, что у вас FRtbl_Bookings не DataSet и ему ContinueDataSet не нужен.
Спасибо за ответ, edward_K, я ещё плаваю в FR.

Другой вопрос, почему я не могу использовать свои поля для вставки, которые я добавил в table inherited?

т.е. если я пишу

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

[.......]
DataStream FRBookings
(
  table inherited::FRtbl_Bookings
  (
    [e_MnPlanName]  mnplan.name;
  );
)

Handleevent table FRtbl_Bookings
cmOnProcess: 
{
   ClearBuffer(#FRtbl_Bookings);
   FRtbl_Bookings.e_MnPlanName:=mnplan.name;
   insert current FRtbl_Bookings
}
то галактика говорит что нет такого поля в FRtbl_Bookings
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Отчеты в FastReport

Сообщение Den »

edd, элемент datastream table
<имя-таблицы> — уникальное в пределах потока данных имя элемента потока. Должно соответствовать имени одной из таблиц интерфейса, возможно, с префиксом, состоящим из имени логической таблицы и точки.
Т.е. в родительском стандартном функционале заявок заявлен table FRtbl_Bookings на основе временной таблицы FRtbl_Bookings, и ты не можешь изменить задекларированную структуру
этой таблы , но да, можешь добавить свое поле в table FRtbl_Bookings в датастриме. Временная FRtbl_Bookings фактически заполнена внутренними алгоритмами Bookings и делать insert current FRtbl_Bookings не имеет смысла никакого в коде твоего наследника. Ты дозаявил поле e_MnPlanName, осталось только его как то связать с существующей записью(ями) FRtbl_Bookings.
Кстати, в FRtbl_Bookings есть поле _IndNrec , в котором хранится Indent.Nrec. Цель же , насколько я понимаю, довывести данные о записи плана к конкертной заявке.
edd
Постоянный обитатель
Сообщения: 170
Зарегистрирован: 29 мар 2005, 17:49

Re: Отчеты в FastReport

Сообщение edd »

Den писал(а):edd, элемент datastream table
<имя-таблицы> — уникальное в пределах потока данных имя элемента потока. Должно соответствовать имени одной из таблиц интерфейса, возможно, с префиксом, состоящим из имени логической таблицы и точки.
Т.е. в родительском стандартном функционале заявок заявлен table FRtbl_Bookings на основе временной таблицы FRtbl_Bookings, и ты не можешь изменить задекларированную структуру
этой таблы , но да, можешь добавить свое поле в table FRtbl_Bookings в датастриме. Временная FRtbl_Bookings фактически заполнена внутренними алгоритмами Bookings и делать insert current FRtbl_Bookings не имеет смысла никакого в коде твоего наследника. Ты дозаявил поле e_MnPlanName, осталось только его как то связать с существующей записью(ями) FRtbl_Bookings.
Кстати, в FRtbl_Bookings есть поле _IndNrec , в котором хранится Indent.Nrec. Цель же , насколько я понимаю, довывести данные о записи плана к конкертной заявке.
Да, помимо записей плана мне нужно было собрать список поставщиков из заявки и все исходящие ДО снабжения. Я не стал мучиться,
часть элементов потока связал с переменными, часть с логической таблой

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

  table inherited::FRtbl_Bookings
  (

    [e_MnPlanName]  mnplan.name;
    [e_katnazna]    katnazna.name;
    [e_DoS_No_d]    sbasedoc_nodoc; 
    [e_allPost]     sAllpost;

  );
передал переменной нрек заявки,

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

NewRef:= FRtbl_Bookings._IndNrec
спозиционировался на логической табле и собрал данные о записях ДО снабжения и поставщиков через функции

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

if  getfirst Indent  where ((NewRef == Indent.Nrec)) = tsOk
{   sbasedoc_nodoc:=_DO_SnbNmDt(indent.nrec, 0h, 0, 0); 
      } else sbasedoc_nodoc:=''
If getfirst claim1 where((NewRef == claim1.cindent)) =tsOK and getfirst katorg where ((claim1.CVALKAU[1] == katorg.nrec)) = tsOk
      {sAllPost=''
         sAllPost:= _Kontragents
      }else sAllPost:=''
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Отчеты в FastReport

Сообщение edward_K »

Если вам все таки понадобится таблица, то добавляете свою и связываете ее с каким нибудь уникальным полем(ми) в родителе.
Ну а дальше вы уже знаете 8)
edd
Постоянный обитатель
Сообщения: 170
Зарегистрирован: 29 мар 2005, 17:49

Re: Отчеты в FastReport

Сообщение edd »

edward_K писал(а):Если вам все таки понадобится таблица, то добавляете свою и связываете ее с каким нибудь уникальным полем(ми) в родителе.
Как связать свою таблицу с уникальным полем родителя?
Родитель это

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

DataStream
   (
    родитель table
        (
         моя table
        )
?
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Отчеты в FastReport

Сообщение Den »

edward_K , наверное имел ввиду в свою таблицу собрать все что нужно и просто указать связь на нее в create view. Хотя, особой разницы не вижу.
Как то так, на примере :

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

Alter interface Bookings;

Overload
 DataStream FRBookings;
end;

  table struct tempdata
  (
   cind  : comp ,
   s1    : string
  )
  with index
  (
    in1=cind
  );

Create View Bookings_v
 as select
   if(isvalidall(tntempdata),tempdata.s1,'') (fieldname=ss1) 
 from
    tempdata
   ,Indent IndFr
 where 
   ((
     FRtbl_Bookings._IndNrec ==  tempdata.cind
   ))
;


DataStream FRBookings
(
  table inherited::FRtbl_Bookings
  (
    [e_MnPlanName] ss1;
  );
)

Handleevent
cmPreProcess : { 
    Var i         : Word;
    Var NewRef    : Comp;

     if( GetMarkerCount(Markers) = 0  )
     {
        InsertMarker(Markers, Indent.NRec);
     }

     mtClear(#tempdata,fmNormal);

     for (i:= 0; i < GetMarkerCount(Markers); i++)
     {
      if (Not GetMarker(Markers, i, NewRef))
        Continue;

      if getfirst IndFr where (( NewRef== IndFr.nrec))=tsok
       if getfirst tempdata where (( NewRef == tempdata.cind))<>tsok
       {       
        insert tempdata set tempdata.cind:=NewRef , tempdata.s1:='Это помеченная заявка №'+string(i+1)+' маркера . '+DateTostr(IndFr.atl_lastdate,'DD.MM.YYYY');
       }
     }
   }
  end;
 end;
end.
Ответить