/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0341DBABase
*   ソースファイル名：JKKejbKK0341DBABase.java
*   作成者          ：富士通
*   日付            ：2011年04月21日
*＜機能概要＞
*   機器提供サービス契約の制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/04/21  富士通      新規作成
*   v7.00.00    2013/12/08  FJ）大山    ANK-1578-00-00
*   v8.00.00    2014/03/20  FJ）小島    ANK-1991-00-00
*  v61.00.00    2022/12/13  FJ) 澤田   【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応】

*
**********************************************************************/

package eo.ejb.common.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.ejb.cbm.entity.KK0251ETMsg;
import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbm.entity.KK0341LE;
import eo.ejb.common.JKKModelConst;

/**
 * <p>
 * 機器提供サービス契約の制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0341DBABase extends JKKejbDBABase
{

	/** サービス_機器提供サービス(回線機器用)対応マップ */
	private static final HashMap<String, String[]> SVC_KKTSV_FOR_KISN_KIKI_MAP = new HashMap<String, String[]>();
	static
	{
		// インターネットサービス：モデム、スプリッター、インラインフィルタ、ＯＮＵ
		SVC_KKTSV_FOR_KISN_KIKI_MAP.put(JKKModelConst.SVC_CD_NET, new String[] {
				// ANK-4315-00-00 MOD START
				//JKKModelConst.KKTK_SVC_CD_MODEM, JKKModelConst.KKTK_SVC_CD_SPLITTER, JKKModelConst.KKTK_SVC_CD_INLINE_FILTER, JKKModelConst.KKTK_SVC_CD_ONU , JKKModelConst.KKTK_SVC_CD_TAKINORT});
				JKKModelConst.KKTK_SVC_CD_MODEM, JKKModelConst.KKTK_SVC_CD_SPLITTER, JKKModelConst.KKTK_SVC_CD_INLINE_FILTER, JKKModelConst.KKTK_SVC_CD_ONU , JKKModelConst.KKTK_SVC_CD_TAKINORT , JKKModelConst.KKTK_SVC_CD_HGW});
				// ANK-4315-00-00 MOD END
		// 電話サービス：モデム、スプリッター、インラインフィルタ、ＯＮＵ
		SVC_KKTSV_FOR_KISN_KIKI_MAP.put(JKKModelConst.SVC_CD_TEL, new String[] {
				// ANK-4315-00-00 MOD START
				//JKKModelConst.KKTK_SVC_CD_MODEM, JKKModelConst.KKTK_SVC_CD_SPLITTER, JKKModelConst.KKTK_SVC_CD_INLINE_FILTER, JKKModelConst.KKTK_SVC_CD_ONU, JKKModelConst.KKTK_SVC_CD_TAKINORT});
				JKKModelConst.KKTK_SVC_CD_MODEM, JKKModelConst.KKTK_SVC_CD_SPLITTER, JKKModelConst.KKTK_SVC_CD_INLINE_FILTER, JKKModelConst.KKTK_SVC_CD_ONU , JKKModelConst.KKTK_SVC_CD_TAKINORT , JKKModelConst.KKTK_SVC_CD_HGW});
				// ANK-4315-00-00 MOD END
		// テレビサービス：Ｖ−ＯＮＵ
		SVC_KKTSV_FOR_KISN_KIKI_MAP.put(JKKModelConst.SVC_CD_TV, new String[] {
				JKKModelConst.KKTK_SVC_CD_V_ONU});
	}

	/**
	 * <p>
	 * 新しいJKKejbKK0341DBABaseを作成します。
	 * </p>
	 */
	public JKKejbKK0341DBABase()
	{
		super(KK0341ETMsg.class.getName());
	}

	/**
	 * <p>
	 * 世代を管理するカラム名を取得します。
	 * </p>
	 * @return 世代を管理するカラム名
	 */
	protected String getGenerationColumn()
	{
		return KK0341ETMsg.GENE_ADD_DTM;
	}

	/**
	 * <p>
	 * 無効状態を管理するカラム名を取得します。
	 * </p>
	 * @return 無効状態を管理するカラム名
	 */
	protected String getInvalidColumn()
	{
		return KK0341ETMsg.MK_FLG;
	}

	/**
	 * <p>
	 * 予約管理エンティティか判定します。
	 * </p>
	 * @return 予約管理エンティティの場合はtrue
	 */
	protected boolean isReserveMgr()
	{
		return true;
	}

	/**
	 * <p>
	 * 予約適用基準日となるカラム名を取得します。
	 * </p>
	 * @return 予約適用基準日となるカラム名
	 */
	protected String getCurrentColumn()
	{
		return KK0341ETMsg.RSV_APLY_YMD;
	}

	/**
	 * <p>
	 * 予約の状態を管理するエンティティか判定します。
	 * </p>
	 * @return 予約の状態を管理するエンティティの場合はtrue
	 */
	protected boolean isReserveStateMgr()
	{
		return true;
	}

	/**
	 * <p>
	 * 予約の状態を管理するカラム名を取得します。
	 * </p>
	 * @return 予約の状態を管理するカラム名
	 */
	protected String getReserveStateColumn()
	{
		return KK0341ETMsg.RSV_APLY_CD;
	}

	/**
	 * <p>
	 * 機器提供サービス契約のカレントレコードを取得します
	 * </p>
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @param stdYmd 基準年月日
	 * @return 機器提供サービス契約番号に紐付く機器提供サービス契約のカレントレコード
	 */
	public CAANMsg getKK0341Current(String kktkSvcKeiNo, String stdYmd)
	{
		// 検索条件の設定
		CAANMsg searchKey = new CAANMsg(KK0341ETMsg.class.getName());
		searchKey.set(KK0341ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		searchKey.set(KK0341ETMsg.RSV_APLY_YMD, stdYmd);
		
		CAANMsg outMsg1 = findByCurrent(searchKey);
		if (outMsg1 == null)
		{
			throw new CAANRuntimeException("該当の機器提供サービス契約が存在しません。機器提供サービス契約番号:" + kktkSvcKeiNo);
		}
		
		return outMsg1;
	}

	/**
	 * <p>
	 * 機器提供サービス契約のプライマリレコードを取得を行います。
	 * </p>
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @param geneAddDtm 世代登録年月日時分秒
	 * @return 機器提供サービス契約番号、世代登録年月日時分秒に紐付く機器提供サービス契約のプライマリレコード
	 */
	public CAANMsg getKK0341Primary(String kktkSvcKeiNo, String geneAddDtm)
	{
		CAANMsg searchKey = new CAANMsg(KK0341ETMsg.class.getName());
		searchKey.set(KK0341ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		searchKey.set(KK0341ETMsg.GENE_ADD_DTM, geneAddDtm);
		
		CAANMsg outMsg1 = new KK0341LE().findByPrimaryKey(searchKey);
		
		// 検索結果が未設定または無効フラグが"無効"の場合
		if (outMsg1 == null 
				|| JKKModelConst.MK_FLG_MK.equals(outMsg1.getString(KK0341ETMsg.MK_FLG)))
		{
			throw new CAANRuntimeException("該当の機器提供サービス契約が存在しません。機器提供サービス契約番号:" + kktkSvcKeiNo);
		}
		
		return outMsg1;
	}

	/**
	 * <p>
	 * 解約済、キャンセル済を除外する
	 * </p>
	 * @param inList オプションサービス契約リスト
	 * @return 解約済、キャンセル済を除外したリスト
	 */
	public CAANMsg[] getKK0341OutDsLCl(CAANMsg[] inList)
	{
		ArrayList<CAANMsg> outList = new ArrayList<CAANMsg>();
		for (CAANMsg inMsg:inList)
		{
			if (!JKKModelConst.KKTK_SVC_KEI_STAT_DSL_ZM.equals(inMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT))
					&& !JKKModelConst.KKTK_SVC_KEI_STAT_CNCL_ZM.equals(inMsg.getString(KK0341ETMsg.KKTK_SVC_KEI_STAT)))
			{
				outList.add(inMsg);
			}
		}
		
		return outList.toArray(new CAANMsg[0]);
	}

	/**
	 * <p>
	 * サービス契約番号に紐づく機器提供サービス契約明細（サービス契約回線内訳経由）を取得します。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param svcCd サービスコード
	 *         (該当のサービスに対応する機器提供サービスの「機器提供サービス契約」を取得する。)
	 * @param searchJknMap 検索条件マップ(key：項目名、value：項目値リスト)<br>
	 *         機器提供サービス契約.項目名 IN (項目値リスト)を検索条件とします。個別検索条件がない場合はNULLを設定すること。<br>
	 *         機器提供サービスコードは、別途検索条件として指定するため設定しないこと。<br>
	 * @param stdYmd 基準年月日
	 * @param searchPtn 「サービス契約回線内訳」の検索パターン<br>
	 * "0"：該当の「サービス契約」が使用していた全ての「サービス契約回線内訳」を取得する場合<br>
	 * "1"：基準年月日時点で、該当の「サービス契約」が使用している「サービス契約回線内訳」を取得する場合<br>
	 *      ("受付済"、"照査済"、"締結済"、"サービス提供中"、"休止・中断中"、"停止中"の「サービス契約」の場合、など)<br>
	 * "2"：基準年月日時点または基準年月日以前の直近で、該当の「サービス契約」が使用していた「サービス契約回線内訳」を取得する場合<br>
	 *      ("解約済"、"キャンセル済"を含む、あらゆるサービス契約ステータスの「サービス契約」の場合、など)<br>
	 * @return 該当の「サービス契約」に紐付く「機器提供サービス契約」のリスト
	 */
	public CAANMsg[] getKK0341FromKK0251bySvcKei(String svcKeiNo, String svcCd, HashMap<String, String[]> searchJknMap, String stdYmd, String searchPtn)
	{
		/* ----------------------------------------------------------------------------------------------------
		 * 該当の「サービス契約」が使用する「サービス契約回線内訳」に紐付く「機器提供サービス契約」を取得する。
		 * ---------------------------------------------------------------------------------------------------- */
		ArrayList<CAANMsg> kk0341MsgList = new ArrayList<CAANMsg>();

		// 追加検索条件：機器提供サービス契約.機器提供サービスコード = 該当のサービスに対応する機器提供サービスコード
		searchJknMap.put(KK0341ETMsg.KKTK_SVC_CD, SVC_KKTSV_FOR_KISN_KIKI_MAP.get(svcCd));

		// 該当の「サービス契約」が使用する「サービス契約回線内訳」を取得する。
		CAANMsg[] kk0251MsgList = new JKKejbKK0251DBABase().getKK0251bySvcKei(svcKeiNo, null, stdYmd, searchPtn);
		for (CAANMsg kk0251Msg : kk0251MsgList)
		{
			// 該当の「サービス契約回線内訳」に紐付く「機器提供サービス契約」を取得する。
			String svcKeiKaisenUcwkNo = kk0251Msg.getString(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO);
			CAANMsg[] kk0341_kk0251MsgList = getKK0341bySvcKeiKaisenUcwk(svcKeiKaisenUcwkNo, searchJknMap, stdYmd);
			for (CAANMsg kk0341_kk0251Msg : kk0341_kk0251MsgList)
			{
				kk0341MsgList.add(kk0341_kk0251Msg);
			}
		}

		return kk0341MsgList.toArray(new CAANMsg[0]);
	}

	/**
	 * <p>
	 * サービス契約番号に紐づく機器提供サービス契約明細を取得します。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param searchJknMap 検索条件マップ(key：項目名、value：項目値リスト)<br>
	 *         機器提供サービス契約.項目名 IN (項目値リスト)を検索条件とします。個別検索条件がない場合はNULLを設定すること。
	 * @param stdYmd 基準年月日
	 * @param searchPtn 検索パターン<br>
	 * "1"：親契約識別コードが"01"(サービス契約)の「機器提供サービス契約」を取得する場合<br>
	 * "2"：親契約識別コードが"03"(サービス契約内訳)の「機器提供サービス契約」を取得する場合<br>
	 * "3"：親契約識別コードが"04"(オプションサービス契約)の「機器提供サービス契約」を取得する場合<br>
	 * "4"：該当の「サービス契約」配下の全ての「機器提供サービス契約」("1"または"2"または"3")を取得する場合<br>
	 * @return 機器提供サービス契約明細
	 */
	public CAANMsg[] getKK0341bySvcKei(String svcKeiNo, HashMap<String, String[]> searchJknMap, String stdYmd, String searchPtn)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		if (!("1".equals(searchPtn) || "2".equals(searchPtn) || "3".equals(searchPtn) || "4".equals(searchPtn)))
		{
			throw new CAANRuntimeException("未定義の検索パターンです。");
		}

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// 注）2013/2/19 現時点では、機器提供サービス契約.親契約識別コードが"01"(サービス契約)の場合だけでなく、
			//     "03"(サービス契約内訳)、"04"(オプションサービス契約)の場合でも、親「サービス契約」のサービス契約番号が設定されているため、以下のような検索条件となる。
			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(getSelectColumnListString(getSelectDBColumnList()));
			sql_Buff.append(" FROM   KK_T_KKTK_SVC_KEI KK0341 ");
			if ("1".equals(searchPtn))
			{
				// 親契約識別コードが"01"(サービス契約)の「機器提供サービス契約」を取得する場合
				sql_Buff.append(" WHERE  KK0341.OYA_KEI_SKBT_CD = '01' ");
			}
			else if ("2".equals(searchPtn))
			{
				// 親契約識別コードが"03"(サービス契約内訳)の「機器提供サービス契約」を取得する場合
				sql_Buff.append(" WHERE  KK0341.OYA_KEI_SKBT_CD = '03' ");
			}
			else if ("3".equals(searchPtn))
			{
				// 親契約識別コードが"04"(オプションサービス契約)の「機器提供サービス契約」を取得する場合
				sql_Buff.append(" WHERE  KK0341.OYA_KEI_SKBT_CD = '04' ");
			}
			else if ("4".equals(searchPtn))
			{
				// 該当の「サービス契約」配下の全ての「機器提供サービス契約」を取得する場合
				sql_Buff.append(" WHERE  KK0341.OYA_KEI_SKBT_CD IN ('01', '03', '04') ");
			}
			sql_Buff.append(" AND    KK0341.SVC_KEI_NO = ? ");
			sql_Buff.append(" AND   (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sql_Buff.append("     FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("     WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("     AND    KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("     AND    KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("     AND    KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append("     GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO) ");
			arraylist.add(svcKeiNo);
			arraylist.add(stdYmd);
			
			// 検索条件マップが設定されている場合、IN句で検索条件を設定する。
			sql_Buff = addSearchJknSql(sql_Buff, "KK0341", searchJknMap, true);
			arraylist = addSearchJknParam(arraylist, searchJknMap);

			// 注）機器提供サービス契約.親契約識別コードが"01"(サービス契約)の場合だけサービス契約番号が設定されている場合の検索は、以下のような検索条件となる。
//			sql_Buff.append(" WHERE (KK0341.KKTK_SVC_KEI_NO, KK0341.GENE_ADD_DTM) IN ( ");
//			if ("1".equals(searchPtn) || "4".equals(searchPtn))
//			{
//				// 親契約識別コードが"01"(サービス契約)の「機器提供サービス契約」を取得する場合
//				sql_Buff.append("     SELECT KK0341_01.KKTK_SVC_KEI_NO ");
//				sql_Buff.append("          , KK0341_01.GENE_ADD_DTM ");
//				sql_Buff.append("     FROM   KK_T_KKTK_SVC_KEI KK0341_01 ");
//				sql_Buff.append("     WHERE  KK0341_01.OYA_KEI_SKBT_CD = '01' ");
//				sql_Buff.append("     AND    KK0341_01.SVC_KEI_NO = ? ");
//				sql_Buff.append("     AND   (KK0341_01.KKTK_SVC_KEI_NO, KK0341_01.RSV_APLY_YMD || KK0341_01.GENE_ADD_DTM) = ");
//				sql_Buff.append("        (SELECT KK0341_01_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_01_GENE.RSV_APLY_YMD || KK0341_01_GENE.GENE_ADD_DTM) AS KK0341_01_MAX ");
//				sql_Buff.append("         FROM   KK_T_KKTK_SVC_KEI KK0341_01_GENE ");
//				sql_Buff.append("         WHERE  KK0341_01_GENE.KKTK_SVC_KEI_NO = KK0341_01.KKTK_SVC_KEI_NO ");
//				sql_Buff.append("         AND    KK0341_01_GENE.RSV_APLY_YMD <= ? ");
//				sql_Buff.append("         AND    KK0341_01_GENE.RSV_APLY_CD = '2' ");
//				sql_Buff.append("         AND    KK0341_01_GENE.MK_FLG = '0' ");
//				sql_Buff.append("         GROUP BY KK0341_01_GENE.KKTK_SVC_KEI_NO) ");
//				arraylist.add(svcKeiNo);
//				arraylist.add(stdYmd);
//			}
//			if ("4".equals(searchPtn))
//			{
//				// 該当の「サービス契約」配下の全ての「機器提供サービス契約」を取得する場合
//				sql_Buff.append("     UNION ");
//			}
//			if ("2".equals(searchPtn) || "4".equals(searchPtn))
//			{
//				// 親契約識別コードが"03"(サービス契約内訳)の「機器提供サービス契約」を取得する場合
//				sql_Buff.append("     SELECT KK0341_02.KKTK_SVC_KEI_NO ");
//				sql_Buff.append("          , KK0341_02.GENE_ADD_DTM ");
//				sql_Buff.append("     FROM   KK_T_KKTK_SVC_KEI KK0341_02 ");
//				sql_Buff.append("     WHERE  KK0341_02.OYA_KEI_SKBT_CD = '03' ");
//				sql_Buff.append("     AND EXISTS ( ");
//				sql_Buff.append("         SELECT 1 ");
//				sql_Buff.append("         FROM   KK_T_SVC_KEI_UCWK KK0161 ");
//				sql_Buff.append("         WHERE  KK0161.SVC_KEI_NO = ? ");
//				sql_Buff.append("         AND    KK0161.SVC_KEI_UCWK_NO = KK0341_02.SVC_KEI_UCWK_NO ");
//				sql_Buff.append("         AND   (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) = ");
//				sql_Buff.append("            (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX ");
//				sql_Buff.append("             FROM   KK_T_SVC_KEI_UCWK KK0161_GENE ");
//				sql_Buff.append("             WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ");
//				sql_Buff.append("             AND    KK0161_GENE.RSV_APLY_YMD <= ? ");
//				sql_Buff.append("             AND    KK0161_GENE.RSV_APLY_CD = '2' ");
//				sql_Buff.append("             AND    KK0161_GENE.MK_FLG = '0' ");
//				sql_Buff.append("             GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ");
//				sql_Buff.append("     ) ");
//				sql_Buff.append("     AND   (KK0341_02.KKTK_SVC_KEI_NO, KK0341_02.RSV_APLY_YMD || KK0341_02.GENE_ADD_DTM) = ");
//				sql_Buff.append("        (SELECT KK0341_02_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_02_GENE.RSV_APLY_YMD || KK0341_02_GENE.GENE_ADD_DTM) AS KK0341_02_MAX ");
//				sql_Buff.append("         FROM   KK_T_KKTK_SVC_KEI KK0341_02_GENE ");
//				sql_Buff.append("         WHERE  KK0341_02_GENE.KKTK_SVC_KEI_NO = KK0341_02.KKTK_SVC_KEI_NO ");
//				sql_Buff.append("         AND    KK0341_02_GENE.RSV_APLY_YMD <= ? ");
//				sql_Buff.append("         AND    KK0341_02_GENE.RSV_APLY_CD = '2' ");
//				sql_Buff.append("         AND    KK0341_02_GENE.MK_FLG = '0' ");
//				sql_Buff.append("         GROUP BY KK0341_02_GENE.KKTK_SVC_KEI_NO) ");
//				arraylist.add(svcKeiNo);
//				arraylist.add(stdYmd);
//				arraylist.add(stdYmd);
//			}
//			if ("4".equals(searchPtn))
//			{
//				// 該当の「サービス契約」配下の全ての「機器提供サービス契約」を取得する場合
//				sql_Buff.append("     UNION ");
//			}
//			if ("3".equals(searchPtn) || "4".equals(searchPtn))
//			{
//				// 親契約識別コードが"04"(オプションサービス契約)の「機器提供サービス契約」を取得する場合
//				sql_Buff.append("     SELECT KK0341_03.KKTK_SVC_KEI_NO ");
//				sql_Buff.append("          , KK0341_03.GENE_ADD_DTM ");
//				sql_Buff.append("     FROM   KK_T_KKTK_SVC_KEI KK0341_03 ");
//				sql_Buff.append("     WHERE  KK0341_03.OYA_KEI_SKBT_CD = '04' ");
//				sql_Buff.append("     AND EXISTS ( ");
//				sql_Buff.append("         SELECT 1 ");
//				sql_Buff.append("         FROM   KK_T_OP_SVC_KEI KK0351 ");
//				sql_Buff.append("         WHERE  KK0351.OP_SVC_KEI_NO = KK0341_03.OP_SVC_KEI_NO ");
//				sql_Buff.append("         AND EXISTS ( ");
//				sql_Buff.append("             SELECT 1 ");
//				sql_Buff.append("             FROM   KK_T_OP_SVC_KEI KK0351_01 ");
//				sql_Buff.append("             WHERE  KK0351_01.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ");
//				sql_Buff.append("             AND    KK0351_01.OYA_KEI_SKBT_CD = '01' ");
//				sql_Buff.append("             AND    KK0351_01.SVC_KEI_NO = ? ");
//				sql_Buff.append("             AND   (KK0351_01.OP_SVC_KEI_NO, KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) = ");
//				sql_Buff.append("                (SELECT KK0351_01_GENE.OP_SVC_KEI_NO, MAX(KK0351_01_GENE.RSV_APLY_YMD || KK0351_01_GENE.GENE_ADD_DTM) AS KK0351_01_MAX ");
//				sql_Buff.append("                 FROM   KK_T_OP_SVC_KEI KK0351_01_GENE ");
//				sql_Buff.append("                 WHERE  KK0351_01_GENE.OP_SVC_KEI_NO = KK0351_01.OP_SVC_KEI_NO ");
//				sql_Buff.append("                 AND    KK0351_01_GENE.RSV_APLY_YMD <= ? ");
//				sql_Buff.append("                 AND    KK0351_01_GENE.RSV_APLY_CD = '2' ");
//				sql_Buff.append("                 AND    KK0351_01_GENE.MK_FLG = '0' ");
//				sql_Buff.append("                 GROUP BY KK0351_01_GENE.OP_SVC_KEI_NO) ");
//				sql_Buff.append("             UNION ");
//				sql_Buff.append("             SELECT 1 ");
//				sql_Buff.append("             FROM   KK_T_OP_SVC_KEI KK0351_02 ");
//				sql_Buff.append("             WHERE  KK0351_02.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ");
//				sql_Buff.append("             AND    KK0351_02.OYA_KEI_SKBT_CD = '03' ");
//				sql_Buff.append("             AND EXISTS ( ");
//				sql_Buff.append("                 SELECT 1 ");
//				sql_Buff.append("                 FROM   KK_T_SVC_KEI_UCWK KK0161 ");
//				sql_Buff.append("                 WHERE  KK0161.SVC_KEI_NO = ? ");
//				sql_Buff.append("                 AND    KK0161.SVC_KEI_UCWK_NO = KK0351_02.SVC_KEI_UCWK_NO ");
//				sql_Buff.append("                 AND   (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) = ");
//				sql_Buff.append("                    (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX ");
//				sql_Buff.append("                     FROM   KK_T_SVC_KEI_UCWK KK0161_GENE ");
//				sql_Buff.append("                     WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ");
//				sql_Buff.append("                     AND    KK0161_GENE.RSV_APLY_YMD <= ? ");
//				sql_Buff.append("                     AND    KK0161_GENE.RSV_APLY_CD = '2' ");
//				sql_Buff.append("                     AND    KK0161_GENE.MK_FLG = '0' ");
//				sql_Buff.append("                     GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ");
//				sql_Buff.append("             ) ");
//				sql_Buff.append("             AND   (KK0351_02.OP_SVC_KEI_NO, KK0351_02.RSV_APLY_YMD || KK0351_02.GENE_ADD_DTM) = ");
//				sql_Buff.append("                (SELECT KK0351_02_GENE.OP_SVC_KEI_NO, MAX(KK0351_02_GENE.RSV_APLY_YMD || KK0351_02_GENE.GENE_ADD_DTM) AS KK0351_02_MAX ");
//				sql_Buff.append("                 FROM   KK_T_OP_SVC_KEI KK0351_02_GENE ");
//				sql_Buff.append("                 WHERE  KK0351_02_GENE.OP_SVC_KEI_NO = KK0351_02.OP_SVC_KEI_NO ");
//				sql_Buff.append("                 AND    KK0351_02_GENE.RSV_APLY_YMD <= ? ");
//				sql_Buff.append("                 AND    KK0351_02_GENE.RSV_APLY_CD = '2' ");
//				sql_Buff.append("                 AND    KK0351_02_GENE.MK_FLG = '0' ");
//				sql_Buff.append("                 GROUP BY KK0351_02_GENE.OP_SVC_KEI_NO) ");
//				sql_Buff.append("         ) ");
//				sql_Buff.append("     ) ");
//				sql_Buff.append("     AND   (KK0341_03.KKTK_SVC_KEI_NO, KK0341_03.RSV_APLY_YMD || KK0341_03.GENE_ADD_DTM) = ");
//				sql_Buff.append("        (SELECT KK0341_03_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_03_GENE.RSV_APLY_YMD || KK0341_03_GENE.GENE_ADD_DTM) AS KK0341_03_MAX ");
//				sql_Buff.append("         FROM   KK_T_KKTK_SVC_KEI KK0341_03_GENE ");
//				sql_Buff.append("         WHERE  KK0341_03_GENE.KKTK_SVC_KEI_NO = KK0341_03.KKTK_SVC_KEI_NO ");
//				sql_Buff.append("         AND    KK0341_03_GENE.RSV_APLY_YMD <= ? ");
//				sql_Buff.append("         AND    KK0341_03_GENE.RSV_APLY_CD = '2' ");
//				sql_Buff.append("         AND    KK0341_03_GENE.MK_FLG = '0' ");
//				sql_Buff.append("         GROUP BY KK0341_03_GENE.KKTK_SVC_KEI_NO) ");
//				arraylist.add(svcKeiNo);
//				arraylist.add(stdYmd);
//				arraylist.add(svcKeiNo);
//				arraylist.add(stdYmd);
//				arraylist.add(stdYmd);
//				arraylist.add(stdYmd);
//			}
//			sql_Buff.append(" ) ");
//			
//			// 検索条件マップが設定されている場合、IN句で検索条件を設定する。
//			sql_Buff = addSearchJknSql(sql_Buff, "KK0341", searchJknMap, true);
//			arraylist = addSearchJknParam(arraylist, searchJknMap);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索データの設定
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery, getSelectMsgColumnList(), 0);

			return outMsg1;
		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}

	/**
	 * <p>
	 * サービス契約内訳番号に紐づく機器提供サービス契約明細を取得します。
	 * </p>
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @param searchJknMap 検索条件マップ(key：項目名、value：項目値リスト)<br>
	 *         機器提供サービス契約.項目名 IN (項目値リスト)を検索条件とします。個別検索条件がない場合はNULLを設定すること。
	 * @param stdYmd 基準年月日
	 * @param searchPtn 検索パターン<br>
	 * "1"：親契約識別コードが"03"(サービス契約内訳)の「機器提供サービス契約」を取得する場合<br>
	 * "2"：親契約識別コードが"04"(オプションサービス契約)の「機器提供サービス契約」を取得する場合<br>
	 * "3"：該当の「サービス契約内訳」配下の全ての「機器提供サービス契約」("1"または"2")を取得する場合<br>
	 * @return 機器提供サービス契約明細
	 */
	public CAANMsg[] getKK0341bySvcKeiUcwk(String svcKeiUcwkNo, HashMap<String, String[]> searchJknMap, String stdYmd, String searchPtn)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		if (!("1".equals(searchPtn) || "2".equals(searchPtn) || "3".equals(searchPtn)))
		{
			throw new CAANRuntimeException("未定義の検索パターンです。");
		}

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// 注）2013/2/19 現時点では、機器提供サービス契約.親契約識別コードが"03"(サービス契約内訳)の場合だけでなく、
			//     "04"(オプションサービス契約)の場合でも、親「サービス契約内訳」のサービス契約内訳番号が設定されているため、以下のような検索条件となる。
			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(getSelectColumnListString(getSelectDBColumnList()));
			sql_Buff.append(" FROM   KK_T_KKTK_SVC_KEI KK0341 ");
			if ("1".equals(searchPtn))
			{
				// 親契約識別コードが"03"(サービス契約内訳)の「機器提供サービス契約」を取得する場合
				sql_Buff.append(" WHERE  KK0341.OYA_KEI_SKBT_CD = '03' ");
			}
			else if ("2".equals(searchPtn))
			{
				// 親契約識別コードが"04"(オプションサービス契約)の「機器提供サービス契約」を取得する場合
				sql_Buff.append(" WHERE  KK0341.OYA_KEI_SKBT_CD = '04' ");
			}
			else if ("3".equals(searchPtn))
			{
				// 該当の「サービス契約内訳」配下の全ての「機器提供サービス契約」を取得する場合
				sql_Buff.append(" WHERE  KK0341.OYA_KEI_SKBT_CD IN ('03', '04') ");
			}
			sql_Buff.append(" AND    KK0341.SVC_KEI_UCWK_NO = ? ");
			sql_Buff.append(" AND   (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sql_Buff.append("     FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("     WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("     AND    KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("     AND    KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("     AND    KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append("     GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO) ");
			arraylist.add(svcKeiUcwkNo);
			arraylist.add(stdYmd);
			
			// 検索条件マップが設定されている場合、IN句で検索条件を設定する。
			sql_Buff = addSearchJknSql(sql_Buff, "KK0341", searchJknMap, true);
			arraylist = addSearchJknParam(arraylist, searchJknMap);

			// 注）機器提供サービス契約.親契約識別コードが"03"(サービス契約内訳)の場合だけサービス契約内訳番号が設定されている場合の検索は、以下のような検索条件となる。
//			sql_Buff.append(" WHERE (KK0341.KKTK_SVC_KEI_NO, KK0341.GENE_ADD_DTM) IN ( ");
//			if ("1".equals(searchPtn) || "3".equals(searchPtn))
//			{
//				// 親契約識別コードが"03"(サービス契約内訳)の「機器提供サービス契約」を取得する場合
//				sql_Buff.append("     SELECT KK0341_02.KKTK_SVC_KEI_NO ");
//				sql_Buff.append("          , KK0341_02.GENE_ADD_DTM ");
//				sql_Buff.append("     FROM   KK_T_KKTK_SVC_KEI KK0341_02 ");
//				sql_Buff.append("     WHERE  KK0341_02.OYA_KEI_SKBT_CD = '03' ");
//				sql_Buff.append("     AND    KK0341_02.SVC_KEI_UCWK_NO = ? ");
//				sql_Buff.append("     AND   (KK0341_02.KKTK_SVC_KEI_NO, KK0341_02.RSV_APLY_YMD || KK0341_02.GENE_ADD_DTM) = ");
//				sql_Buff.append("        (SELECT KK0341_02_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_02_GENE.RSV_APLY_YMD || KK0341_02_GENE.GENE_ADD_DTM) AS KK0341_02_MAX ");
//				sql_Buff.append("         FROM   KK_T_KKTK_SVC_KEI KK0341_02_GENE ");
//				sql_Buff.append("         WHERE  KK0341_02_GENE.KKTK_SVC_KEI_NO = KK0341_02.KKTK_SVC_KEI_NO ");
//				sql_Buff.append("         AND    KK0341_02_GENE.RSV_APLY_YMD <= ? ");
//				sql_Buff.append("         AND    KK0341_02_GENE.RSV_APLY_CD = '2' ");
//				sql_Buff.append("         AND    KK0341_02_GENE.MK_FLG = '0' ");
//				sql_Buff.append("         GROUP BY KK0341_02_GENE.KKTK_SVC_KEI_NO) ");
//				arraylist.add(svcKeiNo);
//				arraylist.add(stdYmd);
//			}
//			if ("3".equals(searchPtn))
//			{
//				// 該当の「サービス契約内訳」配下の全ての「機器提供サービス契約」を取得する場合
//				sql_Buff.append("     UNION ");
//			}
//			if ("2".equals(searchPtn) || "3".equals(searchPtn))
//			{
//				// 親契約識別コードが"04"(オプションサービス契約)の「機器提供サービス契約」を取得する場合
//				sql_Buff.append("     SELECT KK0341_03.KKTK_SVC_KEI_NO ");
//				sql_Buff.append("          , KK0341_03.GENE_ADD_DTM ");
//				sql_Buff.append("     FROM   KK_T_KKTK_SVC_KEI KK0341_03 ");
//				sql_Buff.append("     WHERE  KK0341_03.OYA_KEI_SKBT_CD = '04' ");
//				sql_Buff.append("     AND EXISTS ( ");
//				sql_Buff.append("         SELECT 1 ");
//				sql_Buff.append("         FROM   KK_T_OP_SVC_KEI KK0351 ");
//				sql_Buff.append("         WHERE  KK0351.OP_SVC_KEI_NO = KK0341_03.OP_SVC_KEI_NO ");
//				sql_Buff.append("         AND    KK0351.OYA_KEI_SKBT_CD = '03' ");
//				sql_Buff.append("         AND    KK0351.SVC_KEI_UCWK_NO = ? ");
//				sql_Buff.append("         AND   (KK0351.OP_SVC_KEI_NO, KK0351.RSV_APLY_YMD || KK0351.GENE_ADD_DTM) = ");
//				sql_Buff.append("            (SELECT KK0351_GENE.OP_SVC_KEI_NO, MAX(KK0351_GENE.RSV_APLY_YMD || KK0351_GENE.GENE_ADD_DTM) AS KK0351_MAX ");
//				sql_Buff.append("             FROM   KK_T_OP_SVC_KEI KK0351_GENE ");
//				sql_Buff.append("             WHERE  KK0351_GENE.OP_SVC_KEI_NO = KK0351.OP_SVC_KEI_NO ");
//				sql_Buff.append("             AND    KK0351_GENE.RSV_APLY_YMD <= ? ");
//				sql_Buff.append("             AND    KK0351_GENE.RSV_APLY_CD = '2' ");
//				sql_Buff.append("             AND    KK0351_GENE.MK_FLG = '0' ");
//				sql_Buff.append("             GROUP BY KK0351_GENE.OP_SVC_KEI_NO) ");
//				sql_Buff.append("     ) ");
//				sql_Buff.append("     AND   (KK0341_03.KKTK_SVC_KEI_NO, KK0341_03.RSV_APLY_YMD || KK0341_03.GENE_ADD_DTM) = ");
//				sql_Buff.append("        (SELECT KK0341_03_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_03_GENE.RSV_APLY_YMD || KK0341_03_GENE.GENE_ADD_DTM) AS KK0341_03_MAX ");
//				sql_Buff.append("         FROM   KK_T_KKTK_SVC_KEI KK0341_03_GENE ");
//				sql_Buff.append("         WHERE  KK0341_03_GENE.KKTK_SVC_KEI_NO = KK0341_03.KKTK_SVC_KEI_NO ");
//				sql_Buff.append("         AND    KK0341_03_GENE.RSV_APLY_YMD <= ? ");
//				sql_Buff.append("         AND    KK0341_03_GENE.RSV_APLY_CD = '2' ");
//				sql_Buff.append("         AND    KK0341_03_GENE.MK_FLG = '0' ");
//				sql_Buff.append("         GROUP BY KK0341_03_GENE.KKTK_SVC_KEI_NO) ");
//				arraylist.add(svcKeiNo);
//				arraylist.add(stdYmd);
//				arraylist.add(stdYmd);
//			}
//			sql_Buff.append(" ) ");
//			
//			// 検索条件マップが設定されている場合、IN句で検索条件を設定する。
//			sql_Buff = addSearchJknSql(sql_Buff, "KK0341", searchJknMap, true);
//			arraylist = addSearchJknParam(arraylist, searchJknMap);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索データの設定
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery, getSelectMsgColumnList(), 0);

			return outMsg1;
		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}

	/**
	 * <p>
	 * サービス契約回線内訳番号に紐づく機器提供サービス契約明細を取得します。
	 * </p>
	 * @param svcKeiKaisenUcwkNo サービス契約回線内訳番号
	 * @param searchJknMap 検索条件マップ(key：項目名、value：項目値リスト)<br>
	 *         機器提供サービス契約.項目名 IN (項目値リスト)を検索条件とします。個別検索条件がない場合はNULLを設定すること。
	 * @param stdYmd 基準年月日
	 * @return 機器提供サービス契約明細
	 */
	public CAANMsg[] getKK0341bySvcKeiKaisenUcwk(String svcKeiKaisenUcwkNo, HashMap<String, String[]> searchJknMap, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(getSelectColumnListString(getSelectDBColumnList()));
			sql_Buff.append(" FROM   KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" WHERE  KK0341.OYA_KEI_SKBT_CD = '02' ");
			sql_Buff.append(" AND    KK0341.SVC_KEI_KAISEN_UCWK_NO = ? ");
			sql_Buff.append(" AND   (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sql_Buff.append("     FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("     WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("     AND    KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("     AND    KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("     AND    KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append("     GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO) ");
			arraylist.add(svcKeiKaisenUcwkNo);
			arraylist.add(stdYmd);
			
			// 検索条件マップ1が設定されている場合、IN句で検索条件を設定する。
			sql_Buff = addSearchJknSql(sql_Buff, "KK0341", searchJknMap, true);
			arraylist = addSearchJknParam(arraylist, searchJknMap);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索データの設定
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery, getSelectMsgColumnList(), 0);

			return outMsg1;
		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}

	/**
	 * <p>
	 * カレントの機器提供サービス契約の機器変更番号に変わる直前のレコードを取得します。
	 * </p>
	 * @param kktkSvcKeiNo 機器提供サービス契約番号
	 * @param stdYmd 基準年月日
	 * @return カレントの機器提供サービス契約番の機器変更番号に変わる直前のレコード
	 */
	public CAANMsg getKK0341BeforeKikiChgNoCurrent(String kktkSvcKeiNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ").append(getSelectColumnListString(getSelectDBColumnList()));
			sql_Buff.append(" FROM KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" WHERE KK0341.KKTK_SVC_KEI_NO = ? ");
			sql_Buff.append(" AND   (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sql_Buff.append("     FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("     WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("     AND    KK0341_GENE.KIKI_CHG_NO <>  ");
			sql_Buff.append("        (SELECT KK0341_1.KIKI_CHG_NO ");
			sql_Buff.append("         FROM   KK_T_KKTK_SVC_KEI KK0341_1 ");
			sql_Buff.append("         WHERE  KK0341_1.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("         AND    (KK0341_1.KKTK_SVC_KEI_NO, KK0341_1.RSV_APLY_YMD || KK0341_1.GENE_ADD_DTM) = ");
			sql_Buff.append("                 (SELECT KK0341_1_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_1_GENE.RSV_APLY_YMD || KK0341_1_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sql_Buff.append("                  FROM   KK_T_KKTK_SVC_KEI KK0341_1_GENE ");
			sql_Buff.append("                  WHERE  KK0341_1_GENE.KKTK_SVC_KEI_NO = KK0341_1.KKTK_SVC_KEI_NO ");
			sql_Buff.append("                  AND    KK0341_1_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("                  AND    KK0341_1_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("                  AND    KK0341_1_GENE.MK_FLG = '0' ");
			sql_Buff.append("                  GROUP BY KK0341_1_GENE.KKTK_SVC_KEI_NO) ");
			sql_Buff.append("         GROUP BY KK0341_1.KIKI_CHG_NO) ");
			sql_Buff.append("     AND    KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("     AND    KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("     AND    KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append("     GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO) ");
			arraylist.add(kktkSvcKeiNo);
			arraylist.add(stdYmd);
			arraylist.add(stdYmd);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 検索データの設定
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery, getSelectMsgColumnList(), 0);
			
			if (outMsg1.length == 0)
			{
				return null;
			}

			return outMsg1[0];
		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}
}
