При создании каждого итога генерируется три класса движения итога. Их исходным описанием служит название итога (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> – обеспечивает возможность сравнения текущего объекта с указанным объектом того же типа.