QueryBuilder: управляемый полёт
Добавлено: 05 мар 2009, 06:25
Приветствую уважаемое сообщество.
Есть у меня пожелание, которым хочу поделиться с командой разработчиков.
Пожелание сиюминутное и легко реализуемое, но, возможно, найдёт поддержку со стороны разработчиков.
Захотелось нам использовать QueryBuilder из состава генератора отчётов для своих нужд, причём
как в контексте дизайнера отчётов, так и отдельно в своём приложении.
И мы это сделали, и подружили его со своим хранилищем данных (это наше собственное логическое
хранилище), и написали ему MetadataProvider и SyntaxProvider и даже всё это заработало.
Но удручает полное отсутствие возможности как-то влиять на его работу снаружи.
С одной стороны вмешиваться в исходники не есть гуд и пока удаётся этого избегать,
с другой стороны в реализации QB устраивает не всё и никаких средств хоть как-то на это повлиять нет...
Отбросив мало мотивированные желания (всё многообразие возможностей QB просто не доступно из интерфейса
формы QueryBuilderForm) мы оставили одну "особенность" QB, терпеть которую нет сил,
а именно: у нас в хранилише данных более четырёх сотен объектов (таблицы, процедуры, вьюхи и т.п.)
распределённых по полутора десяткам пространств имён. Когда QB пытается отобразить всё это добро - он сразу раскрывает
всё дерево (QueryBuilder.cs : строка 12558)
Но при запуске QB из дизайнера отчёта
(StiDataStoreSourceEditForm.tbRunQueryBuilder_Click() ---> StiQueryBuilderActivator.RunQueryBuilder())
никаких средств воздействия не остаётся, пользователю вываливается дерево метаданных на полтыщщи узлов, отчего
он тихо охреневает, а я плохо сплю по ночам...
Было бы замечательно иметь набор опций, позволяющих как-то управлять поведением QB. Или иметь возможность
дотянуться до формы QueryBuilderForm при её запуске активатором (какое-нибудь событие BeforeShowQueryBuilderForm с аргументом -
этой формой, чтобы подкрутить её до ума - это конечно жутко криво, но и то - хлеб).
Опубликовать нужные свойства, дабы избежать непотребства с рефлекшном...
Дорогие товарищи учёные, чем можно помочь моему горю?
Есть у меня пожелание, которым хочу поделиться с командой разработчиков.
Пожелание сиюминутное и легко реализуемое, но, возможно, найдёт поддержку со стороны разработчиков.
Захотелось нам использовать QueryBuilder из состава генератора отчётов для своих нужд, причём
как в контексте дизайнера отчётов, так и отдельно в своём приложении.
И мы это сделали, и подружили его со своим хранилищем данных (это наше собственное логическое
хранилище), и написали ему MetadataProvider и SyntaxProvider и даже всё это заработало.
Но удручает полное отсутствие возможности как-то влиять на его работу снаружи.
С одной стороны вмешиваться в исходники не есть гуд и пока удаётся этого избегать,
с другой стороны в реализации QB устраивает не всё и никаких средств хоть как-то на это повлиять нет...
Отбросив мало мотивированные желания (всё многообразие возможностей QB просто не доступно из интерфейса
формы QueryBuilderForm) мы оставили одну "особенность" QB, терпеть которую нет сил,
а именно: у нас в хранилише данных более четырёх сотен объектов (таблицы, процедуры, вьюхи и т.п.)
распределённых по полутора десяткам пространств имён. Когда QB пытается отобразить всё это добро - он сразу раскрывает
всё дерево (QueryBuilder.cs : строка 12558)
Код: Выделить всё
public void ReloadNodes(...)
{
.....
this.ExpandAll();
/// Выполнение диалога построителя запросов
///
public void Execute()
{
using (Stimulsoft.Database.QueryBuilderForm form = new Stimulsoft.Database.QueryBuilderForm())
{
form.QueryBuilder.SyntaxProvider = createSyntaxProvider();
form.QueryBuilder.MetadataProvider = createMetadataProvider();
form.QueryBuilder.SQL = sql;
setFieldValue(form, "PrevSql", sql);
metadataTree = (Stimulsoft.Database.MetadataTree)getFieldValue(form.QueryBuilder, "fMetadataTree");
sqlEditor = (Stimulsoft.Report.Design.Editors.StiCodeEditor)getFieldValue(form, "SqlEditor");
form.QueryBuilder.RefreshMetadata();
form.SaveQuery += new EventHandler(saveQueryHandler);
form.Load += new EventHandler(loadHandler);
DialogResult res = form.ShowDialog();
if (res == DialogResult.OK || res == DialogResult.Yes)
{
this.sql = getQueryText();
}
}
}
private void saveQueryHandler(object sender, EventArgs e)
{
this.sql = getQueryText(); // sender as string;
EventHandler temp = SavingQueryText;
if (temp != null)
{
temp(this, e);
}
}
private FieldInfo getFieldInfo(object recipient, string fieldName)
{
FieldInfo fi = recipient.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
if (fi != null)
{
return fi;
}
else
{
throw new Exception("Field '{0}' not found in object {1}", fieldName, recipient.GetType().Name);
}
}
private void setFieldValue(object recipient, string fieldName, object value)
{
getFieldInfo(recipient, fieldName).SetValue(recipient, value);
}
private object getFieldValue(object recipient, string fieldName)
{
return getFieldInfo(recipient, fieldName).GetValue(recipient);
}
private Stimulsoft.Database.MetadataTree metadataTree;
private void loadHandler(object sender, EventArgs e)
{
//
// Здесь пытаемся открыть дерево метаданных как нам надо...
//
if (metadataTree != null)
{
metadataTree.CollapseAll();
if (metadataTree.Nodes.Count > 0)
{
if (Connection is PDPStorageDbConnection)
{
metadataTree.Nodes[0].Text = Connection.ConnectionString;
}
metadataTree.Nodes[0].Expand();
}
}
}
private Stimulsoft.Report.Design.Editors.StiCodeEditor sqlEditor;
private string getQueryText()
{
return sqlEditor.Text;
}
Но при запуске QB из дизайнера отчёта
(StiDataStoreSourceEditForm.tbRunQueryBuilder_Click() ---> StiQueryBuilderActivator.RunQueryBuilder())
никаких средств воздействия не остаётся, пользователю вываливается дерево метаданных на полтыщщи узлов, отчего
он тихо охреневает, а я плохо сплю по ночам...
Было бы замечательно иметь набор опций, позволяющих как-то управлять поведением QB. Или иметь возможность
дотянуться до формы QueryBuilderForm при её запуске активатором (какое-нибудь событие BeforeShowQueryBuilderForm с аргументом -
этой формой, чтобы подкрутить её до ума - это конечно жутко криво, но и то - хлеб).
Опубликовать нужные свойства, дабы избежать непотребства с рефлекшном...
Дорогие товарищи учёные, чем можно помочь моему горю?