Форматирование при использовании Tfrxsubreport

SWzSWz
отредактировано 10:53 Раздел: FastReport 4.0
Здравствуйте!

Отчет представляет из себя один band (MasterData). На нем размещены три поля из источника данных и одно поле - TfrxSubReport. В качестве subreport-а является один band, на котором размещены 5 полей.

В прикреплении к этому сообщению привожу фрагмент сформированного отчета.

Прокомментирую несколько мест отчета (на картинке помечены красным цветом), отображение которых не нравится и хотелось бы поменять:
1. Вот именно так надо, чтобы отображалось. Но в данном случае просто совпало, что текст в ячейки из Masterdata занимает несколько строк и высота ячейки совпала с суммарной высотой двух ячеек из Datail.
2. Высота ячейки из MasterData немного превышает суммарную высоту ячеек из Datail. Необходимо, чтобы последняя ячейка детальных записей растянулась по высоте до нижнего края master-ячейки.
3. Ситуация, аналогичная ситуации из 2.
4. Ситуация, аналогичная 2 и 3.

Для ячеек из MasterData установлено свойство "StretchMode = smMaxHeight". Для ячейки frxSubReport такого свойства нет.
Для бэнда, который является детальными данными, установлено свойство "Stretched = True", а для его ячеек также установлены свойства "StretchMode = smMaxHeight".

Вопрос, как правильно настроить отчет для желаемого отображения?

Комментарии

  • xlaalaaxlaalaa Минск
    отредактировано 10:53
    Я бы такой отчет делал программно на скрипте, используя событие OnManualBuild, методы TfrxMemoView.CalcHeight, TfrxDataSet.First, TfrxDataSet.Next, Engine.ShowBand и т.д.

    Почитайте статью http://fast-report.com/ru/forum/index.php?showtopic=7096
  • SWzSWz
    отредактировано 10:53
    xlaalaa, большое спасибо, интересная статья.

    Как я сейчас строю отчет.
    Перед началом вывода подчиненных записей запоминаю координату (y := Engine.CurY).
    При выводе подчиненных записей вычисляю их суммарную высоту.
    После окончания вывода подчиненных записей вывожу первичную запись, возвращаясь на запомненную координату (Engine.CurY := y).
    Что не так. При выводе подчиненных записей может произойти смена страницы. В этом случае я перехожу на координату Y не предыдущей страницы, а уже текущей, - все отображение, кончно, портится.

    А можно ли как-нибудь перейти на предыдущую страницу, есть ли что-то наподобие Engine.CurPage ?

    А еще лучше, может быть у кого-нибудь есть инетересные примеры построения отчетов на механизме ManualBuild ? Поделитесь, пожалуйста.
  • отредактировано February 2010
    SWz написал: »
    Здравствуйте!

    Отчет представляет из себя один band (MasterData). На нем размещены три поля из источника данных и одно поле - TfrxSubReport. В качестве subreport-а является один band, на котором размещены 5 полей.

    В прикреплении к этому сообщению привожу фрагмент сформированного отчета.

    Прокомментирую несколько мест отчета (на картинке помечены красным цветом), отображение которых не нравится и хотелось бы поменять:
    1. Вот именно так надо, чтобы отображалось. Но в данном случае просто совпало, что текст в ячейки из Masterdata занимает несколько строк и высота ячейки совпала с суммарной высотой двух ячеек из Datail.
    2. Высота ячейки из MasterData немного превышает суммарную высоту ячеек из Datail. Необходимо, чтобы последняя ячейка детальных записей растянулась по высоте до нижнего края master-ячейки.
    3. Ситуация, аналогичная ситуации из 2.
    4. Ситуация, аналогичная 2 и 3.

    Для ячеек из MasterData установлено свойство "StretchMode = smMaxHeight". Для ячейки frxSubReport такого свойства нет.
    Для бэнда, который является детальными данными, установлено свойство "Stretched = True", а для его ячеек также установлены свойства "StretchMode = smMaxHeight".

    Вопрос, как правильно настроить отчет для желаемого отображения?
    Установите у Subreport'а свойство PrintOnParent в True. Это поможет растягивать левые ячейки. А вот чтобы растягивались ячейки Subreport'а до нужной высоты... я, например, запоминаю высоты ячеек в Subreport'е и, если нужно растянуть, то растягиваю последнюю (нижнюю) ячейку (-ки) до высоты ячейки слева.
  • SWzSWz
    отредактировано 10:53
    Alex_Prodigy написал: »
    Установите у Subreport'а свойство PrintOnParent в True. Это поможет растягивать левые ячейки.
    Да, такое сделал.
    Alex_Prodigy написал: »
    А вот чтобы растягивались ячейки Subreport'а до нужной высоты... я, например, запоминаю высоты ячеек в Subreport'е и, если нужно растянуть, то растягиваю последнюю (нижнюю) ячейку (-ки) до высоты ячейки слева.

    Да, я тоже начал было двигаться в этом направлении.
    Я создал глобальную переменную. При выводе первой детальной ячейки обнуляю эту переменную. При выводе каждой детальной ячейки увеличиваю значение на высоту выводимой ячейки. Но когда дохожу до последней, как узнать высоту родительской ячейки?

    Если есть такая возможность, не могли бы Вы прислать похожий пример?
  • отредактировано 10:53
    SWz написал: »
    Да, такое сделал.
    Да, я тоже начал было двигаться в этом направлении.
    Я создал глобальную переменную. При выводе первой детальной ячейки обнуляю эту переменную. При выводе каждой детальной ячейки увеличиваю значение на высоту выводимой ячейки. Но когда дохожу до последней, как узнать высоту родительской ячейки?

    Если есть такая возможность, не могли бы Вы прислать похожий пример?
    Ну я запоминаю высоту в сабрепорте и сравниваю с основным MasterData1.Height...
    И если в сабрепорте она меньше, то я растягиваю последнюю ячейку.
    Моя реализация мне самому не очень нравится, я её пока что обтачиваю... если же Вы найдёте какое-то красивое решение, обязательно сообщите здесь :-)
  • xlaalaaxlaalaa Минск
    отредактировано 10:53
    Алгоритм печати этого отчета по сути будет выглядеть частный случай решения классической "Задачи о назначениях". Поищите в литературе или в гугле термин "Задача о назначениях". Надеюсь это вам поможет.
  • SWzSWz
    отредактировано 10:53
    xlaalaa написал: »
    Алгоритм печати этого отчета по сути будет выглядеть частный случай решения классической "Задачи о назначениях". Поищите в литературе или в гугле термин "Задача о назначениях". Надеюсь это вам поможет.

    :-) Не совсем понятно, как алгоритм решения "задачи о назначении" связан с форматированием при печати моего отчета.
  • xlaalaaxlaalaa Минск
    отредактировано February 2010
    Как-то связан :)
  • SWzSWz
    отредактировано 10:53
    xlaalaa написал: »
    Как-то связан :)

    Снова не понял. Понял, о чем идет речь. Но к моему отчету не имеет никакого отношения.
    У меня уже есть данные. Эти данные выводятся, за исключением некоторых строк, высоту которых необходимо увеличить. Требуется только лишь техническая реализация этого момента. А именно:
    1. Если выводить отчет, используя Subreport, то необходимо корректно обрабатывать процесс вывода строк (анализ высоты строк и т.д.). у меня это сделать не получается, так при выводе ячейки первичной записи DataSet-а, я еще не знаю будущую ее высоту, а она может поменяться из-за детальных записей.
    2. Если строить отчет вручную, то у меня не получается реализовать следующий момент. При выводе ячеек детальных записей страница отчета может поменяться. После вывода всех ячеек детальных записей (и расчета их суммарной высоты) надо вывести master-ячейку, но эта ячейка должна "начинаться" на предыдущей странице, а "оканчиваться" на текущей.

    Еще раз схематично проиллюстрирую результат формирования отчета при использовании subreport.
    На первой картинке изображено то, как выводится отчет, на второй - то, как необходимо (после ячеек "1.3" и "2.1" нельзя оставлять пустое место)

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

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