Изменение построенного отчета
Доброго Вам времени суток, уважаемые знатоки FastReport.
Подскажите, пожалуйста, можно ли изменять уже построенный отчет без помощи frDesigner.
Подскажите, пожалуйста, можно ли изменять уже построенный отчет без помощи frDesigner.
Комментарии
- Можно, но обычно не нужно ...
Ты меня просто покорил своим убойным юмором. Жаль только, что он не помог мне решить мою проблему. И все таки может быть подскажешь как мне можно добиться следующего результата:
- Есть шаблон. Я его загружаю методом LoadFromFile(..)
- Затем строю отчет методом PrepareReport.
- После этого вызываю дизайнер, потому что юзеру надо его изменить по причинам, одному ему известным.
- И вот уже после этого мне необходимо сохранить уже ИЗМЕНЕННЫЙ отчет. У компонента TfrReport я нашел только метод SavePreparedReport(FName: string). Но этим методом можно сохранить построенный отчет только в файл, а необходимо сохранить в Blob поле.
Как же мне это сделать?
Заранее благодарен за помощь. Дмитрий.
stream := TBlobStream.Create( BlobField, bmWrite);
try
EMFPages.SaveToStream(stream);
finally
stream.free;
end
Вот кусок кода:
var Stream: TBlobStream;
begin
FR.LoadFromFile('1.frf');
FR.PrepareReport;
FR.EditPreparedReport(0);
Stream:= TBlobStream.Create(BlobField, bmWrite);
try
FR.EMFPages.SaveToStream(Stream);
finally
Stream.Free;
end;
Нормально загружает шаблон, строит его, выводит для редактирования. Но когда доход до места FR.EMFPages.SaveToStream(Stream); выдает ошибку "Stream Write Error...".
Что за ботва? Что я не так делаю? Help!!!
А так пробывал ?
P.S. Также советую НЕ ПОЛЬЗОВАТЬСЯ каталогом по умолчанию для загрузки FRF. Пиши полный путь до файла в LoadFromFile ...
Спасибо тебе, братан. Всё заработало! Объясни(если не в падлу) в чем закавырка?
Только вот еще один вопросик: а как правильно потом загружать этот отчет из БД? Пробовал так:
var Stream: TBlobStream;
begin
Stream:= TBlobStream.Create(BlobField, bmRead);
try
FR.EMFPages.LoadFromStream(Stream);
finally
Stream.Free;
end;
FR.ShowReport;
end;
но толи не загружает его из Stream, толи ещё какая ботва происходит только результат один - значения свойства Pages.Count равно 0, и как результат ОТЧЕТА НЕТ.
Смотрим исходники, много думаем:
Не тот метод вызываешь - нужно ShowPreparedReport, а не ShowReport ...
Спасибо тебе огромное, очень помог!
Только я не могу понять механизм работы frDesigner. Беда вот в чем:
Имеются данные которые состовляют костяк отчета. Из этих данных по нажатию кнопки строится отчет вот таким образом:
FR.LoadFromFile('c:\techchar.frf');
FR.PrepareReport;
Затем методом FR.EditPreparedReport(0) я вызываю дизайнер, для того чтобы пользователь изменил уже построенный отчет (по разным причинам, но это необходимо). После того, как пользователь нажал кнопку "Закрыть" дизайнер спрашивает его необходимо ли сохранить изменения. Юзер отвечает Да, и дизайнер вновь перестраивает отчет. Затем вновь перестроенный отчет я сохраняю в BLOB поле БД вот таким макаром:
// Спрашиваю юзера надо ли сохранять в базу
if MessageDlg('Сохранить подготовленный отчет в базу данных?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then Exit;
// Если надо то
if not Table1.Active then Table1.Open;
if Table1.RecordCount <> 0 then Table1.Edit
else Table1.Insert;
Stream:= TBlobStream.Create(Table1Report, bmWrite);
try
FR.EMFPages.SaveToStream(Stream);
finally
Stream.Free;
end;
Table1.Post;
Все сохраняется в лучшем виде. Тут же можно посмотреть его загрузив из БД вот так:
if not Table1.Active then Table1.Open;
Stream:= TBlobStream.Create(Table1Report, bmRead);
try
FR.EMFPages.LoadFromStream(Stream);
finally
Stream.Free;
end;
FR.ShowPreparedReport;
Показывает именно в том виде, до которого пользователь "доработал" отчет. Если два раза щелкнуть по отчету то запускается дизайнер, редактируется и т.д. все как по маслу.
Только есть одно "НО"! Если закрыть приложение -> вновь его открыть -> загрузить из БД тот самый подготовленный отчет (методом написанным выше) -> двойным кликом запустить дизайнер -> исправить (или не исправлять) отчет -> нажать "Закрыть" тут то и вываливается сообщение ошибки "List index out of bounds (0)" . Я так полагаю, что дело в том что не было PrepareReport или чего то с ним связанного(т.к. свойство EMFPages.Count равно 0). Как быть?