TargetTerm: IMsFormulaTerm;
Свойство TargetTerm возвращает параметры элементов выражений (термов), используемых в целевой функции.
Для выполнения примера предполагается наличие в репозитории алгоритма расчёта с идентификатором ALGORITHM. В алгоритме расчёта создан и настроен блок линейной оптимизации.
Добавьте ссылки на системные сборки: Algo, Cubes, Dimensions, Metabase, Ms. Также добавьте ссылки на сборки, которые необходимы для работы с алгоритмами расчёта.
Sub UserProc;
Var
MB: IMetabase;
MObj: IMetabaseObjectDescriptor;
Algo, CalcBlock: ICalcObject;
List: ICalcObjectsList;
CalcAlgo: ICalcAlgorithm;
LinearBlock: ICalcLinearOptimizationBlock;
TargetTerm: IMsFormulaTerm;
TargetTermInfo: IMsFormulaTermInfo;
StubSel: IStubSelection;
Begin
MB := MetabaseClass.Active;
// Получим алгоритм расчёта
MObj := MB.ItemById("ALGORITHM");
Algo := CalcObjectFactory.CreateCalcObject(MObj, True);
CalcAlgo := Algo As ICalcAlgorithm;
// Получим список объектов алгоритма расчёта
List := CalcAlgo.Items;
// Получим первый блок линейной оптимизации
CalcBlock := List.Item(0);
LinearBlock := CalcBlock As ICalcLinearOptimizationBlock;
// Проверяем признак соответствия источника данных целевой функции
If LinearBlock.IsValidStub(LinearBlock.StubOut) Then
Debug.WriteLine("Источник данных соответствует целевой функции.");
Else
Debug.WriteLine("Источник данных не соответствует целевой функции.");
End If;
// Проверяем параметры термов, используемых в целевой функции
Debug.WriteLine("Параметры термов, используемые в целевой функции.");
TargetTerm := LinearBlock.TargetTerm;
// Проверяем настройки параметров терма
Debug.WriteLine("Настройки параметров термов.");
Debug.WriteLine("Ключ терма: " + targetTerm.Key.ToString);
Debug.WriteLine("Наименование среза: " + TargetTerm.Slice.Name);
StubSel := LinearBlock.StubResult;
TargetTermInfo := LinearBlock.TargetTermInfo;
Debug.WriteLine("Дата, на которую будут браться данные из указанного среза переменной при использовании данного терма: " + TargetTermInfo.Date.ToString);
Debug.WriteLine("Выражение: '" + StubSel.Term.TermToText + "'");
ShowSelectionSet("Отметка источника данных: ", StubSel.SelectionSet);
ShowSelectionSet("Отметка источника данных (с учётом параметров): ", StubSel.GetRealSelectionSet);
ShowSelectionSet("Отметка в срезе выражения: ", StubSel.Term.Slice.Selection);
Debug.WriteLine("Изменяем целевую функцию.");
FillTargetFunction(LinearBlock);
StubSel.RefreshSelection;
ShowSelectionSet("Отметка в срезе выражения: ", StubSel.Term.Slice.Selection);
End Sub UserProc;
Sub ShowSelectionSet(begMsg: String; SelectionSet: IDimSelectionSet);
Var
s: String;
i: Integer;
Begin
s := "";
For i := 0 To SelectionSet.Count - 1 Do
s := s + "[" + SelectionSet.Item(i).ToString + "]" + (i = SelectionSet.Count - 1 ? "" : ",");
End For;
Debug.WriteLine(begMsg + s);
End Sub ShowSelectionSet;
Sub FillTargetFunction(LinearBlock: ICalcLinearOptimizationBlock);
Var
oneDimension: IDimensionModel;
oneDimensionInstance: IDimInstance;
sel: IDimSelection;
iteratorDim: IMsDimIteratorDimension;
i, cnt: Integer;
Begin
cnt := LinearBlock.StubOut.DimensionCount;
For i := 1 To cnt - 1 Do
oneDimension := LinearBlock.StubOut.Dimension(i);
If Not oneDimension.IsCalendar Then
oneDimensionInstance := ((oneDimension As IMetabaseObjectDescriptor).Open(Null) As IDimInstance);
// Факты нельзя добавить в целевую функцию
If oneDimensionInstance.Ident <> "FACTS" Then
sel := LinearBlock.TargetFunction.FindByKey(oneDimensionInstance.Key);
If sel = Null Then
LinearBlock.TargetFunction.Add(oneDimensionInstance);
// Необходимо убрать эти измерения из итератора
iteratorDim := linearBlock.Iterator.Dimensions.FindByKey(oneDimensionInstance.Key);
CopyFromIterToTerm(iteratorDim, linearBlock);
LinearBlock.Iterator.Dimensions.RemoveByKey(iteratorDim.Dimension.Key);
End If;
End If;
End If;
End For;
End Sub FillTargetFunction;
Sub CopyFromIterToTerm(dimIter: IMsDimIteratorDimension; linearBlock: ICalcLinearOptimizationBlock);
Var
dimParam: IMsParametrizedDimension;
sel: IDimSelection;
Begin
sel := linearBlock.TargetFunction.FindByKey(dimIter.Dimension.Key);
If sel <> Null Then
sel.DeselectAll;
End If;
dimParam := linearBlock.TargetTerm.Slice.ParametrizedDimensions.FindByKey(dimIter.Dimension.Key);
dimParam.Aggregation.AggregateAll := False;
dimParam.ParamAttributes.Parameter := Null;
If dimIter.Filter.ParameterAsSelection <> Null Then
dimParam.ParamAttributes.Parameter := linearBlock.Params.FindById(dimIter.Filter.ParameterAsSelection.Id);
Else
If dimIter.Filter.Selection = Null Then
dimParam.Aggregation.AggregateAll := True;
Else
sel := linearBlock.TargetFunction.FindByKey(dimIter.Dimension.Key);
dimIter.Filter.Selection.CopyTo(sel, True);
End If;
End If;
CopyAdvFilter(dimIter.Filter.AdvancedFilter, dimParam.Aggregation.AdvancedFilter);
End Sub CopyFromIterToTerm;
Sub CopyAdvFilter(advFilterSource, advFilterTarget: IMsDimIteratorAdvancedFilter);
Var
sourceItem, targetItem: IMsDimIteratorAdvancedFilterCondition;
i, cnt: Integer;
Begin
advFilterTarget.Clear;
cnt := advFilterSource.Count;
For i := 0 To cnt - 1 Do
sourceItem := advFilterSource.Item(i);
targetItem := advFilterTarget.Add;
targetItem.Attribute := sourceItem.Attribute;
targetItem.Inversed := sourceItem.Inversed;
targetItem.Operator_ := sourceItem.Operator_;
targetItem.ParamAttributes.Parameter := sourceItem.ParamAttributes.Parameter;
targetItem.Value := sourceItem.Value;
End For;
End Sub CopyAdvFilter;
При выполнении примера в консоль среды разработки будет выведена информация о термах, используемых в целевой функции. После этого целевая функция будет изменена: если какие-либо измерения приёмника не были включены в целевую функцию, то они будут добавлены в неё. Настройки фильтрации и расширенный фильтр измерений будут сохранены.
См. также: