Возникла проблема с многоуровневым отчетом

отредактировано December 2009 Раздел: FastReport 4.0
Господа, добрый день! Помогите разобраться с многоуровневым отчетом, а точнее подскажите, как можно реализовать перенос интересующих меня заголовков в случае непомещения группы оных на одной странице. Сначала скажу пару слов о структуре отчета:

1. MasterData1: "Разбиение 1"
Сhild: SubReport1:

1.1. MasterData2: "Подгруппа 1"

1.1.1. Header1: "Квадратная матрица"
1.1.2. DetailData1: Кросс-таблица
1.1.3. Header2: "Треугольная матрица"
1.1.4. DetailData2: Кросс-таблица

1.2. MasterData2: "Подгруппа 2"

1.2.1. Header1: "Квадратная матрица"
1.2.2. DetailData1: Кросс-таблица
1.2.3. Header2: "Треугольная матрица"
1.2.4. DetailData2: Кросс-таблица

2. MasterData1: "Разбиение 2"
Сhild: SubReport1:
2.1. MasterData2: "Подгруппа 1"
2.1.1. Header1: "Квадратная матрица"
2.1.2. DetailData1: Кросс-таблица
2.1.3. Header2: "Треугольная матрица"
2.1.4. DetailData2: Кросс-таблица

2.2. MasterData2: "Подгруппа 2"

2.2.1. Header1: "Квадратная матрица"
2.2.2. DetailData1: Кросс-таблица
2.2.3. Header2: "Треугольная матрица"
2.2.4. DetailData2: Кросс-таблица


Итак, я хочу "объединить" группу заголовков 1., 1.1., 1.1.1 в одну "группу", т.е. если один из них не помещается на одну страницу, то все три переносятся на следующую страницу. Тоже самое необходимо проделать с:
1.2 и 1.2.1;
2., 2.1., 2.1.1.;
2.2. 2.2.1

Может быть стоит воспользоваться другими объектами FR, изменив структуру отчета без использования подотчетов и данных второго уровня? Или же проще написать скрипт для переноса интересующих меня "групп"?
«1

Комментарии

  • отредактировано 05:32
    У заголовка группы есть св-во KeepTogether.
    Установите в True и группа будет "Держатся Вместе", если конечно размер группы не превышает размер страницы.
  • отредактировано 05:32
    написал: »
    У заголовка группы есть св-во KeepTogether.
    Установите в True и группа будет "Держатся Вместе", если конечно размер группы не превышает размер страницы.
    В том-то и проблема, что размеры всей группы могут превышать размеры страницы, правильнее даже будет сказать, что они всегда превышают размеры страницы, поэтому требование звучит именно так, как звучит. Внутри группы разрывы могут осуществляться. Важно "склеить" только выше названные группообразующие заголовки.
  • отредактировано 05:32
    Ваше требование как раз описывает работу KeepTogether.
    Используйте groupHeader в отчете для разбиение на группы.
    смотрите пример из mainDemo "Other features" - "Keep group together" (33.fr3).
  • отредактировано 05:32
    написал: »
    Ваше требование как раз описывает работу KeepTogether.
    Используйте groupHeader в отчете для разбиение на группы.
    смотрите пример из mainDemo "Other features" - "Keep group together" (33.fr3).
    Боюсь, что группы как таковые я использовать не смогу, ибо значения для заголовков группы и для внутренних датабэндов я вынужден брать из разных источников данных. Поэтому и пользуюсь именно той структурой построения отчета, которую привел вначале. А насколько мне известно, группировки изначально базируются на одном наборе данных. Как выйти из ситуации?
  • отредактировано 05:32
    Если у группы есть какой то общий признак/поле то можно создать группу.
    Привязка к датасету не обязательна, можно использовать выражения.
  • отредактировано 05:32
    написал: »
    Если у группы есть какой то общий признак/поле то можно создать группу.
    Вот именно, что нету!
    написал: »
    Привязка к датасету не обязательна, можно использовать выражения.
    Не понял, поясните. Или лучше отошлите к какому-то конкретному параграфу Руководства Пользователя, если там есть интересующая меня информация.

    А вообще, меня в целом устраивает приведенная в первом посте структура отчета. Так что, может, проще написать коротенький скрипт, учитывающий выход за пределы страницы одного из группообразующих заголовков?
  • отредактировано December 2009
    И, кстати, еще возникла проблема с переносом кросс-таблицы на следующую страницу. Поясняю. Я хочу, чтобы 1.1.3 и 1.1.4 выводились строго совместно на одной странице, для чего у DetailData2 выставляю свойство KeepHeader в true, а у кросс-таблицы, лежащей в этом бэнде, ставлю свойство KeepTogether в True. Таким образом, заголовок и соответствующая ему кросс-таблица переносятся на следующую страницу в случае совместного непомещения на данной странице. Но! Почему-то у кросс-таблицы кроме "шапки" ничего нет, т.е. все данные, всё "нутро" куда-то исчезает. В чем проблема, подскажите, на мой взгляд, я все делаю правильно, а оно "не заводится".
    З.Ы. Вопрос, конечно, можно было задать в отдельной теме, но он все равно тесно примыкает к данной задаче, поэтому я поместил его здесь.
    З.З.Ы. Если необходимо, готовый отчет или его скрин я приложу.
  • отредактировано 05:32
    madmech написал: »
    Вот именно, что нету!
    Не понял, поясните. Или лучше отошлите к какому-то конкретному параграфу Руководства Пользователя, если там есть интересующая меня информация.

    А вообще, меня в целом устраивает приведенная в первом посте структура отчета. Так что, может, проще написать коротенький скрипт, учитывающий выход за пределы страницы одного из группообразующих заголовков?
    Для примера в отчете Simple group из mainDemo используется выражение Copy(<Customers."Company">, 1, 1).
    Т.е. можно сделать пользовательскую функцию, которая будет возвращать какой-то признак группы.

    madmech написал: »
    И, кстати, еще возникла проблема с переносом кросс-таблицы на следующую страницу. Поясняю. Я хочу, чтобы 1.1.3 и 1.1.4 выводились строго совместно на одной странице, для чего у DetailData2 выставляю свойство KeepHeader в true, а у кросс-таблицы, лежащей в этом бэнде, ставлю свойство KeepTogether в True. Таким образом, заголовок и соответствующая ему кросс-таблица переносятся на следующую страницу в случае совместного непомещения на данной странице. Но! Почему-то у кросс-таблицы кроме "шапки" ничего нет, т.е. все данные, всё "нутро" куда-то исчезает. В чем проблема, подскажите, на мой взгляд, я все делаю правильно, а оно "не заводится".
    З.Ы. Вопрос, конечно, можно было задать в отдельной теме, но он все равно тесно примыкает к данной задаче, поэтому я поместил его здесь.
    З.З.Ы. Если необходимо, готовый отчет или его скрин я приложу.
    Можно сделать и скриптом, отчет должен быть двухпроходными.
    первый проход вычисляет высоты для групп (можно сохранять в список), на втором в зависимости от вычисленной высоты и свободного места (Engine.FreeSpace) переносить группу(Engine.NewPage).

    По поводу кросса, знакомое описание ошибки.
    Возможно даже исправлял, какую версию используете ?
    Если с последней такая же ошибка, присылайте отчет (рабочий, желательно на базе из mainDemo. т.е чтобы не требовалось БД), буду разбираться.

  • отредактировано December 2009
    написал: »
    По поводу кросса, знакомое описание ошибки.
    Возможно даже исправлял, какую версию используете ?
    Если с последней такая же ошибка, присылайте отчет (рабочий, желательно на базе из mainDemo. т.е чтобы не требовалось БД), буду разбираться.
    Попробовал создать схожую ситуацию в одном из отчетов mainDemo, все оказалось нормально. А в моем отчете - нет. Чудеса какие-то...
    Версию использую 4.8.46
  • отредактировано December 2009
    Поставил текущую версию FastReport на Turbo Delphi и у меня исчезли все другие компоненты кроме ФастРепортовских!!! Что делать???
    UPD. Проблему решил запуском "Install Packages", где выбрал все файлы *.bpl из папки C:\Program Files\Borland\BDS\4.0\Bin.
    Но все равно компоненты не должны исчезать.
  • отредактировано 05:32
    Могу прислать отчет, построенный на моих данных, на почту, чтобы вы посмотрели, как это безобразие выглядит. Только почту дайте свою.
  • отредактировано 05:32
    Можете отослать мне на почту, адрес кинул в ЛС.
  • отредактировано 05:32
    Отправил.
  • отредактировано 05:32
    Исправил.
    Скачать новый билд можно будет завтра.
  • отредактировано 05:32
    Спасибо! В понедельник посмотрю и дам ответ: все ли там нормально.
  • отредактировано 05:32
    Да, все нормально, кросс-отчет переносится, но возникла другая проблема, а может, это проблема моего недопонимания работы FR. :)
    Есть DetailData c расположенными на нем мемками, берущими свои значения из некоего дэйта-сета, и есть заголовок над ним. И, как не сложно догадаться, я хочу, чтобы в случае, когда заголовок находится на предыдущей странице, а ДетэилДэйта на следующий, чтобы заголовок переносился вослед за бэндом. Я выставляю у бэнда KeepHeader в True, но это ни к чему не приводит. Может, кто-то подскажет другое решение?
  • отредактировано December 2009
    И второй вопрос вдогонку: как у кросс-таблицы сделать невидимыми определенные столбцы? Когда я пытаюсь как в примере, указанном в Руководстве Пользователя, выставить Width := 0 у интересующих меня столбцов (ColumnIndex = 0 и ColumnIndex = 1 ) в событии OnCalcWidth, это ни к чему не приводит. АвтоРазмер выставляю в True. Может, что-то не так делаю?
  • отредактировано 05:32
    madmech написал: »
    Да, все нормально, кросс-отчет переносится, но возникла другая проблема, а может, это проблема моего недопонимания работы FR. :)
    Есть DetailData c расположенными на нем мемками, берущими свои значения из некоего дэйта-сета, и есть заголовок над ним. И, как не сложно догадаться, я хочу, чтобы в случае, когда заголовок находится на предыдущей странице, а ДетэилДэйта на следующий, чтобы заголовок переносился вослед за бэндом. Я выставляю у бэнда KeepHeader в True, но это ни к чему не приводит. Может, кто-то подскажет другое решение?
    Пришлите шаблон отчета, по описанию сложно понять полную структуру отчета и установленные св-ва.
    madmech написал: »
    И второй вопрос вдогонку: как у кросс-таблицы сделать невидимыми определенные столбцы? Когда я пытаюсь как в примере, указанном в Руководстве Пользователя, выставить Width := 0 у интересующих меня столбцов (ColumnIndex = 0 и ColumnIndex = 1 ) в событии OnCalcWidth, это ни к чему не приводит. АвтоРазмер выставляю в True. Может, что-то не так делаю?
    С АвтоРазмером данное событие не работает.
  • отредактировано 05:32
    написал:
    С АвтоРазмером данное событие не работает.
    Как это не работает??? Если у меня с включенным свойством у другой кросс-таблицы ширины столбцов выстраиваются так, как нужно.
    Как оно было
    написал:
    Пришлите шаблон отчета, по описанию сложно понять полную структуру отчета и установленные св-ва.
    Выслал.
  • отредактировано 05:32
    madmech написал: »
    Как это не работает??? Если у меня с включенным свойством у другой кросс-таблицы ширины столбцов выстраиваются так, как нужно.
    Как оно было
    Выслал.
    Это я и имел введу но сказал наоборот.
    Т.е. с autosize=true столбцы не скрываются ?
    таким способом должно скрываться все, кроме заголовков и итогов.

    Посмотрел отчет, т.е. у вас первая запись которая печатается после хидера отрывается от него ?
    или все-таки вы имеете введу отрыв остальных записей, к примеру :
    заголовок

    запись1

    новая страница

    запись 2
  • отредактировано 05:32
    написал:
    Т.е. с autosize=true столбцы не скрываются ?
    Вот именно, что не скрываются!
    написал:
    Посмотрел отчет, т.е. у вас первая запись которая печатается после хидера отрывается от него ?
    или все-таки вы имеете введу отрыв остальных записей, к примеру :
    Да, как раз-таки первая запись не должна отрываться от заголовка в отличие от остальных, т.е. может произойти картина, которую вы описали. Но не должно возникать следующего, когда заголовок сам по себе болтается на одной странице, а записи на другой:
    заголовок

    новая страница

    запись1

    запись 2

    Это именно то, с чем я пока что безуспешно борюсь.
  • отредактировано 05:32
    Кстати, первичную проблему, с которой я обращался, я тоже решил, а именно правильный перенос "группировок заголовков". И без всяких скриптов и группирующих бэндов обошелся, как видите из шаблона отчета. :)
  • отредактировано 05:32
    Немного модифицировал ваш отчет и пытался воспроизвести на нем проблему, не получилось.
    Так же и со скрытием колонок кросс таблицы.

    отчеты прилагаются.
  • отредактировано December 2009
    Не понял: а что значит "пытался воспроизвести на нем проблему, не получилось"? У вас все работает как надо и вам непонятно, откуда у меня вылезла ошибка, или вам не удалось смоделировать выше описанную мной ситуацию? Тоже касается скрытия колонок кросс-таблицы. Я помню, что раньше, по крайней мере, отстройка ширины столбцов кросс-таблицы у меня работала. И это хорошо видно из той ссылки, которую я привел чуть выше. Не может ли это быть проблема самой последней текущей версии, которую я скачал и установил?
  • отредактировано 05:32
    Попробуйте запустить приложенные мной шаблоны из Main Demo.
    Первый шаблон полный аналог вашего, но без данных, обратите внимание на 3-ю страницу - заголовок не оторвался.

    Второй шаблон скрывает вторую колонку в кросс таблице.

    У вас они работают ?
  • отредактировано 05:32
    Вы бы сразу написали, чтобы я ваши шаблоны в MainDemo запустил, тогда бы я предыдущий пост не писал. :)
    Да, действительно, в первом шаблоне заголовок не отрывается. Но я подозреваю, что моя проблема в том, что я вывожу не все данные в MasterData, а лишь те, которые отфильтровываются в событии DetailData3OnBeforePrint. Может, здесь кроется корень проблемы? Иных разумных объяснений я не вижу. Пойду еще голову поломаю...
    Со вторым шаблоном у вас тоже все в порядке. Когда я в OnCalcWidth прописываю Width = 0, то таблица почти полностью схлопывается. Чудеса да и только!..
  • отредактировано 05:32
    Кстати, прошу прощения, я вас ввел в заблуждение своим вопросом про исчезновение столбцов. Я только что осознал, что на самом деле мне нужно убрать заголовки строк, и я только что эту проблему благополучно решил. Но все равно, если бы задача стояла убрать именно столбцы, то она осталась бы ПОКА нерешенной. :)
  • отредактировано 05:32
    написал:
    Но я подозреваю, что моя проблема в том, что я вывожу не все данные в MasterData, а лишь те, которые отфильтровываются в событии DetailData3OnBeforePrint.
    Вынужден сам себя комментировать... :) Отключил фильтрацию и перенос начал нормально осуществляться. А фильтрация выглядит, если что, следующим образом:
    procedure DetailData3OnBeforePrint(Sender: TfrxComponent);
    begin                                                                                                                                                             
      if (<EnumStatDBDS_Sq."NEnum"> = <EnumPartDBDS1."NEnum">) and
         (<EnumStatDBDS_Sq."NSub"> = <EnumPartDBDS2."NSub">) then
        DetailData3.Visible := True         
      else              
        DetailData3.Visible := False                                     
    end;
    
    Пошел дальше ломать голову... Если решу эту последнюю проблему, то отчет, можно сказать, будет готов. :)
  • отредактировано 05:32
    Теперь все понятно, на скрипт ваш как-то не посмотрел - много лишнего в нем было :)

    Не имеет значения скрыт бэнд в скрипте или нет, он все равно обрабатывается в цикле вывода и механизм "держать вместе" сработает именно для этого бэнда.

    Если есть возможность лучше реализовать фильтр в запросе
  • отредактировано January 2010
    написал:
    Если есть возможность лучше реализовать фильтр в запросе
    А если нет такой возможности? Если я вынужден пользоваться именно той многоуровневой структурой отчета, которую привел, и которая предполагает фильтрацию данных на этапе построения, зависящую от значений датасетов более высокого уровня? Или, может, я неправильно понял Ваше предложение о "реализации фильтра в запросе"... Что Вы предлагаете, объясните, пожалуйста, поконкретнее.

    Вдогонку пущу второй вопрос, дабы не плодить темы: пытаюсь по правой кнопке мыши через контекстное меню вкладочки "SubReport" посмотреть настройки страницы. Ничего не происходит, хотя в контекстном меню такой пункт присутствует. Это ошибка разработчиков, не доведенная до конца возможность или у подотчетов просто нет свойств страницы? Использую FR 4.9.1.

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

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