IMsProblemCalculationSettings.ValueFlag

Синтаксис

ValueFlag: Integer;

ValueFlag: Integer;

Описание

Свойство ValueFlag определяет значение флага, используемого для отметки изменившихся значений.

Комментарии

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

Если для текущего свойства ValueFlag задано собственное значение больше нуля, то сохраняются те данные, для которых установлен передаваемый флаг изменившихся значений. Допустимое значение свойства находится в диапазоне [0; 255].

Значение флага будет доступно в событиях IMsProblemCalculationCallback.OnBeforeSaveData и IMsProblemCalculationCallback.OnSaveData.

Пример

Для выполнения примера предполагается наличие базы данных временных рядов с идентификатором «TSDB». В контейнере моделирования, который является дочерним объектом базы, создана задача моделирования с идентификатором «TSDB_PROBLEM».

Добавьте ссылки на системные сборки: Cubes, Matrix, Metabase, Ms.

Sub UserProc;
Var
    Mb: IMetabase;
    Rub: IRubricator;
    Problem: IMsProblem;
    Calculation: IMsProblemCalculation;
    CalcSettings: IMsProblemCalculationSettings;
Begin
    Mb := MetabaseClass.Active;
    Rub := MB.ItemById(
"TSDB").Bind As IRubricator;
    
// Получаем задачу в контейнере моделирования БДВР
    Problem := Mb.ItemByIdNamespace("TSDB_PROBLEM", Rub.ModelSpace.Key).Edit As IMsProblem;
    
// Флаг, который будет присвоен изменившимся данным
    // Задаем параметры расчёта задачи
    CalcSettings := Problem.CreateCalculationSettings;
    CalcSettings.FactIncluded := 
True;
    CalcSettings.BreakOnError := 
True;
    // Выполнение задачи с ValueFlag=2
    //...
    //Указание в CalcSettings первого набора параметров для расчёта
    //...
    CalcSettings.ValueFlag := 2;
    Calculation := Problem.Calculate(CalcSettings);
    Calculation.Callback := 
New MCallback.Create;
    Calculation.Run;
    // Выполнение задачи с ValueFlag=3
    //...
    //Указание в CalcSettings второго набора параметров для расчёта
    //...
    CalcSettings.ValueFlag := 3;
    Calculation := Problem.Calculate(CalcSettings);
    Calculation.Callback := 
New MCallback.Create;
    Calculation.Run;
End Sub UserProc;

Public Class MCallback: ProblemCalculationCallback
    
Public Sub OnBeforeSaveData(Stub: IVariableStub; Matrix: IMatrix; Var ValueFlag: Integer; Var Cancel: Boolean);
    
Begin
        Debug.WriteLine(ValueFlag);
        
Select Case ValueFlag
            
Case 2:
                
//...
                //Обработка данных, которые должны быть сохранены при ValueFlag = 2
                //...
            Case 3:
                
//...
                //Обработка данных, которые должны быть сохранены при ValueFlag = 3
                //...
        End Select;
    
End Sub OnBeforeSaveData;

    
Public Sub OnSaveData(Stub: IVariableStub; Matrix: IMatrix; ValueFlag: Integer; AuditRecordKey: Variant);
    
Var
        Iter: IMatrixIterator;
        RecordCount: Integer;
    
Begin
        Iter := Matrix.CreateIterator;
        Iter.Move(IteratorDirection.First);
        
While Iter.Valid Do
            
If Iter.ValueFlag = ValueFlag Then
                RecordCount := RecordCount + 
1;
            
End If;
            Iter.Move(IteratorDirection.Next);
        
End While;
        Debug.WriteLine(
"Данные сохранены на ValueFlag: " + ValueFlag.ToString + #13 + #10 +
            
"Количество сохранённых значений: " + RecordCount.ToString + #13 + #10 +
            
"Ключ записи в протоколе доступа: " + AuditRecordKey);
    
End Sub OnSaveData;
End Class MCallback;

Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.Ms;

Public Shared Sub Main(Params: StartParams);
Var
    Mb: IMetabase;
    Rub: IRubricator;
    Problem: IMsProblem;
    Calculation: IMsProblemCalculation;
    CalcSettings: IMsProblemCalculationSettings;
Begin
    Mb := Params.Metabase;
    Rub := MB.ItemById[
"TSDB"].Bind() As IRubricator;
    
// Получаем задачу в контейнере моделирования БДВР
    Problem := Mb.ItemByIdNamespace["TSDB_PROBLEM", Rub.ModelSpace.Key].Bind() As IMsProblem;
    
// Флаг, который будет присвоен изменившимся данным
    // Задаем параметры расчёта задачи
    CalcSettings := Problem.CreateCalculationSettings();
    CalcSettings.FactIncluded := 
True;
    CalcSettings.BreakOnError := 
True;
    // Выполнение задачи с ValueFlag=2
    //...
    //Указание в CalcSettings первого набора параметров для расчёта
    //...
    CalcSettings.ValueFlag := 2;
    Calculation := Problem.Calculate(CalcSettings);
    Calculation.Callback := 
New MCallback();
    Calculation.Run();
    // Выполнение задачи с ValueFlag=3
    //...
    //Указание в CalcSettings второго набора параметров для расчёта
    //...
    CalcSettings.ValueFlag := 3;
    Calculation := Problem.Calculate(CalcSettings);
    Calculation.Callback := 
New MCallback();
    Calculation.Run();
End Sub;

Public Class MCallback: IMsProblemCalculationCallback
    
Public Sub OnBeforeSaveData(Stub: IVariableStub; Matrix: IMatrix; Var ValueFlag: Integer; Var Cancel: Boolean);
    
Begin
        
Select Case ValueFlag
            
Case 2:
                
//...
                //Обработка данных, которые должны быть сохранены при ValueFlag = 2
                //...
            Case 3:
                
//...
                //Обработка данных, которые должны быть сохранены при ValueFlag = 3
                //...
        End Select;
    
End Sub;

    
Public Sub OnSaveData(Stub: IVariableStub; Matrix: IMatrix; ValueFlag: Integer; AuditRecordKey: Object);
    
Var
        Iter: IMatrixIterator;
        RecordCount: Integer;
    
Begin
        Iter := Matrix.CreateIterator();
        Iter.Move(IteratorDirection.itdFirst);
        
While Iter.Valid Do
            
If Iter.ValueFlag = ValueFlag Then
                RecordCount := RecordCount + 
1;
            
End If;
            Iter.Move(IteratorDirection.itdNext);
        
End While;
        System.Diagnostics.Debug.WriteLine(
"Данные сохранены на ValueFlag: " + ValueFlag.ToString() + char.ConvertFromUtf32(13) + char.ConvertFromUtf32(10) +
            
"Количество сохранённых значений: " + RecordCount.ToString() + char.ConvertFromUtf32(13) + char.ConvertFromUtf32(10) +
            
"Ключ записи в протоколе доступа: " + AuditRecordKey);
    
End Sub;

    
Public Sub OnBreak(Breakp: IMsBreakpoint);
    
Begin
    
End Sub;
    
    
Public Sub OnMessage(Message: String);
    
Begin
    
End Sub;
    
    
Public Sub OnError(Message: String);
    
Begin
    
End Sub;
    
    
Public Sub OnFinish();
    
Begin
    
End Sub;
    
    
Public Sub OnModelCalculation(Model: IMsModel);
    
Begin
    
End Sub;
    
    
Public Sub OnStep();
    
Begin
    
End Sub;
    
    
Public Sub OnWarning(Message: string);
    
Begin
    
End Sub;
    
    
Public Sub OnStageStart(Stage: MsProblemCalculationStage; Data: object);
    
Begin
    
End Sub;
    
    
Public Sub OnStageFinish(Stage: MsProblemCalculationStage; Duration: Integer; Data: object);
    
Begin
    
End Sub;
    
    
Public Function OnGetActiveEvents(): MsProblemCalculationCallbackEvents;
    
Begin
        
Return MsProblemCalculationCallbackEvents.mspceAll
    
End Function;
End Class;

В результате выполнения примера будет осуществлён расчёт задачи моделирования с двумя различными наборами параметров. Для расчётных данных при этом будут выставлены различные флаги изменённых данных. В событии OnBeforeSaveData по флагу может быть произведена дополнительная обработка данных. После сохранения в консоль среды разработки будет выведена информация о количестве сохранённых значений и ключе записи в протоколе доступа, соответствующей сохранению данных.

См. также:

IMsProblemCalculationSettings