/*
このファイルの中身は、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) ______________________________________.
*/

//
//	GroupAndPeople 管理XMO データアクセスクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.xmo.GroupAndPeople;

import java.util.*;
import java.sql.*;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.util.ChangeEncode;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.Message.Message;
import jp.co.ntt.lms.xmo.RoleAssignments.RoleAssignmentsClient;

/**
 * GroupAndPeople 管理XMO データアクセスクラスです。<BR>
 * このクラスはGroupAndPeopleテーブルへの登録、修正、削除、検索処理を実行します。<BR>
 * DataAccessクラスを使用し、登録、修正、削除、検索処理単位で
 * トランザクション管理を行います。
 * @author T.Nijou
 * @version 0.0.0.1 2004/01/08
 */
public class GroupAndPeopleDataAccess
	implements GroupAndPeopleMessage, GroupAndPeopleTable
{
	/**
	 * コンストラクタです。<BR>
	 */
	public GroupAndPeopleDataAccess() {
	}

	/**
	 * GroupAndPeopleテーブルへ登録処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * なおテーブルの主キー以外を省略した場合は省略したフィールドには
	 * Null値が格納されます。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             MEMBER_SHIP_ID          人々ID
	 *             PARENT_ID               親ID
	 *             CHILD_ID                子ID
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 登録情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	synchronized public String insert( Hashtable htData )
		throws XMOException
	{

		// グループと人データがnullのとき
		if( htData == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 登録処理実行メソッドを実行します
			insertAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 正常時インフォメーションメッセージID返却
		return "";
	}

	/**
	 * 登録処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 登録情報
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void insertAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		Hashtable htbData = setData( htbParam );
		// 親IDの取得
		String strParentID = (String)htbParam.get("parentID");
		// 子IDの取得
		String strChildID = (String)htbParam.get("childID");
		// メンバーシップIDの設定
		htbData.put( MEMBER_SHIP_ID, strParentID + strChildID );

		// ソート番号の最大値を取得します
		int intMaxSortNo = getMaxSortNo( strParentID, objDataAccess );
		// ソート番号を+1して、登録用Hashtableにsort_noをキーにして格納します。
		String strSortNo = Integer.toString( ++intMaxSortNo );
		htbData.put( SORT_NO, strSortNo );

		String strSQL = objDataAccess.getInsertSQL(htbData);

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

		// 登録されたグループおよび人に親グループに割り当てられている
		// LOと同じものを割り当てます。
		assignLoSameToParent( htbParam, objDataAccess );

	}

	/**
	 * 登録したグループまたは人に親グループに登録されているLoAssignmentsと同じものを
	 * 割り当てます。
	 * @param htbParam パラメータ
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void assignLoSameToParent( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		// 親IDの取得
		String strParentID = (String)htbParam.get("parentID");
		// 子IDの取得
		String strChildID = (String)htbParam.get("childID");

		try {
			// 親メンバーシップIDの取得処理を行うためにGroupAndPeopleのクライアント
			// 部品をインスタンス化します
			GroupAndPeopleClient objrgoupAndPeople = new GroupAndPeopleClient();

			// 現在登録した親IDを検索条件の子IDに設定して、親IDのメンバーシップID
			// を取得します。
			objrgoupAndPeople.setChildID( strParentID );

			// 現在使用中のコネクションインデックスを指定し、トランザクションを
			// 共有します。
			objrgoupAndPeople.setConnectionIndex( objDataAccess.getConnectionIndex() );
			// 検索メソッド実行
			if( !objrgoupAndPeople.select() ) {
				// 検索エラーをスローする
				throw new XMOException( objrgoupAndPeople.getMessageData() );
			}

			// メンバーシップIDの取得
			String strMemberShipID ="";
			if(objrgoupAndPeople.next()){
				// メンバーシップIDを取得します
				strMemberShipID =  objrgoupAndPeople.getMemberShipID();
			}

			// 取得したメンバーシップIDに割り当てられているLOアサインを検索
			// するためにAssignmentsクライアントをインスタンス化します。
			AssignmentsClient objAssignments = new AssignmentsClient();

			// メンバーシップIDを検索条件に付与します。
			objAssignments.setWhereMemberShipID( strMemberShipID );
			// 現在使用中のコネクションインデックスを指定し、トランザクションを
			// 共有します。
			objAssignments.setConnectionIndex( objDataAccess.getConnectionIndex() );

			// 検索メソッド実行
			if( !objAssignments.select() ) {
				// 検索エラーをスローする
				throw new XMOException( objAssignments.getMessageData() );
			}

			// 検索結果数文ループをしながら、メンバーシップIDのみを変更して、
			// Assignmentsの登録メソッドを実行します。
			//登録するユーザのアサインを登録
			while(objAssignments.next()){
				// 登録用のAssignmentsClientをインスタンス化します
				AssignmentsClient objInAss = new AssignmentsClient();
				// 現在使用しているコネクションをしようしトランザクションの共有を行います
				objInAss.setConnectionIndex( objDataAccess.getConnectionIndex() );
				// パラメータ設定
				objInAss.setMemberShipID( strParentID + strChildID );				// 人々ID
				objInAss.setMaterialID( objAssignments.getMaterialID() );			// コンポーネントID
				objInAss.setStudyStartDate( objAssignments.getStudyStartDate() );	// 開始日
				objInAss.setEndDate( objAssignments.getEndDate() );					// 終了日
				objInAss.setAssigner( objAssignments.getAssigner() );							// アサイン者
				objInAss.setLearnAuthority( objAssignments.getLearnAuthority() );				// 学習権限
				objInAss.setManagementAuthority( objAssignments.getManagementAuthority() );		// 管理権限
				objInAss.setMethodFlag( objAssignments.getMethodFlag());		// メソッドフラグ
				// 登録メソッド実行
				if( !objInAss.insert() ) {
					// 登録エラーをスローする
					throw new XMOException( objInAss.getMessageData() );
				}
			}
		}
		catch( Exception e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// データベースエラーをスローする
			throw new XMOException( getMessageData( DB_ERR ) );
		}
	}


	/**
	 * GroupAndPeopleテーブルへ更新処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * 省略したフィールドは更新されません。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             MEMBER_SHIP_ID          人々ID
	 *             PARENT_ID               親ID
	 *             CHILD_ID                子ID
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 更新情報
	 * @param mobjTree ツリー構造
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	synchronized public String update( Hashtable htData, GroupAndPeopleTree mobjTree)
		throws XMOException
	{
		// GroupAndPeopleデータがnullのとき
		if( htData == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 更新処理実行メソッドを実行します
			updateAction( htData, objDataAccess, mobjTree );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 正常時空文字返却
		return "";
	}

	/**
	 * 更新処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 更新情報
	 * @param mobjTree ツリー構造
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void updateAction( Hashtable htbParam, DataAccess objDataAccess, GroupAndPeopleTree mobjTree )
		throws XMOException, SQLException
	{

		// 更新するレコードを取得します
		Vector vecSelect = selectAction( htbParam, objDataAccess );
		//////////////////////////////////////////////////////
		// 存在チェックを行います
		//////////////////////////////////////////////////////
		// 親IDの取得
		String strParentID = (String)htbParam.get(PARENT_ID);
		// 子IDの取得
		String strChildID = (String)htbParam.get(CHILD_ID);
		// 更新後メンバーシップID
		String strUpdateMemberShipID = strParentID + strChildID;
		// 更新前メンバーシップID
		String strBeforeMemberShipID = "";
		// 更新前移動メンバーシップID
		String strBeforeTransferMemberShipID = "";

		// 親ID、子IDどちらかが更新対象の場合のみ存在チェックを行う
		if( strParentID != null && strChildID != null ) {
			int intCount = vecSelect.size();
			for( int i = 0; i < intCount; i++ ) {
				GroupAndPeopleData objData = (GroupAndPeopleData)vecSelect.get(i);
				if(i == 0){
					strBeforeTransferMemberShipID = objData.getMemberShipID();
				}
				strBeforeMemberShipID = objData.getMemberShipID();
				if( !strUpdateMemberShipID.equals( strBeforeMemberShipID ) ) {
					if( objDataAccess.isExit( htbParam, MEMBER_SHIP_ID ) ) {
						// 更新するレコードがすでに存在するエラーを投げます
						throw new XMOException( getMessageData( EXIT_MEMBERSHIP_WAR ) );
					}
				}
			}
		}

		// 更新処理用のデータをセットします
		Hashtable htbData = setData( htbParam );

		String strSQL = objDataAccess.getUpdateSQL(htbData);

		// 条件文の取得
		String strCondition = (String)htbParam.get( CONDITION_KEY );
		if( strCondition != null ) {
			strSQL += strCondition;
		}

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

		String strDont = (String)htbParam.get( UPDATE_ASSIGNMENTS );
		if( strDont == null ) {
			// 更新されたグループおよび人に親グループに割り当てられている
			// LOと同じものを割り当てます。
			//LO割り当てテーブルの更新が必要な場合のみ更新します。
			try {
				// LO割当テーブルを更新します
				AssignmentsClient objAss = new AssignmentsClient();
				objAss.setMemberShipID( strUpdateMemberShipID );
				objAss.setWhereMemberShipID( strBeforeMemberShipID );
				// 現在使用しているコネクションをしようしトランザクションの共有を行います
				objAss.setConnectionIndex( objDataAccess.getConnectionIndex() );
				// LO割当テーブル更新処理
				if( !objAss.update() ) {
					// DBエラーを投げる
					throw new XMOException( objAss.getMessageData() );
				}
			}
			catch( Exception e ) {
				DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
				// システムエラーを投げる
				throw new XMOException( getMessageData( SYSTEM_ERR ) );
			}
			// 更新されたグループおよび人に親グループに割り当てられている
			// LOと同じものを割り当てます。
			assignLoSameToParentUpdate( htbParam, objDataAccess );
		}

		// 指定ID配下を取得
		try {
			RoleAssignmentsClient objRolesAss = new RoleAssignmentsClient();
			String[] strChildList = mobjTree.getUnderIDList(strBeforeTransferMemberShipID);
			for( int i = 0; i < strChildList.length; i++ ) {
				if(strChildList[i].substring(0,2).equals("GR")){
					//移動グループ配下にグループが存在する場合、Roleassignmentsテーブルからレコードを削除します。
					objRolesAss.setDeleteGroupID(strChildList[i]);
					if( !objRolesAss.delete() ) {
						throw new XMOException( objRolesAss.getMessageData() );
					}
				}
			}
		}
		catch( Exception e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// システムエラーを投げる
			throw new XMOException( getMessageData( SYSTEM_ERR ) );
		}
	}

	/**
	 * 登録したグループまたは人に親グループに登録されているLoAssignmentsと同じものを
	 * 割り当てます。（※重複無視バージョン）
	 * @param htbParam パラメータ
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void assignLoSameToParentUpdate( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		// 親IDの取得
		String strParentID = (String)htbParam.get("parentID");
		// 子IDの取得
		String strChildID = (String)htbParam.get("childID");

		try {
			// 親メンバーシップIDの取得処理を行うためにGroupAndPeopleのクライアント
			// 部品をインスタンス化します
			GroupAndPeopleClient objrgoupAndPeople = new GroupAndPeopleClient();

			// 現在登録した親IDを検索条件の子IDに設定して、親IDのメンバーシップID
			// を取得します。
			objrgoupAndPeople.setWhereChildID( strParentID );

			// 現在使用中のコネクションインデックスを指定し、トランザクションを
			// 共有します。
			objrgoupAndPeople.setConnectionIndex( objDataAccess.getConnectionIndex() );
			// 検索メソッド実行
			if( !objrgoupAndPeople.selectDatabase() ) {
				// 検索エラーをスローする
				throw new XMOException( objrgoupAndPeople.getMessageData() );
			}

			// メンバーシップIDの取得
			String strMemberShipID ="";
			if(objrgoupAndPeople.next()){
				// メンバーシップIDを取得します
				strMemberShipID =  objrgoupAndPeople.getMemberShipID();
			}

			// 取得したメンバーシップIDに割り当てられているLOアサインを検索
			// するためにAssignmentsクライアントをインスタンス化します。
			AssignmentsClient objAssignments = new AssignmentsClient();

			// メンバーシップIDを検索条件に付与します。
			objAssignments.setWhereMemberShipID( strMemberShipID );
			// 現在使用中のコネクションインデックスを指定し、トランザクションを
			// 共有します。
			objAssignments.setConnectionIndex( objDataAccess.getConnectionIndex() );

			// 検索メソッド実行
			if( !objAssignments.select() ) {
				// 検索エラーをスローする
				throw new XMOException( objAssignments.getMessageData() );
			}

			// 検索結果数文ループをしながら、メンバーシップIDのみを変更して、
			// Assignmentsの登録メソッドを実行します。
			//登録するユーザのアサインを登録
			while(objAssignments.next()){
				// 検索用のAssignmentsClientをインスタンス化します
				AssignmentsClient objInAss = new AssignmentsClient();
				// 現在使用しているコネクションをしようしトランザクションの共有を行います
				objInAss.setConnectionIndex( objDataAccess.getConnectionIndex() );
				// すでに登録されている場合は無視
				objInAss.setWhereMemberShipID( strParentID + strChildID );
				objInAss.setWhereMaterialID( objAssignments.getMaterialID() );
				if( !objInAss.select() ) {
					// 検索がうまくいかなかった場合
					// 登録エラーをスローする
					throw new XMOException( objInAss.getMessageData() );
				}
				if( objInAss.next() ) {
					continue;
				}

				// 登録用のAssignmentsClientをインスタンス化します
				objInAss = new AssignmentsClient();
				// 現在使用しているコネクションをしようしトランザクションの共有を行います
				objInAss.setConnectionIndex( objDataAccess.getConnectionIndex() );
				// パラメータ設定
				objInAss.setMemberShipID( strParentID + strChildID );				// 人々ID
				objInAss.setMaterialID( objAssignments.getMaterialID() );			// コンポーネントID
				objInAss.setStudyStartDate( objAssignments.getStudyStartDate() );	// 開始日
				objInAss.setEndDate( objAssignments.getEndDate() );					// 終了日
				objInAss.setAssigner( objAssignments.getAssigner() );							// アサイン者
				objInAss.setLearnAuthority( objAssignments.getLearnAuthority() );				// 学習権限
				objInAss.setManagementAuthority( objAssignments.getManagementAuthority() );		// 管理権限
				// 登録メソッド実行
				if( !objInAss.insert() ) {
					// 登録エラーをスローする
					throw new XMOException( objInAss.getMessageData() );
				}
			}
		}
		catch( Exception e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// データベースエラーをスローする
			throw new XMOException( getMessageData( DB_ERR ) );
		}
	}

	/**
	 * GroupAndPeopleテーブルへ削除処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           削除条件文
	 *          ---------------------------------------------
	 *          または
	 *          ---------------------------------------------
	 *             DELETE_SELECTID         selectID(グループIDまたはユーザID)
	 *             DELETE_PARENTID         親ID
	 *          ---------------------------------------------
	 * </PRE>
	 * CONDITION_KEYに削除条件文が格納されていた場合はその条件に沿って
	 * 削除処理を行います。<BR>
	 * その他の場合は、以下のような削除を行います。
	 * <PRE>
	 *     グループの削除の場合… テーブルから削除を行います。またその配下の
	 *                            グループも削除します。
	 *                            グループ配下のユーザはすべて未所属に移動します。
	 *                            そのユーザが所属追加で複数存在して場合は、所属追加ユーザ
	 *                            はすべて削除されます。
	 *     ユーザの削除の場合… 削除するユーザがすでに未所属に所属していた場合は、テーブルから削除
	 *                          されます。
	 *                          未所属に所属していない場合は、未所属に移動します。
	 *                          ユーザが所属追加されている場合は所属追加ユーザはすべて削除されます。
	 * </PRE>
	 * @param htData 削除情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public String delete( Hashtable htData )
		throws XMOException
	{

		// グループと人データがnullのとき
		if( htData == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {
			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 削除処理実行メソッドを実行します
			deleteAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}
		return "";
	}

	/**
	 * 削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 削除情報
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// SelectIDの取得
		String strSelectID = (String)htbParam.get( DELETE_SELECTID );
		// ParentIDの取得
		String strParentID = (String)htbParam.get( DELETE_PARENTID );
		if( strSelectID == null || strParentID == null ) {
			// 条件式指定の削除処理を実行する
			deleteCondition( htbParam, objDataAccess );
		} else {

			// GroupAndPeopleテーブルを検索し、memberShipIDを取得する
			// memberShipIDを設定し、Assignments XMO の削除を実行する
			deleteAssignments( strSelectID, strParentID, objDataAccess );

			// GroupAndPeopleテーブルを検索し、取得したレコードの
			// childIDがグループIDとユーザIDの場合で処理を振り分けます
			deleteEqParentID( strSelectID, objDataAccess );

		if ( strParentID.equals( XMOPropertyDef.WASTES_GROUPID )
			|| strSelectID.startsWith( XMOPropertyDef.LEADMARK_GROUPID ) ) {
				// 親IDが無所属、またはSelectIDがグループIDの場合、
				// GroupAndPeopleテーブルの削除を行います。
				deleteEqChildID( strSelectID, strParentID, objDataAccess );
			} else {
				// GroupAndPeopleテーブルを検索し、更新または削除を行います
				deleteEqSelectID( strSelectID, strParentID, objDataAccess );
			}
		}

	}

	/**
	 * 削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 削除情報
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteCondition( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		// GroupAndPeopleテーブルデータ削除用SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "DELETE FROM " + TABLE_NAME );

		// 条件文の取得
		String strCondition = (String)htbParam.get( "condition_key" );
		if( strCondition != null ) {
			sbSQL.append( strCondition );
		}

		// Peopleテーブルデータ削除処理を実行
		objDataAccess.execute( sbSQL.toString() );
	}

	/**
	 * GroupAndPeopleテーブルを検索し、取得したレコードのmemberShipIDを
	 * 設定して、Assignments XMO の削除を実行します
	 *
	 * @param strSelectID
	 * @param strParentID
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteAssignments( String strSelectID, String strParentID,
		DataAccess objDataAccess ) throws XMOException, SQLException
	{
		// memberShipIDを取得する。
		StringBuffer sbSQL = new StringBuffer( "SELECT " );
		sbSQL.append( MEMBER_SHIP_ID );
		sbSQL.append( " FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE " );
		sbSQL.append( CHILD_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strSelectID) );
		sbSQL.append( "' AND " );
		sbSQL.append( PARENT_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strParentID) );
		sbSQL.append( "' ");
		ResultSet rs = objDataAccess.executeQuery( sbSQL.toString() );
		if( rs.next() ){
			try {
				// Assignmentsクライアントをインスタンス化します。
				AssignmentsClient objAssignments = new AssignmentsClient();
				// memberShipIDを設定し、Assignments XMO の削除を実行する
				objAssignments.setWhereMemberShipID(rs.getString(MEMBER_SHIP_ID));
				objAssignments.setConnectionIndex(
					objDataAccess.getConnectionIndex() );
				if( !objAssignments.delete() ) {
					throw new XMOException( objAssignments.getMessageData() );
				}
			} catch (Exception e) {
				DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
				// データベースエラーを設定
				throw new XMOException( getMessageData( DB_ERR ) );
			}
		}
	}

	/**
	 * GroupAndPeopleテーブルを検索し、取得したレコードの
	 * childIDがグループIDとユーザIDの場合で処理を振り分けます
	 *
	 * @param strSelectID selectID
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteEqParentID( String strSelectID, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		// parentIDにselectIDを持つレコードを取得する
		StringBuffer sbSQL = new StringBuffer( "SELECT " );
		sbSQL.append( CHILD_ID );
		sbSQL.append( " FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE " );
		sbSQL.append( PARENT_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strSelectID) );
		sbSQL.append( "' ");
		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());
		ArrayList arrChild = new ArrayList();
		while(rs.next()) {
			arrChild.add( ChangeEncode.setChar( rs.getString( CHILD_ID ) ) );
		}

		try {
			// Groupsクライアントをインスタンス化します。
			GroupsClient objGroups = new GroupsClient();
			// Peopleクライアントをインスタンス化します。
			PeopleClient objPeople = new PeopleClient();
			int iChild = arrChild.size();
			for( int i=0; i<iChild; i++ ){
				String strChildId = (String)arrChild.get(i);
				// childIDがグループIDの場合
				if( strChildId.startsWith( XMOPropertyDef.LEADMARK_GROUPID ) ) {
					// childIDを設定し、Groups XMO の削除を実行する
					objGroups.setDeleteSelectID( strChildId );
					objGroups.setDeleteParentID( strSelectID );
					objGroups.setConnectionIndex(
						objDataAccess.getConnectionIndex() );
					if( !objGroups.delete() ) {
						throw new XMOException( objGroups.getMessageData() );
					}
					// インスタンスを使いまわす。
					objGroups.clear();
				} else {
				// childIDがユーザIDの場合
					// childID,parentIDを設定し、People XMO の削除を実行する
					objPeople.setDeleteUserID( strChildId );
					objPeople.setDeleteParentID( strSelectID );
					objPeople.setConnectionIndex(
						objDataAccess.getConnectionIndex() );
					if( !objPeople.delete() ) {
						throw new XMOException( objPeople.getMessageData() );
					}
					// インスタンスを使いまわす。
					objPeople.clear();
				}
			}
		} catch (Exception e) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}
	}

	/**
	 * GroupAndPeopleテーブルの削除を行います。
	 *
	 * @param strSelectID
	 * @param strParentID
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteEqChildID( String strSelectID, String strParentID,
		DataAccess objDataAccess ) throws XMOException, SQLException
	{
		// GroupAndPeopleテーブルから
		// childIDにselectIDを持つレコードを削除する
		StringBuffer sbSQL = new StringBuffer( "DELETE FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE " );
		sbSQL.append( CHILD_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strSelectID) );
		sbSQL.append( "' AND " );
		sbSQL.append( PARENT_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strParentID) );
		sbSQL.append( "' ");
		// SQLを実行する
		objDataAccess.execute( sbSQL.toString() );
	}

	/**
	 * GroupAndPeopleテーブルを検索し、更新または削除を行います
	 *
	 * @param strSelectID
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteEqSelectID( String strSelectID, String strParentID,
		DataAccess objDataAccess ) throws XMOException, SQLException
	{
		// childIDにselectIDを持つレコードを取得する
		StringBuffer sbSQL = new StringBuffer( "SELECT " );
		sbSQL.append( "COUNT(*)" );
		sbSQL.append( " FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE " );
		sbSQL.append( CHILD_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strSelectID) );
		sbSQL.append( "' ");
		ResultSet rs = objDataAccess.executeQuery( sbSQL.toString() );
		if (rs.next()) {
			int iCount = rs.getInt(1);
			if ( !strParentID.equals( XMOPropertyDef.WASTES_GROUPID )
				&& iCount == 1 ) {
				// 親IDが無所属でなく該当レコード数が１件の場合、
				// 親IDを無所属に更新する
				try {
					// GroupAndPeopleクライアントをインスタンス化します。
					GroupAndPeopleClient objGroupAndPeople =
						new GroupAndPeopleClient();
					// 指定されたユーザ(selectID)を未所属に移動します
					// 移動するユーザのメンバシップIDを組み立てる(親ID + "^" + 子ID)
					String strSendID = strParentID + "^" + strSelectID;
					// 移動先メンバシップIDの組み立る( ルートID ^ 未所属ID )
					String strReceiveID = XMOPropertyDef.ROOT_GROUPID + "^" + XMOPropertyDef.WASTES_GROUPID;
					// アサインの更新をしない設定をする。
					objGroupAndPeople.setDontUpdateAssignments();
					// トランザクション共有のため、コネクションインデックスを設定する。
					objGroupAndPeople.setConnectionIndex(
						objDataAccess.getConnectionIndex() );
					// 移動処理をコールする(処理区分を中へに指定する。)
					if( !objGroupAndPeople.transfer(strSendID, strReceiveID, GroupAndPeopleClient.IN_TYPE) ) {
						throw new XMOException(objGroupAndPeople.getMessageData());
					}
				} catch (Exception e) {
					DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
					// データベースエラーを設定
					throw new XMOException( getMessageData( DB_ERR ) );
				}
			} else {
				// SelectIDの一致するレコードを削除します
				deleteEqChildID( strSelectID, strParentID, objDataAccess );
			}
		}

	}

	/**
	 * GroupAndPeopleテーブルへ検索処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           検索条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 検索情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public Vector select( Hashtable htData )
		throws XMOException
	{
		// グループと人データがnullのとき
		if( htData == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// 戻り値
		Vector vecReturn = new Vector();


		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {
			objDataAccess.trans( htData );

			// 検索処理実行メソッド
			vecReturn = selectAction( htData, objDataAccess );

			// コミット
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		return vecReturn;
	}

	/**
	 * 検索処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 検索情報
	 * @return Vector 検索結果
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private Vector selectAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT * FROM " + TABLE_NAME );

		// 条件文の取得
		String strCondition = (String)htbParam.get( "condition_key" );
		if( strCondition != null ) {
			sbSQL.append( strCondition );

			// ORDER BY句がない場合、LOIDのORDER BY句を追加する
			if(strCondition.indexOf("ORDER BY") == -1)
			{
				sbSQL.append(" ORDER BY " + PARENT_ID);
				sbSQL.append(" , " + SORT_NO );
			}
		}
		else
		{
			sbSQL.append(" ORDER BY " + SORT_NO );
		}

		// クエリーを実行します
		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		Vector vecReturn = new Vector();
		while(rs.next()) {
			String strMemberShhipID = ChangeEncode.setChar( rs.getString( MEMBER_SHIP_ID ) );
			String strParentID = ChangeEncode.setChar( rs.getString( PARENT_ID ) );
			String strChildID = ChangeEncode.setChar( rs.getString( CHILD_ID ) );
			GroupAndPeopleData objData = new GroupAndPeopleData();
			objData.setMemberShipID( strMemberShhipID );
			objData.setParentID( strParentID );
			objData.setChildID( strChildID );
			vecReturn.add( objData );
		}

		return vecReturn;

	}

	/**
	 * 親IDを指定して、sort_noの最大値を取得し、
	 * int型で返します。
	 * @param strParentID 親ID
	 * @param objDataAccess データアクセス
	 * @exception SQLException DBエラーが発生した場合
	 */
	public int getMaxSortNo(String strParentID, DataAccess objDataAccess)
		throws SQLException
	{
		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT MAX(sort_no) as sort_no FROM " + TABLE_NAME + " WHERE " + PARENT_ID + "='" + StringEscapeUtils.escapeSql(strParentID) + "'" );

		// SQLの実行を行います
		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		int intSortNo = 0;
		if( rs.next() ) {
			intSortNo = rs.getInt( "sort_no" );
		}

		return intSortNo;
	}

	/**
	 * 登録、更新処理時のデータを組み立てます
	 * @param htData
	 * @return Hashtable
	 */
	private Hashtable setData( Hashtable htbParam ) {
		Hashtable htbData = new Hashtable();
		putData( htbData, htbParam, MEMBER_SHIP_ID );
		putData( htbData, htbParam, PARENT_ID );
		putData( htbData, htbParam, CHILD_ID );
		return htbData;
	}

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

	/**
	 * メッセージオブジェクトを作成します
	 * @param strMessageID メッセージID
	 * @return MessageData メッセージオブジェクト 例外発生時はnullを返します
	 */
	private MessageData getMessageData( String strMessageID) {
		MessageData objMessage = null;
		try {
			objMessage = Message.getInstance().getMessageData( strMessageID, MSG_FIEL_PATH, MSG_FILE_NAME );
		}
		catch( Exception e ) {

		}
		return objMessage;
	}

	/**
	 * 親子IDを指定して、sort_noを取得し、
	 * int型で返します。
	 * @param strMemberShipID 親子ID
	 * @param objDataAccess データアクセス
	 * @exception SQLException DBエラーが発生した場合
	 */
	public int getMemberShipIDSortNo(String strMemberShipID, DataAccess objDataAccess)
		throws SQLException
	{
		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT sort_no FROM " + TABLE_NAME + " WHERE " + MEMBER_SHIP_ID + "='" + StringEscapeUtils.escapeSql(strMemberShipID) + "'" );
		// SQLの実行を行います
		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());
		int intSortNo = 0;
		if( rs.next() ) {
			intSortNo = rs.getInt( "sort_no" );
		}
		return intSortNo;
	}

	/**
	 * 上への時：移動先のsort_no以上のsort_noをメソッド引数の移動元IDリスト配列数プラスする。
	 * 下への時：移動先のsort_noより大きいsort_noをメソッド引数の移動元IDリスト配列数プラスする。
	 * @param intReciveSortNo 移動先のsort_no
	 * @param intSendListLength 移動元ID配列数
	 * @param strParentID 移動先の親ID
	 * @param intType 処理区分(上へ：1、中へ：2、下へ：3)
	 * @param objDataAccess データアクセス
	 * @exception SQLException DBエラーが発生した場合
	 */
	public void updateSortNo(int intSortNo,
										int intSendListLength,
										String strParentID,
										int intType, DataAccess objDataAccess)
		throws SQLException
	{

				// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "UPDATE " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " SET " );
		sbSQL.append( SORT_NO );
		sbSQL.append( " = " );
		sbSQL.append( SORT_NO );
		sbSQL.append( " + '" );
		sbSQL.append( intSendListLength );
		sbSQL.append( "' ");
		sbSQL.append( " WHERE " );
		sbSQL.append( PARENT_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strParentID) );
		sbSQL.append( "' ");
		sbSQL.append( " AND " );
		sbSQL.append( SORT_NO );
		//上への時
		if (intType == 1){
			sbSQL.append( " >= '" );
		}
		//下への時
		if (intType == 3){
			sbSQL.append( " > '" );
		}
		sbSQL.append( intSortNo );
		sbSQL.append( "' ");

		// SQLの実行を行います
		objDataAccess.execute( new String(sbSQL) );

	}

	/**
	 * MemberShipIDをキーにGroupAndPeopleテーブルのMemberShipID、parentID、sort_no更新する。
	 * @param objSendData 移動元：LoRelationID、parentID、childID
	 * @param strParentID 親ID(上へ又は下への時：移動先の親ID。下への時：移動先の子ID。)
	 * @param intSortNo 上へ又は下への時：移動先のsort_no
	 *                          中への時：移動先の子の配下のsort_noの最大値
	 * @param objDataAccess データアクセス
	 * @exception SQLException DBエラーが発生した場合
	 */
	public void updateGroupAndPeople(GroupAndPeopleData objSendData,
							String strParentID,
							int intSortNo,
							DataAccess objDataAccess)
		throws SQLException
	{
				// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();

		sbSQL.append( "UPDATE " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " SET " );
		sbSQL.append( MEMBER_SHIP_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strParentID + objSendData.getChildID()) );
		sbSQL.append( "' ,");
		sbSQL.append( PARENT_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strParentID) );
		sbSQL.append( "' ,");
		sbSQL.append( SORT_NO );
		sbSQL.append( " = '" );
		sbSQL.append( intSortNo );
		sbSQL.append( "' ");
		sbSQL.append( " WHERE " );
		sbSQL.append( MEMBER_SHIP_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(objSendData.getMemberShipID()) );
		sbSQL.append( "' ");

		// SQLの実行を行います
		objDataAccess.execute( new String(sbSQL) );

	}

	/**
	 * 移動先に移動元のMemberShipID、parentID、childID、sort_noを追加する。
	 * @param objSendData 移動元：LoRelationID、parentID、childID
	 * @param intSortNo 上へ又は下への時：移動先のsort_no
	 *                          中への時：移動先の子の配下のsort_noの最大値
	 * @param objDataAccess データアクセス
	 * @exception SQLException DBエラーが発生した場合
	 */
	public void insertGroupAndPeople(GroupAndPeopleData objSendData,
							String strParentID,
							int intSortNo,
							DataAccess objDataAccess)
		throws SQLException
	{
				// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();

		sbSQL.append( "INSERT " );
		sbSQL.append( "INTO " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( "( " );
		sbSQL.append( MEMBER_SHIP_ID );
		sbSQL.append( "," );
		sbSQL.append( SORT_NO );
		sbSQL.append( "," );
		sbSQL.append( PARENT_ID );
		sbSQL.append( "," );
		sbSQL.append( CHILD_ID );
		sbSQL.append( " )" );
		sbSQL.append( "VALUES" );
		sbSQL.append( "( '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strParentID + objSendData.getChildID()) );
		sbSQL.append( "' , '");
		sbSQL.append( intSortNo );
		sbSQL.append( "' , '");
		sbSQL.append( StringEscapeUtils.escapeSql(strParentID) );
		sbSQL.append( "' , '");
		sbSQL.append( StringEscapeUtils.escapeSql(objSendData.getChildID()) );
		sbSQL.append( "' ");
		sbSQL.append( " )" );
		// SQLの実行を行います
		objDataAccess.execute( new String(sbSQL) );
	}

	/**
	 * 子IDを指定して、MemberShipIDを取得します。
	 * @param strChildID 子ID
	 * @param objDataAccess データアクセス
	 * @return String MemberShipID
	 * @exception SQLException DBエラーが発生した場合
	 */
	public String getMemberShipIDFromChildID(String strChildID,
							DataAccess objDataAccess)
		throws SQLException
	{
		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();

		sbSQL.append( "SELECT " );
		sbSQL.append( MEMBER_SHIP_ID );
		sbSQL.append( " FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE ");
		sbSQL.append( CHILD_ID );
		sbSQL.append( "='" );
		sbSQL.append( StringEscapeUtils.escapeSql(strChildID) );
		sbSQL.append( "'" );

		// SQLの実行を行います
		ResultSet rs = objDataAccess.executeQuery( new String(sbSQL) );
		String strMemberShipID = null;
		if( rs.next() ) {
			strMemberShipID = ChangeEncode.setChar(rs.getString( MEMBER_SHIP_ID ));
		}

		return strMemberShipID;
	}

	/**
	 * MemberShipIDを指定して、レコードの件数を取得します。
	 * 検索でテーブル排他を行います。
	 * @param strMemberShipID メンバシップID
	 * @param objDataAccess objDataAccess
	 * @return int レコード存在確認(レコード存在する場合"１"、ない場合"0")
	 * @exception SQLException DB例外
	 */
	public int getCountMemberShipID( String strMemberShipID, DataAccess objDataAccess )
		throws SQLException
	{
		int intCount = 0;
		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv=new Environment();
			// SQLの組み立て
			StringBuffer sbSQL = new StringBuffer();
			sbSQL.append( "SELECT * " );
			sbSQL.append( " FROM " );
			sbSQL.append( TABLE_NAME );

			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				sbSQL.append( " WITH(TABLOCKX) WHERE ");
			//Oracleの場合 OR PostgreSQLの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				sbSQL.append( " WHERE ");
			}

			sbSQL.append( MEMBER_SHIP_ID );
			sbSQL.append( "='" );
			sbSQL.append( StringEscapeUtils.escapeSql(strMemberShipID) );
			sbSQL.append( "'" );

			//Oracleの場合 OR PostgreSQLの場合
			if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				sbSQL.append( " FOR UPDATE" );
			}
						
			DebugLog.write( this.getClass(),new String(sbSQL), DebugLog.ROW );

			ResultSet rs = objDataAccess.executeQuery( new String(sbSQL) );

			while(rs.next()) {
				//レコードが存在する場合
				intCount = 1;
			}

		}
		catch(Exception ex)
		{

		}
		return intCount;
	}

	/**
	 * ChildIDを指定して、レコードの件数を取得します。
	 * 検索でテーブル排他を行います。
	 * @param strChildID 子ID
	 * @param objDataAccess objDataAccess
	 * @return int レコード件数
	 * @exception SQLException DB例外
	 */
	public int getCountChildID( String strChildID, DataAccess objDataAccess )
		throws SQLException
	{
		int intCount = 0;
		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv=new Environment();

			// SQLの組み立て
			StringBuffer sbSQL = new StringBuffer();
			sbSQL.append( "SELECT COUNT(*) " );
			sbSQL.append( " FROM " );
			sbSQL.append( TABLE_NAME );

			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				sbSQL.append( " WITH(TABLOCKX) WHERE ");
			//Oracleの場合 OR PostgreSQLの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				sbSQL.append( " WHERE ");
			}
			sbSQL.append( CHILD_ID );
			sbSQL.append( "='" );
			sbSQL.append( StringEscapeUtils.escapeSql(strChildID) );
			sbSQL.append( "'" );

			DebugLog.write( this.getClass(),new String(sbSQL), DebugLog.ROW );

			ResultSet rs = objDataAccess.executeQuery( new String(sbSQL) );
			if( rs.next() ) {
				intCount = rs.getInt(1);
			}
		}
		catch(Exception ex)
		{

		}
		return intCount;
	}


}
