//
// CopyRight (C) 2003, NTT All rights reserved.
//
//	WBT教材個別ログ　AiccCoreテーブルアクセスクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.lo.WBT.Aicc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.Vector;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xmo.DataAccess;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.util.ChangeEncode;
import jp.co.ntt.lms.xmo.util.DebugLog;
/**
 * WBT教材個別ログ　AiccCoreテーブルアクセスクラスです。<BR>
 * @version 0.0.0.1 2004.01.08
 * @author T.Nijou
 */
public class AiccCoreDataAccess extends AiccDataAccess implements AiccConst {

	public static final String TABLE_NAME = "AiccCore";

	/**
	 * コンストラクタ
	 **/
	public AiccCoreDataAccess() {
		super ( TABLE_NAME );
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルへ登録処理を行います
	 * @param objRecords AiccCoreレコード配列
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception SQLException DB操作に失敗した場合
	 */
	public synchronized void insert(	AiccCoreRecord[] objRecords,
										DataAccess objDataAccess  )
		throws SQLException
	{
		for( int i = 0; i < objRecords.length; i++ ) {
			// データ変換処理
			Hashtable htbData = changeData( objRecords[i] );
			insertAction( htbData, objDataAccess );
		}
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルへ登録処理を行います
	 * @param objRecord AiccCoreレコードオブジェクト
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception SQLException DB操作に失敗した場合
	 */
	public synchronized void insert(	AiccCoreRecord objRecord,
										DataAccess objDataAccess  )
		throws SQLException
	{

		// データ変換処理
		Hashtable htbData = changeData( objRecord );
		insertAction( htbData, objDataAccess );
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルへ登録処理を行います
	 * @param htbData パラメータ
	 * @exception SQLException DBエラー
	 */
	private void insertAction( Hashtable htbParam, DataAccess objDataAccess )
		throws SQLException
	{

		// 登録用SQLを生成します
		String strSQL = objDataAccess.getInsertSQL( htbParam, TABLE_NAME );

		// 登録処理を実行
		objDataAccess.execute( strSQL );
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルへ更新処理を行います
	 * @param objRecord 検索データを設定します
	 * @param strUserID ユーザIDを更新条件に設定します
	 * @param strLoID LOID LOIDを更新条件に設定します
	 * @param strSessionID セッションID セッションIDを更新条件に設定します
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception SQLException DB操作に失敗した場合
	 */
	public synchronized void update(	AiccCoreRecord objRecord,
										String strUserID,
										String strLoID,
										String strSessionID,
										DataAccess objDataAccess  )
		throws SQLException
	{

		// データ変換処理
		Hashtable htbData = changeData( objRecord );

		String strCondition = AiccMakeCondition.makeCondition(	strUserID,
																strLoID,
																strSessionID );
		updateAction( htbData, strCondition, objDataAccess );
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルへ更新処理を行います<BR>
	 * @param objRecord 検索データを設定します
	 * @param strCondition 検索条件を設定します
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception SQLException DB操作に失敗した場合
	 */
	public synchronized void update(	AiccCoreRecord objRecord,
										String strCondition,
										DataAccess objDataAccess  )
		throws SQLException
	{

		// データ変換処理
		Hashtable htbData = changeData( objRecord );
		updateAction( htbData, strCondition, objDataAccess );
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルへ更新処理を行います
	 * @param strCondition 更新条件文
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception SQLException DBエラー
	 */
	private void updateAction(	Hashtable htbParam,
								String strCondition,
								DataAccess objDataAccess )
		throws SQLException
	{

		// 登録用SQLを生成します
		String strSQL = objDataAccess.getUpdateSQL( htbParam, TABLE_NAME );

		// SQL連結
		if( strCondition != null ) {
			strSQL = strSQL + strCondition;
		}

		// 更新処理を実行
		objDataAccess.execute( strSQL );
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルへ削除を行います
	 * @param strUserID ユーザIDを削除条件に設定します
	 * @param strLoID LOID LOIDを削除条件に設定します
	 * @param strSessionID セッションID セッションIDを削除条件に設定します
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception SQLException DB操作に失敗した場合
	 */
	public synchronized void delete(	String strUserID,
										String strLoID,
										String strSessionID,
										DataAccess objDataAccess  )
		throws SQLException
	{
		String strCondition = AiccMakeCondition.makeCondition(	strUserID,
																strLoID,
																strSessionID );
		// 削除処理
		deleteAction( strCondition, objDataAccess );
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルへ削除を行います
	 * @param strCondition 削除条件文
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception SQLException DB操作に失敗した場合
	 */
	public synchronized void delete(	String strCondition,
										DataAccess objDataAccess  )
		throws SQLException
	{
		// 削除処理
		deleteAction( strCondition, objDataAccess );
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルへ削除を行います
	 * @param strCondition 削除条件文
	 * @param objDataAccess パラメータ
	 * @exception SQLException DBエラー
	 */
	private void deleteAction(	String strCondition,
								DataAccess objDataAccess )
		throws SQLException
	{

		// 削除用SQLを生成します
		try {
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv = new Environment();

			StringBuffer sbfSQL = new StringBuffer();
			sbfSQL.append("DELETE FROM ");
			sbfSQL.append(TABLE_NAME);

			//SQLServerの場合
			if(objEnv.getDBType().equals( Environment.DB_SQLSERVER )){
				sbfSQL.append(" WITH(TABLOCKX) ");
			}
			sbfSQL.append(strCondition);

			// 削除処理を実行
			objDataAccess.execute( sbfSQL.toString() );
		} catch(Exception e) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
		}
	}


	/**
	 * WBT教材個別ログ　AiccCoreテーブルからデータを取得します
	 * @param strUserID ユーザIDを検索条件に設定します
	 * @param strLoID LOID LOIDを検索条件に設定します
	 * @param strSessionID セッションID セッションIDを検索条件に設定します
	 * @param objDataAccess データアクセスオブジェクト
	 * @return AiccCoreRecord[] 検索結果の配列
	 * @exception SQLException データベースエラー
	 */
	public AiccCoreRecord[] getData(	String strUserID,
										String strLoID,
										String strSessionID,
										DataAccess objDataAccess )
		throws SQLException
	{
		String strCondition = AiccMakeCondition.makeCondition(	strUserID,
																strLoID,
																strSessionID );

		return getData( strCondition, objDataAccess );
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルからデータを取得します
	 * @param strCondition 検索条件文
	 * @param objDataAccess データアクセスオブジェクト
	 * @return AiccCoreRecord[] 検索結果の配列
	 * @exception SQLException データベースエラー
	 */
	public AiccCoreRecord[] getData(	String strCondition,
										DataAccess objDataAccess )
		throws SQLException
	{
		AiccCoreRecord[] objResult = null;

		if( strCondition == null ) {
			strCondition = "";
		}

		// 検索SQLの組み立て
		String strSQL = "SELECT * FROM " + TABLE_NAME + strCondition;

		ResultSet rs = objDataAccess.executeQuery(strSQL);
		Vector vecResult = new Vector();

		while( rs.next() ) {
			AiccCoreRecord objData = new AiccCoreRecord();
			// セッションレコードにコピー
			objData.setLessonStatus( ChangeEncode.setChar(rs.getString( LESSON_STATUS )) );
			objData.setRawScore( ChangeEncode.setChar(rs.getString( RAW_SCORE )) );
			objData.setMaxScore( ChangeEncode.setChar(rs.getString( MAX_SCORE )) );
			objData.setMinScore( ChangeEncode.setChar(rs.getString( MIN_SCORE )) );
			objData.setStayTime( ChangeEncode.setChar(rs.getString( STAY_TIME )) );
			objData.setLessonLocation( ChangeEncode.setChar(rs.getString( LESSON_LOCATION )) );
			objData.setExist( ChangeEncode.setChar(rs.getString( EXIST )) );
			objData.setUserID( ChangeEncode.setChar(rs.getString( USERID )) );
			objData.setLoID( ChangeEncode.setChar( rs.getString( LOID )) );
			objData.setSessionID( ChangeEncode.setChar(rs.getString( SESSIONID )) );
			objData.setUid( ChangeEncode.setChar(rs.getString( UID )) );

			// 結果格納用Vectorに格納
			vecResult.add( objData );
		}

		// 配列に変換
		objResult = new AiccCoreRecord[vecResult.size()];
		vecResult.copyInto( objResult );

		return objResult;
	}

	/**
	 * WBT教材ステータス取得　AiccCoreテーブルからステータスを取得します
	 * @param strUserID ユーザーID
	 * @param strLOID   LOID
	 * @param strUID    UIDリスト
	 * @param objDataAccess データアクセスオブジェクト
	 * @return char 検索結果のステータス
	 * @exception SQLException データベースエラー
	 */
	public char getStatus(	String strUserID,
							String strLOID,
							String[] strUID,
							DataAccess objDataAccess )
		throws SQLException
	{
		char charRet = FAILED;	// ステータス
		String STATUS_COUNTER = "status_counter";
		int intCnt = 0;

		// UIDのリスト
		StringBuffer strUIDTemp = new StringBuffer();
		for( int i = 0; i < strUID.length; i++ ) {
			strUIDTemp.append( "'" + StringEscapeUtils.escapeSql(strUID[i]) + "'," );
		}
		String strUIDList = strUIDTemp.substring(0,strUIDTemp.length()-1);

		/*
		 * 合格判定
		 */
		// 検索SQLの組み立て
		StringBuffer sbPSQL = new StringBuffer();
		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv = new Environment();
			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				sbPSQL.append("SELECT COUNT(DISTINCT " + UID + ") AS " + STATUS_COUNTER + " ");
			//Oracleの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
				sbPSQL.append("SELECT COUNT(DISTINCT " +"\""+UID+"\"" + ") AS " + STATUS_COUNTER + " ");
			}
			sbPSQL.append("FROM " + TABLE_NAME + " ");
			sbPSQL.append("WHERE " + USERID + "='" + StringEscapeUtils.escapeSql(strUserID) + "' ");
			sbPSQL.append("AND " + LOID + "='"+ StringEscapeUtils.escapeSql(new String(strLOID)) + "' ");

			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				sbPSQL.append("AND UID IN (" + strUIDList + ") ");
			//Oracleの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
				sbPSQL.append("AND"+" \"UID\" "+"IN (" + strUIDList + ") ");
			}

			sbPSQL.append("AND (Lesson_Status LIKE '" + PASSED + "%')");

			// 合格件数取得
			ResultSet rsP = objDataAccess.executeQuery(sbPSQL.toString());

			while( rsP.next() ) {
				intCnt = rsP.getInt( STATUS_COUNTER );
			}

			// 全ページ合格の場合
			if(intCnt == strUID.length){
				charRet = PASSED;
				return charRet;
			}

			/*
			 * 修了判定
			 */
			// 検索SQLの組み立て
			StringBuffer sbCSQL = new StringBuffer();
			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				sbCSQL.append("SELECT COUNT(DISTINCT " + UID + ") AS " + STATUS_COUNTER + " ");
			//Oracleの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
				sbCSQL.append("SELECT COUNT(DISTINCT " +" \""+UID+"\"" + ") AS " + STATUS_COUNTER + " ");
			}
			sbCSQL.append("FROM " + TABLE_NAME + " ");
			sbCSQL.append("WHERE " + USERID + "='" + StringEscapeUtils.escapeSql(strUserID) + "' ");
			sbCSQL.append("AND " + LOID + "='"+ StringEscapeUtils.escapeSql(new String(strLOID)) + "' ");

			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				sbCSQL.append("AND UID IN (" + strUIDList + ") ");
			//Oracleの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
				sbCSQL.append("AND"+" \"UID\" "+"IN (" + strUIDList + ") ");
			}
			sbCSQL.append("AND (Lesson_Status LIKE '" + PASSED + "%' OR Lesson_Status LIKE '" + COMPLETED + "%')");

			// 修了件数取得
			ResultSet rsC = objDataAccess.executeQuery(sbCSQL.toString());

			intCnt = 0;
			while( rsC.next() ) {
				intCnt = rsC.getInt( STATUS_COUNTER );
			}

			// 全ページ修了の場合
			if(intCnt == strUID.length){
				charRet = COMPLETED;
				return charRet;
			}
		}
		catch(Exception ex)
		{

		}
		return charRet;
	}


	/**
	 * WBT教材個別ログ　AiccCoreテーブルからログ件数*100を取得します
	 * @param strUserID 	ユーザID
	 * @param strLOID 		LOID
	 * @param strSessionID 	セッションID
	 * @param objDataAccess データアクセスオブジェクト
	 * @return ログ件数*100
	 * @exception SQLException データベースエラー
	 */
	public String getFullScore(String strUserID,
								String strLOID,
								String strSessionID,
								DataAccess objDataAccess )
		throws SQLException
	{
		// 検索SQLの組み立て
		StringBuffer sbPSQL = new StringBuffer();
		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv=new Environment();
			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				sbPSQL.append("SELECT COUNT(DISTINCT UID) * 100 AS FullScore ");
			//Oracleの場合 OR PostgreSQLの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				sbPSQL.append("SELECT COUNT(DISTINCT"+" \"UID\""+") * 100 AS FullScore ");
			}

			sbPSQL.append("FROM " + TABLE_NAME + " ");
			sbPSQL.append("WHERE " + USERID + "='" + StringEscapeUtils.escapeSql(strUserID) + "' ");
			sbPSQL.append("AND " + LOID + "='"+ StringEscapeUtils.escapeSql(strLOID) + "' ");
			sbPSQL.append("AND " + RAW_SCORE + " IS NOT NULL ");
		}
		catch(Exception ex)
		{

		}

		DebugLog.write( this.getClass(),sbPSQL.toString(), DebugLog.ROW );

		// 満点値取得
		ResultSet rs = objDataAccess.executeQuery(sbPSQL.toString());

		// デフォルトで0
		String strRet = "0";
		if( rs.next() ) {
			strRet = rs.getString(1);
		}

		return strRet;
	}
	/**
	 * WBT教材個別ログ　AiccCoreテーブルからMaxScoreの合計値を取得します
	 * @param strUserID 	ユーザID
	 * @param strLOID 		LOID
	 * @param strSessionID 	セッションID
	 * @param objDataAccess データアクセスオブジェクト
	 * @return MaxScoreの合計値
	 * @exception SQLException データベースエラー
	 */
	public String getSumMaxScore(	String strUserID,
									String strLOID,
									String strSessionID,
									DataAccess objDataAccess)
		throws SQLException
	{
		// 合計値取得
		return getSumScore(strUserID, strLOID, strSessionID, objDataAccess, MAX_SCORE);
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルからMinScoreの合計値を取得します
	 * @param strUserID 	ユーザID
	 * @param strLOID 		LOID
	 * @param strSessionID 	セッションID
	 * @param objDataAccess データアクセスオブジェクト
	 * @return MinScoreの合計値
	 * @exception SQLException データベースエラー
	 */
	public String getSumMinScore(	String strUserID,
									String strLOID,
									String strSessionID,
									DataAccess objDataAccess)
		throws SQLException
	{
		// 合計値取得
		return getSumScore(strUserID, strLOID, strSessionID, objDataAccess, MIN_SCORE);
	}
	/**
	 * WBT教材個別ログ　AiccCoreテーブルからRawScoreの合計値を取得します
	 * @param strUserID 	ユーザID
	 * @param strLOID 		LOID
	 * @param strSessionID 	セッションID
	 * @param objDataAccess データアクセスオブジェクト
	 * @return RawScoreの合計値
	 * @exception SQLException データベースエラー
	 */
	public String getSumRawScore(	String strUserID,
									String strLOID,
									String strSessionID,
									DataAccess objDataAccess)
		throws SQLException
	{
		// 合計値取得
		return getSumScore(strUserID, strLOID, strSessionID, objDataAccess, RAW_SCORE);
	}

	/**
	 * WBT教材個別ログ　AiccCoreテーブルからstrFieldNameの合計値を取得します
	 * @param strUserID 	ユーザID
	 * @param strLOID 		LOID
	 * @param strSessionID 	セッションID
	 * @param objDataAccess データアクセスオブジェクト
	 * @param strFieldName 	合計するフィールド名
	 * @return strFieldNameの合計値
	 * @exception SQLException データベースエラー
	 */
	private String getSumScore(	String strUserID,
								String strLOID,
								String strSessionID,
								DataAccess objDataAccess,
								String strFieldName )
		throws SQLException
	{
		// 検索SQLの組み立て
		StringBuffer sbPSQL = new StringBuffer();
		// デフォルトで0
		String strRet = "0";
		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv = new Environment();

			if(strFieldName != null && !strFieldName.equals(RAW_SCORE))
			{
				sbPSQL.append("SELECT SUM(MaxScore) AS MaxScore, SUM(MinScore) AS MinScore ");
				sbPSQL.append("FROM (SELECT MAX(MaxScore) AS MaxScore, MIN(MinScore) AS MinScore ");
				sbPSQL.append("FROM " + TABLE_NAME + " ");
				sbPSQL.append("WHERE " + USERID + "='" + StringEscapeUtils.escapeSql(strUserID) + "' ");
				sbPSQL.append("AND " + LOID + "='"+ StringEscapeUtils.escapeSql(strLOID) + "' ");

				//SQLServerの場合
				if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
					sbPSQL.append("GROUP BY UserID, LOID, UID) WorkTable");
				//Oracleの場合 OR PostgreSQLの場合
				}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
					sbPSQL.append("GROUP BY UserID, LOID,"+"\"UID\""+") WorkTable");
				}

				DebugLog.write( this.getClass(),sbPSQL.toString(), DebugLog.ROW );

				// 最高得点と最低得点の集計値取得
				ResultSet rs = objDataAccess.executeQuery(sbPSQL.toString());
				if( rs.next() ) {
					if(strFieldName != null && strFieldName.equals(MAX_SCORE))
					{
						strRet = rs.getString("MaxScore");
					}
					else if(strFieldName != null && strFieldName.equals(MIN_SCORE))
					{
						strRet = rs.getString("MinScore");
					}
				}
			}
			else if(strFieldName != null && strFieldName.equals(RAW_SCORE))
			{
				sbPSQL.append("SELECT SUM(AiccCore.RawScore) ");
				//SQLServerの場合
				if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
					sbPSQL.append("FROM (SELECT UID, USERID, LOID, MAX(CONVERT(INT,SessionID)) AS SessionID ");
				//Oracleの場合
				}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
						sbPSQL.append("FROM (SELECT "+"\"UID\""+", USERID, LOID, MAX(TO_NUMBER(SessionID)) AS SessionID ");
				//PostgreSQLの場合
				}else if(objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
						sbPSQL.append("FROM (SELECT "+"\"UID\""+", USERID, LOID, MAX(TO_NUMBER(SessionID,'99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999')) AS SessionID ");
				}
				sbPSQL.append("FROM " + TABLE_NAME + " ");
				sbPSQL.append("WHERE " + USERID + "='" + StringEscapeUtils.escapeSql(strUserID) + "' ");
				sbPSQL.append("AND " + LOID + "='"+ StringEscapeUtils.escapeSql(strLOID) + "' ");
				//SQLServerの場合
				if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
					sbPSQL.append("GROUP BY UID, LOID, UserID) WORK INNER JOIN ");
					sbPSQL.append("AiccCore ON WORK .UID = AiccCore.UID AND ");
				//Oracleの場合 OR PostgreSQLの場合
				}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
					sbPSQL.append("GROUP BY "+"\"UID\""+", LOID, UserID) WORK INNER JOIN ");
					sbPSQL.append("AiccCore ON WORK ."+"\"UID\""+" = AiccCore."+"\""+UID+"\""+" AND ");
				}

				if ( objEnv.getDBType().equals( Environment.DB_SQLSERVER )
						|| objEnv.getDBType().equals( Environment.DB_ORACLE ) ) {
					// SQLServer又はOracleの場合
					sbPSQL.append( "WORK .SessionID = AiccCore.SessionID AND " );
					sbPSQL.append( "WORK .USERID = AiccCore.UserID AND WORK .LOID = AiccCore.LOID" );

				} else {
					// PostgreSQLの場合
					sbPSQL.append("WORK .SessionID = TO_NUMBER(AiccCore.SessionID,'99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999')  AND ");
					sbPSQL.append("WORK .USERID = AiccCore.UserID AND WORK .LOID = AiccCore.LOID");
				}


				DebugLog.write( this.getClass(),sbPSQL.toString(), DebugLog.ROW );

				// 得点の集計値取得
				ResultSet rs = objDataAccess.executeQuery(sbPSQL.toString());
				if(rs.next())
				{
					strRet = rs.getString(1);
				}
			}
		}
		catch(Exception ex)
		{

		}
		return strRet;
	}

	/**
	 * 登録、更新処理時のデータを組み立てます
	 * @param htData
	 * @return Hashtable
	 */
	private Hashtable changeData( AiccCoreRecord objRecord ) {
		Hashtable htbData = new Hashtable();
		// レッスンステータス
		putData( htbData, LESSON_STATUS, objRecord.getLessonStatus() );
		putData( htbData, RAW_SCORE, objRecord.getRawScore() );
		putData( htbData, MAX_SCORE, objRecord.getMaxScore() );
		putData( htbData, MIN_SCORE, objRecord.getMinScore() );
		putData( htbData, STAY_TIME, objRecord.getStayTime() );
		putData( htbData, LESSON_LOCATION, objRecord.getLessonLocation() );
		putData( htbData, EXIST, objRecord.getExist() );
		putData( htbData, USERID, objRecord.getUserID() );
		putData( htbData, LOID, objRecord.getLoID() );
		putData( htbData, SESSIONID, objRecord.getSessionID() );
		putData( htbData, UID, objRecord.getUid() );

		return htbData;
	}

	/**
	 * 安全にHashtableに追加するメソッドです
	 */
	private void putData( Hashtable htbData, String strKey, String strValue ) {
		if( strValue != null && !strValue.equals( "" ) ) {
			htbData.put( strKey, strValue );
		}
	}


}