SetCallback(Module: IMetabaseObjectDescriptor; ForeClass: String);
SetCallback(Module: Prognoz.Platform.Interop.Metabase.IMetabaseObjectDescriptor; ForeClass: String);
Module. Описание модуля, в котором реализован класс, реализующий методы интерфейса ISQLCallback.
ForeClass. Наименование класса, который используется для обработки процесса формирования запроса на извлечение данных.
Метод SetCallback задаёт для источника данных обработчик процесса формирования запроса на извлечение данных.
В параметре ForeClass необходимо указать наименование класса, который реализует методы интерфейса ISQLCallback.
Для сброса установленного обработчика задайте параметру Module значение Null, а параметру ForeClass - "".
Для выполнения примера предполагается наличие в репозитории стандартного куба с идентификатором «STD_CUBE» и модуля с идентификатором «CUBE_CALLBACK». В модуле реализован класс «SQLCallback».
Добавьте ссылки на системные сборки: Cubes, Metabase.
Sub UserProc;
Var
MB: IMetabase;
Cube: IStandardCube;
CubeDataset: IStandardCubeDataset;
Begin
MB := MetabaseClass.Active;
Cube := MB.ItemById("STD_CUBE").Edit As IStandardCube;
CubeDataset := Cube.Destinations.Item(0).Datasets.Item(0);
CubeDataset.SetCallback(MB.ItemById("CUBE_CALLBACK"), "SQLCallback");
(Cube As IMetabaseObject).Save;
End Sub UserProc;
Public Class SQLCallback: Object, ISQLCallback
Sub BeforeConstruction(Components: ISQLComponents);
Var
i: Integer;
Select_, From_, Where, GroupBy, Aggregation, OrderBy: String;
Begin
Debug.WriteLine("Select_: " + Components.Select_);
Debug.WriteLine("From_: " + Components.From_);
Debug.WriteLine("Where: " + Components.Where);
Debug.WriteLine("GroupBy: " + Components.GroupBy);
Debug.WriteLine("Aggregation: " + Components.Aggregation);
Debug.WriteLine("OrderBy: " + Components.OrderBy);
Debug.WriteLine("SubQuery: " + Components.SubQuery.ToString);
Debug.WriteLine("ConditionCount: " + Components.ConditionCount.ToString);
For i := 0 To Components.ConditionCount - 1 Do
Debug.WriteLine("Condition " + i.ToString + " : " + Components.Condition(i).Condition);
End For;
Debug.WriteLine("TableAlias: " + Components.TableAlias);
//---Изменяемые части запроса
//Select_ := Components.Select_;
//...
//...Модификация Select_
//...
//Components.Select_ := Select_;
//From_ := Components.From_;
//...
//...Модификация From_
//...
//Components.From_ := From_;
//Where := Components.Where;
//...
//...Модификация Where
//...
//Components.Where := Where;
//GroupBy := Components.GroupBy;
//...
//...Модификация GroupBy
//...
//Components.GroupBy := GroupBy;
//Aggregation := Components.Aggregation;
//...
//...Модификация Aggregation
//...
//Components.Aggregation := Aggregation;
//OrderBy := Components.OrderBy;
//...
//...Модификация OrderBy
//...
//Components.OrderBy := OrderBy;
End Sub BeforeConstruction;
Sub AfterConstruction(Var SQL: String);
Begin
//При необходимости модификация окончательного текста запроса в переменной SQL
Debug.WriteLine("AFTER: " + SQL);
End Sub AfterConstruction;
End Class SQLCallback;
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Db;
Imports Prognoz.Platform.Interop.Metabase;
Public Sub Main(Params: StartParams);
Var
MB: IMetabase;
Cube: IStandardCube;
CubeDataset: IStandardCubeDataset;
Begin
MB := Params.Metabase;
Cube := MB.ItemById["STD_CUBE"].Edit() As IStandardCube;
CubeDataset := Cube.Destinations.Item[0].Datasets.Item[0];
CubeDataset.SetCallback(MB.ItemById["CUBE_CALLBACK"], "SQLCallback");
(Cube As IMetabaseObject).Save();
End Sub;
Public Class SQLCallback: ISQLCallback
Public Sub BeforeConstruction(Components: ISQLComponents);
Var
i, l: Integer;
Select_, From_, Where, GroupBy, Aggregation, OrderBy: String;
Begin
System.Diagnostics.Debug.WriteLine("Select_: " + Components.@Select);
System.Diagnostics.Debug.WriteLine("From_: " + Components.From);
System.Diagnostics.Debug.WriteLine("Where: " + Components.Where);
System.Diagnostics.Debug.WriteLine("GroupBy: " + Components.GroupBy);
System.Diagnostics.Debug.WriteLine("Aggregation: " + Components.Aggregation);
System.Diagnostics.Debug.WriteLine("OrderBy: " + Components.OrderBy);
System.Diagnostics.Debug.WriteLine("SubQuery: " + Components.SubQuery.ToString());
System.Diagnostics.Debug.WriteLine("ConditionCount: " + Components.ConditionCount.ToString());
l := Components.ConditionCount - 1;
For i := 0 To l Do
System.Diagnostics.Debug.WriteLine("Condition " + i.ToString() + " : " + Components.Condition[i].Condition);
End For;
System.Diagnostics.Debug.WriteLine("TableAlias: " + Components.TableAlias);
//---Изменяемые части запроса
//Select_ := Components.Select_;
//...
//...Модификация Select_
//...
//Components.Select_ := Select_;
//From_ := Components.From_;
//...
//...Модификация From_
//...
//Components.From_ := From_;
//Where := Components.Where;
//...
//...Модификация Where
//...
//Components.Where := Where;
//GroupBy := Components.GroupBy;
//...
//...Модификация GroupBy
//...
//Components.GroupBy := GroupBy;
//Aggregation := Components.Aggregation;
//...
//...Модификация Aggregation
//...
//Components.Aggregation := Aggregation;
//OrderBy := Components.OrderBy;
//...
//...Модификация OrderBy
//...
//Components.OrderBy := OrderBy;
End Sub;
Public Sub AfterConstruction(Var SQL: String);
Begin
//При необходимости модификация окончательного текста запроса в переменной SQL
System.Diagnostics.Debug.WriteLine("AFTER: " + SQL);
End Sub;
End Class;
При выполнении примера для первого источника куба будет установлен обработчик процесса формирования запроса.
См. также: