dr78: #i116426# use ODataAccessDescriptor for database import parameters, support bookmarks for selection

# HG changeset patch
# User Niklas Nebel <nn@openoffice.org>
# Date 1294842009 -3600
# Node ID e25621ed7fd31753eea52ee5ff3f0a6d170db9a9
# Parent  5ea5624904a5aa39bb40ce197c80a0a41f40b873
diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index 489b93f..b030a95 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -5438,7 +5438,7 @@ SfxUInt16Item RowHeight FID_ROW_HEIGHT

//--------------------------------------------------------------------------
SfxVoidItem SbaImport SID_SBA_IMPORT
(SfxStringItem Query SID_SBA_IMPORT,SfxStringItem Target FN_PARAM_1)
(SfxUsrAnyItem Query SID_SBA_IMPORT,SfxStringItem Target FN_PARAM_1)
[
    /* flags: */
    AutoUpdate = FALSE,
diff --git a/sc/source/ui/app/typemap.cxx b/sc/source/ui/app/typemap.cxx
index e250fec..1d4c3a0 100644
--- a/sc/source/ui/app/typemap.cxx
+++ b/sc/source/ui/app/typemap.cxx
@@ -124,6 +124,7 @@

#include <svl/aeitem.hxx>
#include <avmedia/mediaitem.hxx>
#include <sfx2/frame.hxx>
#include "attrib.hxx"

#define SvxDrawToolItem             SfxAllEnumItem
diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx
index 623ecce..0461d2b 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -34,8 +34,9 @@
#include <sfx2/app.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/waitobj.hxx>
#include <svx/dataaccessdescriptor.hxx>

#include <com/sun/star/sdbc/XResultSet.hpp>
#include <com/sun/star/sdb/CommandType.hpp>

#include "dbdocfun.hxx"
#include "sc.hrc"
@@ -60,6 +61,8 @@
#include "queryentry.hxx"
#include "markdata.hxx"

using namespace ::com::sun::star;

// -----------------------------------------------------------------

bool ScDBDocFunc::AddDBRange( const ::rtl::OUString& rName, const ScRange& rRange, sal_Bool /* bApi */ )
@@ -1450,15 +1453,11 @@ sal_Bool ScDBDocFunc::DataPilotUpdate( ScDPObject* pOldObj, const ScDPObject* pN

//==================================================================
//
//      Datenbank-Import...
//      database import

void ScDBDocFunc::UpdateImport( const String& rTarget, const String& rDBName,
        const String& rTableName, const String& rStatement, bool bNative,
        sal_uInt8 nType, const ::com::sun::star::uno::Reference<
        ::com::sun::star::sdbc::XResultSet >& xResultSet,
        const std::vector<sal_Int32> *pSelection )
void ScDBDocFunc::UpdateImport( const String& rTarget, const svx::ODataAccessDescriptor& rDescriptor )
{
    //  Target ist jetzt einfach der Bereichsname
    // rTarget is the name of a database range

    ScDocument* pDoc = rDocShell.GetDocument();
    ScDBCollection& rDBColl = *pDoc->GetDBCollection();
@@ -1479,15 +1478,21 @@ void ScDBDocFunc::UpdateImport( const String& rTarget, const String& rDBName,
    ScImportParam aImportParam;
    pData->GetImportParam( aImportParam );

    bool bSql = (rStatement.Len() != 0);
    rtl::OUString sDBName;
    rtl::OUString sDBTable;
    sal_Int32 nCommandType = 0;
    rDescriptor[svx::daDataSource]  >>= sDBName;
    rDescriptor[svx::daCommand]     >>= sDBTable;
    rDescriptor[svx::daCommandType] >>= nCommandType;

    aImportParam.aDBName    = rDBName;
    aImportParam.bSql       = bSql;
    aImportParam.aStatement = bSql ? rStatement : rTableName;
    aImportParam.bNative    = bNative;
    aImportParam.nType      = nType;
    aImportParam.aDBName    = sDBName;
    aImportParam.bSql       = ( nCommandType == sdb::CommandType::COMMAND );
    aImportParam.aStatement = sDBTable;
    aImportParam.bNative    = false;
    aImportParam.nType      = static_cast<sal_uInt8>( ( nCommandType == sdb::CommandType::QUERY ) ? ScDbQuery : ScDbTable );
    aImportParam.bImport    = true;
    bool bContinue = DoImport( nTab, aImportParam, xResultSet, pSelection, sal_True );

    bool bContinue = DoImport( nTab, aImportParam, &rDescriptor, true );

    //  DB-Operationen wiederholen

diff --git a/sc/source/ui/docshell/dbdocimp.cxx b/sc/source/ui/docshell/dbdocimp.cxx
index 5ccd9ef..829d36e 100644
--- a/sc/source/ui/docshell/dbdocimp.cxx
+++ b/sc/source/ui/docshell/dbdocimp.cxx
@@ -42,6 +42,7 @@
#include <com/sun/star/sdbc/XRow.hpp>
#include <com/sun/star/sdbc/XRowSet.hpp>
#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
#include <com/sun/star/sdbcx/XRowLocate.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/frame/XDispatchProvider.hpp>
@@ -63,6 +64,7 @@
#include "dbdocutl.hxx"
#include "editable.hxx"
#include "hints.hxx"
#include "miscuno.hxx"
#include "chgtrack.hxx"

using namespace com::sun::star;
@@ -119,99 +121,22 @@ void ScDBDocFunc::ShowInBeamer( const ScImportParam& rParam, SfxViewFrame* pFram
bool ScDBDocFunc::DoImportUno( const ScAddress& rPos,
                                const uno::Sequence<beans::PropertyValue>& aArgs )
{
    bool bDone = false;
    svx::ODataAccessDescriptor aDesc( aArgs );      // includes selection and result set

    ScImportParam aImParam;
    aImParam.nCol1 = aImParam.nCol2 = rPos.Col();
    aImParam.nRow1 = aImParam.nRow2 = rPos.Row();
    aImParam.bImport = true;
    //  create database range
    ScDBData* pDBData = rDocShell.GetDBData( ScRange(rPos), SC_DB_IMPORT, SC_DBSEL_KEEP );
    DBG_ASSERT(pDBData, "can't create DB data");
    String sTarget = pDBData->GetName();

    uno::Reference<sdbc::XResultSet> xResSet;
    uno::Sequence<uno::Any> aSelection;
    UpdateImport( sTarget, aDesc );

    rtl::OUString aStrVal;
    const beans::PropertyValue* pPropArray = aArgs.getConstArray();
    long nPropCount = aArgs.getLength();
    long i;
    for (i = 0; i < nPropCount; i++)
    {
        const beans::PropertyValue& rProp = pPropArray[i];
        String aPropName = rProp.Name;

        if ( aPropName.EqualsAscii( SC_DBPROP_DATASOURCENAME ))
        {
            if ( rProp.Value >>= aStrVal )
                aImParam.aDBName = aStrVal;
        }
        else if ( aPropName.EqualsAscii( SC_DBPROP_COMMAND ))
        {
            if ( rProp.Value >>= aStrVal )
                aImParam.aStatement = aStrVal;
        }
        else if ( aPropName.EqualsAscii( SC_DBPROP_COMMANDTYPE ))
        {
            sal_Int32 nType = 0;
            if ( rProp.Value >>= nType )
            {
                aImParam.bSql = ( nType == sdb::CommandType::COMMAND );
                aImParam.nType = sal::static_int_cast<sal_uInt8>( ( nType == sdb::CommandType::QUERY ) ? ScDbQuery : ScDbTable );
                // nType is ignored if bSql is set
            }
        }
        else if ( aPropName.EqualsAscii( SC_DBPROP_SELECTION ))
        {
            rProp.Value >>= aSelection;
        }
        else if ( aPropName.EqualsAscii( SC_DBPROP_CURSOR ))
        {
            rProp.Value >>= xResSet;
        }
    }

    std::vector<sal_Int32> aList;
    long nSelLen = aSelection.getLength();
    for (i = 0; i < nSelLen; i++)
    {
        sal_Int32 nEntry = 0;
        if ( aSelection[i] >>= nEntry )
            aList.push_back( nEntry );
    }

    bool bAddrInsert = false;       //!???
    if ( bAddrInsert )
    {
        bDone = DoImport( rPos.Tab(), aImParam, xResSet, &aList, sal_True, bAddrInsert );
    }
    else
    {
        //  create database range
        //! merge this with SID_SBA_IMPORT execute in docsh4.cxx

        ScDBData* pDBData = rDocShell.GetDBData( ScRange(rPos), SC_DB_IMPORT, SC_DBSEL_KEEP );
        OSL_ENSURE(pDBData, "can't create DB data");
        String sTarget = pDBData->GetName();

        //! change UpdateImport to use only one of rTableName, rStatement

        String aTableName, aStatement;
        if ( aImParam.bSql )
            aStatement = aImParam.aStatement;
        else
            aTableName = aImParam.aStatement;

        UpdateImport( sTarget, aImParam.aDBName, aTableName, aStatement,
                aImParam.bNative, aImParam.nType, xResSet, &aList );
        bDone = true;
    }

    return bDone;
    return true;
}

// -----------------------------------------------------------------

bool ScDBDocFunc::DoImport( SCTAB nTab, const ScImportParam& rParam,
        const uno::Reference< sdbc::XResultSet >& xResultSet,
        const std::vector<sal_Int32> *pSelection, bool bRecord, bool bAddrInsert )
        const svx::ODataAccessDescriptor* pDescriptor, bool bRecord, bool bAddrInsert )
{
    ScDocument* pDoc = rDocShell.GetDocument();
    ScChangeTrack *pChangeTrack = NULL;
@@ -251,17 +176,34 @@ bool ScDBDocFunc::DoImport( SCTAB nTab, const ScImportParam& rParam,

    sal_Bool bDoSelection = false;
    sal_Bool bRealSelection = false;            // sal_True if not everything is selected
    sal_uLong nListPos = 0;
    sal_uLong nRowsRead = 0;
    sal_uLong nListCount = 0;
    sal_Bool bBookmarkSelection = sal_False;
    sal_Int32 nListPos = 0;
    sal_Int32 nRowsRead = 0;
    sal_Int32 nListCount = 0;

    //  -1 is special
    if ( !pSelection->empty() && (*pSelection)[0] != -1 )
    uno::Sequence<uno::Any> aSelection;
    if ( pDescriptor && pDescriptor->has(svx::daSelection) )
    {
        bDoSelection = sal_True;
        nListCount = pSelection->size();
        (*pDescriptor)[svx::daSelection] >>= aSelection;
        nListCount = aSelection.getLength();
        if ( nListCount > 0 )
        {
            bDoSelection = true;
            if ( pDescriptor->has(svx::daBookmarkSelection) )
                bBookmarkSelection = ScUnoHelpFunctions::GetBoolFromAny( (*pDescriptor)[svx::daBookmarkSelection] );
            if ( bBookmarkSelection )
            {
                // From bookmarks, there's no way to detect if all records are selected.
                // Rely on base to pass no selection in that case.
                bRealSelection = true;
            }
        }
    }

    uno::Reference<sdbc::XResultSet> xResultSet;
    if ( pDescriptor && pDescriptor->has(svx::daCursor) )
        xResultSet.set((*pDescriptor)[svx::daCursor], uno::UNO_QUERY);

    // ImportDoc - also used for Redo
    ScDocument* pImportDoc = new ScDocument( SCDOCMODE_UNDO );
    pImportDoc->InitUndo( pDoc, nTab, nTab );
@@ -345,6 +287,17 @@ bool ScDBDocFunc::DoImport( SCTAB nTab, const ScImportParam& rParam,
                //! error message
            }

            uno::Reference<sdbcx::XRowLocate> xLocate;
            if ( bBookmarkSelection )
            {
                xLocate.set( xRowSet, uno::UNO_QUERY );
                if ( !xLocate.is() )
                {
                    DBG_ERRORFILE("can't get XRowLocate");
                    bDoSelection = bRealSelection = bBookmarkSelection = sal_False;
                }
            }

            uno::Reference<sdbc::XRow> xRow( xRowSet, uno::UNO_QUERY );
            if ( nColCount > 0 && xRow.is() )
            {
@@ -388,16 +341,25 @@ bool ScDBDocFunc::DoImport( SCTAB nTab, const ScImportParam& rParam,
                    {
                        if (nListPos < nListCount)
                        {
                            sal_uInt32 nNextRow = (*pSelection)[nListPos];
                            if ( nRowsRead+1 < nNextRow )
                                bRealSelection = sal_True;
                            bEnd = !xRowSet->absolute(nRowsRead = nNextRow);
                            if ( bBookmarkSelection )
                            {
                                bEnd = !xLocate->moveToBookmark(aSelection[nListPos]);
                            }
                            else    // use record numbers
                            {
                                sal_Int32 nNextRow = 0;
                                aSelection[nListPos] >>= nNextRow;
                                if ( nRowsRead+1 < nNextRow )
                                    bRealSelection = true;
                                bEnd = !xRowSet->absolute(nRowsRead = nNextRow);
                            }
                            ++nListPos;
                        }
                        else
                        {
                            bRealSelection = xRowSet->next();
                            bEnd = sal_True; // more data available but not used
                            if ( !bBookmarkSelection && xRowSet->next() )
                                bRealSelection = true;                      // more data available but not used
                            bEnd = true;
                        }
                    }

diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx
index 39fae9c..1fbaa78 100644
--- a/sc/source/ui/docshell/docsh4.cxx
+++ b/sc/source/ui/docshell/docsh4.cxx
@@ -30,7 +30,7 @@

#include <com/sun/star/embed/XEmbeddedObject.hpp>
#include <com/sun/star/frame/XComponentLoader.hpp>

 

using namespace ::com::sun::star;

@@ -56,6 +56,7 @@ using namespace ::com::sun::star;
#include <vcl/msgbox.hxx>
#include <vcl/waitobj.hxx>
#include <tools/multisel.hxx>
#include <svx/dataaccessdescriptor.hxx>
#include <svx/drawitem.hxx>
#include <svx/fmview.hxx>
#include <svx/pageitem.hxx>
@@ -193,19 +194,21 @@ void ScDocShell::Execute( SfxRequest& rReq )
        }
        break;


        //  SID_SBA_QRY_CHANGETARGET gibts nicht mehr - auch in idl raus

        case SID_SBA_IMPORT:
        {
            if (pReqArgs)
            {
                const sal_Unicode cSbaSep = 11;     // Trennzeichen

                const SfxPoolItem* pItem;
                String sSbaData, sTarget;
                if ( pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET )
                    sSbaData = ((const SfxStringItem*)pItem)->GetValue();
                svx::ODataAccessDescriptor aDesc;
                if ( pReqArgs->GetItemState( nSlot, true, &pItem ) == SFX_ITEM_SET )
                {
                    uno::Any aAny = static_cast<const SfxUsrAnyItem*>(pItem)->GetValue();
                    uno::Sequence<beans::PropertyValue> aProperties;
                    if ( aAny >>= aProperties )
                        aDesc.initializeFrom( aProperties );
                }

                String sTarget;
                if ( pReqArgs->GetItemState( FN_PARAM_1, sal_True, &pItem ) == SFX_ITEM_SET )
                    sTarget = ((const SfxStringItem*)pItem)->GetValue();

@@ -213,33 +216,6 @@ void ScDocShell::Execute( SfxRequest& rReq )
                if ( pReqArgs->GetItemState( FN_PARAM_2, sal_True, &pItem ) == SFX_ITEM_SET )
                    bIsNewArea = ((const SfxBoolItem*)pItem)->GetValue();

                ::com::sun::star::uno::Reference<
                        ::com::sun::star::sdbc::XResultSet > xResultSet;
                if ( pReqArgs->GetItemState( FN_PARAM_3, false, &pItem ) == SFX_ITEM_SET && pItem )
                    xResultSet.set(((const SfxUsrAnyItem*)pItem)->GetValue(),::com::sun::star::uno::UNO_QUERY);

                String sDBName  = sSbaData.GetToken(0,cSbaSep);     // Datenbankname
                String sDBTable = sSbaData.GetToken(1,cSbaSep);     // Tabellen- oder Query-Name
                String sTabFlag = sSbaData.GetToken(2,cSbaSep);
                String sDBSql   = sSbaData.GetToken(3,cSbaSep);     // SQL im Klartext

                sal_uInt8 nType = ScDbTable;        // "0" oder "1"
                if ( sTabFlag.EqualsAscii("0") )        // "0" = Query, "1" = Table (Default)
                    nType = ScDbQuery;

                std::vector<sal_Int32> aSelectionList;
                xub_StrLen nCount = sSbaData.GetTokenCount(cSbaSep);

                for (xub_StrLen i = 4; i < nCount; i++)
                {
                    String aSelItem = sSbaData.GetToken(i,cSbaSep);
                    if (aSelItem.Len())
                    {
                        sal_uInt32 nValue = aSelItem.ToInt32();
                        aSelectionList.push_back(nValue);
                    }
                }

                // bei Bedarf neuen Datenbankbereich anlegen
                bool bMakeArea = false;
                if (bIsNewArea)
@@ -279,9 +255,7 @@ void ScDocShell::Execute( SfxRequest& rReq )

                if (bDo)
                {
                    ScDBDocFunc(*this).UpdateImport( sTarget, sDBName,
                            sDBTable, sDBSql, true, nType, xResultSet,
                            &aSelectionList );
                    ScDBDocFunc(*this).UpdateImport( sTarget, aDesc );
                    rReq.Done();

                    //  UpdateImport aktualisiert auch die internen Operationen
diff --git a/sc/source/ui/docshell/docsh5.cxx b/sc/source/ui/docshell/docsh5.cxx
index 28948b9..d053561 100644
--- a/sc/source/ui/docshell/docsh5.cxx
+++ b/sc/source/ui/docshell/docsh5.cxx
@@ -40,7 +40,6 @@
#include <sfx2/bindings.hxx>
#include <svl/smplhint.hxx>

#include <com/sun/star/sdbc/XResultSet.hpp>
#include <com/sun/star/script/vba/XVBACompatibility.hpp>

// INCLUDE ---------------------------------------------------------------
@@ -1014,8 +1013,7 @@ IMPL_LINK( ScDocShell, RefreshDBDataHdl, ScRefreshTimer*, pRefreshTimer )
    {
        ScRange aRange;
        pDBData->GetArea( aRange );
                Reference< ::com::sun::star::sdbc::XResultSet> xResultSet;
        bContinue = aFunc.DoImport( aRange.aStart.Tab(), aImportParam, xResultSet, NULL, true, false ); //! Api-Flag as parameter
        bContinue = aFunc.DoImport( aRange.aStart.Tab(), aImportParam, NULL, true, false ); //! Api-Flag as parameter
        // internal operations (sort, query, subtotal) only if no error
        if (bContinue)
        {
diff --git a/sc/source/ui/inc/dbdocfun.hxx b/sc/source/ui/inc/dbdocfun.hxx
index ac0ed58..83996cc 100644
--- a/sc/source/ui/inc/dbdocfun.hxx
+++ b/sc/source/ui/inc/dbdocfun.hxx
@@ -41,7 +41,6 @@ struct ScSortParam;
struct ScSubTotalParam;

class SfxViewFrame;
class SbaSelectionList;
class ScDBData;
class ScDocShell;
class ScAddress;
@@ -52,11 +51,12 @@ namespace com { namespace sun { namespace star {
    namespace beans {
        struct PropertyValue;
    }
    namespace sdbc {
        class XResultSet;
    }
} } }

namespace svx {
    class ODataAccessDescriptor;
}

class ScDBDocFunc
{
friend class ScDBFunc;
@@ -68,16 +68,11 @@ public:
                    ScDBDocFunc( ScDocShell& rDocSh ): rDocShell(rDocSh) {}
                    ~ScDBDocFunc() {}

    void            UpdateImport( const String& rTarget, const String& rDBName,
                        const String& rTableName, const String& rStatement,
                        bool bNative, sal_uInt8 nType,
                        const ::com::sun::star::uno::Reference<
                        ::com::sun::star::sdbc::XResultSet >& xResultSet,
                        const std::vector<sal_Int32> *pSelection );
    void            UpdateImport( const String& rTarget, const svx::ODataAccessDescriptor& rDescriptor );

    bool DoImport( SCTAB nTab, const ScImportParam& rParam,
                   const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet >& xResultSet,
                   const std::vector<sal_Int32> *pSelection, bool bRecord,
                   const svx::ODataAccessDescriptor* pDescriptor,      // used for selection and existing ResultSet
                   bool bRecord,
                   bool bAddrInsert = false );

    bool DoImportUno( const ScAddress& rPos,
diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx
index 4c21708..fc90a3ac 100644
--- a/sc/source/ui/unoobj/cellsuno.cxx
+++ b/sc/source/ui/unoobj/cellsuno.cxx
@@ -5911,12 +5911,11 @@ void SAL_CALL ScCellRangeObj::doImport( const uno::Sequence<beans::PropertyValue
        aParam.nRow2 = aRange.aEnd.Row();

        //! TODO: could we get passed a valid result set by any means?
        uno::Reference< sdbc::XResultSet > xResultSet;

        pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );       // ggf. Bereich anlegen

        ScDBDocFunc aFunc(*pDocSh);                         // Bereich muss angelegt sein
        aFunc.DoImport( nTab, aParam, xResultSet, NULL, sal_True, false );  //! Api-Flag als Parameter
        aFunc.DoImport( nTab, aParam, NULL, true );         //! Api-Flag as parameter
    }
}

diff --git a/sc/source/ui/unoobj/datauno.cxx b/sc/source/ui/unoobj/datauno.cxx
index 3172d26..5b10f13 100644
--- a/sc/source/ui/unoobj/datauno.cxx
+++ b/sc/source/ui/unoobj/datauno.cxx
@@ -1850,8 +1850,7 @@ void SAL_CALL ScDatabaseRangeObj::refresh() throw(uno::RuntimeException)
            SCCOL nDummyCol;
            SCROW nDummyRow;
            pData->GetArea( nTab, nDummyCol,nDummyRow,nDummyCol,nDummyRow );
            uno::Reference< sdbc::XResultSet > xResultSet;
            bContinue = aFunc.DoImport( nTab, aImportParam, xResultSet, NULL, sal_True, false );    //! Api-Flag als Parameter
            bContinue = aFunc.DoImport( nTab, aImportParam, NULL, true );   //! Api-Flag as parameter
        }

        // interne Operationen (sort, query, subtotal) nur, wenn kein Fehler
diff --git a/sc/source/ui/view/dbfunc.cxx b/sc/source/ui/view/dbfunc.cxx
index b401465..5979ea0 100644
--- a/sc/source/ui/view/dbfunc.cxx
+++ b/sc/source/ui/view/dbfunc.cxx
@@ -517,8 +517,7 @@ sal_Bool ScDBFunc::ImportData( const ScImportParam& rParam, sal_Bool bRecord )
    }

    ScDBDocFunc aDBDocFunc( *GetViewData()->GetDocShell() );
    ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > xResultSet;
    return aDBDocFunc.DoImport( GetViewData()->GetTabNo(), rParam, xResultSet, NULL, bRecord );
    return aDBDocFunc.DoImport( GetViewData()->GetTabNo(), rParam, NULL, bRecord );
}


diff --git a/sc/source/ui/view/viewfun5.cxx b/sc/source/ui/view/viewfun5.cxx
index 89f00c8..eae1329 100644
--- a/sc/source/ui/view/viewfun5.cxx
+++ b/sc/source/ui/view/viewfun5.cxx
@@ -373,10 +373,15 @@ sal_Bool ScViewFunc::PasteDataFormat( sal_uLong nFormatId,
    {
        //  import of database data into table

        String sDataDesc;
        if ( aDataHelper.GetString( nFormatId, sDataDesc ) )
        const DataFlavorExVector& rVector = aDataHelper.GetDataFlavorExVector();
        if ( svx::ODataAccessObjectTransferable::canExtractObjectDescriptor(rVector) )
        {
            SfxStringItem aDataDesc(SID_SBA_IMPORT, sDataDesc);
            // transport the whole ODataAccessDescriptor as slot parameter
            svx::ODataAccessDescriptor aDesc = svx::ODataAccessObjectTransferable::extractObjectDescriptor(aDataHelper);
            uno::Any aDescAny;
            uno::Sequence<beans::PropertyValue> aProperties = aDesc.createPropertyValueSequence();
            aDescAny <<= aProperties;
            SfxUsrAnyItem aDataDesc(SID_SBA_IMPORT, aDescAny);

            ScDocShell* pDocSh = GetViewData()->GetDocShell();
            SCTAB nTab = GetViewData()->GetTabNo();
@@ -400,20 +405,10 @@ sal_Bool ScViewFunc::PasteDataFormat( sal_uLong nFormatId,
            sal_Bool bAreaIsNew = !pDBData;
            SfxBoolItem aAreaNew(FN_PARAM_2, bAreaIsNew);

            ::svx::ODataAccessDescriptor aDesc;
            DataFlavorExVector& rVector = aDataHelper.GetDataFlavorExVector();
            ::std::auto_ptr<SfxUsrAnyItem> pCursorItem;
            if ( ::svx::ODataAccessObjectTransferable::canExtractObjectDescriptor(rVector) )
            {
                aDesc = ::svx::ODataAccessObjectTransferable::extractObjectDescriptor(aDataHelper);
                if ( aDesc.has(::svx::daCursor) )
                    pCursorItem.reset(new SfxUsrAnyItem(FN_PARAM_3, aDesc[::svx::daCursor]));
            }

            //  asynchronous, to avoid doing the whole import in drop handler
            SfxDispatcher& rDisp = GetViewData()->GetDispatcher();
            rDisp.Execute(SID_SBA_IMPORT, SFX_CALLMODE_ASYNCHRON,
                                        &aDataDesc, &aTarget, &aAreaNew, pCursorItem.get(), (void*)0 );
                                        &aDataDesc, &aTarget, &aAreaNew, (void*)0 );

            bRet = sal_True;
        }