Изменение построенного отчета

отредактировано 07:20 Раздел: FastReport 2.xx VCL
Доброго Вам времени суток, уважаемые знатоки FastReport.
Подскажите, пожалуйста, можно ли изменять уже построенный отчет без помощи frDesigner.

Комментарии

  • отредактировано 07:20
    - Доктор, скажите, можно проглотить бильярдный шар ?
    - Можно, но обычно не нужно ...
  • отредактировано April 2004
    2 Vano:

    Ты меня просто покорил своим убойным юмором. Жаль только, что он не помог мне решить мою проблему. И все таки может быть подскажешь как мне можно добиться следующего результата:
    - Есть шаблон. Я его загружаю методом LoadFromFile(..)
    - Затем строю отчет методом PrepareReport.
    - После этого вызываю дизайнер, потому что юзеру надо его изменить по причинам, одному ему известным.
    - И вот уже после этого мне необходимо сохранить уже ИЗМЕНЕННЫЙ отчет. У компонента TfrReport я нашел только метод SavePreparedReport(FName: string). Но этим методом можно сохранить построенный отчет только в файл, а необходимо сохранить в Blob поле.
    Как же мне это сделать?

    Заранее благодарен за помощь. Дмитрий.
  • FOXFOX
    отредактировано 07:20
    А чуточку подумать:

    stream := TBlobStream.Create( BlobField, bmWrite);
    try
    EMFPages.SaveToStream(stream);
    finally
    stream.free;
    end
  • отредактировано 07:20
    Да пробовал так, только один хрен шляпа какая-то выходит.
    Вот кусок кода:

    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!!!
  • отредактировано 07:20
    2 dimoniy:

    А так пробывал ?
    var Stream: TBlobStream;
    begin
    FR.LoadFromFile('1.frf');
    FR.PrepareReport;
    
    Stream:= TBlobStream.Create(BlobField, bmWrite);
    try
    FR.EMFPages.SaveToStream(Stream);
    finally
    Stream.Free;
    end;
    

    P.S. Также советую НЕ ПОЛЬЗОВАТЬСЯ каталогом по умолчанию для загрузки FRF. Пиши полный путь до файла в LoadFromFile ...
  • отредактировано 07:20
    2 Vano:

    Спасибо тебе, братан. Всё заработало! Объясни(если не в падлу) в чем закавырка?

    Только вот еще один вопросик: а как правильно потом загружать этот отчет из БД? Пробовал так:

    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, и как результат ОТЧЕТА НЕТ.
  • отредактировано 07:20
    написал:
    Спасибо тебе, братан. Всё заработало! Объясни(если не в падлу) в чем закавырка?

    Смотрим исходники, много думаем:
    FR.EditPreparedReport(0);
    
    написал:
    Только вот еще один вопросик: а как правильно потом загружать этот отчет из БД?

    Не тот метод вызываешь - нужно ShowPreparedReport, а не ShowReport ...
  • отредактировано 07:20
    2 Vano:

    Спасибо тебе огромное, очень помог!
    Только я не могу понять механизм работы 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). Как быть?

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.