Суммирование по бендам

отредактировано February 2004 Раздел: FastReport 2.xx VCL
У меня есть отчет такой структуры, который создается из 2-х таблиц связанных реляционными отношениями

Группа №1
Строка 1
Строка 2
Строка 3
Строка 4

Группа №2
Строка 1
Строка 2
Строка 3
Строка 4

Группа №3
Строка 1
Строка 2
Строка 3
Строка 4

.....


В дизайнере у меня такая структура

Master Data (Группа) (таблица мастер)
Detail Data (Строки) (таблица детайл)


мне надо в конце отчета получить итоговые данные по всем группам в разрезе строк, должно получится вот так

.....

Итого по группам
Строка 1
Строка 2
Строка 3
Строка 4

Можно ли это сделать с помошью бендов не прибегая к созданию еще одной базы с итогом?

Комментарии

  • отредактировано 06:56
    Итого по группам- понятно, обычная функция Sum()
    "Итого по Строкам 1" - сложнее. Если во всех группах набор деталей одинаковый, можно например в каждой строке деталей увеличивать итоговую сумму и заносить в массив. В бенде ReportSummary запустить цикл типа
    For i:=1 To МаксимальноеКоличествоСтрок Do ShowBand(Child1)
    А на бенде Child1 выводить итоговые суммы по строкам. Это если строк дофига. Если штук 5 проще итоговые суммы загонять в переменные.
    А вабще не лучшая схема отчета. Может я чего не понял? Интересно будет почитать что думают коллеги 8=|
  • отредактировано 06:56
    ИМХО SubReport ему нужен... с отдельным запросом.
  • отредактировано 06:56
    smbody написал:
    ИМХО SubReport ему нужен... с отдельным запросом.
    Я не совсем понял как сделать такой отчет с помощью SubReport, но идея я думаю хорошая. Не могли объяснить как это сделать.
  • отредактировано 06:56
    Alexander написал:
    Итого по группам- понятно, обычная функция Sum()
    "Итого по Строкам 1" - сложнее. Если во всех группах набор деталей одинаковый, можно например в каждой строке деталей увеличивать итоговую сумму и заносить в массив. В бенде ReportSummary запустить цикл типа
    For i:=1 To МаксимальноеКоличествоСтрок Do ShowBand(Child1)
    А на бенде Child1 выводить итоговые суммы по строкам. Это если строк дофига. Если штук 5 проще итоговые суммы загонять в переменные.
    А вабще не лучшая схема отчета. Может я чего не понял? Интересно будет почитать что думают коллеги 8=|
    Количество строк не большое, штук 5 небольше, но это колчиство не постоянно, может быть и 4 и 3, а может вообще ничего не быть. А вот про массивы мысль дельная, вот только не мог бы ты показать пример как организовывать в FR массивы.
    За ранее спасибо.
  • отредактировано 06:56
    Массивы
    В скрипте, помимо переменных, можно создавать массивы. Массивы могут быть только одномерными, но можно организовать доступ к элементам массива таким образом, что можно трактовать массив как двумерный или с болшим количеством измерений.

    Пример использования массива:

    begin
    MyArr[0] := 'a'; MyArr[1] := 'b'; MyArr[3] := 'd';
    MyArr[2] := MyArr[0] + MyArr[1] + 'c' + MyArr[3];
    end;

    Фактически значения элементов массива хранятся в списке frVariables в виде
    Arr_имя массива_индекс. Т.е. в вышеприведенном примере мы получим содержимое frVariables:

    Arr_MyArr_0 := 'a'
    Arr_MyArr_1 := 'b'
    Arr_MyArr_2 := 'abcd'
    Arr_MyArr_3 := 'd'

    Это все из хелпа... Вроде и добавить нечего, массивы в FR очень простые. Разбирайся.
  • отредактировано 06:56
    to Alexander
    Спасибо за разъяснение по массивам, но хотел еще узнать, можно осуществлять поиск по массивам, так как у меня могу не все строки выводится на печать, потому как в них ничего может не быть.
  • отредактировано 06:56
    Э, нет! Использование массива предполагает одинаковый набор строк по каждой группе. Если набор строк для каждой группы свой, нужно ввести какой-то идентификатор (признак) строки и записывать сумму по этой строке в свой элемент массива.
  • отредактировано 06:56
    Идентификатором строки в группе может быть LINE# ...
  • отредактировано 06:56
    Да, но если например
    1 строка- приход
    2 строка- продажа
    3 строка- оплата
    4 строка- возврат
    5 строка- списание
    то есть каждая строка имеет какой-то логический смысл, использование параметра LINE# будет ошибкой, т.к. LINE# возвращает просто порядковый номер строки в группе, а не номер по смыслу ;)
  • отредактировано 06:56
    Ну раз ты сам знаешь смысл каждой строки, то в чём тогда проблема ? ;) )
  • отредактировано February 2004
    Vano написал:
    Ну раз ты сам знаешь смысл каждой строки, то в чём тогда проблема ? ;) )
    Да но ведь может быть и вот так

    Группа №1
    1 строка- приход
    2 строка- продажа
    3 строка- оплата
    4 строка- возврат
    5 строка- списание

    Группа №2
    1 строка- оплата
    2 строка- возврат
    3 строка- списание

    в группе два просто отсутвуют Продажа и Приход, по ним может вообще ничего не быть и выводить их напечать просто нет необходимости.

    Я уже подумываю, перед отчетом создать временные базы и туда просуммировать нужные мне базы (благо их придется делать всего три), вот только незнаю как их потом на листе отобразить, ведь еще одна связка Master-Detail Band приведет перемешиванию с первой связкой.
  • bakhbakh Санкт-Петербург
    отредактировано 06:56
    ipavels написал:
    в группе два просто отсутвуют Продажа и Приход, по ним может вообще ничего не быть и выводить их напечать просто нет необходимости.
    А ты смотрел свойство бэнда PrintSubsetIfEmpty?..
  • отредактировано 06:56
    bakh написал:
    bakh написал:
    в группе два просто отсутвуют Продажа и Приход, по ним может вообще ничего не быть и выводить их напечать просто нет необходимости.
    А ты смотрел свойство бэнда PrintSubsetIfEmpty?..
    Да это я знаю что можно печатать пустые бенды, но мне так не нужно.

    Вопрос ко всем ;)
    Объясните пожайлуста как можно извратится с одномерным массивом , что бы сделать его двумерным. Я как понимаю это можно сделать используя вложенные массивы. Так ли это?
  • BorisBoris Москва
    отредактировано February 2004
    Например, можно поступить таким образом.
    Создать массив строк, каждая из которых содержит элементы с разделителями,
    т.е.
    MyArr:= 'abc;xyz;1234;test;...'
    Здесь разделителем является ';', а значения отдельных элементов , будут:
    элемент [i,0] = 'abc'
    элемент [i,1] = 'xyz'
    элемент [i,2] = '1234'
    элемент [i,3] = 'test'.
    Только придется писать функцию, которая распарсивает такую строку, т.е. фактически ищет разделители и то, что между ними считает элементом массива. Правда ситуация осложнится, если символ разделителя может присутствовать в значении элемента.
  • bakhbakh Санкт-Петербург
    отредактировано 06:56
    ipavels написал:
    ipavels написал:
    А ты смотрел свойство бэнда PrintSubsetIfEmpty?..
    Да это я знаю что можно печатать пустые бенды, но мне так не нужно.
    Я имел в иду с точносью до наоборот: НЕ печатать пустые...
    ipavels написал:
    в группе два просто отсутвуют Продажа и Приход
    Я так думаю!.. Мимино ;)
  • отредактировано 06:56
    А если в сам источник данных включить описание этого источника? Типа
    SELECT Field1, Field2, ... 1 AS LineType - для прихода
    SELECT Field1, Field2, ... 2 AS LineType - для продажи
    ...

    Тогда можно будет заносить итоговую сумму в элемент массива
    MyArray[DocType]
  • отредактировано 06:56
    Alexander написал:
    А если в сам источник данных включить описание этого источника? Типа
    SELECT Field1, Field2, ... 1 AS LineType - для прихода
    SELECT Field1, Field2, ... 2 AS LineType - для продажи
    ...

    Тогда можно будет заносить итоговую сумму в элемент массива
    MyArray[DocType]
    Что-то я не совсем понял идею?

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

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