/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。
日本電信電話株式会社により創作された部分は、Copyright (C) 2004
日本電信電話株式会社 です。
全ての権利が留保されます。
「コントリビュータ」：_____________________________________


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION.
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
//	IndividualLogGroupProgressLogic
//	変更履歴
//		2004.02.01	新規作成
//		2004.10.01	M010		A.Shimoma
//

package jp.co.ntt.lms.xms.logsumup.scorm;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xms.logsumup.*;
import jp.co.ntt.lms.xmo.DataAccess;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.util.ChangeEncode;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsInnerException;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.base.Logic;
import jp.co.ntt.lms.xms.framework.base.LogicResult;
import jp.co.ntt.lms.xms.logsumup.scorm.ScormItemList;

/**
 * ログ集計グループ比較集計ロジック・クラス。<br>
 */
public class IndividualLogGroupProgressLogic implements Logic {

// 20041001 M010 ADD start NTTR(N)
	/**
	 * IN句に連結可能な設定値
	 */
	private static final int MAXCONNECTECOUNT = 1000;

	/**
	 * IN句に連結時に用いるカラム名
	 */
	private static final String GROUP_ID = "group_id";
// 20041001 M010 ADD end

	/**
     * リクエストされたグループID
     */
    private String GroupID;
    /**
     * リクエストされたLOID
     */
    private String LOID;
    /**
     * リクエストされたLoType
     */
    private String LOType;
    /**
     * リクエストされた配下フラグ
     */
    private String Reflex;
	/**
	 * リクエストされたモードフラグ
	 */
	private String mode;
    /**
     * セッションより取り出された教材構造
     */
    private ScormItemList CurrentScormNode;

    /**
     * 集計結果格納クラス
     */
    IndividualLogGroupProgressResult result = new IndividualLogGroupProgressResult();

    /**
     * コンストラクタ。<br>
     */
    public IndividualLogGroupProgressLogic() {
    }

    /**
     * コンストラクタ。<br>
     * @param GroupID 画面で選択したグループID
     * @param LOID 画面で選択したLOID
     * @param LOType LOタイプ
     * @param Reflex
     * @param mode
     * @param itemList
     */
    public IndividualLogGroupProgressLogic(
        String GroupID,
        String LOID,
        String LOType,
        String Reflex,
		String mode,
        ScormItemList itemList)
        throws XmsException {

        // パラメータチェック
		if (LOID.equals("")
            || GroupID.equals("")
            || LOType.equals("")
            || itemList == null){
            throw new XmsInnerException("parameter is null.");
        }

        this.LOID = LOID;
        this.GroupID = GroupID;
        this.LOType = LOType;
		this.Reflex = Reflex;
		this.mode = mode;
		// 教材リストを作成し設定
        this.CurrentScormNode = itemList;
    }

    /**
     * 集計ロジック・メソッド。<br>
     * 個別ログメニュー画面より選択されたActivityID数回分、<br>、
     * 配下のログデータを取得し集計します。<br>
     * @param dataAccess DataAccessオブジェクト
     * @return LogicResult 集計結果
     * @exception XmsException
     * @see IndividualLogGroupProgressResult
     */
    public LogicResult doLogic(DataAccess dataAccess) throws XmsException {

        // パラメータチェック
        if (dataAccess == null) {
            throw new XmsInnerException("parameter is null.");
        }

        ResultSet rs = null;

        try {
            // ログ共通用Commonクラスの生成
            LoLogCommon_inc cominc = new LoLogCommon_inc();

			// アサイン情報取得
			AssignmentsClient asclient = new AssignmentsClient();
			String strGroupFlag = null;
			if ( Reflex.equals("") ) {
				// グループ直下
				strGroupFlag = "off";
			} else {
				// グループ配下全てのユーザー（ＣＳＶ出力指定時）
				strGroupFlag = "on";
			}
			// アサイン情報生成
			asclient.getAssignInfo(null,GroupID,LOID,0,strGroupFlag);

			// LO情報取得
			LoClient loclient = new LoClient();
			loclient.setWhereLoID(LOID);
			loclient.select();
			loclient.next();
			// リアルLOIDを取得。
			String strRealLoID 			= loclient.getRealLOID();
			// ＬＯＩＤ設定
			result.strLOID   			= strRealLoID;
			// ＬＯタイトル設定
			result.strLOName   			= loclient.getLoTytle();
			// 外部ＬＯＩＤ設定
			result.strForeignLOID		= loclient.getForeignID();
			// グループ情報取得
			String[] strHeadGroupDetails = new String[2];
			strHeadGroupDetails = cominc.getGroupDetails(GroupID);
			// グループ名設定
			result.strGroupName			= strHeadGroupDetails[0];
			// グループ外部ID設定
			result.strGroupForeignId	= strHeadGroupDetails[1];
			// 個別リスト情報生成
            try {
				// 検索条件取得
				// 配下グループ一覧or直下グループを取得
				List groupIdList = new ArrayList();
// 20041001 M010 DEL start-end NTTR(N)
				if ( Reflex.equals("") ) {
					groupIdList.add(GroupID);
				} else {
					GroupAndPeopleClient GapClient = new GroupAndPeopleClient();
					// GroupId配下のグループIDを取得
					groupIdList = GapClient.getGroupIdList(GroupID, groupIdList);
				}
// 20041001 M010 DEL start-end NTTR(N)

				// AUリスト生成
				List AUList = new ArrayList();
				List AUSqlList = new ArrayList();
				for(int i = 0 ; i < CurrentScormNode.getMaxRow() ; i++){
					// ＣＳＶ出力用に最初のノード名を取得する
					if(i == 0){
						result.strSectionName = CurrentScormNode.getAuTitle(0);
					}
					// ASSET又はSCOのタイプのみ条件文に追加
					if( CurrentScormNode.getAuType(i) == ScormNodeConst.ASSET_NODE ||
						CurrentScormNode.getAuType(i) == ScormNodeConst.SCO_NODE)
					{
						// ＳＱＬ発行する為の集計対象ActivityIDをリストへ設定
						AUList.add(CurrentScormNode.getAuID(i));
						// ＡＵ数を同時に設定(assetとscoのみの数を集計)
						result.flActCount++;
					}
				}
				// AUSQL条件文発行回数を取得
				AUSqlList = commaParseForSQL( AUList );

                // SQL文生成
                StringBuffer sbSQL = new StringBuffer();
				sbSQL.append("SELECT ");
				sbSQL.append(	"A.groupid				as groupid, ");
				sbSQL.append(	"A.groupname			as groupname, ");
				sbSQL.append(	"A.userid				as userid, ");
				sbSQL.append(	"A.username				as username, ");
				sbSQL.append(	"B.loid					as loid, ");
				sbSQL.append(	"B.StudySessionCount	as StudySessionCount, ");
				sbSQL.append(	"B.ActivityCnt			as ActivityCnt, ");
				sbSQL.append(	"B.AccessCnt			as AccessCnt, ");
				sbSQL.append(	"B.stStudydate			as stStudydate, ");
				sbSQL.append(	"B.edStudydate			as edStudydate, ");
				sbSQL.append(	"B.totaltime			as TotalTime, ");
				sbSQL.append(	"B.NewestScaledScore	as NewScaledScore, ");
				sbSQL.append(	"B.NewestRawScore		as NewRawScore, ");
				sbSQL.append(	"B.MaxScaledScore		as MaxScaledScore, ");
				sbSQL.append(	"B.MaxRawScore			as MaxRawScore, ");
				sbSQL.append(	"B.CompStNum			as CompNum, ");
				sbSQL.append(	"B.SuccStNum			as SuccNum ");
				sbSQL.append("FROM ");
				sbSQL.append(	"(SELECT ");
				sbSQL.append(		"GAP.groupid	as	groupid, ");
				sbSQL.append(		"GAP.groupname	as	groupname, ");
				sbSQL.append(		"PE.user_id		as	userid, ");
				sbSQL.append(		"PE.user_name	as	username ");
				sbSQL.append(	"FROM ");
				sbSQL.append(		"(SELECT ");
				sbSQL.append(			"user_id, ");
				sbSQL.append(			"user_name ");
				sbSQL.append(		"FROM ");
				sbSQL.append(			"people ");
				sbSQL.append(		") PE ");
				sbSQL.append(	"INNER JOIN ");
				sbSQL.append(		"(SELECT ");
				sbSQL.append(			"group_name		as groupname, ");
				sbSQL.append(			"group_id    	as groupid, ");
				sbSQL.append(			"gap.childid 	as userid ");
				sbSQL.append(		"FROM ");
				sbSQL.append(			"(SELECT ");
				sbSQL.append(				"* ");
				sbSQL.append(			"FROM ");
				sbSQL.append(				"groups ");
				sbSQL.append(			"WHERE ");
// 20041001 M010 DEL start-end NTTR(N)

// 20041001 M010 ADD start NTTR(N)
				// 配下のグループを設定
				List groupIdConnectList = commaParseForSQL( groupIdList );
				String inGroupID = inConnection( groupIdConnectList );
				sbSQL.append(			inGroupID );
// 20041001 M010 ADD end
				sbSQL.append(			") grp ");
				sbSQL.append(		"INNER JOIN ");
				sbSQL.append(			"groupandpeople gap ");
				sbSQL.append(		"ON ");
				sbSQL.append(			"grp.group_id = gap.parentid ");
				sbSQL.append(		") GAP ");
				sbSQL.append(	"ON ");
				sbSQL.append(		"PE.user_id = GAP.userid ");
				sbSQL.append(	") A ");
				sbSQL.append("LEFT OUTER JOIN ");
				sbSQL.append(	"(SELECT ");
				sbSQL.append(		"A.userid					as userid, ");
				sbSQL.append(		"A.loid						as loid, ");
				sbSQL.append(		"A.StudySessionCount		as StudySessionCount, ");
				sbSQL.append(		"count(*)					as ActivityCnt, ");
				sbSQL.append(		"SUM(A.AccessCnt)			as AccessCnt, ");
				sbSQL.append(		"MIN(A.stStudydate)			as stStudydate, ");
				sbSQL.append(		"MAX(A.edStudydate)			as edStudydate, ");
				sbSQL.append(		"SUM(A.TotalTime)			as totaltime, ");
				sbSQL.append(		"SUM(A.MaxScaled)			as MaxScaledScore, ");
				sbSQL.append(		"SUM(A.MaxRawScaled)		as MaxRawScore, ");
				sbSQL.append(		"SUM(A.CompStNum)			as CompStNum, ");
				sbSQL.append(		"SUM(A.SuccStNum)			as SuccStNum, ");
				sbSQL.append(		"SUM(A.NewestScaledScore)	as NewestScaledScore, ");
				sbSQL.append(		"SUM(A.NewestRawScore)		as NewestRawScore ");
				sbSQL.append(	"FROM ");
				sbSQL.append(		"(SELECT ");
				sbSQL.append(			"A.userid				as userid, ");
				sbSQL.append(			"A.loid					as loid, ");
				sbSQL.append(			"A.StudySessionCount	as StudySessionCount, ");
				sbSQL.append(			"A.ActivityID			as ActivityID, ");
				sbSQL.append(			"A.AccessCnt			as AccessCnt, ");
				sbSQL.append(			"A.stStudydate			as stStudydate, ");
				sbSQL.append(			"A.edStudydate			as edStudydate, ");
				sbSQL.append(			"A.TotalTime			as totaltime, ");
				sbSQL.append(			"A.MaxScaled			as MaxScaled, ");
				sbSQL.append(			"A.MaxRawScaled			as MaxRawScaled, ");
				sbSQL.append(			"A.CompStNum			as CompStNum, ");
				sbSQL.append(			"A.SuccStNum			as SuccStNum, ");
				sbSQL.append(			"B.NewestScaledScore	as NewestScaledScore, ");
				sbSQL.append(			"B.NewRawScore			as NewestRawScore ");
				sbSQL.append(		"FROM ");
				sbSQL.append(			"(SELECT ");
				sbSQL.append(				"A.userid						as userid, ");
				sbSQL.append(				"A.loid							as loid, ");
				sbSQL.append(				"A.StudySessionCount			as StudySessionCount, ");
				sbSQL.append(				"A.ActivityID					as ActivityID, ");
				sbSQL.append(				"count(*)						as AccessCnt, ");
				sbSQL.append(				"MIN(A.learnSession_date)		as stStudydate, ");
				sbSQL.append(				"MAX(A.learnSession_date)		as edStudydate, ");
				sbSQL.append(				"SUM(A.Attempt_Session_time)	as TotalTime, ");
				sbSQL.append(				"MAX(A.ScaledScore)				as MaxScaled, ");
				sbSQL.append(				"MAX(A.RawScore)				as MaxRawScaled, ");
				sbSQL.append(				"CASE SUM(CASE A.completion_status	WHEN 'completed' THEN	1	ELSE	0	END) WHEN	0 THEN 0 ELSE 1 END	as CompStNum, ");
				sbSQL.append(				"CASE SUM(CASE A.Success_status		WHEN 'passed'	 THEN	1	ELSE	0	END) WHEN	0 THEN 0 ELSE 1 END	as SuccStNum ");
				sbSQL.append(			"FROM ");
				sbSQL.append(				"scorm_attempt A ");
				sbSQL.append(			"INNER JOIN ");
				// モードにて学習回数を全て取得するか最新のみ取得するかを分岐する
				sbSQL.append(				"(SELECT ");
				if ( mode.equals("") ) {
				sbSQL.append(					"userid					as userid, ");
				sbSQL.append(					"loid					as loid, ");
				sbSQL.append(					"MAX(studySessionCount)	as studySessionCount ");
				sbSQL.append(				"FROM ");
				sbSQL.append(					"scormsession ");
				sbSQL.append(				"WHERE ");
				sbSQL.append(					"loid = '" + StringEscapeUtils.escapeSql(strRealLoID) + "' ");
				sbSQL.append(				"GROUP BY ");
				sbSQL.append(					"userid,loid ");
				}else{
				sbSQL.append(					"userid					as userid, ");
				sbSQL.append(					"loid					as loid, ");
				sbSQL.append(					"studySessionCount		as studySessionCount ");
				sbSQL.append(				"FROM ");
				sbSQL.append(					"scormsession ");
				sbSQL.append(				"WHERE ");
				sbSQL.append(					"loid = '" + StringEscapeUtils.escapeSql(strRealLoID) + "' ");
				sbSQL.append(				"GROUP BY ");
				sbSQL.append(					"userid,loid,studySessionCount ");
				}
				sbSQL.append(				") B ");
				sbSQL.append(			"ON ");
				sbSQL.append(				"A.userid = B.userid ");
				sbSQL.append(			"AND ");
				sbSQL.append(				"A.loid = B.loid ");
				sbSQL.append(			"AND ");
				sbSQL.append(				"A.StudySessionCount = B.StudySessionCount ");
				sbSQL.append(			"GROUP BY ");
				sbSQL.append(				"A.userid,A.loid,A.StudySessionCount,A.activityid ");
				sbSQL.append(			") A ");
				sbSQL.append(		"INNER JOIN ");
				sbSQL.append(			"(SELECT ");
				sbSQL.append(				"A.userid				as userid, ");
				sbSQL.append(				"A.ActivityID			as activityID, ");
				sbSQL.append(				"A.loid					as loid, ");
				sbSQL.append(				"A.StudySessionCount	as StudySessionCount, ");
				sbSQL.append(				"A.AttemptCount			as AttemptCount, ");
				sbSQL.append(				"A.LearnSessionCount	as LearnSessionCount, ");
				sbSQL.append(				"A.ScaledScore			as NewestScaledScore, ");
				sbSQL.append(				"A.RawScore				as NewRawScore ");
				sbSQL.append(			"FROM ");
				sbSQL.append(				"scorm_attempt A ");
				sbSQL.append(			"INNER JOIN ");
				sbSQL.append(				"(SELECT ");
				sbSQL.append(					"A.userid					as userid, ");
				sbSQL.append(					"A.ActivityID				as activityID, ");
				sbSQL.append(					"A.loid						as loid, ");
				sbSQL.append(					"A.StudySessionCount		as StudySessionCount, ");
				sbSQL.append(					"A.AttemptCount				as AttemptCount, ");
				sbSQL.append(					"MAX(A.LearnSessionCount)	as LearnSessionCount ");
				sbSQL.append(				"FROM ");
				sbSQL.append(					"scorm_attempt A ");
				sbSQL.append(				"INNER JOIN ");
				sbSQL.append(					"(SELECT ");
				sbSQL.append(						"A.userid				as userid, ");
				sbSQL.append(						"A.ActivityID			as activityID, ");
				sbSQL.append(						"A.loid					as loid, ");
				sbSQL.append(						"A.StudySessionCount	as StudySessionCount, ");
				sbSQL.append(						"MAX(A.AttemptCount)	as AttemptCount ");
				sbSQL.append(					"FROM ");
				sbSQL.append(						"scorm_attempt A ");
				sbSQL.append(					"INNER JOIN ");
				sbSQL.append(						"(SELECT ");
				// モードにて学習回数を全て取得するか最新のみ取得するかを分岐する
				if ( mode.equals("") ) {
				sbSQL.append(							"userid					as userid, ");
				sbSQL.append(							"loid					as loid, ");
				sbSQL.append(							"MAX(studySessionCount)	as studySessionCount ");
				sbSQL.append(						"FROM ");
				sbSQL.append(							"scormsession ");
				sbSQL.append(						"WHERE ");
				sbSQL.append(							"loid = '" + StringEscapeUtils.escapeSql(strRealLoID) + "' ");
				sbSQL.append(						"GROUP BY ");
				sbSQL.append(							"userid,loid ");
				}else{
				sbSQL.append(							"userid					as userid, ");
				sbSQL.append(							"loid					as loid, ");
				sbSQL.append(							"studySessionCount		as studySessionCount ");
				sbSQL.append(						"FROM ");
				sbSQL.append(							"scormsession ");
				sbSQL.append(						"WHERE ");
				sbSQL.append(							"loid = '" + StringEscapeUtils.escapeSql(strRealLoID) + "' ");
				sbSQL.append(						"GROUP BY ");
				sbSQL.append(							"userid,loid,studySessionCount ");
				}
				sbSQL.append(						") B ");
				sbSQL.append(					"ON ");
				sbSQL.append(						"A.userid = B.userid ");
				sbSQL.append(					"AND ");
				sbSQL.append(						"A.loid = B.loid ");
				sbSQL.append(					"AND ");
				sbSQL.append(						"A.StudySessionCount = B.StudySessionCount ");
				sbSQL.append(					"GROUP BY ");
				sbSQL.append(						"A.userid,A.loid,A.activityid,A.StudySessionCount ");
				sbSQL.append(					") B ");
				sbSQL.append(				"ON ");
				sbSQL.append(					"A.userid = B.userid ");
				sbSQL.append(				"AND ");
				sbSQL.append(					"A.loid = B.loid ");
				sbSQL.append(				"AND ");
				sbSQL.append(					"A.activityid = B.activityid ");
				sbSQL.append(				"AND ");
				sbSQL.append(					"A.StudySessionCount = B.StudySessionCount ");
				sbSQL.append(				"AND ");
				sbSQL.append(					"A.AttemptCount = B.AttemptCount ");
				sbSQL.append(				"GROUP BY ");
				sbSQL.append(					"A.userid,A.loid,A.activityid,A.StudySessionCount,A.AttemptCount ");
				sbSQL.append(				") B ");
				sbSQL.append(			"ON ");
				sbSQL.append(				"A.userid = B.userid ");
				sbSQL.append(			"AND ");
				sbSQL.append(				"A.loid = B.loid ");
				sbSQL.append(			"AND ");
				sbSQL.append(				"A.activityid = B.activityid ");
				sbSQL.append(			"AND ");
				sbSQL.append(				"A.StudySessionCount = B.StudySessionCount ");
				sbSQL.append(			"AND ");
				sbSQL.append(				"A.AttemptCount = B.AttemptCount ");
				sbSQL.append(			"AND ");
				sbSQL.append(				"A.LearnSessionCount = B.LearnSessionCount ");
				sbSQL.append(			") B ");
				sbSQL.append(		"ON ");
				sbSQL.append(			"A.userid = B.userid ");
				sbSQL.append(		"AND ");
				sbSQL.append(			"A.loid = B.loid ");
				sbSQL.append(		"AND ");
				sbSQL.append(			"A.activityid = B.activityid ");
				sbSQL.append(		"AND ");
				sbSQL.append(			"A.StudySessionCount = B.StudySessionCount ");
				sbSQL.append(		") A ");
				sbSQL.append(	"WHERE ");
				// ActivityIDを設定
				for (int i=0;i<AUSqlList.size() ;i++) {
					if ( i == 0 ) {
						sbSQL.append(	"A.ActivityID IN (" + AUSqlList.get(i) + ")");
					}else{
						sbSQL.append("OR ");
						sbSQL.append(	"A.ActivityID IN (" + AUSqlList.get(i) + ")");
					}
				}
				sbSQL.append(	"GROUP BY ");
				sbSQL.append(		"A.userid,A.loid,A.StudySessionCount ");
				sbSQL.append(	") B ");
				sbSQL.append("ON ");
				sbSQL.append(	"A.userid = B.userid ");
				sbSQL.append("ORDER BY ");
				sbSQL.append(	"A.username,B.StudySessionCount ");
				// クエリーの実行
				rs = dataAccess.executeQuery(sbSQL.toString());
				// 取得したレコード数ループ
				List objDbList = new ArrayList();
				while (rs.next()) {
					// ユーザ別集計結果格納データクラス生成
					IndividualLogGroupProgressStoreData user = new IndividualLogGroupProgressStoreData();
					// ユーザ名称設定
					user.strUserName			= rs.getString("username");
					// ユーザＩＤ設定
					user.strUserID				= rs.getString("userid");
					// グループ名称設定
					user.strGroupName			= rs.getString("groupname");
					// グループＩＤ設定
					user.strGroupID				= rs.getString("groupid");
					// 学習回数設定
					user.lngStudySessionCnt 	= rs.getInt("StudySessionCount");
                    // 学習開始日設定
                    user.datStartDate			= rs.getTimestamp("stStudydate");
                    // 最終アクセス日設定
                    user.datEndDate 			= rs.getTimestamp("edStudydate");
					// Activity数設定
					user.lngActivityCnt			= rs.getLong("ActivityCnt");
                    // アクセス回数設定
					user.lngAccessCount 		= rs.getLong("AccessCnt");
                    // 累積滞在時間設定
					user.dwResidanceTime 		= rs.getDouble("TotalTime");
					// 正規化済み得点（最新）設定
					user.dwStoreScaledNewScore	= rs.getDouble("NewScaledScore");
					// 得点（最新）設定
					user.dwStoreNewScore 		= rs.getDouble("NewRawScore");
					// 正規化済み得点（最高）設定
					user.dwStoreScaledMaxScore	= rs.getDouble("MaxScaledScore");
                    // 得点（最高）設定
					user.dwStoreMaxScore		= rs.getDouble("MaxRawScore");
                    // 完了ユニット設定
					user.lngUnitComplete		= rs.getInt("CompNum");
					// 合格ユニット設定
					user.lngUnitPass 			= rs.getInt("SuccNum");
					// アサイン情報設定
					user.blAssign 				= asclient.isAssign(ChangeEncode.setChar(rs.getString("userid")),LOID);
					// 取得したレコードをセット
					objDbList.add(user);
				}
				ResultCreate(objDbList);
			} catch (Exception e) {
				throw new XmsSystemException(e);
			} finally {
				// 終期処理
				if (rs != null) {
					try {
						rs.close();
					} catch (Exception e) {
						throw new XmsSystemException(e);
					}
					rs = null;
				}
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
		return result;
	}

	/**
	 * 画面出力レコード返却・メソッド。<br>
	 * ＤＢから取得したレコードを画面出力用編集を行う
	 * @return List
	 * @exception XmsException
	 * @see IndividualLogGroupProgressResult
	 */
	private void ResultCreate(List lstDbData){
		// 集計用ユーザ名保持領域
		String tmpUserName = "";
		// ＤＢ取得データにてループ
		for(int i = 0 ; i < lstDbData.size() ; i++ ){
			// １レコードに対する情報を取得
			IndividualLogGroupProgressStoreData objDb
				= (IndividualLogGroupProgressStoreData)lstDbData.get(i);		// ＤＢデータオブジェクトを取得
			// レコードの有効無効を判定
			if(objDb.lngAccessCount > 0){
				// 有効レコードフラグ設定
				objDb.blRecValid = true;
				// 滞在時間編集処理
				if(objDb.dwResidanceTime > 0){
					// 累積滞在時間集計処理
					objDb.dwResidanceTime = objDb.dwResidanceTime / 60;
				}
				////////////////////////////////////////////
				// 集計処理
				////////////////////////////////////////////
				if(objDb.lngActivityCnt > 0){
					// Activity数集計処理
					result.flActivitySumCnt = result.flActivitySumCnt + objDb.lngActivityCnt;
				}
				if(objDb.lngAccessCount > 0){
					// アクセス数（回）集計処理
					result.flAccessCountCnt = result.flAccessCountCnt + objDb.lngAccessCount;
				}
				if(objDb.dwResidanceTime > 0){
					// 累積滞在時間集計処理
					result.dwResidanceTimeCnt = result.dwResidanceTimeCnt + objDb.dwResidanceTime;
				}
				if(objDb.dwStoreScaledNewScore > 0){
					// データのパーセント変換
					objDb.dwStoreScaledNewScore = objDb.dwStoreScaledNewScore * 100;
					// 正規化済み得点（最新）集計処理（パーセント表記にて集計を行う）
					result.dwStoreScaledNewScore = result.dwStoreScaledNewScore + objDb.dwStoreScaledNewScore ;
				}
				if(objDb.dwStoreNewScore > 0){
					// 得点（最新）集計処理
					result.dwStoreNewScore = result.dwStoreNewScore + objDb.dwStoreNewScore;
				}
				if(objDb.dwStoreScaledMaxScore > 0 ){
					// データのパーセント変換
					objDb.dwStoreScaledMaxScore = objDb.dwStoreScaledMaxScore * 100;
					// 正規化済み得点（最高）集計処理（パーセント表記にて集計を行う）
					result.dwStoreScaledMaxScore = result.dwStoreScaledMaxScore + objDb.dwStoreScaledMaxScore;
				}
				if(objDb.dwStoreMaxScore > 0){
					// 得点（最高）集計処理
					result.dwStoreMaxScore = result.dwStoreMaxScore + objDb.dwStoreMaxScore;
				}
				// ユーザ数設定
				if(!(tmpUserName.equals(objDb.strUserName))){
					// 一致しなかった場合はカウントアップして現在ユーザを設定
					tmpUserName = objDb.strUserName;
					result.flUserCount++;
				}
				// 合計完了ユニット数
				result.flUnitComplete = result.flUnitComplete + objDb.lngUnitComplete;
				// 合計合格ユニット数
				result.flUnitPass = result.flUnitPass + objDb.lngUnitPass;
				// 有効レコード数合計
				result.flRecValidCount++;
			}else{
				// 対象ユーザのデータが存在しない場合は初期値を入れる
				// ユーザ数設定
				if(!(tmpUserName.equals(objDb.strUserName))){
					// 一致しなかった場合はカウントアップして現在ユーザを設定
					tmpUserName = objDb.strUserName;
					result.flUserCount++;
				}

			}
			// レコード数合計
			result.flRecCount++;
			// リストへ追加設定
			result.addLog(objDb);
		}
	}

// 20041001 M010 DEL start-end NTTR(N)

// 20041001 M010 ADD start NTTR(N)
	/**
	 * リスト中の文字列を'Param1','Param2',・・・型の文字列にしてリストで戻す。<br>
	 * リストが1000を超える場合には複数の文字列を作成しリストにして戻す。<br>
	 *
	 * @param prmList 文字列リスト
	 * @return List シングルクォーテーションで囲った後カンマ区切りした文字列リスト。
	 */
	private List commaParseForSQL( List prmList ) {

		// ループ数の取得
		int roupCount = getInCount( prmList );
		// 返却用リスト
		List retList = new ArrayList();
		// リストが1000以上の場合は複数回ループ
		// 最低１度はループする。
		for ( int j = 0; j < roupCount; j++ ) {
			// リスト配下のログ集計
			// ループ開始カウント
			int intStart = j * MAXCONNECTECOUNT;
			// ループ終了カウント
			int intEnd = intStart + MAXCONNECTECOUNT;
			// ループ終了カウントよりリストサイズの方が小さい場合
			if ( prmList.size() < intEnd ) {
				intEnd = prmList.size();
			}
			StringBuffer stbTempSQL = new StringBuffer();
			//  ｢,｣ 区切りの文字列にする
			for ( int i = intStart, k =0 ; i < intEnd; i++, k++ ) {
				String strTemp = ( String ) prmList.get( i );
				if ( k == 0 ) {
					stbTempSQL.append( "'" + StringEscapeUtils.escapeSql(strTemp) + "'" );
				} else {
					stbTempSQL.append( ",'" + StringEscapeUtils.escapeSql(strTemp) + "'" );
				}
			}
			retList.add( stbTempSQL.toString() );
		}
		return retList;
	}

	/**
	 * IN句連結回数取得メソッド <BR>
	 * IN句連結回数を取得します。 <BR>
	 * lstが1000以上の場合、複数個分回のIN句をORで連結します。
	 * その為の回数を取得します。
	 *
	 * @param lst 条件となるデータが格納されたリスト
	 * @return sqlCount IN句連結回数
	 */
	private int getInCount(List lst) {

		int sqlCount = 0;

		if (lst.size() >= MAXCONNECTECOUNT) {
			sqlCount = lst.size() / MAXCONNECTECOUNT;
		}
		if (lst.size() % MAXCONNECTECOUNT != 0) {
			sqlCount++;
		}
		return sqlCount;
	}

	/**
	 * クエリーのIN句を生成します。<BR>
	 * 1000個カンマ区切りでIN句に設定します。
	 * 1000以上の場合はORで連結させます。
	 *
	 * @param lst
	 * @return
	 */
	private String inConnection( List lst ) {

		StringBuffer inConnect = new StringBuffer();

		for ( int i = 0; i < lst.size(); i++ ) {
			if ( i != 0 ) {
				inConnect.append( " OR " );
			}
			inConnect.append( GROUP_ID );
			inConnect.append( " IN ( " );
			inConnect.append( lst.get(i) );
			inConnect.append( " ) " );
		}

		return inConnect.toString();
	}
// 20041001 M010 ADD end
}

