/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" // INCLUDE --------------------------------------------------------------- #include #include #include #include "dbdocutl.hxx" #include "document.hxx" #include "cell.hxx" #include "formula/errorcodes.hxx" using namespace ::com::sun::star; #define D_TIMEFACTOR 86400.0 // ----------------------------------------------------------------------- // static void ScDatabaseDocUtil::PutData( ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB nTab, const uno::Reference& xRow, long nRowPos, long nType, sal_Bool bCurrency, sal_Bool* pSimpleFlag ) { String aString; double nVal = 0.0; sal_Bool bValue = sal_False; sal_Bool bEmptyFlag = sal_False; sal_Bool bError = sal_False; sal_uLong nFormatIndex = 0; //! wasNull calls only if null value was found? try { switch ( nType ) { case sdbc::DataType::BIT: case sdbc::DataType::BOOLEAN: //! use language from doc (here, date/time and currency)? nFormatIndex = pDoc->GetFormatTable()->GetStandardFormat( NUMBERFORMAT_LOGICAL, ScGlobal::eLnge ); nVal = (xRow->getBoolean(nRowPos) ? 1 : 0); bEmptyFlag = ( nVal == 0.0 ) && xRow->wasNull(); bValue = sal_True; break; case sdbc::DataType::TINYINT: case sdbc::DataType::SMALLINT: case sdbc::DataType::INTEGER: case sdbc::DataType::BIGINT: case sdbc::DataType::FLOAT: case sdbc::DataType::REAL: case sdbc::DataType::DOUBLE: case sdbc::DataType::NUMERIC: case sdbc::DataType::DECIMAL: //! do the conversion here? nVal = xRow->getDouble(nRowPos); bEmptyFlag = ( nVal == 0.0 ) && xRow->wasNull(); bValue = sal_True; break; case sdbc::DataType::CHAR: case sdbc::DataType::VARCHAR: case sdbc::DataType::LONGVARCHAR: aString = xRow->getString(nRowPos); bEmptyFlag = ( aString.Len() == 0 ) && xRow->wasNull(); break; case sdbc::DataType::DATE: { SvNumberFormatter* pFormTable = pDoc->GetFormatTable(); nFormatIndex = pFormTable->GetStandardFormat( NUMBERFORMAT_DATE, ScGlobal::eLnge ); util::Date aDate = xRow->getDate(nRowPos); nVal = Date( aDate.Day, aDate.Month, aDate.Year ) - *pFormTable->GetNullDate(); bEmptyFlag = xRow->wasNull(); bValue = sal_True; } break; case sdbc::DataType::TIME: { SvNumberFormatter* pFormTable = pDoc->GetFormatTable(); nFormatIndex = pFormTable->GetStandardFormat( NUMBERFORMAT_TIME, ScGlobal::eLnge ); util::Time aTime = xRow->getTime(nRowPos); nVal = ( aTime.Hours * 3600 + aTime.Minutes * 60 + aTime.Seconds + aTime.HundredthSeconds / 100.0 ) / D_TIMEFACTOR; bEmptyFlag = xRow->wasNull(); bValue = sal_True; } break; case sdbc::DataType::TIMESTAMP: { SvNumberFormatter* pFormTable = pDoc->GetFormatTable(); nFormatIndex = pFormTable->GetStandardFormat( NUMBERFORMAT_DATETIME, ScGlobal::eLnge ); util::DateTime aStamp = xRow->getTimestamp(nRowPos); nVal = ( Date( aStamp.Day, aStamp.Month, aStamp.Year ) - *pFormTable->GetNullDate() ) + ( aStamp.Hours * 3600 + aStamp.Minutes * 60 + aStamp.Seconds + aStamp.HundredthSeconds / 100.0 ) / D_TIMEFACTOR; bEmptyFlag = xRow->wasNull(); bValue = sal_True; } break; case sdbc::DataType::SQLNULL: bEmptyFlag = sal_True; break; case sdbc::DataType::BINARY: case sdbc::DataType::VARBINARY: case sdbc::DataType::LONGVARBINARY: default: bError = sal_True; // unknown type } } catch ( uno::Exception& ) { bError = sal_True; } if ( bValue && bCurrency ) nFormatIndex = pDoc->GetFormatTable()->GetStandardFormat( NUMBERFORMAT_CURRENCY, ScGlobal::eLnge ); ScBaseCell* pCell; if (bEmptyFlag) { pCell = NULL; pDoc->PutCell( nCol, nRow, nTab, pCell ); } else if (bError) { pDoc->SetError( nCol, nRow, nTab, NOTAVAILABLE ); } else if (bValue) { pCell = new ScValueCell( nVal ); if (nFormatIndex == 0) pDoc->PutCell( nCol, nRow, nTab, pCell ); else pDoc->PutCell( nCol, nRow, nTab, pCell, nFormatIndex ); } else { if (aString.Len()) { pCell = ScBaseCell::CreateTextCell( aString, pDoc ); if ( pSimpleFlag && pCell->GetCellType() == CELLTYPE_EDIT ) *pSimpleFlag = sal_False; } else pCell = NULL; pDoc->PutCell( nCol, nRow, nTab, pCell ); } }