xref: /aoo42x/main/sw/source/core/fields/dbfld.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 #include <float.h>
32 #include <sfx2/app.hxx>
33 #include <svl/zforlist.hxx>
34 #include <svx/pageitem.hxx>
35 #include <svx/dataaccessdescriptor.hxx>
36 #include <com/sun/star/sdbc/DataType.hpp>
37 #include <fmtfld.hxx>
38 #include <txtfld.hxx>
39 #include <doc.hxx>
40 #include <docary.hxx>
41 #include <frame.hxx>
42 #include <fldbas.hxx>
43 #include <pam.hxx>
44 #include <ndtxt.hxx>
45 #include <dbfld.hxx>
46 #include <dbmgr.hxx>
47 #include <docfld.hxx>
48 #include <expfld.hxx>
49 #include <txtatr.hxx>
50 #include <unofldmid.h>
51 #include <switerator.hxx>
52 
53 using namespace ::com::sun::star::sdbc;
54 using namespace ::com::sun::star;
55 using ::rtl::OUString;
56 
57 /*--------------------------------------------------------------------
58 	Beschreibung: Datenbanktrenner durch Punkte fuer Anzeige ersetzen
59  --------------------------------------------------------------------*/
60 
61 String lcl_DBTrennConv(const String& aContent)
62 {
63 	String sTmp(aContent);
64 	sal_Unicode* pStr = sTmp.GetBufferAccess();
65 	for( sal_uInt16 i = sTmp.Len(); i; --i, ++pStr )
66 		if( DB_DELIM == *pStr )
67 			*pStr = '.';
68 	return sTmp;
69 }
70 
71 /*--------------------------------------------------------------------
72 	Beschreibung: DatenbankFeldTyp
73  --------------------------------------------------------------------*/
74 
75 SwDBFieldType::SwDBFieldType(SwDoc* pDocPtr, const String& rNam, const SwDBData& rDBData ) :
76 	SwValueFieldType( pDocPtr, RES_DBFLD ),
77 	aDBData(rDBData),
78 	sColumn(rNam),
79 	nRefCnt(0)
80 {
81     if(aDBData.sDataSource.getLength() || aDBData.sCommand.getLength())
82     {
83         sName =  aDBData.sDataSource;
84         sName += DB_DELIM;
85         sName += (String)aDBData.sCommand;
86         sName += DB_DELIM;
87     }
88 	sName += GetColumnName();
89 }
90 //------------------------------------------------------------------------------
91 SwDBFieldType::~SwDBFieldType()
92 {
93 }
94 //------------------------------------------------------------------------------
95 
96 SwFieldType* SwDBFieldType::Copy() const
97 {
98 	SwDBFieldType* pTmp = new SwDBFieldType(GetDoc(), sColumn, aDBData);
99 	return pTmp;
100 }
101 
102 //------------------------------------------------------------------------------
103 const String& SwDBFieldType::GetName() const
104 {
105 	return sName;
106 }
107 
108 //------------------------------------------------------------------------------
109 
110 void SwDBFieldType::ReleaseRef()
111 {
112 	ASSERT(nRefCnt > 0, "RefCount kleiner 0!");
113 
114 	if (--nRefCnt <= 0)
115 	{
116 		sal_uInt16 nPos = GetDoc()->GetFldTypes()->GetPos(this);
117 
118 		if (nPos != USHRT_MAX)
119 		{
120 			GetDoc()->RemoveFldType(nPos);
121 			delete this;
122 		}
123 	}
124 }
125 
126 sal_Bool SwDBFieldType::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
127 {
128     switch( nWhichId )
129 	{
130     case FIELD_PROP_PAR1:
131 		rAny <<= aDBData.sDataSource;
132 		break;
133     case FIELD_PROP_PAR2:
134 		rAny <<= aDBData.sCommand;
135 		break;
136     case FIELD_PROP_PAR3:
137 		rAny <<= OUString(sColumn);
138 		break;
139 	case FIELD_PROP_SHORT1:
140 		rAny <<= aDBData.nCommandType;
141 		break;
142     default:
143 		DBG_ERROR("illegal property");
144 	}
145 	return sal_True;
146 }
147 
148 sal_Bool SwDBFieldType::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
149 {
150     switch( nWhichId )
151 	{
152     case FIELD_PROP_PAR1:
153 		rAny >>= aDBData.sDataSource;
154 		break;
155     case FIELD_PROP_PAR2:
156 		rAny >>= aDBData.sCommand;
157 		break;
158     case FIELD_PROP_PAR3:
159 		{
160 			String sTmp;
161 			::GetString( rAny, sTmp );
162 			if( sTmp != sColumn )
163 			{
164 				sColumn = sTmp;
165 				SwIterator<SwFmtFld,SwFieldType> aIter( *this );
166 				SwFmtFld* pFld = aIter.First();
167 				while(pFld)
168 				{
169 					// Feld im Undo?
170 					SwTxtFld *pTxtFld = pFld->GetTxtFld();
171 					if(pTxtFld && pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
172 					{
173 						SwDBField* pDBField = (SwDBField*)pFld->GetFld();
174 						pDBField->ClearInitialized();
175 						pDBField->InitContent();
176  					}
177 					pFld = aIter.Next();
178 				}
179 			}
180 		}
181 		break;
182 	case FIELD_PROP_SHORT1:
183 		rAny >>= aDBData.nCommandType;
184 		break;
185 	default:
186 		DBG_ERROR("illegal property");
187 	}
188 	return sal_True;
189 }
190 /*--------------------------------------------------------------------
191 	Beschreibung: SwDBField
192  --------------------------------------------------------------------*/
193 
194 SwDBField::SwDBField(SwDBFieldType* pTyp, sal_uLong nFmt)
195 	: 	SwValueField(pTyp, nFmt),
196 		nSubType(0),
197 		bIsInBodyTxt(sal_True),
198 		bValidValue(sal_False),
199 		bInitialized(sal_False)
200 {
201 	if (GetTyp())
202 		((SwDBFieldType*)GetTyp())->AddRef();
203 	InitContent();
204 }
205 
206 //------------------------------------------------------------------------------
207 
208 SwDBField::~SwDBField()
209 {
210 	if (GetTyp())
211 		((SwDBFieldType*)GetTyp())->ReleaseRef();
212 }
213 
214 //------------------------------------------------------------------------------
215 
216 void SwDBField::InitContent()
217 {
218 	if (!IsInitialized())
219 	{
220 		aContent = '<';
221 		aContent += ((SwDBFieldType*)GetTyp())->GetColumnName();
222 		aContent += '>';
223 	}
224 }
225 
226 //------------------------------------------------------------------------------
227 
228 void SwDBField::InitContent(const String& rExpansion)
229 {
230 	if (rExpansion.Len() > 2)
231 	{
232 		if (rExpansion.GetChar(0) == '<' &&
233 			rExpansion.GetChar(rExpansion.Len() - 1) == '>')
234 		{
235 			String sColumn( rExpansion.Copy( 1, rExpansion.Len() - 2 ) );
236 			if( ::GetAppCmpStrIgnore().isEqual( sColumn,
237 							((SwDBFieldType *)GetTyp())->GetColumnName() ))
238 			{
239 				InitContent();
240 				return;
241 			}
242 		}
243 	}
244 	SetExpansion( rExpansion );
245 }
246 
247 //------------------------------------------------------------------------------
248 
249 String SwDBField::Expand() const
250 {
251     String sRet;
252 
253     if(0 ==(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE))
254         sRet = lcl_DBTrennConv(aContent);
255     return sRet;
256 }
257 
258 //------------------------------------------------------------------------------
259 
260 SwField* SwDBField::Copy() const
261 {
262 	SwDBField *pTmp = new SwDBField((SwDBFieldType*)GetTyp(), GetFormat());
263 	pTmp->aContent 		= aContent;
264 	pTmp->bIsInBodyTxt 	= bIsInBodyTxt;
265 	pTmp->bValidValue 	= bValidValue;
266 	pTmp->bInitialized	= bInitialized;
267 	pTmp->nSubType		= nSubType;
268 	pTmp->SetValue(GetValue());
269     pTmp->sFieldCode = sFieldCode;
270 
271 	return pTmp;
272 }
273 
274 String SwDBField::GetFieldName() const
275 {
276     const String& rDBName = static_cast<SwDBFieldType*>(GetTyp())->GetName();
277         //TODO/CLEANUP
278         //Funktion tut nichts!
279         //String sContent( SFX_APP()->LocalizeDBName(INI2NATIONAL,
280         //                                    rDBName.GetToken(0, DB_DELIM)));
281     String sContent( rDBName.GetToken(0, DB_DELIM) );
282 
283     if (sContent.Len() > 1)
284     {
285         sContent += DB_DELIM;
286         sContent += rDBName.GetToken(1, DB_DELIM);
287         sContent += DB_DELIM;
288         sContent += rDBName.GetToken(2, DB_DELIM);
289     }
290     return lcl_DBTrennConv(sContent);
291 }
292 
293 //------------------------------------------------------------------------------
294 
295 void SwDBField::ChgValue( double d, sal_Bool bVal )
296 {
297 	bValidValue = bVal;
298 	SetValue(d);
299 
300 	if( bValidValue )
301 		aContent = ((SwValueFieldType*)GetTyp())->ExpandValue(d, GetFormat(), GetLanguage());
302 }
303 
304 /*--------------------------------------------------------------------
305 	Beschreibung:
306  --------------------------------------------------------------------*/
307 
308 SwFieldType* SwDBField::ChgTyp( SwFieldType* pNewType )
309 {
310 	SwFieldType* pOld = SwValueField::ChgTyp( pNewType );
311 
312 	((SwDBFieldType*)pNewType)->AddRef();
313 	((SwDBFieldType*)pOld)->ReleaseRef();
314 
315 	return pOld;
316 }
317 
318 /*--------------------------------------------------------------------
319 	Beschreibung: Aktuellen Field-Value holen und chachen
320  --------------------------------------------------------------------*/
321 
322 void SwDBField::Evaluate()
323 {
324 	SwNewDBMgr* pMgr = GetDoc()->GetNewDBMgr();
325 
326 	// erstmal loeschen
327 	bValidValue = sal_False;
328 	double nValue = DBL_MAX;
329 	const SwDBData& aTmpData = GetDBData();
330 
331     if(!pMgr || !pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, sal_True))
332 		return ;
333 
334 	sal_uInt32 nFmt;
335 
336 	// Passenden Spaltennamen suchen
337 	String aColNm( ((SwDBFieldType*)GetTyp())->GetColumnName() );
338 
339 	SvNumberFormatter* pDocFormatter = GetDoc()->GetNumberFormatter();
340 	pMgr->GetMergeColumnCnt(aColNm, GetLanguage(), aContent, &nValue, &nFmt);
341 	if( !( nSubType & nsSwExtendedSubType::SUB_OWN_FMT ) )
342 		SetFormat( nFmt = pMgr->GetColumnFmt( aTmpData.sDataSource, aTmpData.sCommand,
343 										aColNm, pDocFormatter, GetLanguage() ));
344 
345 	if( DBL_MAX != nValue )
346 	{
347 		sal_Int32 nColumnType = pMgr->GetColumnType(aTmpData.sDataSource, aTmpData.sCommand, aColNm);
348 		if(	DataType::DATE == nColumnType  || DataType::TIME == nColumnType  ||
349                  DataType::TIMESTAMP  == nColumnType)
350 
351 		{
352 			Date aStandard(1,1,1900);
353 			if (*pDocFormatter->GetNullDate() != aStandard)
354 				nValue += (aStandard - *pDocFormatter->GetNullDate());
355 		}
356 		bValidValue = sal_True;
357 		SetValue(nValue);
358 		aContent = ((SwValueFieldType*)GetTyp())->ExpandValue(nValue, GetFormat(), GetLanguage());
359 	}
360 	else
361 	{
362 		SwSbxValue aVal;
363 		aVal.PutString( aContent );
364 
365 		if (aVal.IsNumeric())
366 		{
367 			SetValue(aVal.GetDouble());
368 
369 			SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
370             if (nFmt && nFmt != SAL_MAX_UINT32 && !pFormatter->IsTextFormat(nFmt))
371 				bValidValue = sal_True;	// Wegen Bug #60339 nicht mehr bei allen Strings
372 		}
373 		else
374 		{
375 			// Bei Strings sal_True wenn Laenge > 0 sonst sal_False
376 			SetValue(aContent.Len() ? 1 : 0);
377 		}
378 	}
379 	bInitialized = sal_True;
380 }
381 
382 /*--------------------------------------------------------------------
383 	Beschreibung: Namen erfragen
384  --------------------------------------------------------------------*/
385 
386 const String& SwDBField::GetPar1() const
387 {
388 	return ((SwDBFieldType*)GetTyp())->GetName();
389 }
390 
391 /*--------------------------------------------------------------------
392 	Beschreibung:
393  --------------------------------------------------------------------*/
394 
395 sal_uInt16 SwDBField::GetSubType() const
396 {
397 	return nSubType;
398 }
399 
400 /*--------------------------------------------------------------------
401 	Beschreibung:
402  --------------------------------------------------------------------*/
403 
404 void SwDBField::SetSubType(sal_uInt16 nType)
405 {
406 	nSubType = nType;
407 }
408 
409 
410 sal_Bool SwDBField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
411 {
412     switch( nWhichId )
413 	{
414 	case FIELD_PROP_BOOL1:
415 		{
416 			sal_Bool bTemp = 0 == (GetSubType()&nsSwExtendedSubType::SUB_OWN_FMT);
417 			rAny.setValue(&bTemp, ::getBooleanCppuType());
418 		}
419 		break;
420     case FIELD_PROP_BOOL2:
421     {
422         sal_Bool bVal = 0 == (GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE);
423         rAny.setValue(&bVal, ::getBooleanCppuType());
424     }
425     break;
426     case FIELD_PROP_FORMAT:
427 		rAny <<= (sal_Int32)GetFormat();
428 		break;
429 	case FIELD_PROP_PAR1:
430 		rAny <<= OUString(aContent);
431 		break;
432     case FIELD_PROP_PAR2:
433         rAny <<= OUString(sFieldCode);
434         break;
435     default:
436 		DBG_ERROR("illegal property");
437 	}
438 	return sal_True;
439 
440 }
441 
442 sal_Bool SwDBField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
443 {
444     switch( nWhichId )
445 	{
446 	case FIELD_PROP_BOOL1:
447 		if( *(sal_Bool*)rAny.getValue() )
448 			SetSubType(GetSubType()&~nsSwExtendedSubType::SUB_OWN_FMT);
449 		else
450 			SetSubType(GetSubType()|nsSwExtendedSubType::SUB_OWN_FMT);
451 		break;
452     case FIELD_PROP_BOOL2:
453     {
454         sal_uInt16 nSubTyp = GetSubType();
455         sal_Bool bVisible = sal_False;
456         if(!(rAny >>= bVisible))
457             return sal_False;
458         if(bVisible)
459             nSubTyp &= ~nsSwExtendedSubType::SUB_INVISIBLE;
460         else
461             nSubTyp |= nsSwExtendedSubType::SUB_INVISIBLE;
462         SetSubType(nSubTyp);
463         //invalidate text node
464         if(GetTyp())
465         {
466             SwIterator<SwFmtFld,SwFieldType> aIter( *GetTyp() );
467             SwFmtFld* pFld = aIter.First();
468             while(pFld)
469             {
470                 SwTxtFld *pTxtFld = pFld->GetTxtFld();
471                 if(pTxtFld && (SwDBField*)pFld->GetFld() == this )
472                 {
473                     //notify the change
474                     pTxtFld->NotifyContentChange(*pFld);
475                     break;
476                 }
477                 pFld = aIter.Next();
478             }
479         }
480     }
481     break;
482     case FIELD_PROP_FORMAT:
483 		{
484 			sal_Int32 nTemp = 0;
485 			rAny >>= nTemp;
486 			SetFormat(nTemp);
487 		}
488 		break;
489 	case FIELD_PROP_PAR1:
490 		::GetString( rAny, aContent );
491 		break;
492     case FIELD_PROP_PAR2:
493         ::GetString( rAny, sFieldCode );
494     break;
495 	default:
496 		DBG_ERROR("illegal property");
497 	}
498 	return sal_True;
499 }
500 
501 /*--------------------------------------------------------------------
502 	Beschreibung: Basisklasse fuer alle weiteren Datenbankfelder
503  --------------------------------------------------------------------*/
504 
505 SwDBNameInfField::SwDBNameInfField(SwFieldType* pTyp, const SwDBData& rDBData, sal_uLong nFmt) :
506 	SwField(pTyp, nFmt),
507     aDBData(rDBData),
508     nSubType(0)
509 {
510 }
511 
512 //------------------------------------------------------------------------------
513 
514 SwDBData SwDBNameInfField::GetDBData(SwDoc* pDoc)
515 {
516 	SwDBData aRet;
517 	if(aDBData.sDataSource.getLength())
518 		aRet = aDBData;
519 	else
520 		aRet = pDoc->GetDBData();
521 	return aRet;
522 }
523 
524 // #111840#
525 void SwDBNameInfField::SetDBData(const SwDBData & rDBData)
526 {
527     aDBData = rDBData;
528 }
529 
530 //------------------------------------------------------------------------------
531 
532 String SwDBNameInfField::GetFieldName() const
533 {
534     String sStr( SwField::GetFieldName() );
535     if (aDBData.sDataSource.getLength())
536     {
537         sStr += ':';
538         sStr += String(aDBData.sDataSource);
539         sStr += DB_DELIM;
540         sStr += String(aDBData.sCommand);
541     }
542 	return lcl_DBTrennConv(sStr);
543 }
544 
545 sal_Bool SwDBNameInfField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
546 {
547     switch( nWhichId )
548 	{
549 	case FIELD_PROP_PAR1:
550 		rAny <<= aDBData.sDataSource;
551 		break;
552 	case FIELD_PROP_PAR2:
553 		rAny <<= aDBData.sCommand;
554 		break;
555 	case FIELD_PROP_SHORT1:
556 		rAny <<= aDBData.nCommandType;
557 		break;
558     case FIELD_PROP_BOOL2:
559     {
560         sal_Bool bVal = 0 == (GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE);
561         rAny.setValue(&bVal, ::getBooleanCppuType());
562     }
563     break;
564     default:
565 		DBG_ERROR("illegal property");
566 	}
567 	return sal_True;
568 }
569 
570 sal_Bool SwDBNameInfField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
571 {
572     switch( nWhichId )
573 	{
574 	case FIELD_PROP_PAR1:
575 		rAny >>= aDBData.sDataSource;
576 		break;
577 	case FIELD_PROP_PAR2:
578 		rAny >>= aDBData.sCommand;
579 		break;
580 	case FIELD_PROP_SHORT1:
581 		rAny >>= aDBData.nCommandType;
582 		break;
583     case FIELD_PROP_BOOL2:
584     {
585         sal_uInt16 nSubTyp = GetSubType();
586         sal_Bool bVisible = sal_False;
587         if(!(rAny >>= bVisible))
588             return sal_False;
589         if(bVisible)
590             nSubTyp &= ~nsSwExtendedSubType::SUB_INVISIBLE;
591         else
592             nSubTyp |= nsSwExtendedSubType::SUB_INVISIBLE;
593         SetSubType(nSubTyp);
594     }
595     break;
596     default:
597 		DBG_ERROR("illegal property");
598 	}
599 	return sal_True;
600 }
601 
602 sal_uInt16 SwDBNameInfField::GetSubType() const
603 {
604     return nSubType;
605 }
606 
607 void SwDBNameInfField::SetSubType(sal_uInt16 nType)
608 {
609     nSubType = nType;
610 }
611 
612 /*--------------------------------------------------------------------
613 	Beschreibung: NaechsterDatensatz
614  --------------------------------------------------------------------*/
615 
616 SwDBNextSetFieldType::SwDBNextSetFieldType()
617 	: SwFieldType( RES_DBNEXTSETFLD )
618 {
619 }
620 
621 //------------------------------------------------------------------------------
622 
623 SwFieldType* SwDBNextSetFieldType::Copy() const
624 {
625 	SwDBNextSetFieldType* pTmp = new SwDBNextSetFieldType();
626     return pTmp;
627 }
628 /*--------------------------------------------------------------------
629 	Beschreibung: SwDBSetField
630  --------------------------------------------------------------------*/
631 
632 SwDBNextSetField::SwDBNextSetField(SwDBNextSetFieldType* pTyp,
633 								   const String& rCond,
634 								   const String& ,
635 								   const SwDBData& rDBData) :
636 	SwDBNameInfField(pTyp, rDBData), aCond(rCond), bCondValid(sal_True)
637 {}
638 
639 //------------------------------------------------------------------------------
640 
641 String SwDBNextSetField::Expand() const
642 {
643 	return aEmptyStr;
644 }
645 
646 //------------------------------------------------------------------------------
647 
648 SwField* SwDBNextSetField::Copy() const
649 {
650 	SwDBNextSetField *pTmp = new SwDBNextSetField((SwDBNextSetFieldType*)GetTyp(),
651 										 aCond, aEmptyStr, GetDBData());
652     pTmp->SetSubType(GetSubType());
653     pTmp->bCondValid = bCondValid;
654 	return pTmp;
655 }
656 //------------------------------------------------------------------------------
657 
658 void SwDBNextSetField::Evaluate(SwDoc* pDoc)
659 {
660 	SwNewDBMgr* pMgr = pDoc->GetNewDBMgr();
661 	const SwDBData& rData = GetDBData();
662 	if( !bCondValid ||
663             !pMgr || !pMgr->IsDataSourceOpen(rData.sDataSource, rData.sCommand, sal_False))
664 		return ;
665     pMgr->ToNextRecord(rData.sDataSource, rData.sCommand);
666 }
667 
668 /*--------------------------------------------------------------------
669 	Beschreibung: Bedingung
670  --------------------------------------------------------------------*/
671 
672 const String& SwDBNextSetField::GetPar1() const
673 {
674 	return aCond;
675 }
676 
677 void SwDBNextSetField::SetPar1(const String& rStr)
678 {
679 	aCond = rStr;
680 }
681 
682 sal_Bool SwDBNextSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
683 {
684 	sal_Bool bRet = sal_True;
685     switch( nWhichId )
686 	{
687 	case FIELD_PROP_PAR3:
688 		rAny <<= OUString(aCond);
689 		break;
690 	default:
691         bRet = SwDBNameInfField::QueryValue( rAny, nWhichId );
692 	}
693 	return bRet;
694 }
695 
696 sal_Bool SwDBNextSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
697 {
698 	sal_Bool bRet = sal_True;
699     switch( nWhichId )
700 	{
701 	case FIELD_PROP_PAR3:
702 		::GetString( rAny, aCond );
703 		break;
704 	default:
705         bRet = SwDBNameInfField::PutValue( rAny, nWhichId );
706 	}
707 	return bRet;
708 }
709 
710 /*--------------------------------------------------------------------
711 	Beschreibung: Datensatz mit bestimmter ID
712  --------------------------------------------------------------------*/
713 
714 SwDBNumSetFieldType::SwDBNumSetFieldType() :
715 	SwFieldType( RES_DBNUMSETFLD )
716 {
717 }
718 
719 //------------------------------------------------------------------------------
720 
721 SwFieldType* SwDBNumSetFieldType::Copy() const
722 {
723 	SwDBNumSetFieldType* pTmp = new SwDBNumSetFieldType();
724 	return pTmp;
725 }
726 
727 /*--------------------------------------------------------------------
728 	Beschreibung: SwDBSetField
729  --------------------------------------------------------------------*/
730 
731 SwDBNumSetField::SwDBNumSetField(SwDBNumSetFieldType* pTyp,
732 								 const String& rCond,
733 								 const String& rDBNum,
734 								 const SwDBData& rDBData) :
735 	SwDBNameInfField(pTyp, rDBData),
736 	aCond(rCond),
737 	aPar2(rDBNum),
738 	bCondValid(sal_True)
739 {}
740 
741 //------------------------------------------------------------------------------
742 
743 String SwDBNumSetField::Expand() const
744 {
745 	return aEmptyStr;
746 }
747 
748 //------------------------------------------------------------------------------
749 
750 SwField* SwDBNumSetField::Copy() const
751 {
752 	SwDBNumSetField *pTmp = new SwDBNumSetField((SwDBNumSetFieldType*)GetTyp(),
753 										 aCond, aPar2, GetDBData());
754 	pTmp->bCondValid = bCondValid;
755     pTmp->SetSubType(GetSubType());
756     return pTmp;
757 }
758 
759 void SwDBNumSetField::Evaluate(SwDoc* pDoc)
760 {
761 	SwNewDBMgr* pMgr = pDoc->GetNewDBMgr();
762 	const SwDBData& aTmpData = GetDBData();
763 
764 	if( bCondValid && pMgr && pMgr->IsInMerge() &&
765                         pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, sal_True))
766 	{	// Bedingug OK -> aktuellen Set einstellen
767 		pMgr->ToRecordId(Max((sal_uInt16)aPar2.ToInt32(), sal_uInt16(1))-1);
768 	}
769 }
770 
771 /*--------------------------------------------------------------------
772 	Beschreibung: LogDBName
773  --------------------------------------------------------------------*/
774 
775 const String& SwDBNumSetField::GetPar1() const
776 {
777 	return aCond;
778 }
779 
780 void SwDBNumSetField::SetPar1(const String& rStr)
781 {
782 	aCond = rStr;
783 }
784 
785 /*--------------------------------------------------------------------
786 	Beschreibung: Bedingung
787  --------------------------------------------------------------------*/
788 
789 String SwDBNumSetField::GetPar2() const
790 {
791 	return aPar2;
792 }
793 
794 void SwDBNumSetField::SetPar2(const String& rStr)
795 {
796 	aPar2 = rStr;
797 }
798 
799 sal_Bool SwDBNumSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
800 {
801 	sal_Bool bRet = sal_True;
802     switch( nWhichId )
803 	{
804 	case FIELD_PROP_PAR3:
805 		rAny <<= OUString(aCond);
806 		break;
807 	case FIELD_PROP_FORMAT:
808 		rAny <<= (sal_Int32)aPar2.ToInt32();
809 		break;
810 	default:
811         bRet = SwDBNameInfField::QueryValue(rAny, nWhichId );
812 	}
813 	return bRet;
814 }
815 
816 sal_Bool    SwDBNumSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
817 {
818 	sal_Bool bRet = sal_True;
819     switch( nWhichId )
820 	{
821 	case FIELD_PROP_PAR3:
822 		::GetString( rAny, aCond );
823 		break;
824 	case FIELD_PROP_FORMAT:
825 		{
826 			sal_Int32 nVal = 0;
827 			rAny >>= nVal;
828 			aPar2 = String::CreateFromInt32(nVal);
829 		}
830 		break;
831 	default:
832         bRet = SwDBNameInfField::PutValue(rAny, nWhichId );
833 	}
834 	return bRet;
835 }
836 
837 /*--------------------------------------------------------------------
838 	Beschreibung: SwDBNameFieldType
839  --------------------------------------------------------------------*/
840 
841 SwDBNameFieldType::SwDBNameFieldType(SwDoc* pDocument)
842 	: SwFieldType( RES_DBNAMEFLD )
843 {
844 	pDoc = pDocument;
845 }
846 //------------------------------------------------------------------------------
847 
848 String SwDBNameFieldType::Expand(sal_uLong ) const
849 {
850 	const SwDBData aData = pDoc->GetDBData();
851 	String sRet(aData.sDataSource);
852 	sRet += '.';
853 	sRet += (String)aData.sCommand;
854 	return sRet;
855 }
856 //------------------------------------------------------------------------------
857 
858 SwFieldType* SwDBNameFieldType::Copy() const
859 {
860 	SwDBNameFieldType *pTmp = new SwDBNameFieldType(pDoc);
861 	return pTmp;
862 }
863 
864 //------------------------------------------------------------------------------
865 
866 /*--------------------------------------------------------------------
867 	Beschreibung: Name der angedockten DB
868  --------------------------------------------------------------------*/
869 
870 SwDBNameField::SwDBNameField(SwDBNameFieldType* pTyp, const SwDBData& rDBData, sal_uLong nFmt)
871 	: SwDBNameInfField(pTyp, rDBData, nFmt)
872 {}
873 
874 //------------------------------------------------------------------------------
875 
876 String SwDBNameField::Expand() const
877 {
878     String sRet;
879     if(0 ==(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE))
880         sRet = ((SwDBNameFieldType*)GetTyp())->Expand(GetFormat());
881     return sRet;
882 }
883 
884 //------------------------------------------------------------------------------
885 
886 SwField* SwDBNameField::Copy() const
887 {
888 	SwDBNameField *pTmp = new SwDBNameField((SwDBNameFieldType*)GetTyp(), GetDBData());
889 	pTmp->ChangeFormat(GetFormat());
890 	pTmp->SetLanguage(GetLanguage());
891     pTmp->SetSubType(GetSubType());
892 	return pTmp;
893 }
894 
895 
896 sal_Bool SwDBNameField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
897 {
898     return SwDBNameInfField::QueryValue(rAny, nWhichId );
899 }
900 
901 sal_Bool SwDBNameField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
902 {
903     return SwDBNameInfField::PutValue(rAny, nWhichId );
904 }
905 /*--------------------------------------------------------------------
906 	Beschreibung: SwDBNameFieldType
907  --------------------------------------------------------------------*/
908 
909 SwDBSetNumberFieldType::SwDBSetNumberFieldType()
910 	: SwFieldType( RES_DBSETNUMBERFLD )
911 {
912 }
913 
914 //------------------------------------------------------------------------------
915 
916 SwFieldType* SwDBSetNumberFieldType::Copy() const
917 {
918 	SwDBSetNumberFieldType *pTmp = new SwDBSetNumberFieldType;
919 	return pTmp;
920 }
921 
922 //------------------------------------------------------------------------------
923 
924 /*--------------------------------------------------------------------
925 	Beschreibung: SetNumber der angedockten DB
926  --------------------------------------------------------------------*/
927 
928 SwDBSetNumberField::SwDBSetNumberField(SwDBSetNumberFieldType* pTyp,
929 									   const SwDBData& rDBData,
930 									   sal_uLong nFmt)
931 	: SwDBNameInfField(pTyp, rDBData, nFmt), nNumber(0)
932 {}
933 
934 //------------------------------------------------------------------------------
935 
936 String SwDBSetNumberField::Expand() const
937 {
938     if(0 !=(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE) || nNumber == 0)
939 		return aEmptyStr;
940 	else
941 		return FormatNumber((sal_uInt16)nNumber, GetFormat());
942 }
943 
944 //------------------------------------------------------------------------------
945 
946 void SwDBSetNumberField::Evaluate(SwDoc* pDoc)
947 {
948 	SwNewDBMgr* pMgr = pDoc->GetNewDBMgr();
949 
950     const SwDBData& aTmpData = GetDBData();
951     if (!pMgr || !pMgr->IsInMerge() ||
952         !pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, sal_False))
953         return;
954     nNumber = pMgr->GetSelectedRecordId();
955 }
956 
957 
958 //------------------------------------------------------------------------------
959 
960 SwField* SwDBSetNumberField::Copy() const
961 {
962 	SwDBSetNumberField *pTmp =
963 		new SwDBSetNumberField((SwDBSetNumberFieldType*)GetTyp(), GetDBData(), GetFormat());
964 	pTmp->SetLanguage(GetLanguage());
965 	pTmp->SetSetNumber(nNumber);
966     pTmp->SetSubType(GetSubType());
967     return pTmp;
968 }
969 
970 sal_Bool SwDBSetNumberField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
971 {
972 	sal_Bool bRet = sal_True;
973     switch( nWhichId )
974 	{
975 	case FIELD_PROP_USHORT1:
976 		rAny <<= (sal_Int16)GetFormat();
977 		break;
978 	case FIELD_PROP_FORMAT:
979 		rAny <<= nNumber;
980 		break;
981 	default:
982         bRet = SwDBNameInfField::QueryValue( rAny, nWhichId );
983 	}
984 	return bRet;
985 }
986 
987 sal_Bool SwDBSetNumberField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
988 {
989 	sal_Bool bRet = sal_True;
990     switch( nWhichId )
991 	{
992 	case FIELD_PROP_USHORT1:
993 		{
994 			sal_Int16 nSet = 0;
995 			rAny >>= nSet;
996 			if(nSet < (sal_Int16) SVX_NUMBER_NONE )
997 				SetFormat(nSet);
998 			else {
999 				//exception(wrong_value)
1000 				;
1001             }
1002 		}
1003 		break;
1004 	case FIELD_PROP_FORMAT:
1005 		rAny >>= nNumber;
1006 		break;
1007 	default:
1008         bRet = SwDBNameInfField::PutValue( rAny, nWhichId );
1009 	}
1010 	return bRet;
1011 }
1012 
1013 
1014