Blob Blame History Raw
From 155af162b260ee49e1c6603baa2c2a96d6e93b67 Mon Sep 17 00:00:00 2001
From: Kohei Yoshida <kohei.yoshida@collabora.com>
Date: Mon, 28 Jul 2014 21:34:40 -0400
Subject: [PATCH 064/137] fdo#79578: Properly update formulas upon change in db
 collection.

Update it to handle formula groups correctly.

(cherry picked from commit 300845922eec7a28bc1da337acd21f138685d759)

Conflicts:
	sc/source/ui/docshell/dbdocfun.cxx
	sc/source/ui/docshell/docfunc.cxx
	sc/source/ui/docshell/docsh5.cxx
	sc/source/ui/undo/undocell.cxx
	sc/source/ui/undo/undodat.cxx
	sc/source/ui/unoobj/nameuno.cxx
	sc/source/ui/view/viewfunc.cxx
	sc/source/ui/view/dbfunc.cxx

Change-Id: I009a7fcf3d3fb17ef6951c50534ca6bc1fffc259
Reviewed-on: https://gerrit.libreoffice.org/10605
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
---
 sc/inc/column.hxx                   |  6 +++--
 sc/inc/document.hxx                 |  8 ++----
 sc/inc/formulacell.hxx              |  1 -
 sc/inc/table.hxx                    |  6 +++--
 sc/source/core/data/column2.cxx     | 22 ----------------
 sc/source/core/data/column4.cxx     | 43 +++++++++++++++++++++----------
 sc/source/core/data/documen4.cxx    | 11 --------
 sc/source/core/data/document10.cxx  | 17 +++++++++++--
 sc/source/core/data/formulacell.cxx | 51 -------------------------------------
 sc/source/core/data/table4.cxx      |  6 -----
 sc/source/core/data/table7.cxx      | 11 ++++++--
 sc/source/ui/docshell/dbdocfun.cxx  | 14 +++++-----
 sc/source/ui/docshell/docfunc.cxx   |  4 +--
 sc/source/ui/docshell/docsh5.cxx    |  4 +--
 sc/source/ui/undo/undocell.cxx      |  2 +-
 sc/source/ui/undo/undodat.cxx       |  8 +++---
 sc/source/ui/undo/undorangename.cxx |  2 +-
 sc/source/ui/unoobj/nameuno.cxx     |  2 +-
 sc/source/ui/view/dbfunc.cxx        |  4 +--
 sc/source/ui/view/viewfunc.cxx      |  2 +-
 20 files changed, 85 insertions(+), 139 deletions(-)

diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 1cac044..8962422 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -373,9 +373,12 @@ public:
     void PreprocessRangeNameUpdate(
         sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt );
 
-    void PostprocessRangeNameUpdate(
+    void CompileHybridFormula(
         sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt );
 
+    void PreprocessDBDataUpdate(
+        sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt );
+
     const SfxPoolItem*      GetAttr( SCROW nRow, sal_uInt16 nWhich ) const;
     const ScPatternAttr*    GetPattern( SCROW nRow ) const;
     const ScPatternAttr*    GetMostUsedPattern( SCROW nStartRow, SCROW nEndRow ) const;
@@ -480,7 +483,6 @@ public:
     void CollectListeners( std::vector<SvtListener*>& rListeners, SCROW nRow1, SCROW nRow2 );
 
     void CompileDBFormula( sc::CompileFormulaContext& rCxt );
-    void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString );
     void CompileColRowNameFormula( sc::CompileFormulaContext& rCxt );
 
     sal_Int32   GetMaxStringLen( SCROW nRowStart, SCROW nRowEnd, rtl_TextEncoding eCharSet ) const;
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index c901af5..9d365cc 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -516,11 +516,8 @@ public:
      * Call this immediately before updating all named ranges.
      */
     SC_DLLPUBLIC void PreprocessRangeNameUpdate();
-
-    /**
-     * Call this immediately after all named ranges have been updated.
-     */
-    SC_DLLPUBLIC void PostprocessRangeNameUpdate();
+    SC_DLLPUBLIC void PreprocessDBDataUpdate();
+    SC_DLLPUBLIC void CompileHybridFormula();
 
     SCTAB           GetMaxTableNumber() { return static_cast<SCTAB>(maTabs.size()) - 1; }
     void            SetMaxTableNumber(SCTAB nNumber) { nMaxTableNumber = nNumber; }
@@ -1967,7 +1964,6 @@ public:
     void                StartTrackTimer();
 
     void            CompileDBFormula();
-    void            CompileDBFormula( bool bCreateFormulaString );
     void            CompileColRowNameFormula();
 
     /** Maximum string length of a column, e.g. for dBase export.
diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx
index 9c7cd10..0a43f49 100644
--- a/sc/inc/formulacell.hxx
+++ b/sc/inc/formulacell.hxx
@@ -310,7 +310,6 @@ public:
     bool            IsRunning() const;
     void            SetRunning( bool bVal );
     void CompileDBFormula( sc::CompileFormulaContext& rCxt );
-    void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString );
     void CompileColRowNameFormula( sc::CompileFormulaContext& rCxt );
     ScFormulaCell*  GetPrevious() const;
     ScFormulaCell*  GetNext() const;
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index f8928de..9d36a1e 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -864,9 +864,12 @@ public:
     void PreprocessRangeNameUpdate(
         sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt );
 
-    void PostprocessRangeNameUpdate(
+    void CompileHybridFormula(
         sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt );
 
+    void PreprocessDBDataUpdate(
+        sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt );
+
     ScConditionalFormatList* GetCondFormList();
     const ScConditionalFormatList* GetCondFormList() const;
     void SetCondFormList( ScConditionalFormatList* pList );
@@ -1029,7 +1032,6 @@ private:
     bool        GetNextMarkedCell( SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark ) const;
     bool        TestTabRefAbs(SCTAB nTable) const;
     void CompileDBFormula( sc::CompileFormulaContext& rCxt );
-    void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString );
     void CompileColRowNameFormula( sc::CompileFormulaContext& rCxt );
     void        RebuildFormulaGroups();
 
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 63c5e0f..a8ba063 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -3218,21 +3218,6 @@ public:
     }
 };
 
-class CompileDBFormula2Handler
-{
-    sc::CompileFormulaContext& mrCxt;
-    bool mbCreateFormulaString;
-
-public:
-    CompileDBFormula2Handler( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ) :
-        mrCxt(rCxt), mbCreateFormulaString(bCreateFormulaString) {}
-
-    void operator() (size_t, ScFormulaCell* p)
-    {
-        p->CompileDBFormula(mrCxt, mbCreateFormulaString);
-    }
-};
-
 struct CompileColRowNameFormulaHandler
 {
     sc::CompileFormulaContext& mrCxt;
@@ -3254,13 +3239,6 @@ void ScColumn::CompileDBFormula( sc::CompileFormulaContext& rCxt )
     RegroupFormulaCells();
 }
 
-void ScColumn::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString )
-{
-    CompileDBFormula2Handler aFunc(rCxt, bCreateFormulaString);
-    sc::ProcessFormula(maCells, aFunc);
-    RegroupFormulaCells();
-}
-
 void ScColumn::CompileColRowNameFormula( sc::CompileFormulaContext& rCxt )
 {
     CompileColRowNameFormulaHandler aFunc(rCxt);
diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx
index 9a3ef12..bf3b817 100644
--- a/sc/source/core/data/column4.cxx
+++ b/sc/source/core/data/column4.cxx
@@ -135,15 +135,19 @@ void ScColumn::DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const Sc
 
 namespace {
 
-class PreRangeNameUpdateHandler
+class RecompileByOpcodeHandler
 {
     ScDocument* mpDoc;
+    const boost::unordered_set<OpCode>& mrOps;
     sc::EndListeningContext& mrEndListenCxt;
     sc::CompileFormulaContext& mrCompileFormulaCxt;
 
 public:
-    PreRangeNameUpdateHandler( ScDocument* pDoc, sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ) :
+    RecompileByOpcodeHandler(
+        ScDocument* pDoc, const boost::unordered_set<OpCode>& rOps,
+        sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ) :
         mpDoc(pDoc),
+        mrOps(rOps),
         mrEndListenCxt(rEndListenCxt),
         mrCompileFormulaCxt(rCompileCxt) {}
 
@@ -163,12 +167,7 @@ public:
             pTop = rEntry.mpCell;
 
         ScTokenArray* pCode = pTop->GetCode();
-
-        boost::unordered_set<OpCode> aOps;
-        aOps.insert(ocBad);
-        aOps.insert(ocColRowName);
-        aOps.insert(ocName);
-        bool bRecompile = pCode->HasOpCodes(aOps);
+        bool bRecompile = pCode->HasOpCodes(mrOps);
 
         if (bRecompile)
         {
@@ -204,14 +203,14 @@ public:
     }
 };
 
-class PostRangeNameUpdateHandler
+class CompileHybridFormulaHandler
 {
     ScDocument* mpDoc;
     sc::StartListeningContext& mrStartListenCxt;
     sc::CompileFormulaContext& mrCompileFormulaCxt;
 
 public:
-    PostRangeNameUpdateHandler( ScDocument* pDoc, sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt ) :
+    CompileHybridFormulaHandler( ScDocument* pDoc, sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt ) :
         mpDoc(pDoc),
         mrStartListenCxt(rStartListenCxt),
         mrCompileFormulaCxt(rCompileCxt) {}
@@ -277,17 +276,35 @@ void ScColumn::PreprocessRangeNameUpdate(
     // Collect all formula groups.
     std::vector<sc::FormulaGroupEntry> aGroups = GetFormulaGroupEntries();
 
-    PreRangeNameUpdateHandler aFunc(pDocument, rEndListenCxt, rCompileCxt);
+    boost::unordered_set<OpCode> aOps;
+    aOps.insert(ocBad);
+    aOps.insert(ocColRowName);
+    aOps.insert(ocName);
+    RecompileByOpcodeHandler aFunc(pDocument, aOps, rEndListenCxt, rCompileCxt);
+    std::for_each(aGroups.begin(), aGroups.end(), aFunc);
+}
+
+void ScColumn::PreprocessDBDataUpdate(
+    sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt )
+{
+    // Collect all formula groups.
+    std::vector<sc::FormulaGroupEntry> aGroups = GetFormulaGroupEntries();
+
+    boost::unordered_set<OpCode> aOps;
+    aOps.insert(ocBad);
+    aOps.insert(ocColRowName);
+    aOps.insert(ocDBArea);
+    RecompileByOpcodeHandler aFunc(pDocument, aOps, rEndListenCxt, rCompileCxt);
     std::for_each(aGroups.begin(), aGroups.end(), aFunc);
 }
 
-void ScColumn::PostprocessRangeNameUpdate(
+void ScColumn::CompileHybridFormula(
     sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt )
 {
     // Collect all formula groups.
     std::vector<sc::FormulaGroupEntry> aGroups = GetFormulaGroupEntries();
 
-    PostRangeNameUpdateHandler aFunc(pDocument, rStartListenCxt, rCompileCxt);
+    CompileHybridFormulaHandler aFunc(pDocument, rStartListenCxt, rCompileCxt);
     std::for_each(aGroups.begin(), aGroups.end(), aFunc);
 }
 
diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx
index 8a4e3ec..03ee3ef 100644
--- a/sc/source/core/data/documen4.cxx
+++ b/sc/source/core/data/documen4.cxx
@@ -548,17 +548,6 @@ void ScDocument::CompileDBFormula()
     }
 }
 
-void ScDocument::CompileDBFormula( bool bCreateFormulaString )
-{
-    sc::CompileFormulaContext aCxt(this);
-    TableContainer::iterator it = maTabs.begin();
-    for (;it != maTabs.end(); ++it)
-    {
-        if (*it)
-            (*it)->CompileDBFormula(aCxt, bCreateFormulaString);
-    }
-}
-
 void ScDocument::CompileColRowNameFormula()
 {
     sc::CompileFormulaContext aCxt(this);
diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx
index cb64221..26f34db 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -57,7 +57,20 @@ void ScDocument::PreprocessRangeNameUpdate()
     }
 }
 
-void ScDocument::PostprocessRangeNameUpdate()
+void ScDocument::PreprocessDBDataUpdate()
+{
+    sc::EndListeningContext aEndListenCxt(*this);
+    sc::CompileFormulaContext aCompileCxt(this);
+
+    TableContainer::iterator it = maTabs.begin(), itEnd = maTabs.end();
+    for (; it != itEnd; ++it)
+    {
+        ScTable* p = *it;
+        p->PreprocessDBDataUpdate(aEndListenCxt, aCompileCxt);
+    }
+}
+
+void ScDocument::CompileHybridFormula()
 {
     sc::StartListeningContext aStartListenCxt(*this);
     sc::CompileFormulaContext aCompileCxt(this);
@@ -65,7 +78,7 @@ void ScDocument::PostprocessRangeNameUpdate()
     for (; it != itEnd; ++it)
     {
         ScTable* p = *it;
-        p->PostprocessRangeNameUpdate(aStartListenCxt, aCompileCxt);
+        p->CompileHybridFormula(aStartListenCxt, aCompileCxt);
     }
 }
 
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 18194e1..bbaff4f 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -3496,57 +3496,6 @@ void ScFormulaCell::CompileDBFormula( sc::CompileFormulaContext& rCxt )
     }
 }
 
-void ScFormulaCell::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString )
-{
-    // Two phases must be called after each other
-    // 1. Formula String with old generated names
-    // 2. Formula String with new generated names
-    if ( bCreateFormulaString )
-    {
-        bool bRecompile = false;
-        pCode->Reset();
-        for ( FormulaToken* p = pCode->First(); p && !bRecompile; p = pCode->Next() )
-        {
-            switch ( p->GetOpCode() )
-            {
-                case ocBad:             // DB Area eventually goes bad
-                case ocColRowName:      // in case of the same names
-                case ocDBArea:          // DB Area
-                    bRecompile = true;
-                break;
-                case ocName:
-                    if ( p->GetIndex() >= SC_START_INDEX_DB_COLL )
-                        bRecompile = true;  // DB Area
-                break;
-                default:
-                    ; // nothing
-            }
-        }
-        if ( bRecompile )
-        {
-            OUString aFormula = GetFormula(rCxt);
-            if ( GetMatrixFlag() != MM_NONE && !aFormula.isEmpty() )
-            {
-                if ( aFormula[ aFormula.getLength()-1 ] == '}' )
-                    aFormula = aFormula.copy( 0, aFormula.getLength()-1 );
-                if ( aFormula[0] == '{' )
-                    aFormula = aFormula.copy( 1 );
-            }
-            EndListeningTo( pDocument );
-            pDocument->RemoveFromFormulaTree( this );
-            pCode->Clear();
-            SetHybridFormula(aFormula, rCxt.getGrammar());
-        }
-    }
-    else if ( !pCode->GetLen() && !aResult.GetHybridFormula().isEmpty() )
-    {
-        rCxt.setGrammar(eTempGrammar);
-        Compile(rCxt, aResult.GetHybridFormula(), false);
-        aResult.SetToken( NULL);
-        SetDirty();
-    }
-}
-
 void ScFormulaCell::CompileColRowNameFormula( sc::CompileFormulaContext& rCxt )
 {
     pCode->Reset();
diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx
index bfefd30..aef4726 100644
--- a/sc/source/core/data/table4.cxx
+++ b/sc/source/core/data/table4.cxx
@@ -2062,12 +2062,6 @@ void ScTable::CompileDBFormula( sc::CompileFormulaContext& rCxt )
         aCol[i].CompileDBFormula(rCxt);
 }
 
-void ScTable::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString )
-{
-    for (SCCOL i = 0; i <= MAXCOL; ++i)
-        aCol[i].CompileDBFormula(rCxt, bCreateFormulaString);
-}
-
 void ScTable::CompileColRowNameFormula( sc::CompileFormulaContext& rCxt )
 {
     for (SCCOL i = 0; i <= MAXCOL; ++i)
diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx
index b427617..1ede729 100644
--- a/sc/source/core/data/table7.cxx
+++ b/sc/source/core/data/table7.cxx
@@ -50,11 +50,18 @@ void ScTable::PreprocessRangeNameUpdate(
         aCol[i].PreprocessRangeNameUpdate(rEndListenCxt, rCompileCxt);
 }
 
-void ScTable::PostprocessRangeNameUpdate(
+void ScTable::PreprocessDBDataUpdate(
+    sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt )
+{
+    for (SCCOL i = 0; i <= MAXCOL; ++i)
+        aCol[i].PreprocessDBDataUpdate(rEndListenCxt, rCompileCxt);
+}
+
+void ScTable::CompileHybridFormula(
     sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt )
 {
     for (SCCOL i = 0; i <= MAXCOL; ++i)
-        aCol[i].PostprocessRangeNameUpdate(rStartListenCxt, rCompileCxt);
+        aCol[i].CompileHybridFormula(rStartListenCxt, rCompileCxt);
 }
 
 void ScTable::UpdateScriptTypes( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 )
diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx
index 900bf3e..29d2da1 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -79,7 +79,7 @@ bool ScDBDocFunc::AddDBRange( const OUString& rName, const ScRange& rRange, sal_
     bool bCompile = !pDoc->IsImportingXML();
     bool bOk;
     if ( bCompile )
-        pDoc->CompileDBFormula( sal_True );     // CreateFormulaString
+        pDoc->PreprocessDBDataUpdate();
     if ( rName == STR_DB_LOCAL_NONAME )
     {
         pDoc->SetAnonymousDBData(rRange.aStart.Tab() , pNew);
@@ -90,7 +90,7 @@ bool ScDBDocFunc::AddDBRange( const OUString& rName, const ScRange& rRange, sal_
         bOk = pDocColl->getNamedDBs().insert(pNew);
     }
     if ( bCompile )
-        pDoc->CompileDBFormula( false );    // CompileFormulaString
+        pDoc->CompileHybridFormula();
 
     if (!bOk)
     {
@@ -128,9 +128,9 @@ bool ScDBDocFunc::DeleteDBRange(const OUString& rName)
         if (bUndo)
             pUndoColl = new ScDBCollection( *pDocColl );
 
-        pDoc->CompileDBFormula( true );     // CreateFormulaString
+        pDoc->PreprocessDBDataUpdate();
         rDBs.erase(*p);
-        pDoc->CompileDBFormula( false );    // CompileFormulaString
+        pDoc->CompileHybridFormula();
 
         if (bUndo)
         {
@@ -164,13 +164,13 @@ bool ScDBDocFunc::RenameDBRange( const OUString& rOld, const OUString& rNew )
 
         ScDBCollection* pUndoColl = new ScDBCollection( *pDocColl );
 
-        pDoc->CompileDBFormula(true);               // CreateFormulaString
+        pDoc->PreprocessDBDataUpdate();
         rDBs.erase(*pOld);
         bool bInserted = rDBs.insert(pNewData);
         if (!bInserted)                             // Fehler -> alten Zustand wiederherstellen
             pDoc->SetDBCollection(pUndoColl);       // gehoert dann dem Dokument
-                                                    //
-        pDoc->CompileDBFormula( false );            // CompileFormulaString
+
+        pDoc->CompileHybridFormula();
 
         if (bInserted)                              // Einfuegen hat geklappt
         {
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index 2d85309..034f881 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -4871,7 +4871,7 @@ bool ScDocFunc::SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc, SCTA
     else
         pDoc->SetRangeName( pNewRanges );       // takes ownership
     if ( bCompile )
-        pDoc->PostprocessRangeNameUpdate();
+        pDoc->CompileHybridFormula();
 
     if (bModifyDoc)
     {
@@ -4897,7 +4897,7 @@ void ScDocFunc::ModifyAllRangeNames( const boost::ptr_map<OUString, ScRangeName>
 
     pDoc->PreprocessRangeNameUpdate();
     pDoc->SetAllRangeNames(rRangeMap);
-    pDoc->PostprocessRangeNameUpdate();
+    pDoc->CompileHybridFormula();
 
     aModificator.SetDocumentModified();
     SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
diff --git a/sc/source/ui/docshell/docsh5.cxx b/sc/source/ui/docshell/docsh5.cxx
index ee63dcf..3c65fc0 100644
--- a/sc/source/ui/docshell/docsh5.cxx
+++ b/sc/source/ui/docshell/docsh5.cxx
@@ -256,7 +256,7 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe
             OUString aNewName;
             if (eMode==SC_DB_IMPORT)
             {
-                aDocument.CompileDBFormula( sal_True );         // CreateFormulaString
+                aDocument.PreprocessDBDataUpdate();
                 pUndoColl = new ScDBCollection( *pColl );   // Undo fuer Import1-Bereich
 
                 OUString aImport = ScGlobal::GetRscString( STR_DBNAME_IMPORT );
@@ -289,7 +289,7 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe
 
             if ( pUndoColl )
             {
-                aDocument.CompileDBFormula( false );        // CompileFormulaString
+                aDocument.CompileHybridFormula();
 
                 ScDBCollection* pRedoColl = new ScDBCollection( *pColl );
                 GetUndoManager()->AddUndoAction( new ScUndoDBData( this, pUndoColl, pRedoColl ) );
diff --git a/sc/source/ui/undo/undocell.cxx b/sc/source/ui/undo/undocell.cxx
index 02f67a9..03f2288 100644
--- a/sc/source/ui/undo/undocell.cxx
+++ b/sc/source/ui/undo/undocell.cxx
@@ -1059,7 +1059,7 @@ void ScUndoRangeNames::DoChange( sal_Bool bUndo )
             pDoc->SetRangeName( new ScRangeName( *pNewRanges ) );
     }
 
-    pDoc->PostprocessRangeNameUpdate();
+    pDoc->CompileHybridFormula();
 
     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) );
 }
diff --git a/sc/source/ui/undo/undodat.cxx b/sc/source/ui/undo/undodat.cxx
index 57d0875..32af832 100644
--- a/sc/source/ui/undo/undodat.cxx
+++ b/sc/source/ui/undo/undodat.cxx
@@ -1133,9 +1133,9 @@ void ScUndoDBData::Undo()
 
     sal_Bool bOldAutoCalc = pDoc->GetAutoCalc();
     pDoc->SetAutoCalc( false );         // Avoid unnecessary calculations
-    pDoc->CompileDBFormula( sal_True );     // CreateFormulaString
+    pDoc->PreprocessDBDataUpdate();
     pDoc->SetDBCollection( new ScDBCollection(*pUndoColl), sal_True );
-    pDoc->CompileDBFormula( false );    // CompileFormulaString
+    pDoc->CompileHybridFormula();
     pDoc->SetAutoCalc( bOldAutoCalc );
 
     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
@@ -1151,9 +1151,9 @@ void ScUndoDBData::Redo()
 
     sal_Bool bOldAutoCalc = pDoc->GetAutoCalc();
     pDoc->SetAutoCalc( false );         // Avoid unnecessary calculations
-    pDoc->CompileDBFormula( sal_True );     // CreateFormulaString
+    pDoc->PreprocessDBDataUpdate();
     pDoc->SetDBCollection( new ScDBCollection(*pRedoColl), sal_True );
-    pDoc->CompileDBFormula( false );    // CompileFormulaString
+    pDoc->CompileHybridFormula();
     pDoc->SetAutoCalc( bOldAutoCalc );
 
     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
diff --git a/sc/source/ui/undo/undorangename.cxx b/sc/source/ui/undo/undorangename.cxx
index 172f802..9a92b77 100644
--- a/sc/source/ui/undo/undorangename.cxx
+++ b/sc/source/ui/undo/undorangename.cxx
@@ -79,7 +79,7 @@ void ScUndoAllRangeNames::DoChange(const boost::ptr_map<OUString, ScRangeName>&
 
     rDoc.PreprocessRangeNameUpdate();
     rDoc.SetAllRangeNames(rNames);
-    rDoc.PostprocessRangeNameUpdate();
+    rDoc.CompileHybridFormula();
 
     SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
 }
diff --git a/sc/source/ui/unoobj/nameuno.cxx b/sc/source/ui/unoobj/nameuno.cxx
index 87ed766..3c3273c 100644
--- a/sc/source/ui/unoobj/nameuno.cxx
+++ b/sc/source/ui/unoobj/nameuno.cxx
@@ -751,7 +751,7 @@ void ScNamedRangesObj::lock()
 /** called from the XActionLockable interface methods on final unlock */
 void ScNamedRangesObj::unlock()
 {
-    pDocShell->GetDocument()->PostprocessRangeNameUpdate();
+    pDocShell->GetDocument()->CompileHybridFormula();
 }
 
 // document::XActionLockable
diff --git a/sc/source/ui/view/dbfunc.cxx b/sc/source/ui/view/dbfunc.cxx
index e5ebd37..1cd3223 100644
--- a/sc/source/ui/view/dbfunc.cxx
+++ b/sc/source/ui/view/dbfunc.cxx
@@ -224,9 +224,9 @@ void ScDBFunc::NotifyCloseDbNameDlg( const ScDBCollection& rNewColl, const std::
 
     //  register target in SBA no longer necessary
 
-    pDoc->CompileDBFormula( sal_True );     // CreateFormulaString
+    pDoc->PreprocessDBDataUpdate();
     pDoc->SetDBCollection( new ScDBCollection( rNewColl ) );
-    pDoc->CompileDBFormula( false );    // CompileFormulaString
+    pDoc->CompileHybridFormula();
     pOldColl = NULL;
     pDocShell->PostPaint(ScRange(0, 0, 0, MAXCOL, MAXROW, MAXTAB), PAINT_GRID);
     aModificator.SetDocumentModified();
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index e308cad..13a785b 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -2805,7 +2805,7 @@ bool ScViewFunc::InsertName( const OUString& rName, const OUString& rSymbol,
             bOk = true;
         pNewEntry = NULL;   // never delete, insert took ownership
 
-        pDoc->PostprocessRangeNameUpdate();
+        pDoc->CompileHybridFormula();
 
         aModificator.SetDocumentModified();
         SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) );
-- 
1.9.3