QueryBuilder: управляемый полёт

Обсуждение Stimulsoft Reports.NET
Ответить
ppvlad
Сообщения: 24
Зарегистрирован: 26 янв 2009, 10:35
Откуда: Moscow
Контактная информация:

QueryBuilder: управляемый полёт

Сообщение ppvlad »

Приветствую уважаемое сообщество.

Есть у меня пожелание, которым хочу поделиться с командой разработчиков.
Пожелание сиюминутное и легко реализуемое, но, возможно, найдёт поддержку со стороны разработчиков.

Захотелось нам использовать 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 с аргументом -
этой формой, чтобы подкрутить её до ума - это конечно жутко криво, но и то - хлеб).
Опубликовать нужные свойства, дабы избежать непотребства с рефлекшном...

Дорогие товарищи учёные, чем можно помочь моему горю?

Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

QueryBuilder: управляемый полёт

Сообщение Edward »

Здравствуйте.

Большое спасибо за Ваши идеи и дельные предложения. У нас есть планы по усовершенствованию QueryBuilder, но заняться мы сможем этим только после релиза 2009.1 который ожидается в конце марта.

Спасибо.
Ответить