Динамическое отображение таблиц
Доброго времени суток). Что-то никак не могу разобраться. У меня есть переменный набор групп. Их точное количество вычисляется. Нужно отобразить где-то так:
Имя группы
Таблица значений
Имя следующей группы
Таблица значений
и т.д.
Может кто натолкнет на мыслю. Пишу в delphi
Имя группы
Таблица значений
Имя следующей группы
Таблица значений
и т.д.
Может кто натолкнет на мыслю. Пишу в delphi
Комментарии
Ну тут смотря какой SQL напишу. Правда потом у меня он в массив преобразовывается и пользуюсь UserDataSet. Могу сделать выборку, чтобы все в одном запросе было, могу чтобы в разных и передавать несколько раз. Но что-то мне кажется, что в одном массиве как-то проще будет. Только не могу понять как его разделить. А то у меня три раза одни и те же данные выводит. .
Исходя из задачи, которую вы преследуете предложу 2 варианта:
1) Если таких групп должно быть точное число (2, 5, 6), то можно создать некий параметр вида: В дизайне отчёта добавляете один frxGroupHeader по полю PARAMETER и анализируете его либо посредством вложенных IIF, либо в onBeforePrint по средством CASE. И выводите тот текст, что нужно
2) Если мы заранее не знаем, сколько таких групп, то создаём группы динамически Только надо определиться, каким образом будет передаваться параметр группировки, но это уже зависит от конкретной задачи, которую решаете (от БД)
Случай 2. У нас несколько SQL-запросов в разных TDataSet
Здесь вообще элементарно:
Header1
MasterData1
Footer1
Header2
MasterData2
Footer2
и так далее
Можно создавать динамически, можно в дизайнере. Это зависит, опять же таки, от того, знаем ли мы точное количество групп.
выводит только Группу 0 и Группу 1 (((
И рекомендую использовать fr01cm или fr1cm, цифра "20" не факт, что даст корректный результат.
Пришлите тестовый проект с кусочком базы данных, попробую разобраться.
Смотрите вложения.
234.fr3 и 1.jpg - ваш отчёт.
123.fr3 и 2.jpg - мой отчёт.
Если хотите, пришлите пример готового отчёта (рисунок или WORD) и кусок имеющейся базы или её макет, смогу если не помочь, то хотя бы подсказать.
Группа 1 - имя пользователя - тел - ....
Группа 1 - имя пользователя - тел - ....
Группа 1 - имя пользователя - тел - ....
Группа 2 - имя пользователя - тел - ....
Группа 2 - имя пользователя - тел - ....
Группа 3 - имя пользователя - тел - ....
Можно, например, так:
Select {... поля ...}, Group_Number --хранится в базе данных
Select {... поля ...}, (Select <выражение>) as Group_Number --вычисляется
Добавляем на форму frxDBDataset1
В отчёте создаём один TfrxGroupHeader (+ Footer). Можно в дизайнере. Бросаем на него Memo1
В onBeforePrint этого GroupHeader1 пишем: А можно вообще в SQL-запросе написать поле GroupName и вообще никакого Case не надо, тупо в Memo пишем [frxDBDataSet1."GroupName"]
Это так, в общих чертах. Более детально подскажу, если увижу базу, и как вы из неё берёте данные.
Выбираете FastReport VCL -> Demo -> compiled Demo.
В самом демо есть пример отчёта "Drill-down groups".
Кнопки Preview и Design покажут вам, как это работает.
т.е.
MasterData1 = DataSet
MasterData2 = DataSet
MasterData3 = DataSet
но при первом проходе мне надо вывести элементы 1 группы
при втором элементы 2 группы
при третьем элементы 3 группы и т.д.
написал что-то тестовое. Вроди бы подходит. Но не пойму как в дата сете установить первый элемент. Или чем можно заменить Value := '' чтобы оно просто ничего не выводило.
Чтобы не выводить что-то, нужно это скрыть
TfrxMasterData(...).Visible := (<условие> = true);
TfrxMemoView(...).Visible := (<условие> = true);
Та я пробую, нашел пример. У меня ж не запрос. А запрос преобразованный в дерево, это дерево преобразовано в массив. И в отчет уже поступает массив данных и рекорд. В рекорде указание с какой строки по какую принадлежит какой группе. Просто проект большой да и база несколько гб. Кусочки могу канешь показать.
А через датасет как? Я же не могу привязать мастер даты к разным датасетам. Или мне динамически придется создавать TFrxUserDataSet, что у меня не получилось. Или я чего-то непонимаю
В общем, анализируйте. После 17:00 уже не отвечу. Исходники прикрепил
То или не то?
TRecord1 = record
text: string;
grouptype:integer;
end;
поменять на
TRecord1 = record
text:array[0..5] of TStringList;
grouptype:integer;
end;
Завтра помучаю). Но пол дела сделано ).
procedure TForm7.frxUserDataSet1GetValue(const VarName: string; var Value: Variant);
begin
if VarName = 'Text' then
begin
Value := array1[Index].text[row];
inc(row);
inc(countRow);
if countRow=recordCount then
begin
countRow := 0;
frxUserDataSet1Next(self);
end;
end
else if VarName = 'GroupType' then
Value := array1[Index].grouptype
else if VarName = 'GroupName' then
Value := groups[array1[Index].grouptype]
end;
Теперь у меня при достижении нужного номера вызывается событие frxUserDataSet1Next(self);
а в Prior задается количество строк в следующем списке
procedure TForm7.frxUserDataSet1Prior(Sender: TObject);
begin
recordCount := recordCount+1; // тут любое количество
if INdex >0 then
dec(index);
{ row:=0; }
end;
вобщем демо код готов. Можно его внедрять в проект). Nightmareterrible большое спасибо).