23#include <osl/diagnose.h>
27#include <tokenarray.hxx>
39#include <document.hxx>
51#include <com/sun/star/sheet/ComplexReference.hpp>
52#include <com/sun/star/sheet/ExternalReference.hpp>
53#include <com/sun/star/sheet/FormulaToken.hpp>
54#include <com/sun/star/sheet/ReferenceFlags.hpp>
55#include <com/sun/star/sheet/NameToken.hpp>
65 void lcl_SingleRefToCalc(
ScSingleRefData& rRef,
const sheet::SingleReference& rAPI )
69 rRef.
SetColRel( ( rAPI.Flags & sheet::ReferenceFlags::COLUMN_RELATIVE ) != 0 );
70 rRef.
SetRowRel( ( rAPI.Flags & sheet::ReferenceFlags::ROW_RELATIVE ) != 0 );
71 rRef.
SetTabRel( ( rAPI.Flags & sheet::ReferenceFlags::SHEET_RELATIVE ) != 0 );
72 rRef.
SetColDeleted( ( rAPI.Flags & sheet::ReferenceFlags::COLUMN_DELETED ) != 0 );
73 rRef.
SetRowDeleted( ( rAPI.Flags & sheet::ReferenceFlags::ROW_DELETED ) != 0 );
74 rRef.
SetTabDeleted( ( rAPI.Flags & sheet::ReferenceFlags::SHEET_DELETED ) != 0 );
75 rRef.
SetFlag3D( ( rAPI.Flags & sheet::ReferenceFlags::SHEET_3D ) != 0 );
76 rRef.
SetRelName( ( rAPI.Flags & sheet::ReferenceFlags::RELATIVE_NAME ) != 0 );
94 void lcl_ExternalRefToCalc(
ScSingleRefData& rRef,
const sheet::SingleReference& rAPI )
98 rRef.
SetColRel( ( rAPI.Flags & sheet::ReferenceFlags::COLUMN_RELATIVE ) != 0 );
99 rRef.
SetRowRel( ( rAPI.Flags & sheet::ReferenceFlags::ROW_RELATIVE ) != 0 );
100 rRef.
SetColDeleted( ( rAPI.Flags & sheet::ReferenceFlags::COLUMN_DELETED ) != 0 );
101 rRef.
SetRowDeleted( ( rAPI.Flags & sheet::ReferenceFlags::ROW_DELETED ) != 0 );
103 rRef.
SetFlag3D( ( rAPI.Flags & sheet::ReferenceFlags::SHEET_3D ) != 0 );
120 struct TokenPointerRange
125 TokenPointerRange() :
mpStart(nullptr), mpStop(nullptr) {}
127 mpStart(
p), mpStop(
p + static_cast<size_t>(
n)) {}
131 TokenPointerRange maPointerRange[2];
135 bool bSkipRelName =
true ) :
136 mbSkipRelName(bSkipRelName)
138 maPointerRange[0] = TokenPointerRange( pCode, nLen);
139 maPointerRange[1] = TokenPointerRange( pRPN, nRPN);
142 bool skipToken(
size_t i,
const FormulaToken*
const * pp )
152 if ((*pp)->GetRef() > 1)
159 switch ((*pp)->GetType())
162 return (*pp)->GetSingleRef()->IsRelName();
179 if (skipToken( i, pp))
183 if (
p->GetOpCode() == ocTableRef)
247 sbyte.eInForceArray = ParamClass::Unknown;
354#define IF_NOT_OPCODE_ERROR(o,c) SAL_WARN_IF((eOp!=o), "sc.core", #c "::ctor: OpCode " << static_cast<int>(eOp) << " lost, converted to " #o "; maybe inherit from FormulaToken instead!")
423 SAL_WARN(
"sc.core",
"unknown ScRawToken::CreateToken() type " <<
int(
GetType()));
427#undef IF_NOT_OPCODE_ERROR
436 (_rToken1.
GetType() == svSingleRef || _rToken1.
GetType() == svDoubleRef)
437 && _rToken1.FormulaToken::operator ==(_rToken2));
442 if ( _rToken1.
GetType() == svSingleRef )
451 if ( _rToken2.
GetType() == svSingleRef )
460 ScRange aRange1 = aTemp1.
toAbs(rLimits, aPos), aRange2 = aTemp2.
toAbs(rLimits, aPos);
469#if DEBUG_FORMULA_COMPILER
474 cout <<
"-- ScSingleRefToken" <<
endl;
478 cout <<
"-- ScDoubleRefToken" <<
endl;
482 cout <<
"-- FormulaToken" <<
endl;
483 cout <<
" opcode: " <<
int(rToken.
GetOpCode()) <<
" " <<
485 cout <<
" type: " <<
static_cast<int>(rToken.
GetType()) << endl;
505 const ScAddress & rPos,
bool bReuseDoubleRef )
550 aRef.
Extend(rLimits, rRef2, rPos);
562 xRes = (bReuseDoubleRef && rTok1.
GetRef() == 1 ? &rTok1 : rTok1.
Clone());
567 xRes = (bReuseDoubleRef && rTok2.
GetRef() == 1 ? &rTok2 : rTok2.
Clone());
576 if (pRefList->empty())
587 for (
size_t i=0;
i<2; ++
i)
592 rRef.
Extend(rLimits, *
pt[
i]->GetSingleRef(), rPos);
595 rRef.
Extend(rLimits, *
pt[
i]->GetDoubleRef(), rPos);
602 for (
const auto& rRefData : *
p)
604 rRef.
Extend(rLimits, rRefData, rPos);
612 rRef.
Extend(rLimits, *
pt[
i]->GetSingleRef(), rPos);
618 rRef.
Extend(rLimits, *
pt[
i]->GetDoubleRef(), rPos);
725 maTabName(
std::move(aTabName)),
756 if (!FormulaToken::operator==(r))
771 maTabName(
std::move(aTabName)),
822 if (!FormulaToken::operator==(r))
855 if ( !FormulaToken::operator==(r) )
873 mxAreaRefRPN( r.mxAreaRefRPN ? r.mxAreaRefRPN->
Clone() : nullptr),
895 SAL_WARN(
"sc.core",
"ScTableRefToken::GetSheet - maybe adapt caller to know about TableRef?");
922 if ( !FormulaToken::operator==(r) )
947 , mpJumpMatrix(
std::move(
p))
1067 OSL_ENSURE( r.
GetType() !=
svMatrix,
"ScMatrixFormulaCellToken::operator=: assigning ScMatrixToken to ScMatrixFormulaCellToken is not proper, use ScMatrixCellResultToken instead");
1101 OSL_FAIL(
"ScMatrixFormulaCellToken::SetUpperLeftDouble: not modifying unhandled token type");
1113 double f,
const svl::SharedString & rStr, OUString aFormula,
bool bEmptyDisplayedAsString ) :
1117 mbEmptyDisplayedAsString( bEmptyDisplayedAsString)
1120 assert( !bEmptyDisplayedAsString || (f == 0.0 && rStr.
getString().isEmpty()));
1140 bool bError = FormulaTokenArray::AddFormulaToken(rToken, rSPool, pExtRef);
1144 const OpCode eOpCode =
static_cast<OpCode>(rToken.OpCode);
1146 const uno::TypeClass eClass = rToken.Data.getValueTypeClass();
1149 case uno::TypeClass_STRUCT:
1151 uno::Type aType = rToken.Data.getValueType();
1155 sheet::SingleReference aApiRef;
1156 rToken.Data >>= aApiRef;
1157 lcl_SingleRefToCalc( aSingleRef, aApiRef );
1168 sheet::ComplexReference aApiRef;
1169 rToken.Data >>= aApiRef;
1170 lcl_SingleRefToCalc( aComplRef.
Ref1, aApiRef.Reference1 );
1171 lcl_SingleRefToCalc( aComplRef.
Ref2, aApiRef.Reference2 );
1180 sheet::NameToken aTokenData;
1181 rToken.Data >>= aTokenData;
1184 SAL_WARN_IF( aTokenData.Sheet < -1 || std::numeric_limits<sal_Int16>::max() < aTokenData.Sheet,
1186 "ScTokenArray::AddFormulaToken - NameToken.Sheet out of limits: " << aTokenData.Sheet);
1187 sal_Int16 nSheet =
static_cast<sal_Int16
>(aTokenData.Sheet);
1199 sheet::ExternalReference aApiExtRef;
1200 if( (eOpCode ==
ocPush) && (rToken.Data >>= aApiExtRef) && (0 <= aApiExtRef.Index) && (aApiExtRef.Index <=
SAL_MAX_UINT16) )
1202 sal_uInt16 nFileId =
static_cast< sal_uInt16
>( aApiExtRef.Index );
1203 sheet::SingleReference aApiSRef;
1204 sheet::ComplexReference aApiCRef;
1206 if( aApiExtRef.Reference >>= aApiSRef )
1209 size_t nCacheId =
static_cast< size_t >( aApiSRef.Sheet );
1211 if( !aTabName.isEmpty() )
1215 lcl_ExternalRefToCalc( aSingleRef, aApiSRef );
1221 else if( aApiExtRef.Reference >>= aApiCRef )
1224 size_t nCacheId =
static_cast< size_t >( aApiCRef.Reference1.Sheet );
1226 if( !aTabName.isEmpty() )
1230 lcl_ExternalRefToCalc( aComplRef.
Ref1, aApiCRef.Reference1 );
1231 lcl_ExternalRefToCalc( aComplRef.
Ref2, aApiCRef.Reference2 );
1234 aComplRef.
Ref1.
Tab() +
static_cast<SCTAB>(aApiCRef.Reference2.Sheet - aApiCRef.Reference1.Sheet));
1240 else if( aApiExtRef.Reference >>=
aName )
1242 if( !
aName.isEmpty() )
1257 case uno::TypeClass_SEQUENCE:
1262 uno::Sequence< uno::Sequence< uno::Any >>>::get()))
1283#if HAVE_CPP_CONSTINIT_SORTED_VECTOR
1319 static const bool bThreadingProhibited = std::getenv(
"SC_NO_THREADED_CALCULATION");
1321 if (bThreadingProhibited)
1329 if (aThreadedCalcDenyList.find(eOp) != aThreadedCalcDenyList.end())
1332 <<
"(" <<
int(eOp) <<
") disables threaded calculation of formula group");
1347 <<
" disables threaded calculation of formula group");
1371 <<
"(" <<
int(eOp) <<
") disables vectorisation for formula group");
1556 <<
"(" <<
int(eOp) <<
") disables vectorisation for formula group");
1610 <<
"(" <<
int(eOp) <<
") disables vectorisation for formula group");
1646 <<
"(" <<
int(eOp) <<
") disables vectorisation for formula group");
1722 nVal += (size_t(rRef.
IsRowRel()) << 1);
1723 nVal += (size_t(rRef.
IsTabRel()) << 2);
1732 static const OUStringHash aHasher;
1738 sal_uInt16
n = std::min<sal_uInt16>(
nLen, 20);
1739 for (sal_uInt16
i = 0;
i <
n; ++
i)
1742 eOp =
p->GetOpCode();
1753 nHash +=
static_cast<size_t>(nVal);
1759 double fVal =
p->GetDouble();
1760 nHash += std::hash<double>()(fVal);
1766 OUString
aStr =
p->GetString().getString();
1767 nHash += aHasher(
aStr);
1772 size_t nVal = HashSingleRef(*
p->GetSingleRef());
1779 size_t nVal1 = HashSingleRef(rRef.
Ref1);
1780 size_t nVal2 = HashSingleRef(rRef.
Ref2);
1787 nHash +=
static_cast<size_t>(eOp);
1792 nHash +=
static_cast<size_t>(eOp);
1794 nHash = (nHash << 4) - nHash;
1827 for (;
p != pEnd; ++
p)
1829 switch ((*p)->GetType())
1868 mxSheetLimits(&rDoc.GetSheetLimits()),
1875 mxSheetLimits(&rLimits),
1903 Move(std::move(rArr));
1915 for (sal_uInt16
i=0;
i<
nLen;
i++)
1917 if ( ppToken1[
i] != ppToken2[
i] &&
1918 !(*ppToken1[
i] == *ppToken2[
i]) )
1928 FormulaTokenArray::Clear();
1950 pp =
p->pCode.get();
1952 for( sal_uInt16
i = 0;
i <
nLen;
i++, pp++ )
1954 *pp = (*pp)->
Clone();
1962 for( sal_uInt16
i = 0;
i <
nRPN;
i++, pp++ )
1965 if(
t->GetRef() > 1 )
1968 sal_uInt16 nIdx = 0xFFFF;
1969 for( sal_uInt16 j = 0; j <
nLen; j++, p2++ )
1976 if( nIdx == 0xFFFF )
1979 *pp =
p->pCode[ nIdx ];
2008 pp = aNew.
pCode.get();
2010 for( sal_uInt16
i = 0;
i <
nLen;
i++, pp++ )
2012 *pp = (*pp)->
Clone();
2020 for( sal_uInt16
i = 0;
i <
nRPN;
i++, pp++ )
2023 if(
t->GetRef() > 1 )
2026 sal_uInt16 nIdx = 0xFFFF;
2027 for( sal_uInt16 j = 0; j <
nLen; j++, p2++ )
2034 if( nIdx == 0xFFFF )
2037 *pp = aNew.
pCode[ nIdx ];
2057 bool bResult = (bPrevWasSep == bNewVal);
2058 bPrevWasSep = bNewVal;
2064 int nCol = -1, nRow = 0;
2065 int i, nPrevRowSep = -1, nStart = 0;
2066 bool bPrevWasSep =
false;
2068 bool bNumeric =
false;
2072 for (
i =
nLen ;
i-- > nStart ; )
2075 switch (
t->GetOpCode() )
2137 if( nPrevRowSep < 0 ||
2138 ((nPrevRowSep -
i) % 2) == 1)
2145 nCol = (nPrevRowSep -
i) / 2;
2147 else if( (nPrevRowSep -
i)/2 != nCol)
2179 if( nCol <= 0 || nRow <= 0 )
2184 for (
i = nStart, nCol = 0, nRow = 0 ;
i <
nLen ;
i++ )
2188 switch (
t->GetOpCode() )
2193 pArray->
PutDouble(
t->GetDouble() * nSign, nCol, nRow );
2198 pArray->
PutString(
t->GetString(), nCol, nRow);
2233 nLen = sal_uInt16( nStart );
2241 sal_uInt16 nIdx =
nLen;
2326 sal_uInt16 nTokens = 1;
2330 if( !rFormulaNmsp.isEmpty() )
2334 Assign( nTokens, aTokens );
2347 nExtend = rPos.
Row();
2353 nExtend = rPos.
Col();
2354 nCol =
static_cast<SCCOL>(nExtend) + 1;
2357 if ( rPos.
Row() <= 0 )
2359 nExtend = rPos.
Row();
2363 if ( rPos.
Col() <= 0 )
2365 nExtend = rPos.
Col();
2366 nCol =
static_cast<SCCOL>(nExtend) - 1;
2369 OSL_FAIL(
"unknown Direction" );
2378 if ( nParamCount &&
nRPN > nParamCount )
2381 sal_uInt16 nParam =
nRPN - nParamCount - 1;
2382 for ( ; nParam <
nRPN-1; nParam++ )
2385 switch (
p->GetType() )
2394 if (aAbs.
Row() == nRow && aAbs.
Row() > nExtend)
2396 nExtend = aAbs.
Row();
2401 if (aAbs.
Col() == nCol &&
static_cast<SCCOLROW>(aAbs.
Col()) > nExtend)
2403 nExtend = aAbs.
Col();
2408 if (aAbs.
Row() == nRow && aAbs.
Row() < nExtend)
2410 nExtend = aAbs.
Row();
2415 if (aAbs.
Col() == nCol &&
static_cast<SCCOLROW>(aAbs.
Col()) < nExtend)
2417 nExtend = aAbs.
Col();
2476void GetExternalTableData(
const ScDocument* pOldDoc,
const ScDocument* pNewDoc,
const SCTAB nTab, OUString& rTabName, sal_uInt16& rFileId)
2478 const OUString& aFileName = pOldDoc->
GetFileURL();
2481 if (rTabName.isEmpty())
2482 pOldDoc->
GetName(nTab, rTabName);
2521 if (bCheckCopyArea && IsInCopyRange(aRange, &rOldDoc))
2547 for ( sal_uInt16 j=0; j<
nLen; ++j )
2549 switch (
pCode[j]->GetType() )
2553 if (SkipReference(
pCode[j], rPos, rOldDoc, bRangeName,
true))
2564 GetExternalTableData(&rOldDoc, &rNewDoc, rRef1.
Tab(), aTabName, nFileId);
2573 if (SkipReference(
pCode[j], rPos, rOldDoc, bRangeName,
true))
2582 GetExternalTableData(&rOldDoc, &rNewDoc, rRef.
Tab(), aTabName, nFileId);
2598 bool bCheckCopyRange)
2601 for (
size_t j=0; j<2; ++j)
2605 for (; pp != pEnd; ++pp)
2611 switch (
p->GetType() )
2615 if (!SkipReference(
p, rOldPos, rOldDoc,
false, bCheckCopyRange))
2622 AdjustSingleRefData( rRef1, rOldPos, rNewPos );
2623 AdjustSingleRefData( rRef2, rOldPos, rNewPos );
2628 if (!SkipReference(
p, rOldPos, rOldDoc,
false, bCheckCopyRange))
2633 AdjustSingleRefData( rRef, rOldPos, rNewPos );
2648 for (
size_t j=0; j<2; ++j)
2652 for (; pp != pEnd; ++pp)
2658 switch (
p->GetType() )
2696 for (
size_t j=0; j<2; ++j)
2698 FormulaToken*
const * pp = aPtrs.maPointerRange[j].mpStart;
2699 FormulaToken*
const *
const pEnd = aPtrs.maPointerRange[j].mpStop;
2700 for (; pp != pEnd; ++pp)
2706 switch (
p->GetType() )
2716 if (nTab1 <= nTab && nTab <= nTab2)
2725 if (rRef.
Tab() + nPosTab == nTab)
2730 if (rRef.
Tab() == nTab)
2783 return aSelectedRange;
2836 restoreDeletedRef(rRef.
Ref1, rCxt);
2837 restoreDeletedRef(rRef.
Ref2, rCxt);
3132 ScRange aSelectedRange = getSelectedRange(rCxt);
3142 assert(!
"can't move");
3147 for (
size_t j=0; j<2; ++j)
3151 for (; pp != pEnd; ++pp)
3157 switch (
p->GetType())
3167 setRefDeleted(rRef, rCxt);
3178 restoreDeletedRef(rRef, rCxt);
3205 setRefDeleted(rRef, rCxt);
3211 const ShrinkResult eSR = shrinkRange(rCxt, aAbs, aSelectedRange, rRef);
3220 else if (eSR == STICKY)
3245 if (aSelectedRange.
Contains(aCheckRange))
3248 restoreDeletedRef(rRef, rCxt);
3256 if (expandRange(rCxt, aAbs, aSelectedRange, rRef))
3265 if (expandRangeByEdge(rCxt, aAbs, aSelectedRange, rRef))
3329 if ((*pp)->GetType() ==
svIndex)
3331 switch ((*pp)->GetOpCode())
3335 SCTAB nOldTab = (*pp)->GetSheet();
3348 if (isDBDataModified(rCxt.
mrDoc, **pp))
3376 assert(!
"can't move");
3380 for (
size_t j=0; j<2; ++j)
3384 for (; pp != pEnd; ++pp)
3390 switch (
p->GetType())
3498 if ((*pp)->GetType() ==
svIndex)
3500 switch ((*pp)->GetOpCode())
3504 SCTAB nOldTab = (*pp)->GetSheet();
3511 if (isDBDataModified(rCxt.
mrDoc, **pp))
3528 for (
size_t j=0; j<2; ++j)
3532 for (; pp != pEnd; ++pp)
3538 switch (
p->GetType())
3545 if (aAbs.
Tab() == nTab && nRow1 <= aAbs.
Row() && aAbs.
Row() <= nRow2)
3549 if (it != rColMap.
end())
3552 SCCOL nNewCol = it->second;
3576 if (it != rColMap.
end())
3579 SCCOL nNewCol = it->second;
3597 for (
size_t j=0; j<2; ++j)
3601 for (; pp != pEnd; ++pp)
3607 switch (
p->GetType())
3614 if (aAbs.
Tab() == nTab && nCol1 <= aAbs.
Col() && aAbs.
Col() <= nCol2)
3618 if (it != rRowMap.
end())
3621 SCROW nNewRow = it->second;
3645 if (it != rRowMap.
end())
3648 SCROW nNewRow = it->second;
3665bool adjustSingleRefInName(
3680 bool bChanged =
false;
3728bool adjustDoubleRefInName(
3731 bool bRefChanged =
false;
3741 ScRange aSelectedRange = getSelectedRange(rCxt);
3758 ScRange aSelectedRange = getSelectedRange(rCxt);
3782 aCxt.mnRowDelta = 0;
3784 aCxt.mnColDelta = 0;
3785 if (!aCxt.mnColDelta && !aCxt.mnRowDelta && !aCxt.mnTabDelta)
3790 if (adjustSingleRefInName(rRef.
Ref2, aCxt, rPos, &rRef))
3793 if (adjustSingleRefInName(rRef.
Ref1, aCxt, rPos,
nullptr))
3799 if (adjustSingleRefInName(rRef.
Ref2, rCxt, rPos, &rRef))
3802 if (adjustSingleRefInName(rRef.
Ref1, rCxt, rPos,
nullptr))
3824 for (
size_t j=0; j<2; ++j)
3828 for (; pp != pEnd; ++pp)
3834 switch (
p->GetType())
3860 if (nDelStartRow <= aAbs.
Row() && aAbs.
Row() <= nDelEndRow)
3889 if (nDelStartCol <= aAbs.
Col() && aAbs.
Col() <= nDelEndCol)
3898 if (adjustSingleRefInName(rRef, rCxt, rPos,
nullptr))
3914 if (adjustDoubleRefInName(rRef, rCxt, rPos))
4033 if (adjustDoubleRefInName(rRef, rCxt, rPos))
4038 if (adjustDoubleRefInName(rRef, rCxt, rPos))
4090 assert(!
"can't move");
4099 for (
size_t j=0; j<2; ++j)
4103 for (; pp != pEnd; ++pp)
4109 switch (
p->GetType())
4174 if (nDelPos <= aAbs.
Tab() && aAbs.
Tab() < nDelPos + nSheets)
4180 if (nDelPos < aAbs.
Tab())
4187 else if (rOldPos.
Tab() != rNewPos.
Tab())
4200 if (nInsPos <= aAbs.
Tab())
4207 else if (rOldPos.
Tab() != rNewPos.
Tab())
4223 bool bMoreThanOneTab = aStartPos.
Tab() != aEndPos.
Tab();
4224 bool bModified =
false;
4225 if (bMoreThanOneTab && aStartPos.
Tab() == nDelPos && nDelPos + nSheets <= aEndPos.
Tab())
4235 bModified = adjustSingleRefOnDeletedTab(rLimits, rRef1, nDelPos, nSheets, rOldPos, rNewPos);
4238 if (bMoreThanOneTab && aEndPos.
Tab() == nDelPos && aStartPos.
Tab() <= nDelPos - nSheets)
4248 bModified |= adjustSingleRefOnDeletedTab(rLimits, rRef2, nDelPos, nSheets, rOldPos, rNewPos);
4262 for (
size_t j=0; j<2; ++j)
4266 for (; pp != pEnd; ++pp)
4272 switch (
p->GetType())
4293 if ((*pp)->GetType() ==
svIndex)
4295 switch ((*pp)->GetOpCode())
4299 SCTAB nOldTab = (*pp)->GetSheet();
4306 (*pp)->SetSheet( nOldTab - rCxt.
mnSheets);
4315 if (isDBDataModified(rCxt.
mrDoc, **pp))
4335 for (
size_t j=0; j<2; ++j)
4339 for (; pp != pEnd; ++pp)
4345 switch (
p->GetType())
4369 if ((*pp)->GetType() ==
svIndex)
4371 switch ((*pp)->GetOpCode())
4375 SCTAB nOldTab = (*pp)->GetSheet();
4381 (*pp)->SetSheet( nOldTab + rCxt.
mnSheets);
4387 if (isDBDataModified(rCxt.
mrDoc, **pp))
4404 if (nNewTab == rPos.
Tab())
4420 if (adjustTabOnMove(aNewPos, rCxt))
4424 for (
size_t j=0; j<2; ++j)
4428 for (; pp != pEnd; ++pp)
4434 switch (
p->GetType())
4440 if (adjustTabOnMove(aAbs, rCxt))
4449 if (adjustTabOnMove(aAbs.
aStart, rCxt))
4451 if (adjustTabOnMove(aAbs.
aEnd, rCxt))
4462 if ((*pp)->GetType() ==
svIndex)
4464 switch ((*pp)->GetOpCode())
4468 SCTAB nOldTab = (*pp)->GetSheet();
4472 if (nNewTab != nOldTab)
4475 (*pp)->SetSheet( nNewTab);
4481 if (isDBDataModified(rCxt.
mrDoc, **pp))
4497 for (
size_t j=0; j<2; ++j)