Глюк или фитча? :)

отредактировано 01:48 Раздел: FastReport 4.0
Встретился с рядом проблем:
1) создаю в рантайме датасет в памяти, фильтрую его и на каждом фильтре строю отчет со своим шаблоном с помощью report.PrepareReport(false). Но вот какая штука, отчет в результате получается пустым, а если сделать report.PrepareReport(false) дважды то первая страница пустая а вторая с данными. Парадокс аднака ;)
2) В цикле меняю значение переменной следующим образом Report.Variables := mtTemplate.FieldByName('orderlist_id').AsInteger
В дизайнере я вижу что переменная существует а вот значения ее отсутсвует, не могли бы Вы пояснить это?
3) Так как я создаю датасет с данными для отчета на лету я делаю следующее
frxDBDataset:= TfrxDBDataset.Create(nil);
frxDBDataset.DataSet:= mt;
frxDBDataset.Name:= 'Main';
Report.DataSets.Add(frxDBDataset);
В результате в дизайнере сразу не отображается датасет Main. Его приходится добавлять руками через меню ;)
4) Если в цикле на каждом шаге я меняю шаблон отчета и затем вызываю дизайнер, то при первом запуске дизайнера все в порядке, а при следующих дизайнер падает со страшными криками. PrepareReport проходит нормально.

Не могли бы Вы ответить на вышеперечисленные вопросы как можно скорее, а то я решил все отчеты перевести под FR4, а тут такие закидоны что хоть стой хоть падай ;)

Комментарии

  • gpigpi
    отредактировано 01:48
    1) Проверьте, действительно ли открыт датасет, на основе которого строится отчёт, перед построением отчёта
    2) Попробуйте установить Report.EngineOptions.DestroyForms:=False;
    3) Добавьте в код Report.EnabledDataSets.Add(frxDBDataset);
    4) Тестовый пример сделать можете?
  • отредактировано 01:48
    gpi написал:
    1) Проверьте, действительно ли открыт датасет, на основе которого строится отчёт, перед построением отчёта
    2) Попробуйте установить Report.EngineOptions.DestroyForms:=False;
    3) Добавьте в код Report.EnabledDataSets.Add(frxDBDataset);
    4) Тестовый пример сделать можете?
    1) открыт, причем для эксперимента делал следующее, не только проверил датасет на наличие записей и открытость, а еще и вызвал desingreport. Так вот, если в дизайнере первый раз нажать превью, то он пустой, а при вторичном превью данные выводятся нормально.
    2) полегчало
    3) полегчало
    4) хмм... надо попробовать, из проекта реально не выдрать, если только создать искусственный пример.

    Кстати, тут мне знакомый сообщил что у него в другом проекте такая же бодяга. Так он просто двойным prepare обошелся, к сожалению мне этот вариант не подходит ;)
  • отредактировано 01:48
    Подскажите пожалуйста, а когда примерно можно получить ответ по двойному PrepareReport? А то у меня тут проект колом стоит, компоненты вроде купил, а они не работают.
  • gpigpi
    отредактировано 01:48
    Желательно получить тестовый пример или хотя бы фрагмент кода и шаблон отчёта.
    Кстати, а после фильтрации датасета и перед вызовом PrepareReport выполняется позиционирование на первую запись отфильтрованного датасета?
  • отредактировано January 2007
    Хорошо, попробую сделать тестовый пример на основе TkbmMemtable от Кима Мэдсена.
    Да кстати, First не помог.


    Подготовил пример программы с реальными данными. Куда слать?
  • gpigpi
    отредактировано 01:48
    e-mail в ПМ
  • gpigpi
    отредактировано 01:48
    У Вас в проекте отчёт создаётся динамически и бэнду мастердата не сопоставляется датасет
    Добавьте
    Report.EnabledDataSets.Add(frxDBDataset);
    TfrxMasterData(Report.FindObject('MasterData1')).DataSet := frxDBDataset; //добавить
    
  • отредактировано 01:48
    Что значит динамически? Динамически создаю банды? Нет, весь шаблон читается из потока. Динамически подсовываю датасеты репорту? Да, но что собственно в этом страшного. Получается что реально на чем он помирает это если сам данасет с данными является динамически создаваемым.
    Да и получается что при первом превью он автоматом не сопоставляется, а при втором сопоставляется? ;) Вам не кажется это странным?

    Но все равно спасибо за потраченное время и подсказку.

    Сегодня огреб еще один прикол
    Report.Variables:= mtOrderlist.FieldByName('orderlist_id').AsString;
    Report.Variables:= postav_name;

    В отчете на второй переменной получаю ошибку <Неопределенный идентификатор: 'IPSA'>, где IPSA - правильное значение второй переменной, т.е значение он вроде как видит, а вот вывести его гордо отказывается ;) Первую переменную видит и выводит без проблем.

    Вобщем я медленно зверею и думаю об откате на FR2 ;) Пошел 4 день как я не могу нормально собрать 1 несложный динамический отчет. Все его отличие от представленных в демо это то, что я создаю датасеты с данными для него в рантайме и загружаю темплейт из потока. На деньги в принципе плевать, а вот потраченного времени безусловно жалко. Продукт слишком сырой чтобы использовать его в реальных проектах.
  • отредактировано 01:48
    Только что снес FR4 и поставил заново FR2, создал композитный отчет полностью аналогичный тому что пытался создать на FR4. Абсолюно корректная и безпроблемная работа. Затраченное время около 25 минут.
  • gpigpi
    отредактировано 01:48
    написал:
    Только что снес FR4 и поставил заново FR2
    А зачем сносить? Они уживаются друг с другом.
    написал:
    Да и получается что при первом превью он автоматом не сопоставляется, а при втором сопоставляется?  Вам не кажется это странным?
    Нет, не кажется. Если модифицировать Ваш код таким образом
    procedure TfrmMain.actPrintExecute(Sender: TObject);
    var
      stReport: TMemoryStream;
      frxDBDataset: TfrxDBDataset;
      Report: TfrxReport;
      postav_id: string;
    begin
      stReport:= TmemoryStream.Create;
      Report:= TfrxReport.Create(frmMain);
      frxDBDataset:= TfrxDBDataset.Create(nil);
      frxDBDataset.Name:= 'Main';
      while not mtPostav.Eof do
      begin
        mt.SortOn('postav_name;man_name;part_number',[]);
        mt.Filtered:= false;
        postav_id:= mtPostav.FieldByName('postav_id').AsString;
        mt.Filter:= 'postav_id='+postav_id;
        mt.Filtered:= true;
        mtPostav.Locate('postav_id',postav_id,[]);
        stReport.Clear;
        TBlobField(mtPostav.FieldByName('template_zakaz')).SaveToStream(stReport);
        stReport.Position:= 0;
        report.LoadFromStream(stReport);
        Report.Variables['orderlist_id'] := mtPostav.FieldByName('orderlist_id').AsInteger;
        frxDBDataset.DataSet:= mt;
        Report.DataSets.Add(frxDBDataset);
        Report.EnabledDataSets.Add(frxDBDataset);
        mt.First;
        if chkDebug.Checked then ShowMessage('просмотр данных перед печатью');
        if chkDesigner.Checked then Report.DesignReport
         else
        report.PrepareReport(false);
        mtPostav.Next;
      end;
      if not chkDesigner.Checked then Report.ShowPreparedReport;
      report.DataSets.Clear;
      FreeAndNil(frxDBDataset);
      Report.Clear;
      FreeAndNil(stReport);
      FreeAndNil(Report);
      mtPostav.Filtered:= false;
      mtPostav.First;
      mt.First;
    end;
    
    то всё будет работать даже без добавления строки с присвоением бенду мастердата датасета
    написал:
    Сегодня огреб еще один прикол
    По своему опыту работы с FR3-FR4 могу посоветовать отказаться от использования переменных и перейти на использование скриптовых переменных
    написал:
    Пошел 4 день как я не могу нормально собрать 1 несложный динамический отчет
    При переходе с двойки это очень малый срок, т.к. версии значительно отличаются. Запаситесь терпением, после освоения четвёрки работать с двойкой уже не захочется
    написал:
    Продукт слишком сырой чтобы использовать его в реальных проектах
    Не согласен
  • отредактировано 01:48
    Просто складывается ощущение что мне за деньги позволили стать альфа-тестером ;)
    Функция есть, но она работает не совсем как надо, либо глючит, либо не работает вообще. Гуй дизайнера периодически слетает, т.е ObjectInspector схлопывается в несколько пикселов и не разворачивается. С переменными надо работать по особо хитрому способу, иначе они могут не работать. Датасеты репорту надо назначать особым способом, иначе репорт их теряет и восстанавливает только при повторном превью или препаре. Вобщем список фитч FR4 безусловно впечатляет, и возможно через несколько месяцев когда такие же платные альфа-тестеры вроде меня его вылижут до приемлимого уровня его можно будет использовать в реальных и крупных проектах. Но в данное время я не готов бороться с недокументированными фитчами FR4, у меня проект горит ;)

    Спасибо qpi за проявленное терпение и внимание к моим проблемам, как жаль что коммерческий суппорт в который я написал через специальную страницу полностью проигнорировал меня. Вобщем в данный момент остаюсь на FR2, а через полгодика посмотрим.

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

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