anchor.diff:      FFieldName : String;
       FDataType : TFieldType;
       FCalculationKind : TmCalculationKind;
  +    FFormula : String;
     public
       constructor Create;
   
       property FieldName : string read FFieldName write FFieldName;
       property DataType : TFieldType read FDataType write FDataType;
       property CalculationKind : TmCalculationKind read FCalculationKind write FCalculationKind;
  +    property Formula : String read FFormula write FFormula;
     end;
   
     { TmCalculationDefs }
  
positive.code: 
  uses
    contnrs, db, variants, Classes,
    mVirtualDataSet, mVirtualDatasetDataProvider,
    mBaseClassesAsObjects,
    StrHashMap;
  
  type
  
    TmGroupByOperationKind = (gpoDistinct, gpoDateYear, gpoDateMonth, gpoDateDay, gpoFirstLetter);
  
    { TmGroupByDef }
  
  
negative.code:     function GetValueList (aKey : string): TList;
    end;
  
    { TKeyValuesForGroupByDef }
  
    TKeyValuesForGroupByDef = class
    strict private
      FValues : TStringList;
      FDictionary : TStringHashMap;
    public
      constructor Create;
      destructor Destroy; override;
      procedure AddValue (aValue : String);
      function Contains (const aValue : String): boolean;
    end;
  
    { TRecordCoordinates }
  
    TRecordCoordinates = class
    strict private
      FCoordinates : TStringList;
    public
      constructor Create;
      destructor Destroy; override;
      procedure Clear;
      property Values : TStringList read FCoordinates;
    end;
  
    { TRecordsCoordinates }
  
    TRecordsCoordinates = class
    strict private
      FList : TObjectList;
    public
      constructor Create;
      destructor Destroy; override;
      procedure Clear;
      function Get (const aIndex : integer): TRecordCoordinates;
      function Add : TRecordCoordinates;
    end;
  
  
    { TmVirtualDatasetPivoter }
  
    TmVirtualDatasetPivoter = class
    strict private
      // dataset
      FVirtualDataset : TmVirtualDataset;
      // group by definitions
      FVerticalGroupByDefs : TmGroupByDefs;
      FHorizontalGroupByDefs : TmGroupByDefs;
      //
      FVerticalValues: array of TKeyValuesForGroupByDef;
      FHorizontalValues: array of TKeyValuesForGroupByDef;
      //
      FVerticalRecordCoordinates : TRecordsCoordinates;
      FHorizontalRecordCoordinates : TRecordsCoordinates;
  
      FIndex : TmIndex;
      FGarbage : TObjectList;
  
  //    procedure CalculateSubIndex(aIndex: TmIndex; const aCurrentRecNo: Cardinal;
  //      const aCurrentGroupByDefIndex: integer);
      function GetIndexKeyValue(aValue : Variant; aGroupByDef : TmGroupByDef): string;
    public
      constructor Create;
  