Проблема с обработкой связей

отредактировано June 2009 Раздел: FastReport .NET
Имеется датасет:
            DataSet ds1 = new DataSet("Example 3");

            //Creating data tables
            DataTable sTable = new DataTable("sTable");
            DataTable iTable = new DataTable("iTable");

            //Creating data columns in data tables
            //sTable
            DataColumn sID = new DataColumn("sID", typeof(int));
            sTable.Columns.Add(sID);
            sTable.PrimaryKey = new DataColumn[] { sID };
            DataColumn sName = new DataColumn("sName", typeof(string));
            sTable.Columns.Add(sName);
            
            DataColumn iSID = new DataColumn("iSID", typeof(int));
            iTable.Columns.Add(iSID);
            DataColumn iTID = new DataColumn("iTID", typeof(int));
            iTable.Columns.Add(iTID);
            

            //Fill tables with data
            //sTable
            DataRow sDr1 = sTable.NewRow();
            sDr1[0] = 1; sDr1[1] = "Source Name 1";
            DataRow sDr2 = sTable.NewRow();
            sDr2[0] = 2; sDr2[1] = "Source Name 2";
            DataRow sDr3 = sTable.NewRow();
            sDr3[0] = 3; sDr3[1] = "Source Name 3";
            sTable.Rows.Add(sDr1);
            sTable.Rows.Add(sDr2);
            sTable.Rows.Add(sDr3);
            //iTable
            DataRow iDr1 = iTable.NewRow();
            iDr1[0] = 1; iDr1[1] = 2; 
            DataRow iDr2 = iTable.NewRow();
            iDr2[0] = 2; iDr2[1] = 3; 
            DataRow iDr3 = iTable.NewRow();
            iDr3[0] = 3; iDr3[1] = 1;
            iTable.Rows.Add(iDr1);
            iTable.Rows.Add(iDr2);
            iTable.Rows.Add(iDr3);

            

            ds1.Tables.AddRange(new DataTable[] { sTable, iTable });
            DataRelation rel_S_to_I = new DataRelation("Source_to_Intersec", sTable.Columns["sID"], iTable.Columns["iSID"]);
            DataRelation rel_I_to_S = new DataRelation("Intersec_to_Source", iTable.Columns["iTID"], sTable.Columns["sID"]);
            ds1.Relations.AddRange(new DataRelation[] { rel_S_to_I , rel_I_to_S });
этот датасет передается в FastReport

С помощью этих двух таблиц и двух связей надо вывести иерархию вида
- 1 Source Name 1
-- 2 Source Name 2
--- 3 Source Name 3
- 2 Source Name 2
-- 3 Source Name 3
и т.д.

пробовал сделать так:
d887c.jpg

при построении отчета получаю только вот это:
65e22.jpg

т.е. при сипользовании промежуточной таблицы, через которую идет связь, не удается получить даже вывод вида:
- 1 Source Name 1
-- 2 Source Name 2
отчет с примером прикрепляться не хочет, если надо могу выслать.

Комментарии

  • отредактировано 15:27
    Здравствуйте,

    Для отчета master-detail-subdetail, как на первом скриншоте, нужны 3 разных таблицы. Вы пытаетесь использовать 2, что неправильно.
    Для иерархии FastReport требуется 1 таблица с полями Id и ParentId (см. пример в демо). В Вашем случае проще будет из двух таблиц и двух связей сделать одну, и "скормить" ее FastReport.
  • отредактировано June 2009
    AlexTZ написал: »
    Здравствуйте,

    Для отчета master-detail-subdetail, как на первом скриншоте, нужны 3 разных таблицы. Вы пытаетесь использовать 2, что неправильно.
    Для иерархии FastReport требуется 1 таблица с полями Id и ParentId (см. пример в демо). В Вашем случае проще будет из двух таблиц и двух связей сделать одну, и "скормить" ее FastReport.

    Понятно, спасибо. В БД, откуда берутся данные, связи имеют более брутальный вид, чем в приведенном мной примере.
    Еще я пробовал передать свои данные через SQLite, т.е. создал свой тип подключения. Все нормально заработало, только вот возникли вопросы:
    1.Из подключения можно передать в FastReport только таблицы и отображения (view)?
    2. Может ли FastReport использовать связи, имеющиеся в БД, и если может то, как их передать?
    3. Почему в Query Designer`e, вкладке Designer не отображаются имена выбранных полей?


    fc28c.jpg
  • отредактировано 15:27
    Можно использовать событие Report.StartReport в скрипте, чтобы создать DataTable, наполнить данными из других таблиц, зарегистрировать в отчете и привязать источник данных к бэнду.

    1) да, визард работает только с таблицами и представлениями
    2) связи не читаются, их придется настраивать самому (в окне "Данные" - Действия/Новая связь)
    3) попробовал у себя, имя отображается... Как повторить ошибку?
  • отредактировано 15:27
    AlexTZ написал: »
    3) попробовал у себя, имя отображается... Как повторить ошибку?
    Даже не знаю, у меня они еще ни разу не отображались. Пробовал и MS Access, и SQL подключения, в конструкторе запросов имена не отображаются, хотя сам запрос строится правильно.

    А на счет связей с которыми работает FastReport - я так понимаю это обычные DataRelation со всеми из ограничениями (столбец источника должен быть уникальным, для каждого дочернего столбца-цели должен существовать родитель)?

    Может имеет смысл "подружить" FastReport с SQLite`ом, использовать SQLite в качестве словаря данных, со всеми его таблицами связями и пр.?
  • отредактировано 15:27
    FR использует свои объекты Relation, которые являются аналогами DataRelation.

    Для SQLite можно сделать коннектор, займусь этим в ближайшее время.
  • отредактировано 15:27
    AlexTZ написал: »
    FR использует свои объекты Relation, которые являются аналогами DataRelation.

    Для SQLite можно сделать коннектор, займусь этим в ближайшее время.

    С подключением к SQLite как к БД проблем нет, необходимо именно работа со связами SQLite`а
  • отредактировано 15:27
    Связи сейчас импортируются только при регистрации датасета методом report.RegisterData(DataSet). Добавлять импорт связей в визард данных долго и тяжело, у каждой БД они разные. Это в ближайшее время не планируется.

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

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