diff --git a/forms/source/component/DatabaseForm.cxx b/forms/source/component/DatabaseForm.cxx index e3b988bb1682..bc9cbf1caf1e 100644 --- a/forms/source/component/DatabaseForm.cxx +++ b/forms/source/component/DatabaseForm.cxx @@ -2,9 +2,9 @@ * * $RCSfile: DatabaseForm.cxx,v $ * - * $Revision: 1.50 $ + * $Revision: 1.51 $ * - * last change: $Author: hr $ $Date: 2003-03-25 18:01:14 $ + * last change: $Author: vg $ $Date: 2003-04-11 14:36:47 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -1686,11 +1686,15 @@ bool ODatabaseForm::hasValidParent() const } try { - Reference xSet(m_xParent, UNO_QUERY); - // only if the parent has a command we have to check if the parent is positioned on a valid row - if (getString(xSet->getPropertyValue(PROPERTY_COMMAND)).getLength() && - (xResultSet->isBeforeFirst() || xResultSet->isAfterLast() || - getBOOL(xSet->getPropertyValue(PROPERTY_ISNEW)))) + Reference< XPropertySet > xSet( m_xParent, UNO_QUERY ); + Reference< XLoadable > xLoad( m_xParent, UNO_QUERY ); + if ( xLoad->isLoaded() + && ( xResultSet->isBeforeFirst() + || xResultSet->isAfterLast() + || getBOOL( xSet->getPropertyValue( PROPERTY_ISNEW ) ) + ) + ) + // the parent form is loaded and on a "virtual" row -> not valid return false; } catch(Exception&) @@ -1859,6 +1863,23 @@ bool ODatabaseForm::fillParameters(ReusableMutexGuard& _rClearForNotifies, const return !bCanceled; } +//------------------------------------------------------------------------------ +void ODatabaseForm::saveInsertOnlyState( ) +{ + OSL_ENSURE( !m_aIgnoreResult.hasValue(), "ODatabaseForm::saveInsertOnlyState: overriding old value!" ); + m_aIgnoreResult = m_xAggregateSet->getPropertyValue( PROPERTY_INSERTONLY ); +} + +//------------------------------------------------------------------------------ +void ODatabaseForm::restoreInsertOnlyState( ) +{ + if ( m_aIgnoreResult.hasValue() ) + { + m_xAggregateSet->setPropertyValue( PROPERTY_INSERTONLY, m_aIgnoreResult ); + m_aIgnoreResult = Any(); + } +} + //------------------------------------------------------------------------------ sal_Bool ODatabaseForm::executeRowSet(ReusableMutexGuard& _rClearForNotifies, sal_Bool bMoveToFirst, const Reference< XInteractionHandler >& _rxCompletionHandler) { @@ -1867,7 +1888,8 @@ sal_Bool ODatabaseForm::executeRowSet(ReusableMutexGuard& _rClearForNotifies, sa if (!fillParameters(_rClearForNotifies, _rxCompletionHandler)) return sal_False; - sal_Bool bInsertOnly = sal_False; + + restoreInsertOnlyState( ); // ensure the aggregated row set has the correct properties sal_Int32 nConcurrency; @@ -1880,13 +1902,17 @@ sal_Bool ODatabaseForm::executeRowSet(ReusableMutexGuard& _rClearForNotifies, sa // clearParameters(); if(m_pParameterInfo && m_pParameterInfo->nCount > 0) { + // reset all parameter values + // (fs@openoffice.org: what is the difference to the "clearParameter" call which was removed + // in revision 1.39, and replaced with the lines below??) Reference xExecutionParams; - query_aggregation( m_xAggregate, xExecutionParams); // we don't have to look if this work otherwise previous calls don't work + query_aggregation( m_xAggregate, xExecutionParams); for (sal_Int32 nPos=1;nPos <= m_pParameterInfo->nCount; ++nPos) xExecutionParams->setNull(nPos,DataType::VARCHAR); - m_aIgnoreResult = m_xAggregateSet->getPropertyValue(PROPERTY_INSERTONLY); - m_xAggregateSet->setPropertyValue(PROPERTY_INSERTONLY,makeAny(sal_True)); + // switch to "insert only" mode + saveInsertOnlyState( ); + m_xAggregateSet->setPropertyValue( PROPERTY_INSERTONLY, makeAny( sal_True ) ); } } else if (m_bAllowInsert || m_bAllowUpdate || m_bAllowDelete) @@ -1894,12 +1920,6 @@ sal_Bool ODatabaseForm::executeRowSet(ReusableMutexGuard& _rClearForNotifies, sa else nConcurrency = ResultSetConcurrency::READ_ONLY; - if (m_bSubForm && hasValidParent() && m_aIgnoreResult.hasValue() && m_pParameterInfo && m_pParameterInfo->nCount > 0) - { - m_xAggregateSet->setPropertyValue(PROPERTY_INSERTONLY,m_aIgnoreResult); - m_aIgnoreResult = Any(); - } - m_xAggregateSet->setPropertyValue(PROPERTY_RESULTSET_CONCURRENCY, makeAny(nConcurrency)); sal_Int32 nResultSetType = ResultSetType::SCROLL_SENSITIVE; @@ -3378,6 +3398,9 @@ void SAL_CALL ODatabaseForm::unload() throw( RuntimeException ) if (m_xAggregateAsRowSet.is()) { + // we may have reset the InsertOnly property on the aggregate - restore it + restoreInsertOnlyState( ); + // clear the parameters if there are any invlidateParameters();