/********************************************************************************
*		ソースファイル名：DataToDB.cpp										
*		用            途：データベース格納クラス												
*		備            考：														
*		履            歴：														
********************************************************************************/
/****************************
*   コンパイル環境定数	    *
****************************/
// DataToDB.cpp : 実装ファイル
//

#include "stdafx.h"
/****************************
*   インクルードファイル    *
****************************/
#include "DataToDB.h"
#include "WMes.h"
#include "DailyLogManagerS.h"
#include "ParameterManager.h"
#include "CsvFile.h"
/****************************
*        マクロ定義			*
****************************/
#define	THREAD_WAIT_MS		100		// スレッド周期[ms]

//***** ガード条件
#define GUARD_RETURN( expr, ret )		{ if( !(expr) )	return (ret) ;		}
#define GUARD_RETURN_VOID( expr )		{ if( !(expr) )	return ;			}
#define GUARD_RETURN_FALSE( expr )		{ if( !(expr) )	return FALSE ;		}
#define GUARD_RETURN_NULL( expr, T )	{ if( !(expr) )	return (T *)NULL ;	}

/****************************
*        構造体定義		    *
****************************/
/****************************
*        クラス定義		    *
****************************/
/****************************
*         関数 宣言		    *
****************************/
/****************************
*		　変数　宣言	    *
****************************/
// CDataToDB
/********************************************************************************
*	関数名：CDataToDB														
*	用　途：コンストラクタ														
*	引き数：																	
*	戻り値：																	
*	備　考：																	
********************************************************************************/
CDataToDB::CDataToDB()
{
	m_bInitialize				= FALSE ;

	m_pMiningQueue				= NULL ;
	m_pSETTING1Queue			= NULL ;
	m_pSETTING2Queue			= NULL ;
	m_pSETTING3Queue			= NULL ;
	m_pSETTING4Queue			= NULL ;
	m_pProductsInfoDataQueue	= NULL;
}

/********************************************************************************
*	関数名：~CDataToDB														
*	用　途：デストラクタ														
*	引き数：																	
*	戻り値：																	
*	備　考：																	
********************************************************************************/
CDataToDB::~CDataToDB()
{
}

/********************************************************************************
*	関数名：GetInstance
*	用　途：インスタンス取得（初回は生成）
*	引き数：
*	戻り値：
*	備　考
********************************************************************************/
CDataToDB& CDataToDB::GetInstance(void)
{
	static CDataToDB Singleton;
	return Singleton;
}

// CDataToDB メッセージ ハンドラ
/********************************************************************************
*	関数名：Initialize															
*	用　途：初期化																
*	引き数：																	
*	戻り値：																	
*	備　考：																	
********************************************************************************/
BOOL CDataToDB::Initialize( 
							
							CRingQueue* pMiningQueue		,
							CRingQueue* pSETTING1Queue		,
							CRingQueue* pSETTING2Queue		,
							CRingQueue* pSETTING3Queue		,
							CRingQueue* pSETTING4Queue		,
							CRingQueue* pProductsInfoDataQueue
						  )
{
	BOOL			bRet	= TRUE ;
	P_PARAM_INIT	tpParam	= CParameterManager::GetInstance().RefParamInit() ; 

	m_pMiningQueue			= pMiningQueue ;
	m_pSETTING1Queue		= pSETTING1Queue ;
	m_pSETTING2Queue		= pSETTING2Queue ;
	m_pSETTING3Queue		= pSETTING3Queue ;
	m_pSETTING4Queue		= pSETTING4Queue ;
	m_pProductsInfoDataQueue = pProductsInfoDataQueue;

	// MySql制御クラス初期化
	m_bInitialize = m_SqlControl.Initialize( 
											  tpParam->szDbHost		,		// local host名
											  tpParam->szDbUser		,		// ユーザー名
											  tpParam->szDbPassword	,		// パスワード
											  tpParam->szDbName		,		// DB名
											  DB_DEFAULT_CHARSET	,		// 文字コード
											  tpParam->uDbPortNo			// DBポート番号
										   ) ;

	//*** 列名保持
	for( INT32 i = 0 ; i < NOF_MINING_DATA ; i++ ){
		m_aMiningCol[i]  = tpParam->taCollect[COLLECT_MINING].tpTableCol[i].szName ;
	}
	for( INT32 i = 0 ; i < NOF_SETTING1_DATA ; i++ ){
		m_aSETTING1Col[i] = tpParam->taCollect[COLLECT_SETTING1].tpTableCol[i].szName ;
	}
	for( INT32 i = 0 ; i < NOF_SETTING2_DATA ; i++ ){
		m_aSETTING2Col[i] = tpParam->taCollect[COLLECT_SETTING2].tpTableCol[i].szName ;
	}
	for( INT32 i = 0 ; i < NOF_SETTING3_DATA ; i++ ){
		m_aSETTING3Col[i] = tpParam->taCollect[COLLECT_SETTING3].tpTableCol[i].szName ;
	}
	for( INT32 i = 0 ; i < NOF_SETTING4_DATA ; i++ ){
		m_aSETTING4Col[i] = tpParam->taCollect[COLLECT_SETTING4].tpTableCol[i].szName ;
	}
	for (INT32 i = 0; i < NOF_PRODUCTINFO_DATA; i++) {
		m_aToolStatusCol[i] = tpParam->taCollect[COLLECT_PRODUCTSINFO].tpTableCol[i].szName;
	}

	if( m_bInitialize ){
		// 初期化完了なら自分でスレッド開始
		Begin() ;
	}else{
		// 初期化失敗はエラーログ出力 v1.00.04
		CString strTmp ;
		strTmp.Format( _T("MySql制御初期化エラー：%s"), m_SqlControl.GetLatestError() ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;

	}

	return m_bInitialize ;
}


/*******************************************************************************
*	関　数　名：Wait
*	用　　　途：スレッド終了指示待ち
*	引　き　数：待ち時間[ms]
*	戻　り　値：スレッド終了指示あり(1) / なし(0) / エラー(-1)
*	備　　　考：通常エラーは通常ありえない
********************************************************************************/
INT32 CDataToDB::Wait( UINT uWaitTime_ms )
{
	INT32	nRet ;
	DWORD	dwWaitResult ;

	//***** スレッド終了イベントハンドルを待機する
	dwWaitResult = ::WaitForSingleObject( CThread::m_hClose, (DWORD)uWaitTime_ms ) ;

	switch( dwWaitResult )
	{
		case WAIT_OBJECT_0:		nRet = (INT32)TRUE ;	break ;
		case WAIT_TIMEOUT:		nRet = (INT32)FALSE ;	break ;
		default:				nRet = -1 ;				break ;
	}

	return nRet ;
}

/********************************************************************************
*	関数名：Main															
*	用　途：スレッドメイン																
*	引き数：																	
*	戻り値：																	
*	備　考：																	
********************************************************************************/
BOOL CDataToDB::Main()
{
	MINING_DATA		tMiningData ;
	SETTING1_DATA	tSETTING1Data ;
	SETTING2_DATA	tSETTING2Data ;
	SETTING3_DATA	tSETTING3Data ;
	SETTING4_DATA	tSETTING4Data ;
	PRODUCTSINFO_DATA tProductsInfoData;

	while( Wait(0) == 0 ){

		//*** マイニングデータ
		// キューにデータある場合、1件分格納処理
		if( m_pMiningQueue->Peek() > 0 )
		{
			// データ取り出し
			m_pMiningQueue->Pop( (void*)&tMiningData ) ;

			// データ格納
			SetMiningData( tMiningData ) ;
		}

		//*** 設定１データ
		// キューにデータある場合、1件分格納処理
		if( m_pSETTING1Queue->Peek() > 0 )
		{
			// データ取り出し
			m_pSETTING1Queue->Pop( (void*)&tSETTING1Data ) ;

			// データ格納
			SetSETTING1Data( tSETTING1Data ) ;
		}

		//*** 設定２データ
		// キューにデータある場合、1件分格納処理
		if( m_pSETTING2Queue->Peek() > 0 )
		{
			// データ取り出し
			m_pSETTING2Queue->Pop( (void*)&tSETTING2Data ) ;

			// データ格納
			SetSETTING2Data( tSETTING2Data ) ;
		}

		//*** 設定３データ
		// キューにデータある場合、1件分格納処理
		if( m_pSETTING3Queue->Peek() > 0 )
		{
			// データ取り出し
			m_pSETTING3Queue->Pop( (void*)&tSETTING3Data) ;

			// データ格納
			SetSETTING3Data( tSETTING3Data ) ;
		}

		//*** 設定４データ
		// キューにデータある場合、1件分格納処理
		if( m_pSETTING4Queue->Peek() > 0 )
		{
			// データ取り出し
			m_pSETTING4Queue->Pop( (void*)&tSETTING4Data ) ;

			// データ格納
			SetSETTING4Data( tSETTING4Data ) ;
		}

		//*** 生産情報データ
		// キューにデータある場合、1件分格納処理
		if (m_pProductsInfoDataQueue->Peek() > 0)
		{
			// データ取り出し
			m_pProductsInfoDataQueue->Pop((void*)&tProductsInfoData);

			// データ格納
			SetProductsInfoData(tProductsInfoData);
		}

		// スレッド終了指示あれば終了
		if( Wait(0) != 0 ) break ;

		//***** 休憩
		::Sleep( THREAD_WAIT_MS ) ;
	}

	return TRUE ;
}

/********************************************************************************
*	関数名：SetMiningData															
*	用　途：マイニングデータ格納																
*	引き数：マイニングデータ構造体																	
*	戻り値：																	
*	備　考：																	
********************************************************************************/
BOOL CDataToDB::SetMiningData( MINING_DATA& tData )
{
	GUARD_RETURN_FALSE( m_bInitialize ) ;

	P_PARAM_COLLECT	tpParam  = &CParameterManager::GetInstance().RefParamInit()->taCollect[COLLECT_MINING] ;

	BOOL	bRet	= TRUE ;
	BYTE	byNgBit = 0x00 ;
	CString	strCols, strSql, strTmp, strValue ;

	// 列名部分のクエリ作成
	strCols = _T("") ;
	for( INT32 i = 0 ; i < NOF_MINING_DATA ; i++ ){
		strCols += m_aMiningCol[i] ;
		strCols += _T(",") ;
	}
	// 末尾の','消し
	strCols.TrimRight( _T(",") ) ;

	// データ部分のクエリ作成
	strValue = _T("") ;
	strTmp.Format( _T("'%s',")	, tData.szWorkID	) ; strValue += strTmp ;	// ワークID
	strTmp.Format( _T("'%s',")	, tData.szDateTime	) ; strValue += strTmp ;	// 計測日時
	strTmp.Format( _T("%d,")	, tData.nOpNo		) ; strValue += strTmp ;	// OP番号
	strTmp.Format( _T("%d,")	, tData.nONo		) ; strValue += strTmp ;	// O番号
	strTmp.Format( _T("%d,")	, tData.nToolNo		) ; strValue += strTmp ;	// ツール番号
	strTmp.Format( _T("'%s',")	, tData.szToolID	) ; strValue += strTmp ;	// ツール背番号
	strTmp.Format( _T("%d,")	, tData.nToolCount	) ; strValue += strTmp ;	// ツール加工回数
	strTmp.Format( _T("%d,")	, tData.nJudge		) ; strValue += strTmp ;	// 判定
	strTmp.Format( _T("%f,")	, tData.dValue		) ; strValue += strTmp ;	// 計測値
	strTmp.Format( _T("%f,")	, tData.dMax		) ; strValue += strTmp ;	// 計測値上限
	strTmp.Format( _T("%d,")	, tData.bBreakage	) ; strValue += strTmp ;	// 折損前検知フラグ
	strTmp.Format( _T("%d,")	, tData.nLineID		) ; strValue += strTmp ;	// ラインID

	for( INT32 i = 0 ; i < NOF_JUDGE_ITEM_RANK ; i++ ){
		// 項目診断データ
		strTmp.Format( _T("%d,")	, tData.taJudgeItem[i].nItem	) ; strValue += strTmp ;	// データ項目
		strTmp.Format( _T("%d,")	, tData.taJudgeItem[i].nFeature ) ; strValue += strTmp ;	// 特徴量番号
		strTmp.Format( _T("%f,")	, tData.taJudgeItem[i].dValue	) ; strValue += strTmp ;	// 診断値
	}

	strTmp.Format( _T("'%s',")	, tData.szIpAddress); strValue += strTmp;		// IpAddress(加工機)
	strTmp.Format( _T("'%s',")	, tData.szModelName); strValue += strTmp;		// ModelName(加工機名)
	strTmp.Format( _T("'%s',")	, tData.szFeatureType); strValue += strTmp;		// KOMTAS Viewer機能選択
	strTmp.Format( _T("'%s',")	, tData.szNcLoggerFileName); strValue += strTmp;	// NCLogger生データファイル名

	// 末尾の','消し
	strValue.TrimRight( _T(",") ) ;

	// クエリ作成
	strSql.Format( SQL_INSERT, tpParam->szTableName, strCols, strValue ) ;

	// クエリ発行
	bRet = m_SqlControl.SetQuery( strSql ) ;

	// ログ出力
	strTmp.Format( 
					_T("[マイニングデータ]データ格納完了：Ret = %d, WorkID = %s, OP = %d, ToolNo = %d"),
					bRet,
					tData.szWorkID,
					tData.nOpNo,
					tData.nToolNo
				 ) ;
	CDailyLogManagerS::GetInstance().PrintLog( LOG_MINING, strTmp ) ;

	// エラー時は追加ログ出力
	if( !bRet ){
		strTmp.Format( _T("[マイニングデータ]データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_MINING, strTmp ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR , strTmp ) ;
	}

	// 計測異常ビット確認
	if( tData.nJudge != JUDGE_OK )	byNgBit |= MES_NG_MINING ;	// マイニングNG
	if( tData.bBreakage )			byNgBit |= MES_NG_BREAK ;	// 折損前検知

	// 計測データビット更新
	//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_MINING, byNgBit ) ;

	return bRet ;
}

/********************************************************************************
*	関数名：SetSETTING1Data															
*	用　途：設定１データ格納																
*	引き数：設定１データ構造体																	
*	戻り値：																	
*	備　考：																	
********************************************************************************/
BOOL CDataToDB::SetSETTING1Data( SETTING1_DATA& tData )
{
	GUARD_RETURN_FALSE( m_bInitialize ) ;

	P_PARAM_COLLECT	tpParam = &CParameterManager::GetInstance().RefParamInit()->taCollect[COLLECT_SETTING1] ;

	BOOL	bRet	= TRUE ;
	BYTE	byNgBit = 0x00 ;
	CString	strCols, strSql, strTmp, strValue, strWhere ;

	//*** 1.設定１テーブルから該当ワークの検索
	// Where条件の作成
	strWhere = _T("") ;
	strTmp.Format( _T("%s = '%s' and ")	, m_aSETTING1Col[SETTING1_WORKID]	, tData.szWorkID ) ; strWhere += strTmp ;
	strTmp.Format( _T("%s = %d and ")	, m_aSETTING1Col[SETTING1_OPNO]	, tData.nOpNo	 ) ; strWhere += strTmp ;
	strTmp.Format( _T("%s = '%s' and ") , m_aSETTING1Col[SETTING1_DATETIME], tData.szDateTime); strWhere += strTmp;
	strTmp.Format( _T("%s = %d")		, m_aSETTING1Col[SETTING1_MESITEM], tData.nMesItem ) ; strWhere += strTmp ;

	// クエリ作成
	strSql.Format( SQL_SELECT_ALL_WHERE, tpParam->szTableName, strWhere ) ;

	// クエリ発行
	bRet = m_SqlControl.SetQuery( strSql ) ;

	if( !bRet ){
		strTmp.Format( _T("[設定１データ]データ検索 データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING1, strTmp ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
		return FALSE ;
	}

	//*** 2.データ格納
	if( (INT32)m_SqlControl.GetRowCount() > 0 )
	{
		//*** 該当データ有りの場合、判定NGならUPDATE命令
		if( tData.nNgBit > 0 ){
			// 更新後のデータ作成
			strValue = _T("") ;
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING1Col[SETTING1_DATETIME]		, tData.szDateTime ) ; strValue += strTmp ;		// 計測日時
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING1Col[SETTING1_MESITEM_NAME]	, tData.szMesItem )  ; strValue += strTmp ;		// 計測項目名称
			strTmp.Format( _T("%s = %d,")	, m_aSETTING1Col[SETTING1_NGBIT]			, tData.nNgBit )	 ; strValue += strTmp ;		// NGビット
			strTmp.Format( _T("%s = %d,")	, m_aSETTING1Col[SETTING1_RESULTID]		, tData.nResultID )  ; strValue += strTmp ;		// 結果ID
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING1Col[SETTING1_DATAITEM]		, tData.szDataItem ) ; strValue += strTmp ;		// データ項目
			for( INT32 i = 0 ; i < NOF_MES_FEATURE1 ; i++ ){
				// 特徴量データ
				strTmp.Format( _T("%s = %d,")	, m_aSETTING1Col[SETTING1_FEATURE1_ENABLE  + (i * 7)], tData.taFeature[i].bEnable		) ; strValue += strTmp ;	// 有効フラグ
				strTmp.Format( _T("%s = '%s',")	, m_aSETTING1Col[SETTING1_FEATURE1_NAME	 + (i * 7)], tData.taFeature[i].szName		) ; strValue += strTmp ;	// 特徴量名称
				strTmp.Format( _T("%s = %d,")	, m_aSETTING1Col[SETTING1_FEATURE1_JUDGE	 + (i * 7)], tData.taFeature[i].nJudge		) ; strValue += strTmp ;	// 判定
				strTmp.Format( _T("%s = %d,")	, m_aSETTING1Col[SETTING1_FEATURE1_JDGKIND + (i * 7)], tData.taFeature[i].nJudgeKind	) ; strValue += strTmp ;	// 判定種類
				strTmp.Format( _T("%s = %f,")	, m_aSETTING1Col[SETTING1_FEATURE1_VALUE	 + (i * 7)], tData.taFeature[i].dValue		) ; strValue += strTmp ;	// 計測値
				strTmp.Format( _T("%s = %f,")	, m_aSETTING1Col[SETTING1_FEATURE1_MIN	 + (i * 7)], tData.taFeature[i].dMin		) ; strValue += strTmp ;	// 計測値下限
				strTmp.Format( _T("%s = %f,")	, m_aSETTING1Col[SETTING1_FEATURE1_MAX	 + (i * 7)], tData.taFeature[i].dMax		) ; strValue += strTmp ;	// 計測値上限
			}

			strTmp.Format( _T("%s = '%s',")		, m_aSETTING1Col[SETTING1_CNC_NO]			, tData.szCncNo )		; strValue += strTmp ;		// CNC No
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING1Col[SETTING1_IPADDRESS]		, tData.szIpAddress)	; strValue += strTmp;		// IpAddress(加工機)
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING1Col[SETTING1_MODELNAME]		, tData.szModelName)	; strValue += strTmp;		// ModelName(加工機名)
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING1Col[SETTING1_FEATURETYPE]		, tData.szFeatureType)	; strValue += strTmp;		// KOMTAS Viewer機能選択
			strTmp.Format( _T("%s = '%s',")  	, m_aSETTING1Col[SETTING1_NCLOGGER_FILENAME], tData.szNcLoggerFileName); strValue += strTmp;		// NCLogger生データファイル名
			strTmp.Format( _T("%s = %d")		, m_aSETTING1Col[SETTING1_TOOLNO]			, tData.nToolNo)		; strValue += strTmp;		// 工具番号
			
			// 末尾の','消し
			//strValue.TrimRight( _T(",") ) ;

			// クエリ作成
			strSql.Format( SQL_UPDATE_WHERE, tpParam->szTableName, strValue, strWhere ) ;

			// クエリ発行
			bRet = m_SqlControl.SetQuery( strSql ) ;

			// ログ出力
			strTmp.Format( 
							_T("[設定１データ]データ更新完了：Ret = %d, WorkID = %s, OP = %d, Measure = %d"),
							bRet,
							tData.szWorkID,
							tData.nOpNo,
							tData.nMesItem
						 ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING1, strTmp ) ;

			// エラー時は追加ログ出力
			if( !bRet ){
				strTmp.Format( _T("[設定１データ]データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
				CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING1, strTmp ) ;
				CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
			}

			// 計測異常ビット確認
			byNgBit |= MES_NG_SETTING1 ;	// 設定１NG

			// 計測データビット更新
			//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_SETTING1, byNgBit ) ;
		}else{
			// ログ出力
			strTmp.Format( 
							_T("[設定１データ]データ更新不要：WorkID = %s, OP = %d, Measure = %d"),
							tData.szWorkID,
							tData.nOpNo,
							tData.nMesItem
						 ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING1, strTmp ) ;
		}
	}
	else
	{
		//*** 該当データ無しの場合、INSERT命令
		// 列名部分のクエリ作成
		strCols = _T("") ;
		for( INT32 i = 0 ; i < NOF_SETTING1_DATA ; i++ ){
			strCols += m_aSETTING1Col[i] ;
			strCols += _T(",") ;
		}
		// 末尾の','消し
		strCols.TrimRight( _T(",") ) ;

		// データ部分のクエリ作成
		strValue = _T("") ;
		strTmp.Format( _T("'%s',")	, tData.szWorkID	) ; strValue += strTmp ;	// ワークID
		strTmp.Format( _T("'%s',")	, tData.szDateTime	) ; strValue += strTmp ;	// 計測日時
		strTmp.Format( _T("%d,")	, tData.nOpNo		) ; strValue += strTmp ;	// OP番号
		strTmp.Format( _T("%d,")	, tData.nMesItem	) ; strValue += strTmp ;	// 計測項目
		strTmp.Format( _T("'%s',")	, tData.szMesItem	) ; strValue += strTmp ;	// 計測項目名称
		strTmp.Format( _T("%d,")	, tData.nNgBit		) ; strValue += strTmp ;	// NGビット
		strTmp.Format( _T("%d,")	, tData.nResultID	) ; strValue += strTmp ;	// 結果ID
		strTmp.Format( _T("'%s',")	, tData.szDataItem	) ; strValue += strTmp ;	// データ項目

		for( INT32 i = 0 ; i < NOF_MES_FEATURE ; i++ ){
			// 特徴量データ
			strTmp.Format( _T("%d,")	, tData.taFeature[i].bEnable	) ; strValue += strTmp ;	// 有効フラグ
			strTmp.Format( _T("'%s',")	, tData.taFeature[i].szName		) ; strValue += strTmp ;	// 特徴量名称
			strTmp.Format( _T("%d,")	, tData.taFeature[i].nJudge		) ; strValue += strTmp ;	// 判定
			strTmp.Format( _T("%d,")	, tData.taFeature[i].nJudgeKind	) ; strValue += strTmp ;	// 判定種類
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dValue		) ; strValue += strTmp ;	// 計測値
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dMin		) ; strValue += strTmp ;	// 計測値下限
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dMax		) ; strValue += strTmp ;	// 計測値上限
		}

		strTmp.Format( _T("'%s',")	, tData.szCncNo	) ; strValue += strTmp ;		// CNC No
		strTmp.Format( _T("'%s',")	, tData.szIpAddress); strValue += strTmp;		// IpAddress(加工機)
		strTmp.Format( _T("'%s',")	, tData.szModelName); strValue += strTmp;		// ModelName(加工機名)
		strTmp.Format( _T("'%s',")	, tData.szFeatureType); strValue += strTmp;		// KOMTAS Viewer機能選択
		strTmp.Format( _T("'%s',")	, tData.szNcLoggerFileName); strValue += strTmp;	// NCLogger生データファイル名
		strTmp.Format( _T("%d")		, tData.nToolNo); strValue += strTmp;		// 工具番号

		// 末尾の','消し
		//strValue.TrimRight( _T(",") ) ;

		// クエリ作成
		strSql.Format( SQL_INSERT, tpParam->szTableName, strCols, strValue ) ;

		// クエリ発行
		bRet = m_SqlControl.SetQuery( strSql ) ;

		// ログ出力
		strTmp.Format( 
						_T("[設定１データ]データ格納完了：Ret = %d, WorkID = %s, OP = %d, Measure = %d"),
						bRet,
						tData.szWorkID,
						tData.nOpNo,
						tData.nMesItem
					 ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING1, strTmp ) ;

		// エラー時は追加ログ出力
		if( !bRet ){
			strTmp.Format( _T("[設定１データ]データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING1, strTmp ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
		}

		// 計測異常ビット確認
		if( tData.nNgBit > 0 ) byNgBit |= MES_NG_SETTING1 ;	// 設定１NG

		// 計測データビット更新
		//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_SETTING1, byNgBit ) ;
	}

	return bRet ;
}

/********************************************************************************
*	関数名：SetSETTING2Data															
*	用　途：設定２データ格納																
*	引き数：設定２データ構造体																	
*	戻り値：																	
*	備　考：																	
********************************************************************************/
BOOL CDataToDB::SetSETTING2Data( SETTING2_DATA& tData )
{
	GUARD_RETURN_FALSE( m_bInitialize ) ;

	P_PARAM_COLLECT	tpParam = &CParameterManager::GetInstance().RefParamInit()->taCollect[COLLECT_SETTING2] ;

	BOOL	bRet	= TRUE ;
	BYTE	byNgBit = 0x00 ;
	CString	strCols, strSql, strTmp, strValue, strWhere ;

	//*** 1.設定２テーブルから該当ワークの検索
	// Where条件の作成
	strWhere = _T("") ;
	strTmp.Format( _T("%s = '%s' and ")	, m_aSETTING2Col[SETTING2_WORKID]	, tData.szWorkID ) ; strWhere += strTmp ;
	strTmp.Format( _T("%s = %d and ")	, m_aSETTING2Col[SETTING2_OPNO]	, tData.nOpNo	 ) ; strWhere += strTmp ;
	strTmp.Format( _T("%s = '%s' and ") , m_aSETTING2Col[SETTING2_DATETIME], tData.szDateTime); strWhere += strTmp;
	strTmp.Format( _T("%s = %d")		, m_aSETTING2Col[SETTING2_MESITEM], tData.nMesItem ) ; strWhere += strTmp ;

	// クエリ作成
	strSql.Format( SQL_SELECT_ALL_WHERE, tpParam->szTableName, strWhere ) ;

	// クエリ発行
	bRet = m_SqlControl.SetQuery( strSql ) ;

	if( !bRet ){
		strTmp.Format( _T("[設定２データ]データ検索 データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING2, strTmp ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
		return FALSE ;
	}

	//*** 2.データ格納
	if( (INT32)m_SqlControl.GetRowCount() > 0 )
	{
		//*** 該当データ有りの場合、判定NGならUPDATE命令
		if( tData.nNgBit > 0 ){
			// 更新後のデータ作成
			strValue = _T("") ;
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING2Col[SETTING2_DATETIME]		, tData.szDateTime ) ; strValue += strTmp ;		// 計測日時
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING2Col[SETTING2_MESITEM_NAME]	, tData.szMesItem )  ; strValue += strTmp ;		// 計測項目名称
			strTmp.Format( _T("%s = %d,")	, m_aSETTING2Col[SETTING2_NGBIT]			, tData.nNgBit )	 ; strValue += strTmp ;		// NGビット
			strTmp.Format( _T("%s = %d,")	, m_aSETTING2Col[SETTING2_RESULTID]		, tData.nResultID )  ; strValue += strTmp ;		// 結果ID
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING2Col[SETTING2_DATAITEM]		, tData.szDataItem ) ; strValue += strTmp ;		// データ項目
			for( INT32 i = 0 ; i < NOF_MES_FEATURE ; i++ ){
				// 特徴量データ
				strTmp.Format( _T("%s = %d,")	, m_aSETTING2Col[SETTING2_FEATURE1_ENABLE  + (i * 7)], tData.taFeature[i].bEnable		) ; strValue += strTmp ;	// 有効フラグ
				strTmp.Format( _T("%s = '%s',")	, m_aSETTING2Col[SETTING2_FEATURE1_NAME	 + (i * 7)], tData.taFeature[i].szName		) ; strValue += strTmp ;	// 特徴量名称
				strTmp.Format( _T("%s = %d,")	, m_aSETTING2Col[SETTING2_FEATURE1_JUDGE	 + (i * 7)], tData.taFeature[i].nJudge		) ; strValue += strTmp ;	// 判定
				strTmp.Format( _T("%s = %d,")	, m_aSETTING2Col[SETTING2_FEATURE1_JDGKIND + (i * 7)], tData.taFeature[i].nJudgeKind	) ; strValue += strTmp ;	// 判定種類
				strTmp.Format( _T("%s = %f,")	, m_aSETTING2Col[SETTING2_FEATURE1_VALUE	 + (i * 7)], tData.taFeature[i].dValue		) ; strValue += strTmp ;	// 計測値
				strTmp.Format( _T("%s = %f,")	, m_aSETTING2Col[SETTING2_FEATURE1_MIN	 + (i * 7)], tData.taFeature[i].dMin		) ; strValue += strTmp ;	// 計測値下限
				strTmp.Format( _T("%s = %f,")	, m_aSETTING2Col[SETTING2_FEATURE1_MAX	 + (i * 7)], tData.taFeature[i].dMax		) ; strValue += strTmp ;	// 計測値上限
			}

			strTmp.Format( _T("%s = '%s',")		, m_aSETTING2Col[SETTING2_CNC_NO]			, tData.szCncNo )		; strValue += strTmp ;		// CNC No
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING2Col[SETTING2_IPADDRESS]		, tData.szIpAddress)	; strValue += strTmp;		// IpAddress(加工機)
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING2Col[SETTING2_MODELNAME]		, tData.szModelName)	; strValue += strTmp;		// ModelName(加工機名)
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING2Col[SETTING2_FEATURETYPE]		, tData.szFeatureType)	; strValue += strTmp;		// KOMTAS Viewer機能選択
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING2Col[SETTING2_NCLOGGER_FILENAME], tData.szNcLoggerFileName); strValue += strTmp;		// NCLogger生データファイル名
			strTmp.Format( _T("%s = %d")		, m_aSETTING2Col[SETTING2_TOOLNO]			, tData.nToolNo)		; strValue += strTmp;		// 工具番号

			// 末尾の','消し
			//strValue.TrimRight( _T(",") ) ;

			// クエリ作成
			strSql.Format( SQL_UPDATE_WHERE, tpParam->szTableName, strValue, strWhere ) ;

			// クエリ発行
			bRet = m_SqlControl.SetQuery( strSql ) ;

			// ログ出力
			strTmp.Format( 
							_T("[設定２データ]データ更新完了：Ret = %d, WorkID = %s, OP = %d, Measure = %d"),
							bRet,
							tData.szWorkID,
							tData.nOpNo,
							tData.nMesItem
						 ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING2, strTmp ) ;

			// エラー時は追加ログ出力
			if( !bRet ){
				strTmp.Format( _T("[設定２データ]データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
				CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING2, strTmp ) ;
				CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
			}

			// 計測異常ビット確認
			byNgBit |= MES_NG_SETTING2 ;	// 設定２NG

			// 計測データビット更新
			//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_SETTING2, byNgBit ) ;
		}else{
			// ログ出力
			strTmp.Format( 
							_T("[設定２データ]データ更新不要：WorkID = %s, OP = %d, Measure = %d"),
							tData.szWorkID,
							tData.nOpNo,
							tData.nMesItem
						 ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING2, strTmp ) ;
		}
	}
	else
	{
		//*** 該当データ無しの場合、INSERT命令
		// 列名部分のクエリ作成
		strCols = _T("") ;
		for( INT32 i = 0 ; i < NOF_SETTING2_DATA ; i++ ){
			strCols += m_aSETTING2Col[i] ;
			strCols += _T(",") ;
		}
		// 末尾の','消し
		strCols.TrimRight( _T(",") ) ;

		// データ部分のクエリ作成
		strValue = _T("") ;
		strTmp.Format( _T("'%s',")	, tData.szWorkID	) ; strValue += strTmp ;	// ワークID
		strTmp.Format( _T("'%s',")	, tData.szDateTime	) ; strValue += strTmp ;	// 計測日時
		strTmp.Format( _T("%d,")	, tData.nOpNo		) ; strValue += strTmp ;	// OP番号
		strTmp.Format( _T("%d,")	, tData.nMesItem	) ; strValue += strTmp ;	// 計測項目
		strTmp.Format( _T("'%s',")	, tData.szMesItem	) ; strValue += strTmp ;	// 計測項目名称
		strTmp.Format( _T("%d,")	, tData.nNgBit		) ; strValue += strTmp ;	// NGビット
		strTmp.Format( _T("%d,")	, tData.nResultID	) ; strValue += strTmp ;	// 結果ID
		strTmp.Format( _T("'%s',")	, tData.szDataItem	) ; strValue += strTmp ;	// データ項目

		for( INT32 i = 0 ; i < NOF_MES_FEATURE ; i++ ){
			// 特徴量データ
			strTmp.Format( _T("%d,")	, tData.taFeature[i].bEnable	) ; strValue += strTmp ;	// 有効フラグ
			strTmp.Format( _T("'%s',")	, tData.taFeature[i].szName		) ; strValue += strTmp ;	// 特徴量名称
			strTmp.Format( _T("%d,")	, tData.taFeature[i].nJudge		) ; strValue += strTmp ;	// 判定
			strTmp.Format( _T("%d,")	, tData.taFeature[i].nJudgeKind	) ; strValue += strTmp ;	// 判定種類
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dValue		) ; strValue += strTmp ;	// 計測値
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dMin		) ; strValue += strTmp ;	// 計測値下限
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dMax		) ; strValue += strTmp ;	// 計測値上限
		}

		strTmp.Format( _T("'%s',")	, tData.szCncNo	) ; strValue += strTmp ;		// CNC No
		strTmp.Format( _T("'%s',")	, tData.szIpAddress); strValue += strTmp;		// IpAddress(加工機)
		strTmp.Format( _T("'%s',")	, tData.szModelName); strValue += strTmp;		// ModelName(加工機名)
		strTmp.Format( _T("'%s',")	, tData.szFeatureType); strValue += strTmp;		// KOMTAS Viewer機能選択
		strTmp.Format( _T("'%s',")	, tData.szNcLoggerFileName); strValue += strTmp;	// NCLogger生データファイル名
		strTmp.Format( _T("%d")		, tData.nToolNo); strValue += strTmp;		// 工具番号

		// 末尾の','消し
		//strValue.TrimRight( _T(",") ) ;

		// クエリ作成
		strSql.Format( SQL_INSERT, tpParam->szTableName, strCols, strValue ) ;

		// クエリ発行
		bRet = m_SqlControl.SetQuery( strSql ) ;

		// ログ出力
		strTmp.Format( 
						_T("[設定２データ]データ格納完了：Ret = %d, WorkID = %s, OP = %d, Measure = %d"),
						bRet,
						tData.szWorkID,
						tData.nOpNo,
						tData.nMesItem
					 ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING2, strTmp ) ;

		// エラー時は追加ログ出力
		if( !bRet ){
			strTmp.Format( _T("[設定２データ]データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING2, strTmp ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
		}

		// 計測異常ビット確認
		if( tData.nNgBit > 0 ) byNgBit |= MES_NG_SETTING2 ;	// 設定２NG

		// 計測データビット更新
		//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_SETTING2, byNgBit ) ;
	}

	return bRet ;
}


/********************************************************************************
*	関数名：SetSETTING3Data															
*	用　途：設定３データ格納																
*	引き数：設定３データ構造体																	
*	戻り値：																	
*	備　考：																	
********************************************************************************/
BOOL CDataToDB::SetSETTING3Data( SETTING3_DATA& tData )
{
	GUARD_RETURN_FALSE( m_bInitialize ) ;

	P_PARAM_COLLECT	tpParam = &CParameterManager::GetInstance().RefParamInit()->taCollect[COLLECT_SETTING3] ;

	BOOL	bRet	= TRUE ;
	BYTE	byNgBit = 0x00 ;
	CString	strCols, strSql, strTmp, strValue, strWhere ;

	//*** 1.設定３テーブルから該当ワークの検索
	// Where条件の作成
	strWhere = _T("") ;
	strTmp.Format( _T("%s = '%s' and ")	, m_aSETTING3Col[SETTING3_WORKID]	, tData.szWorkID ) ; strWhere += strTmp ;
	strTmp.Format( _T("%s = %d and ")	, m_aSETTING3Col[SETTING3_OPNO]	, tData.nOpNo	 ) ; strWhere += strTmp ;
	strTmp.Format( _T("%s = '%s' and ") , m_aSETTING3Col[SETTING3_DATETIME], tData.szDateTime); strWhere += strTmp;
	strTmp.Format( _T("%s = %d")		, m_aSETTING3Col[SETTING3_MESITEM], tData.nMesItem ) ; strWhere += strTmp ;

	// クエリ作成
	strSql.Format( SQL_SELECT_ALL_WHERE, tpParam->szTableName, strWhere ) ;

	// クエリ発行
	bRet = m_SqlControl.SetQuery( strSql ) ;

	if( !bRet ){
		strTmp.Format( _T("[設定３データ]データ検索 データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING3, strTmp ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
		return FALSE ;
	}

	//*** 2.データ格納
	if( (INT32)m_SqlControl.GetRowCount() > 0 )
	{
		//*** 該当データ有りの場合、判定NGならUPDATE命令
		if( tData.nNgBit > 0 ){
			// 更新後のデータ作成
			strValue = _T("") ;
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING3Col[SETTING3_DATETIME]		, tData.szDateTime ) ; strValue += strTmp ;		// 計測日時
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING3Col[SETTING3_MESITEM_NAME]	, tData.szMesItem )  ; strValue += strTmp ;		// 計測項目名称
			strTmp.Format( _T("%s = %d,")	, m_aSETTING3Col[SETTING3_NGBIT]			, tData.nNgBit )	 ; strValue += strTmp ;		// NGビット
			strTmp.Format( _T("%s = %d,")	, m_aSETTING3Col[SETTING3_RESULTID]		, tData.nResultID )  ; strValue += strTmp ;		// 結果ID
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING3Col[SETTING3_DATAITEM]		, tData.szDataItem ) ; strValue += strTmp ;		// データ項目
			for( INT32 i = 0 ; i < NOF_MES_FEATURE ; i++ ){
				// 特徴量データ
				strTmp.Format( _T("%s = %d,")	, m_aSETTING3Col[SETTING3_FEATURE1_ENABLE  + (i * 7)], tData.taFeature[i].bEnable		) ; strValue += strTmp ;	// 有効フラグ
				strTmp.Format( _T("%s = '%s',")	, m_aSETTING3Col[SETTING3_FEATURE1_NAME	 + (i * 7)], tData.taFeature[i].szName		) ; strValue += strTmp ;	// 特徴量名称
				strTmp.Format( _T("%s = %d,")	, m_aSETTING3Col[SETTING3_FEATURE1_JUDGE	 + (i * 7)], tData.taFeature[i].nJudge		) ; strValue += strTmp ;	// 判定
				strTmp.Format( _T("%s = %d,")	, m_aSETTING3Col[SETTING3_FEATURE1_JDGKIND + (i * 7)], tData.taFeature[i].nJudgeKind	) ; strValue += strTmp ;	// 判定種類
				strTmp.Format( _T("%s = %f,")	, m_aSETTING3Col[SETTING3_FEATURE1_VALUE	 + (i * 7)], tData.taFeature[i].dValue		) ; strValue += strTmp ;	// 計測値
				strTmp.Format( _T("%s = %f,")	, m_aSETTING3Col[SETTING3_FEATURE1_MIN	 + (i * 7)], tData.taFeature[i].dMin		) ; strValue += strTmp ;	// 計測値下限
				strTmp.Format( _T("%s = %f,")	, m_aSETTING3Col[SETTING3_FEATURE1_MAX	 + (i * 7)], tData.taFeature[i].dMax		) ; strValue += strTmp ;	// 計測値上限
			}

			strTmp.Format( _T("%s = '%s',")		, m_aSETTING3Col[SETTING3_CNC_NO]			, tData.szCncNo )		; strValue += strTmp ;		// CNC No
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING3Col[SETTING3_IPADDRESS]		, tData.szIpAddress)	; strValue += strTmp;		// IpAddress(加工機)
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING3Col[SETTING3_MODELNAME]		, tData.szModelName)	; strValue += strTmp;		// ModelName(加工機名)
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING3Col[SETTING3_FEATURETYPE]		, tData.szFeatureType)	; strValue += strTmp;		// KOMTAS Viewer機能選択
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING3Col[SETTING3_NCLOGGER_FILENAME], tData.szNcLoggerFileName); strValue += strTmp;		// NCLogger生データファイル名
			strTmp.Format( _T("%s = %d")		, m_aSETTING3Col[SETTING3_TOOLNO]			, tData.nToolNo)		; strValue += strTmp;		// 工具番号

			// 末尾の','消し
			//strValue.TrimRight( _T(",") ) ;

			// クエリ作成
			strSql.Format( SQL_UPDATE_WHERE, tpParam->szTableName, strValue, strWhere ) ;

			// クエリ発行
			bRet = m_SqlControl.SetQuery( strSql ) ;

			// ログ出力
			strTmp.Format( 
							_T("[設定３データ]データ更新完了：Ret = %d, WorkID = %s, OP = %d, Measure = %d"),
							bRet,
							tData.szWorkID,
							tData.nOpNo,
							tData.nMesItem
						 ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING3, strTmp ) ;

			// エラー時は追加ログ出力
			if( !bRet ){
				strTmp.Format( _T("[設定３データ]データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
				CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING3, strTmp ) ;
				CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
			}

			// 計測異常ビット確認
			byNgBit |= MES_NG_SETTING3 ;	// 設定３NG

			// 計測データビット更新
			//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_SETTING3, byNgBit ) ;
		}else{
			// ログ出力
			strTmp.Format( 
							_T("[設定３データ]データ更新不要：WorkID = %s, OP = %d, Measure = %d"),
							tData.szWorkID,
							tData.nOpNo,
							tData.nMesItem
						 ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING3, strTmp ) ;
		}
	}
	else
	{
		//*** 該当データ無しの場合、INSERT命令
		// 列名部分のクエリ作成
		strCols = _T("") ;
		for( INT32 i = 0 ; i < NOF_SETTING3_DATA ; i++ ){
			strCols += m_aSETTING3Col[i] ;
			strCols += _T(",") ;
		}
		// 末尾の','消し
		strCols.TrimRight( _T(",") ) ;

		// データ部分のクエリ作成
		strValue = _T("") ;
		strTmp.Format( _T("'%s',")	, tData.szWorkID	) ; strValue += strTmp ;	// ワークID
		strTmp.Format( _T("'%s',")	, tData.szDateTime	) ; strValue += strTmp ;	// 計測日時
		strTmp.Format( _T("%d,")	, tData.nOpNo		) ; strValue += strTmp ;	// OP番号
		strTmp.Format( _T("%d,")	, tData.nMesItem	) ; strValue += strTmp ;	// 計測項目
		strTmp.Format( _T("'%s',")	, tData.szMesItem	) ; strValue += strTmp ;	// 計測項目名称
		strTmp.Format( _T("%d,")	, tData.nNgBit		) ; strValue += strTmp ;	// NGビット
		strTmp.Format( _T("%d,")	, tData.nResultID	) ; strValue += strTmp ;	// 結果ID
		strTmp.Format( _T("'%s',")	, tData.szDataItem	) ; strValue += strTmp ;	// データ項目

		for( INT32 i = 0 ; i < NOF_MES_FEATURE ; i++ ){
			// 特徴量データ
			strTmp.Format( _T("%d,")	, tData.taFeature[i].bEnable	) ; strValue += strTmp ;	// 有効フラグ
			strTmp.Format( _T("'%s',")	, tData.taFeature[i].szName		) ; strValue += strTmp ;	// 特徴量名称
			strTmp.Format( _T("%d,")	, tData.taFeature[i].nJudge		) ; strValue += strTmp ;	// 判定
			strTmp.Format( _T("%d,")	, tData.taFeature[i].nJudgeKind	) ; strValue += strTmp ;	// 判定種類
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dValue		) ; strValue += strTmp ;	// 計測値
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dMin		) ; strValue += strTmp ;	// 計測値下限
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dMax		) ; strValue += strTmp ;	// 計測値上限
		}

		strTmp.Format( _T("'%s',")	, tData.szCncNo	) ; strValue += strTmp ;		// CNC No
		strTmp.Format( _T("'%s',")	, tData.szIpAddress); strValue += strTmp;		// IpAddress(加工機)
		strTmp.Format( _T("'%s',")	, tData.szModelName); strValue += strTmp;		// ModelName(加工機名)
		strTmp.Format( _T("'%s',")	, tData.szFeatureType); strValue += strTmp;		// KOMTAS Viewer機能選択
		strTmp.Format( _T("'%s',")	, tData.szNcLoggerFileName); strValue += strTmp;	// NCLogger生データファイル名
		strTmp.Format( _T("%d")		, tData.nToolNo); strValue += strTmp;		// 工具番号

		// 末尾の','消し
		//strValue.TrimRight( _T(",") ) ;

		// クエリ作成
		strSql.Format( SQL_INSERT, tpParam->szTableName, strCols, strValue ) ;

		// クエリ発行
		bRet = m_SqlControl.SetQuery( strSql ) ;

		// ログ出力
		strTmp.Format( 
						_T("[設定３データ]データ格納完了：Ret = %d, WorkID = %s, OP = %d, Measure = %d"),
						bRet,
						tData.szWorkID,
						tData.nOpNo,
						tData.nMesItem
					 ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING3, strTmp ) ;

		// エラー時は追加ログ出力
		if( !bRet ){
			strTmp.Format( _T("[設定３データ]データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING3, strTmp ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
		}

		// 計測異常ビット確認
		if( tData.nNgBit > 0 ) byNgBit |= MES_NG_SETTING3 ;	// 設定３NG

		// 計測データビット更新
		//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_SETTING3, byNgBit ) ;
	}

	return bRet ;
}




/********************************************************************************
*	関数名：SetSETTING4Data															
*	用　途：設定４データ格納																
*	引き数：設定４データ構造体																	
*	戻り値：																	
*	備　考：																	
********************************************************************************/
BOOL CDataToDB::SetSETTING4Data( SETTING4_DATA& tData )
{
	GUARD_RETURN_FALSE( m_bInitialize ) ;

	P_PARAM_COLLECT	tpParam = &CParameterManager::GetInstance().RefParamInit()->taCollect[COLLECT_SETTING4] ;

	BOOL	bRet	= TRUE ;
	BYTE	byNgBit = 0x00 ;
	CString	strCols, strSql, strTmp, strValue, strWhere ;

	//*** 1.設定４テーブルから該当ワークの検索
	// Where条件の作成
	strWhere = _T("") ;
	strTmp.Format( _T("%s = '%s' and ")	, m_aSETTING4Col[SETTING4_WORKID]	, tData.szWorkID ) ; strWhere += strTmp ;
	strTmp.Format( _T("%s = %d and ")	, m_aSETTING4Col[SETTING4_OPNO]	, tData.nOpNo	 ) ; strWhere += strTmp ;
	strTmp.Format( _T("%s = '%s' and ") , m_aSETTING4Col[SETTING4_DATETIME], tData.szDateTime); strWhere += strTmp;
	strTmp.Format( _T("%s = %d")		, m_aSETTING4Col[SETTING4_MESITEM], tData.nMesItem ) ; strWhere += strTmp ;

	// クエリ作成
	strSql.Format( SQL_SELECT_ALL_WHERE, tpParam->szTableName, strWhere ) ;

	// クエリ発行
	bRet = m_SqlControl.SetQuery( strSql ) ;

	if( !bRet ){
		strTmp.Format( _T("[設定４データ]データ検索 データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING4, strTmp ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
		return FALSE ;
	}

	//*** 2.データ格納
	if( (INT32)m_SqlControl.GetRowCount() > 0 )
	{
		//*** 該当データ有りの場合、判定NGならUPDATE命令
		if( tData.nNgBit > 0 ){
			// 更新後のデータ作成
			strValue = _T("") ;
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING4Col[SETTING4_DATETIME]		, tData.szDateTime ) ; strValue += strTmp ;		// 計測日時
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING4Col[SETTING4_MESITEM_NAME]	, tData.szMesItem )  ; strValue += strTmp ;		// 計測項目名称
			strTmp.Format( _T("%s = %d,")	, m_aSETTING4Col[SETTING4_NGBIT]			, tData.nNgBit )	 ; strValue += strTmp ;		// NGビット
			strTmp.Format( _T("%s = %d,")	, m_aSETTING4Col[SETTING4_RESULTID]		, tData.nResultID )  ; strValue += strTmp ;		// 結果ID
			strTmp.Format( _T("%s = '%s',")	, m_aSETTING4Col[SETTING4_DATAITEM]		, tData.szDataItem ) ; strValue += strTmp ;		// データ項目
			for( INT32 i = 0 ; i < NOF_MES_FEATURE ; i++ ){
				// 特徴量データ
				strTmp.Format( _T("%s = %d,")	, m_aSETTING4Col[SETTING4_FEATURE1_ENABLE  + (i * 7)], tData.taFeature[i].bEnable		) ; strValue += strTmp ;	// 有効フラグ
				strTmp.Format( _T("%s = '%s',")	, m_aSETTING4Col[SETTING4_FEATURE1_NAME	 + (i * 7)], tData.taFeature[i].szName		) ; strValue += strTmp ;	// 特徴量名称
				strTmp.Format( _T("%s = %d,")	, m_aSETTING4Col[SETTING4_FEATURE1_JUDGE	 + (i * 7)], tData.taFeature[i].nJudge		) ; strValue += strTmp ;	// 判定
				strTmp.Format( _T("%s = %d,")	, m_aSETTING4Col[SETTING4_FEATURE1_JDGKIND + (i * 7)], tData.taFeature[i].nJudgeKind	) ; strValue += strTmp ;	// 判定種類
				strTmp.Format( _T("%s = %f,")	, m_aSETTING4Col[SETTING4_FEATURE1_VALUE	 + (i * 7)], tData.taFeature[i].dValue		) ; strValue += strTmp ;	// 計測値
				strTmp.Format( _T("%s = %f,")	, m_aSETTING4Col[SETTING4_FEATURE1_MIN	 + (i * 7)], tData.taFeature[i].dMin		) ; strValue += strTmp ;	// 計測値下限
				strTmp.Format( _T("%s = %f,")	, m_aSETTING4Col[SETTING4_FEATURE1_MAX	 + (i * 7)], tData.taFeature[i].dMax		) ; strValue += strTmp ;	// 計測値上限
			}

			strTmp.Format( _T("%s = '%s',")		, m_aSETTING4Col[SETTING4_CNC_NO]			, tData.szCncNo )		; strValue += strTmp ;		// CNC No
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING4Col[SETTING4_IPADDRESS]		, tData.szIpAddress)	; strValue += strTmp;		// IpAddress(加工機)
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING4Col[SETTING4_MODELNAME]		, tData.szModelName)	; strValue += strTmp;		// ModelName(加工機名)
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING4Col[SETTING4_FEATURETYPE]		, tData.szFeatureType)	; strValue += strTmp;		// KOMTAS Viewer機能選択
			strTmp.Format( _T("%s = '%s',")		, m_aSETTING4Col[SETTING4_NCLOGGER_FILENAME], tData.szNcLoggerFileName); strValue += strTmp;		// NCLogger生データファイル名
			strTmp.Format( _T("%s = %d")		, m_aSETTING4Col[SETTING4_TOOLNO]			, tData.nToolNo)		; strValue += strTmp;		// 工具番号

			// 末尾の','消し
			//strValue.TrimRight( _T(",") ) ;

			// クエリ作成
			strSql.Format( SQL_UPDATE_WHERE, tpParam->szTableName, strValue, strWhere ) ;

			// クエリ発行
			bRet = m_SqlControl.SetQuery( strSql ) ;

			// ログ出力
			strTmp.Format( 
							_T("[設定４データ]データ更新完了：Ret = %d, WorkID = %s, OP = %d, Measure = %d"),
							bRet,
							tData.szWorkID,
							tData.nOpNo,
							tData.nMesItem
						 ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING4, strTmp ) ;

			// エラー時は追加ログ出力
			if( !bRet ){
				strTmp.Format( _T("[設定４データ]データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
				CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING4, strTmp ) ;
				CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
			}

			// 計測異常ビット確認
			byNgBit |= MES_NG_SETTING4 ;	// 設定４NG

			// 計測データビット更新
			//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_SETTING4, byNgBit ) ;
		}else{
			// ログ出力
			strTmp.Format( 
							_T("[設定４データ]データ更新不要：WorkID = %s, OP = %d, Measure = %d"),
							tData.szWorkID,
							tData.nOpNo,
							tData.nMesItem
						 ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING4, strTmp ) ;
		}
	}
	else
	{
		//*** 該当データ無しの場合、INSERT命令
		// 列名部分のクエリ作成
		strCols = _T("") ;
		for( INT32 i = 0 ; i < NOF_SETTING4_DATA ; i++ ){
			strCols += m_aSETTING4Col[i] ;
			strCols += _T(",") ;
		}
		// 末尾の','消し
		strCols.TrimRight( _T(",") ) ;

		// データ部分のクエリ作成
		strValue = _T("") ;
		strTmp.Format( _T("'%s',")	, tData.szWorkID	) ; strValue += strTmp ;	// ワークID
		strTmp.Format( _T("'%s',")	, tData.szDateTime	) ; strValue += strTmp ;	// 計測日時
		strTmp.Format( _T("%d,")	, tData.nOpNo		) ; strValue += strTmp ;	// OP番号
		strTmp.Format( _T("%d,")	, tData.nMesItem	) ; strValue += strTmp ;	// 計測項目
		strTmp.Format( _T("'%s',")	, tData.szMesItem	) ; strValue += strTmp ;	// 計測項目名称
		strTmp.Format( _T("%d,")	, tData.nNgBit		) ; strValue += strTmp ;	// NGビット
		strTmp.Format( _T("%d,")	, tData.nResultID	) ; strValue += strTmp ;	// 結果ID
		strTmp.Format( _T("'%s',")	, tData.szDataItem	) ; strValue += strTmp ;	// データ項目

		for( INT32 i = 0 ; i < NOF_MES_FEATURE ; i++ ){
			// 特徴量データ
			strTmp.Format( _T("%d,")	, tData.taFeature[i].bEnable	) ; strValue += strTmp ;	// 有効フラグ
			strTmp.Format( _T("'%s',")	, tData.taFeature[i].szName		) ; strValue += strTmp ;	// 特徴量名称
			strTmp.Format( _T("%d,")	, tData.taFeature[i].nJudge		) ; strValue += strTmp ;	// 判定
			strTmp.Format( _T("%d,")	, tData.taFeature[i].nJudgeKind	) ; strValue += strTmp ;	// 判定種類
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dValue		) ; strValue += strTmp ;	// 計測値
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dMin		) ; strValue += strTmp ;	// 計測値下限
			strTmp.Format( _T("%f,")	, tData.taFeature[i].dMax		) ; strValue += strTmp ;	// 計測値上限
		}

		strTmp.Format( _T("'%s',")	, tData.szCncNo	) ; strValue += strTmp ;		// CNC No
		strTmp.Format( _T("'%s',")	, tData.szIpAddress); strValue += strTmp;		// IpAddress(加工機)
		strTmp.Format( _T("'%s',")	, tData.szModelName); strValue += strTmp;		// ModelName(加工機名)
		strTmp.Format( _T("'%s',")	, tData.szFeatureType); strValue += strTmp;		// KOMTAS Viewer機能選択
		strTmp.Format( _T("'%s',")	, tData.szNcLoggerFileName); strValue += strTmp;	// NCLogger生データファイル名
		strTmp.Format( _T("%d")		, tData.nToolNo); strValue += strTmp;		// 工具番号

		// 末尾の','消し
		//strValue.TrimRight( _T(",") ) ;

		// クエリ作成
		strSql.Format( SQL_INSERT, tpParam->szTableName, strCols, strValue ) ;

		// クエリ発行
		bRet = m_SqlControl.SetQuery( strSql ) ;

		// ログ出力
		strTmp.Format( 
						_T("[設定４データ]データ格納完了：Ret = %d, WorkID = %s, OP = %d, Measure = %d"),
						bRet,
						tData.szWorkID,
						tData.nOpNo,
						tData.nMesItem
					 ) ;
		CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING4, strTmp ) ;

		// エラー時は追加ログ出力
		if( !bRet ){
			strTmp.Format( _T("[設定４データ]データベースエラー：%s"), m_SqlControl.GetLatestError() ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_SETTING4, strTmp ) ;
			CDailyLogManagerS::GetInstance().PrintLog( LOG_ERROR  , strTmp ) ;
		}

		// 計測異常ビット確認
		if( tData.nNgBit > 0 ) byNgBit |= MES_NG_SETTING4 ;	// 設定４NG

		// 計測データビット更新
		//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_SETTING4, byNgBit ) ;
	}

	return bRet ;
}

/********************************************************************************
*	関数名：SetProductsInfoData
*	用　途：生産情報データ格納
*	引き数：生産情報データ構造体
*	戻り値：
*	備　考：
********************************************************************************/
BOOL CDataToDB::SetProductsInfoData(PRODUCTSINFO_DATA& tData)
{
	GUARD_RETURN_FALSE(m_bInitialize);

	P_PARAM_COLLECT	tpParam = &CParameterManager::GetInstance().RefParamInit()->taCollect[COLLECT_PRODUCTSINFO];

	BOOL	bRet = TRUE;
	BYTE	byNgBit = 0x00;
	CString	strCols, strSql, strTmp, strValue, strWhere, strWorkType, strWorkSerial;

	//*** 1.工具ステータステーブルから該当ワークの検索
	// Where条件の作成
	strWhere = _T("");
	strTmp.Format(_T("%s = '%s' and "), m_aToolStatusCol[PRODUCTINFO_DATETIME], tData.taProductInfo[0].szDateTime); strWhere += strTmp;
	strTmp.Format(_T("%s BETWEEN '%d' and '%d'"), m_aToolStatusCol[PRODUCTINFO_TOOLNO], 1, tData.nToolNum); strWhere += strTmp;

	// クエリ作成
	strSql.Format(SQL_SELECT_ALL_WHERE, tpParam->szTableName, strWhere);

	// クエリ発行
	bRet = m_SqlControl.SetQuery(strSql);

	if (!bRet) {
		strTmp.Format(_T("[生産情報データ]データ検索 データベースエラー：%s"), m_SqlControl.GetLatestError());
		CDailyLogManagerS::GetInstance().PrintLog(LOG_PRODUCTINFO, strTmp);
		CDailyLogManagerS::GetInstance().PrintLog(LOG_ERROR, strTmp);
		return FALSE;
	}

	//*** 2.データ格納
	if ((INT32)m_SqlControl.GetRowCount() > 0)
	{
		////*** 該当データ有りの場合、判定NGならUPDATE命令
		//if (tData.nNgBit > 0) {
		//	// 更新後のデータ作成
		//	strValue = _T("");
		//	strTmp.Format(_T("%s = '%s',"), m_aSETTING4Col[SETTING4_DATETIME], tData.szDateTime); strValue += strTmp;		// 計測日時
		//	strTmp.Format(_T("%s = '%s',"), m_aSETTING4Col[SETTING4_MESITEM_NAME], tData.szMesItem); strValue += strTmp;		// 計測項目名称
		//	strTmp.Format(_T("%s = %d,"), m_aSETTING4Col[SETTING4_NGBIT], tData.nNgBit); strValue += strTmp;		// NGビット
		//	strTmp.Format(_T("%s = %d,"), m_aSETTING4Col[SETTING4_RESULTID], tData.nResultID); strValue += strTmp;		// 結果ID
		//	strTmp.Format(_T("%s = '%s',"), m_aSETTING4Col[SETTING4_DATAITEM], tData.szDataItem); strValue += strTmp;		// データ項目
		//	for (INT32 i = 0; i < NOF_MES_FEATURE; i++) {
		//		// 特徴量データ
		//		strTmp.Format(_T("%s = %d,"), m_aSETTING4Col[SETTING4_FEATURE1_ENABLE + (i * 7)], tData.taFeature[i].bEnable); strValue += strTmp;	// 有効フラグ
		//		strTmp.Format(_T("%s = '%s',"), m_aSETTING4Col[SETTING4_FEATURE1_NAME + (i * 7)], tData.taFeature[i].szName); strValue += strTmp;	// 特徴量名称
		//		strTmp.Format(_T("%s = %d,"), m_aSETTING4Col[SETTING4_FEATURE1_JUDGE + (i * 7)], tData.taFeature[i].nJudge); strValue += strTmp;	// 判定
		//		strTmp.Format(_T("%s = %d,"), m_aSETTING4Col[SETTING4_FEATURE1_JDGKIND + (i * 7)], tData.taFeature[i].nJudgeKind); strValue += strTmp;	// 判定種類
		//		strTmp.Format(_T("%s = %f,"), m_aSETTING4Col[SETTING4_FEATURE1_VALUE + (i * 7)], tData.taFeature[i].dValue); strValue += strTmp;	// 計測値
		//		strTmp.Format(_T("%s = %f,"), m_aSETTING4Col[SETTING4_FEATURE1_MIN + (i * 7)], tData.taFeature[i].dMin); strValue += strTmp;	// 計測値下限
		//		strTmp.Format(_T("%s = %f,"), m_aSETTING4Col[SETTING4_FEATURE1_MAX + (i * 7)], tData.taFeature[i].dMax); strValue += strTmp;	// 計測値上限
		//	}

		//	strTmp.Format(_T("%s = '%s',"), m_aSETTING4Col[SETTING4_CNC_NO], tData.szCncNo); strValue += strTmp;		// CNC No
		//	strTmp.Format(_T("%s = '%s',"), m_aSETTING4Col[SETTING4_IPADDRESS], tData.szIpAddress); strValue += strTmp;		// IpAddress(加工機)
		//	strTmp.Format(_T("%s = '%s',"), m_aSETTING4Col[SETTING4_MODELNAME], tData.szModelName); strValue += strTmp;		// ModelName(加工機名)
		//	strTmp.Format(_T("%s = '%s',"), m_aSETTING4Col[SETTING4_FEATURETYPE], tData.szFeatureType); strValue += strTmp;		// KOMTAS Viewer機能選択
		//	strTmp.Format(_T("%s = '%s'"), m_aSETTING4Col[SETTING4_NCLOGGER_FILENAME], tData.szNcLoggerFileName); strValue += strTmp;		// NCLogger生データファイル名

		//	// 末尾の','消し
		//	//strValue.TrimRight( _T(",") ) ;

		//	// クエリ作成
		//	strSql.Format(SQL_UPDATE_WHERE, tpParam->szTableName, strValue, strWhere);

		//	// クエリ発行
		//	bRet = m_SqlControl.SetQuery(strSql);

		//	// ログ出力
		//	strTmp.Format(
		//		_T("[設定４データ]データ更新完了：Ret = %d, WorkID = %s, OP = %d, Measure = %d"),
		//		bRet,
		//		tData.szWorkID,
		//		tData.nOpNo,
		//		tData.nMesItem
		//	);
		//	CDailyLogManagerS::GetInstance().PrintLog(LOG_SETTING4, strTmp);

		//	// エラー時は追加ログ出力
		//	if (!bRet) {
		//		strTmp.Format(_T("[設定４データ]データベースエラー：%s"), m_SqlControl.GetLatestError());
		//		CDailyLogManagerS::GetInstance().PrintLog(LOG_SETTING4, strTmp);
		//		CDailyLogManagerS::GetInstance().PrintLog(LOG_ERROR, strTmp);
		//	}

		//	// 計測異常ビット確認
		//	byNgBit |= MES_NG_SETTING4;	// 設定４NG

		//	// 計測データビット更新
		//	//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_SETTING4, byNgBit ) ;
		//}
		//else {
		//	// ログ出力
		//	strTmp.Format(
		//		_T("[設定４データ]データ更新不要：WorkID = %s, OP = %d, Measure = %d"),
		//		tData.szWorkID,
		//		tData.nOpNo,
		//		tData.nMesItem
		//	);
		//	CDailyLogManagerS::GetInstance().PrintLog(LOG_SETTING4, strTmp);
		//}
	}
	else
	{
		//*** 該当データ無しの場合、INSERT命令
		// 列名部分のクエリ作成
		strCols = _T("");
		for (INT32 i = 0; i < NOF_PRODUCTINFO_DATA; i++) {
			strCols += m_aToolStatusCol[i];
			strCols += _T(",");
		}
		// 末尾の','消し
		strCols.TrimRight(_T(","));

		// データ部分のクエリ作成(バルクインサート)
		strValue = _T("");
		for(int i=0; i < tData.nToolNum; i++)
		{
			strTmp.Format(_T("(")); strValue += strTmp;
			strTmp.Format(_T("'%s',"), tData.taProductInfo[i].szDateTime); strValue += strTmp;	// 計測日時
			strTmp.Format(_T("%d,"), tData.taProductInfo[i].nToolNo); strValue += strTmp;	// 工具番号
			strTmp.Format(_T("%d,"), tData.taProductInfo[i].nToolCounts); strValue += strTmp;	// 工具カウント
			strTmp.Format(_T("%d,"), tData.taProductInfo[i].nWorkCounts); strValue += strTmp;	// ワークカウント
			strTmp.Format(_T("%d,"), tData.taProductInfo[i].nWorkType); strValue += strTmp;	// 車種
			strTmp.Format(_T("'%s',"), tData.taProductInfo[i].szWorkSerial); strValue += strTmp;	// ワークシリアル
			strTmp.Format(_T("'%f',"), tData.taProductInfo[i].dCustomMacroVal1); strValue += strTmp;	// カスタムマクロ値1
			strTmp.Format(_T("'%f',"), tData.taProductInfo[i].dCustomMacroVal2); strValue += strTmp;	// カスタムマクロ値2
			// 末尾の','消し
			strValue.TrimRight(_T(","));
			strTmp.Format(_T("),")); strValue += strTmp;
		}
		
		// 末尾の','消し
		strValue.TrimRight(_T(","));

		// クエリ作成
		strSql.Format(SQL_BULKINSERT, tpParam->szTableName, strCols, strValue);

		// クエリ発行
		bRet = m_SqlControl.SetQuery(strSql);

		// ログ出力
		strTmp.Format(
			_T("[生産情報データ]データ格納完了：Ret = %d, ToolNum = %d"),
			bRet,
			tData.nToolNum
		);
		CDailyLogManagerS::GetInstance().PrintLog(LOG_PRODUCTINFO, strTmp);

		// エラー時は追加ログ出力
		if (!bRet) {
			strTmp.Format(_T("[生産情報データ]データベースエラー：%s"), m_SqlControl.GetLatestError());
			CDailyLogManagerS::GetInstance().PrintLog(LOG_PRODUCTINFO, strTmp);
			CDailyLogManagerS::GetInstance().PrintLog(LOG_ERROR, strTmp);
		}

		
		// 計測データビット更新
		//UpdateMeasureData( tData.szWorkID, tData.szDateTime, MES_DATA_SETTING4, byNgBit ) ;
	}

	return bRet;
}