Я на грани своего ума и потерял целый день, пытаясь сделать что-то, что не должно быть таким сложным.
У меня есть набор записей, который был возвращен из запроса Sybase. Этот набор записей использовался для создания сводной таблицы в Excel. Все идет нормально. Я хочу изменить значение в сводной таблице, и для этого я использую новое значение для обновления определенных записей в наборе записей. Я могу выполнить обновление в RS без каких-либо проблем, и значения сохраняются в RS в следующий раз, когда я перебираю его.
Проблема в том, что значения не отражаются в сводной таблице. Я пытался:
pivotTable.Refresh();
- COMException: RefreshTable method of PivotTable class failed
pivotTable.PivotCache().Refresh();
- ComException: Exception from HRESULT: 0x800A03EC
pivotTable.Update();
- No exception but the changes are not reflected in the pivot table
Я также попытался клонировать набор записей и создать из него совершенно новую сводную таблицу, но хотя в Recordset
есть данные, PivotCache.RecordCount
равно 0
Код:
var app = ExcelAppHelper.GetExcelApp();
if (app.ActiveCell == null || app.ActiveCell.PivotTable == null)
return;
PivotTable pivotTable = app.ActiveCell.PivotTable;
var rs = (Recordset)pivotTable.PivotCache().Recordset;
rs.MoveFirst();
s_lastSelectedPivotTree = new PivotFilterTree();
RecalculateSelectedValues(vmMain);
while (!rs.EOF)
{
if (s_lastSelectedPivotTree.Contains(rs.Fields))
{
foreach (var dataFieldName in s_lastSelectedDataFields)
{
// update the values in the RS
rs.Fields[dataFieldName].Value = newValue;
}
// commit the modifications into the RS
rs.Update(Type.Missing, Type.Missing);
}
rs.MoveNext();
}
rs.MoveFirst();
// here is the magic line that will show me the updated pivot table
pivotTable.Update();
Кто-нибудь знает, как это сделать? Измените набор записей, затем «обновите» сводную таблицу, чтобы пересчитать сводную таблицу на основе набора записей.
Спасибо, Шон.