Как программно создать связь Master-detail ?
Доброе время суток!
Есть таблица "Предметы", в которой каждому из предметов соответствует перечень тем из другой таблице по ключевому полю "KeySubject". Необходимо программно установить соединение, связанные таблицы в соединении, и, подключив таблицы к готовым бэндам в отчёте, вывести непосредственно сам отчёт.
Загвоздка в создании связи: программно - никак не получается создать связь...
В приложении пишу:
method report.Page_Load(sender: Object; e: EventArgs);
var
cnnStr : String;
rr : rReport;
rPath : String;
sc : System.Data.SqlClient.SqlConnection;
da : System.Data.SqlClient.SqlDataAdapter;
dt : DataTable;
daCh : System.Data.SqlClient.SqlDataAdapter;
dtCh : DataTable;
ds : DataSet;
begin
cnnStr := "Driver={SQL Server};Server=ххххххххИМЯ СЕРВЕРА MS SQLхххххххх;Database=ххххххххИМЯ БАЗЫ ДАННЫХхххххххх;Uid=user;Pwd=хххххххПАРОЛЬххххххх;";
if not IsPostBack then begin
// try
// чтение исходных данных по отчёту
rr := (Session.Contents as rReport);
//**********************************************************************************
rr.query := "SELECT S.KeySubject, S.NameSubject FROM subject S";
rr.queryDetail := "SELECT T.KeySubject, T.NameTema, T.KeyTema, COUNT(V.KeyVopros) AS cntVopros FROM dbo.tema T LEFT OUTER JOIN dbo.vopros V ON T.KeyTema = V.KeyTema GROUP BY T.KeySubject, T.KeyTema, T.NameTema";
rr.ReportName := 'subjects_topics.frx';
// путь до отчёта + имя отчёта
rPath := Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6) + '\reports\' + rr.ReportName.Trim;
// загрузка до отчёта
WebReport.Report.Load(rPath);
// создание и открытие подключения SqlConnection для отчёта
sc := new System.Data.SqlClient.SqlConnection(cnnStr.Substring(20));
sc.Open;
//*********************************************************************************
da := new System.Data.SqlClient.SqlDataAdapter(rr.query.Trim, sc);
//**********************************************************************************
daCh := new System.Data.SqlClient.SqlDataAdapter(rr.queryDetail.Trim, sc);
//**********************************************************************************
ds := new DataSet;
ds.Tables.Add(new DataTable('dt'));
ds.Tables.Add(new DataTable('dtCh'));
//da.Fill(ds.Tables); - заполнял перед установкой связи - не помогло
//daCh.Fill(ds.Tables);
ds.Tables.Columns.Add('KeySubject',typeof(Integer)); // - это для заполнения таблиц после установки связи - тоже не помогло...
ds.Tables.Columns.Add('KeySubject',typeof(Integer)); // - это для заполнения таблиц после установки связи - тоже не помогло...
ds.Relations.Add(new DataRelation("dsRelations", ds.Tables.Columns, ds.Tables.Columns));
da.Fill(ds.Tables); // - это для заполнения таблиц после установки связи - тоже не помогло...
daCh.Fill(ds.Tables); // - это для заполнения таблиц после установки связи - тоже не помогло...
WebReport.Report.RegisterData(ds, 'ds');
// прямая регистрация связи - не помогла
//WebReport.Report.RegisterData(new DataRelation("dsRelations", ds.Tables.Columns, ds.Tables.Columns), "dsRelations");
(WebReport.Report.FindObject('Data') as fastreport.DataBand).DataSource := WebReport.Report.GetDataSource('dt');
(WebReport.Report.FindObject('DataCh') as fastreport.DataBand).DataSource := WebReport.Report.GetDataSource('dtCh');
WebReport.Report.Prepare;
end;
end;
В результате должен был получиться отчёт в котором у каждого предмета свои темы... но такой связи не получается (у каждой записи ПРЕДМЕТОВ оказывается полное содержание таблицы ТЕМ)... Чего я здесь не так наворотил???
отчёт который вызывается в приложении: "subjects_topics - приложение.frx" прикреплён...
отчёт который нормально работает через подключение в отчёте: "subjects_topics_work - отчёт.frx" - также прикреплён
Просьба продублировать ответ на mouse_ru@mail.ru .
Есть таблица "Предметы", в которой каждому из предметов соответствует перечень тем из другой таблице по ключевому полю "KeySubject". Необходимо программно установить соединение, связанные таблицы в соединении, и, подключив таблицы к готовым бэндам в отчёте, вывести непосредственно сам отчёт.
Загвоздка в создании связи: программно - никак не получается создать связь...
В приложении пишу:
method report.Page_Load(sender: Object; e: EventArgs);
var
cnnStr : String;
rr : rReport;
rPath : String;
sc : System.Data.SqlClient.SqlConnection;
da : System.Data.SqlClient.SqlDataAdapter;
dt : DataTable;
daCh : System.Data.SqlClient.SqlDataAdapter;
dtCh : DataTable;
ds : DataSet;
begin
cnnStr := "Driver={SQL Server};Server=ххххххххИМЯ СЕРВЕРА MS SQLхххххххх;Database=ххххххххИМЯ БАЗЫ ДАННЫХхххххххх;Uid=user;Pwd=хххххххПАРОЛЬххххххх;";
if not IsPostBack then begin
// try
// чтение исходных данных по отчёту
rr := (Session.Contents as rReport);
//**********************************************************************************
rr.query := "SELECT S.KeySubject, S.NameSubject FROM subject S";
rr.queryDetail := "SELECT T.KeySubject, T.NameTema, T.KeyTema, COUNT(V.KeyVopros) AS cntVopros FROM dbo.tema T LEFT OUTER JOIN dbo.vopros V ON T.KeyTema = V.KeyTema GROUP BY T.KeySubject, T.KeyTema, T.NameTema";
rr.ReportName := 'subjects_topics.frx';
// путь до отчёта + имя отчёта
rPath := Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6) + '\reports\' + rr.ReportName.Trim;
// загрузка до отчёта
WebReport.Report.Load(rPath);
// создание и открытие подключения SqlConnection для отчёта
sc := new System.Data.SqlClient.SqlConnection(cnnStr.Substring(20));
sc.Open;
//*********************************************************************************
da := new System.Data.SqlClient.SqlDataAdapter(rr.query.Trim, sc);
//**********************************************************************************
daCh := new System.Data.SqlClient.SqlDataAdapter(rr.queryDetail.Trim, sc);
//**********************************************************************************
ds := new DataSet;
ds.Tables.Add(new DataTable('dt'));
ds.Tables.Add(new DataTable('dtCh'));
//da.Fill(ds.Tables); - заполнял перед установкой связи - не помогло
//daCh.Fill(ds.Tables);
ds.Tables.Columns.Add('KeySubject',typeof(Integer)); // - это для заполнения таблиц после установки связи - тоже не помогло...
ds.Tables.Columns.Add('KeySubject',typeof(Integer)); // - это для заполнения таблиц после установки связи - тоже не помогло...
ds.Relations.Add(new DataRelation("dsRelations", ds.Tables.Columns, ds.Tables.Columns));
da.Fill(ds.Tables); // - это для заполнения таблиц после установки связи - тоже не помогло...
daCh.Fill(ds.Tables); // - это для заполнения таблиц после установки связи - тоже не помогло...
WebReport.Report.RegisterData(ds, 'ds');
// прямая регистрация связи - не помогла
//WebReport.Report.RegisterData(new DataRelation("dsRelations", ds.Tables.Columns, ds.Tables.Columns), "dsRelations");
(WebReport.Report.FindObject('Data') as fastreport.DataBand).DataSource := WebReport.Report.GetDataSource('dt');
(WebReport.Report.FindObject('DataCh') as fastreport.DataBand).DataSource := WebReport.Report.GetDataSource('dtCh');
WebReport.Report.Prepare;
end;
end;
В результате должен был получиться отчёт в котором у каждого предмета свои темы... но такой связи не получается (у каждой записи ПРЕДМЕТОВ оказывается полное содержание таблицы ТЕМ)... Чего я здесь не так наворотил???
отчёт который вызывается в приложении: "subjects_topics - приложение.frx" прикреплён...
отчёт который нормально работает через подключение в отчёте: "subjects_topics_work - отчёт.frx" - также прикреплён
Просьба продублировать ответ на mouse_ru@mail.ru .