Класс движения итога

При создании каждого итога генерируется три класса движения итога. Их исходным описанием служит название итога (Name) +"Transaction" для класса транзакции итога, +"Balance" для класса баланса итога и +"DetailedTransaction" для класса детализированной транзакции итога. А исходным описанием списка их свойств служат соответствующие измерения и переменные итога.

Например, рассмотрим создание простого итога TotalName с измерением DimensionID и переменной Variable.

Класс модели предметной области, сгенерированный по этому описанию, выглядит следующим образом:

// Класс транзакции итога.

[Table(Name = "VTR_TOTAL_NAME"), Serializable]

[LocalizedDisplayName(typeof(TotalNameTransaction),

         "Ultima.Metadata.Classes.Resources", "TotalNameTransactionTotal")]

public partial class TotalNameTransaction : TransactionValue

{

 [Column(Name = "DIMENSION_ID", CanBeNull = false)]

 [LocalizedDisplayName(typeof(TotalNameTransaction),

         "Ultima.Metadata.Classes.Resources", "TotalNameTransaction_DimensionID")]

 public long DimensionID { get; set; }

 

 [Column(Name = "VARIABLE", CanBeNull = false)]

 [LocalizedDisplayName(typeof(TotalNameTransaction),

         "Ultima.Metadata.Classes.Resources", "TotalNameTransaction_Variable")]

 public decimal Variable { get; set; }

}

 

// Класс баланса итога.

[Table(Name = "TB_TOTAL_NAME"), Serializable]

[LocalizedDisplayName(typeof(TotalNameBalance),

         "Ultima.Metadata.Classes.Resources", "TotalNameTransactionTotal")]

public partial class TotalNameBalance : BalanceValue

{

 [Column(Name = "DIMENSION_ID", CanBeNull = false)]

 [LocalizedDisplayName(typeof(TotalNameBalance),

         "Ultima.Metadata.Classes.Resources", "TotalNameTransaction_DimensionID")]

 public long DimensionID { get; set; }

 

 [Column(Name = "VARIABLE", CanBeNull = false)]

 [LocalizedDisplayName(typeof(TotalNameBalance),

         "Ultima.Metadata.Classes.Resources", "TotalNameTransaction_Variable")]

 public decimal Variable { get; set; }

}

 

// Класс детализированной транзакции итога.

[Table(Name = "VTD_TOTAL_NAME"), Serializable]

[LocalizedDisplayName(typeof(TotalNameDetailedTransaction),

         "Ultima.Metadata.Classes.Resources", "TotalNameTransactionTotal")]

public partial class TotalNameDetailedTransaction : DetailedTransactionValue

{

 [Column(Name = "DIMENSION_ID", CanBeNull = false)]

 [LocalizedDisplayName(typeof(TotalNameDetailedTransaction),

         "Ultima.Metadata.Classes.Resources", "TotalNameTransaction_DimensionID")]

 public long DimensionID { get; set; }

 

 [Column(Name = "VARIABLE", CanBeNull = false)]

 [LocalizedDisplayName(typeof(TotalNameDetailedTransaction),

         "Ultima.Metadata.Classes.Resources", "TotalNameTransaction_Variable")]

 public decimal Variable { get; set; }

}

Классы движений итогов наследуются от следующих базовых классов:

классы транзакций итогов наследуются от класса TransactionValue, который в свою очередь наследуется от базового класса TransactionBase:

public abstract class TransactionValue : TransactionBase,

 IEquatable<TransactionValue>, IComparable<TransactionValue>

{

 public long DocumentID { get; set; }

 public DateTime TransactionDate { get; set; }

 public long DeltaNo { get; set; }

 public long ScriptID { get; set; }

 public long PairTotalID { get; set; }

 public Document Document { get; set; }

 public Total Script { get; set; }

 public Total PairTotal { get; set; }

}

классы балансов итогов наследуются от класса TransactionValue, который в свою очередь наследуется от базового класса TransactionBase:

public abstract class BalanceValue : TransactionBase, IEquatable<BalanceValue>

классы детализированных транзакций итогов наследуются от класса DetailedTransactionValue, который в свою очередь наследуется от базового класса TransactionBase:

public abstract class DetailedTransactionValue : TransactionValue,

 IEquatable<DetailedTransactionValue>, IComparable<DetailedTransactionValue>

{

 public long DeltaSubNo { get; set; }

 public decimal LotNo { get; set; }

}

Информация о метаданных движения итога хранится в статических полях его же класса и описывается следующим образом:

public static IClassDescriptor StaticClassDescriptor

{

 get

 {

         return new TotalDescriptor

         {

                 ID = 5180,

                 Name = "TotalName",

                 Caption = ResourceHelper.GetString(

                         typeof(TotalNameTransaction).Assembly,

                         "Ultima.Metadata.Classes.Resources",

                         "TotalNameTransaction"),

                 TableName = "TOTAL_NAME",

                 Comments = string.Empty,

                 Guid = new Guid("99807636-cf24-4805-a77c-d5058cdbe9a6"),

                 IsDoubleEntry = true,

                 UseBalanceTable = true,

                 TransactionType = typeof(TotalNameTransaction),

                 BalanceType = typeof(TotalNameBalance),

                 DetailedTransactionType = typeof(TotalNameDetailedTransaction),

                 Dimensions = new List<TotalDimensionDescriptor>

                 {

                         new TotalDimensionDescriptor

                         {

                                 ID = 5183,

                                 Name = "DimensionID",

                                 Caption = ResourceHelper.GetString(

                                         typeof(TotalNameTransaction).Assembly,

                                         "Ultima.Metadata.Classes.Resources",

                                         "TotalNameTransaction_DimensionID"),

                                 ColumnName = "DIMENSION_ID",

                                 Comments = string.Empty,

                                 IsOperational = true,

                                 GetClassDescriptor = () =>

                                         Dimension.StaticClassDescriptor,

                         },

                 },

                 Variables = new List<TotalVariableDescriptor>

                 {

                         new TotalVariableDescriptor

                         {

                                 ID = 5182,

                                 Name = "Variable",

                                 Caption = ResourceHelper.GetString(

                                         typeof(TotalNameTransaction).Assembly,

                                         "Ultima.Metadata.Classes.Resources",

                                         "TotalNameTransaction_Variable"),

                                 ColumnName = "VARIABLE",

                                 Comments = "Variable",

                                 IsOperational = true,

                         },

                 },

         };

 }

}

Каждый генерируемый класс имеет статическое свойство StaticClassDescriptor типа IClassDescriptor. Обратившись к этому свойству, можно получить все свойства класса, на какие колонки они отображены и так далее. Дескрипторы подробно описаны в разделе Дескрипторы классов.

Каждому свойству движения итога соответствует поле типа EditableValue<T>, где Т – один из указанных в метаданных типов. Класс EditableValue<T> реализует следующие интерфейсы:

ISerializable;

ICloneable;

IRevertibleChangeTracking;

IEditableObject;

IEquatable<T> – обеспечивает возможность сравнения текущего объекта с указанным объектом того же типа.