anchor.diff:    Result := FRecordCoordinates.Find(aVerticalKeys + aHorizontalKeys) as TCardinalList;
   end;
   
  -(*function TmPivoter.ComputeSummary(const aVerticalKeys, aHorizontalKeys: TStringList; const aSummaryDefinition: TmSummaryDefinition): TmSummaryValue;
  -begin
  -  Result := ComputeSummary(StringListToKey(aVerticalKeys), StringListToKey(aHorizontalKeys), aSummaryDefinition);
  -end;
  -
  -function TmPivoter.ComputeSummary(const aVerticalKeys, aHorizontalKeys: String; const aSummaryDefinition: TmSummaryDefinition): TmSummaryValue;
  +function TmPivoter.GetValue(const aVerticalKeys, aHorizontalKeys : TStringList; const aSummaryDefinition: TmSummaryDefinition): TmSummaryValue;
   var
  -  tmpList : TCardinalList;
  -  i : integer;
  -  curValue : Variant;
  +  tmpHor, tmpVer : String;
  +begin
  +  tmpHor := StringListToKey(aHorizontalKeys);
  +  tmpVer := StringListToKey(aVerticalKeys);
  +  Result := GetValue(tmpVer, tmpHor, aSummaryDefinition);
  +end;
  +
  +function TmPivoter.GetValue(const aVerticalKeys, aHorizontalKeys: string; const aSummaryDefinition: TmSummaryDefinition): TmSummaryValue;
  +var
  +  tmpValues : TmSummaryValues;
   begin
     Result := nil;
  -  tmpList := Self.GetRecords(aVerticalKeys, aHorizontalKeys);
  -  if Assigned(tmpList) then
  -  begin
  -    Result := TmSummaryValue.Create(false);
  -    Result.Definition := aSummaryDefinition;
  -    Result.Init;
  -    for i := 0 to tmpList.Count - 1 do
  -    begin
  -      curValue := FDataProvider.GetDatum(tmpList.Nums[i]).GetPropertyByFieldName(aSummaryDefinition.FieldName);
  -      Result.ComputeValueInSummaries(curValue);
  -    end;
  -  end;
  -end;
  -*)
  +
  +  tmpValues := FValues.Find(aVerticalKeys + aHorizontalKeys) as TmSummaryValues;
  +  if Assigned(tmpValues) then
  +    Result := tmpValues.FindByDefinition(aSummaryDefinition);
  +end;
   
   class function TmPivoter.BuildKey(const aOldKey, aNewKeyPartValue: String): String;
   begin
  
positive.code:     // internal or test functions
      function GetRecords (const aVerticalKeys, aHorizontalKeys : TStringList): TCardinalList; overload;
      function GetRecords (const aVerticalKeys, aHorizontalKeys : string): TCardinalList; overload;
  //    function ComputeSummary (const aVerticalKeys, aHorizontalKeys : TStringList; const aSummaryDefinition : TmSummaryDefinition) : TmSummaryValue; overload;
  //    function ComputeSummary (const aVerticalKeys, aHorizontalKeys : String; const aSummaryDefinition : TmSummaryDefinition) : TmSummaryValue;
      class function BuildKey(const aOldKey, aNewKeyPartValue : String) : String;
      class function StringListToKey(const aKeys : TStringList): String;
  
  
negative.code:       tmpKeyValue := GetIndexKeyValue(tmpValue, FVerticalGroupByDefs.Get(k));
        FVerticalValues.Get(k).AddValueIfMissing(tmpKeyValue);
  
        currentCoord := BuildKey(currentCoord, tmpKeyValue);
        if k < (FVerticalGroupByDefs.Count - 1) then
          tmpIndex := tmpIndex.GetSubIndex(tmpKeyValue)
        else
  