/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbEKK0351B506TPDA
*	ソースファイル名：JSYejbEKK0351B506TPDA.java
*	作成者			：EK909148
*	日付			：2012年06月25日
*＜機能概要＞
*	オプションチャンネル契約状態一覧照会テンプレートDBアクセス部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00
*	v3.00       2012/04/26  FJ)南岡    【ANK-0281-00-00】	基本コース・オプションCH組合せチェック
*	v3.01       2012/05/24  FU)南岡     カレント取得SQL修正
*	v3.02       2012/06/25  FU)南岡    【TAI-2012-0000054】 SQL見直し
*	v4.00       2012/08/02  FU)美濃原  【ANK-0531-00-00】	TVオプションＣｈ重複チェック
*	v4.00       2012/08/02  FU)美濃原  【ANK-0550-00-00】	バック系オプションチャンネル追加に伴う重複チェック追加(5月テレビ再編)
*	v4.00       2012/08/02  FU)美濃原  【ANK-0324-00-00】	オプションチャンネル申込の早期化について
*	v4.00       2012/10/12  FJ)美濃原  【IT1-2012-0001273】	システム日付をオンライン運用日付に修正
*	v4.00       2012/10/12  FJ)美濃原  【IT1-2012-0001463】	相関チェック開始、終了年月日のチェックを修正
*	v5.00       2013/01/16  FJ)美濃原  【ANK-1399-00-00】	月末日解約の状態取得を修正
*   v5.01       2013/09/03  FJ）文元   【OM-2013-0001581】	C-CAS製造番号に紐づく機器提供サービス契約が複数件存在する場合エラーとなる不具合対応
*   v14.00      2015/04/22	FJ）西川   【OM-2015-0000744】オプションチャンネル2重課金対応
*
********************************************************************************/

package eo.ejb.cbs.sqlf;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANSQLFacility;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateDBAccessHandler;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import eo.ejb.cbs.cbsmsg.EKK0351B506CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B506CBSMsg1List;
import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.common.JCCModelCommon;

/**
*
*  テンプレートDBアクセス部品　EKK0351B506_SQLF<br>
*  入力された項目からSQL文を動的に組み立て、<br>
*  検索結果をCBSMsgにセットします。<br>
*/
public class JSYejbEKK0351B506TPDA extends CAANSQLFacility implements TemplateDBAccessHandler{
	
	/**
	 * コンストラクタ
	 */
	public JSYejbEKK0351B506TPDA()	{
	}
	
	/**
	*   EKK0351B506_SQLF<br>
	*   @param inMsg    入力値の格納されたCBSMsg <br>
	*   @return void
	*/
	public void invoke(CAANMsg inMsg,AgentDispatchContext inContext){
		
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		/******************** 
		 * SQL文の作成
		 ********************/

		try{
			
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());
			
			
			// SQL文_基本部1
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ")
			.append(" 	KK0811.OP_SVC_CD ")
			.append(" 	,KK0821.OP_SVC_NM ")
			.append(" 	,KK0821.DGTIA_GRP_CD ")
			.append(" 	,KK0821.OP_CHANNEL_SBT_CD ")
			.append(" 	,KK0821.UK_STA_YMDHM ")
			.append(" 	,KK0821.UK_END_YMDHM ")
			.append(" 	,KK0811.OP_SVC_BIKO ")
			.append(" 	,KK0811.BIKO_SCREEN_DSP_STAYMD ")
			.append(" 	,KK0811.BIKO_SCREEN_DSP_ENDYMD ")
			.append(" 	,KK0351.OP_SVC_KEI_STAT ")
			.append(" 	,KK0351.RSV_APLY_YMD ")
			.append(" 	,KK0791.PCRS_CD ")
			.append(" 	,KK0591.PPLAN_CD ")
			.append(" 	,KK0591.PPLAN_NM ")
			.append(" 	,DECODE(KK0601.PPLAN_KOTEI_AMNT, NULL, KK0601_NEXT.PPLAN_KOTEI_AMNT, KK0601.PPLAN_KOTEI_AMNT) PPLAN_KOTEI_AMNT ")
			.append(" 	, ")
			// (1)料金単価  コード名称管理より現在有効な情報を取得
			.append(" 	( ")
			.append(" 		SELECT  ")
			.append(" 			ZM0171_TMP.CD_DIV_NM ")
			.append(" 		FROM   ZM_M_CD_NM_KANRI ZM0171_TMP ")
			.append(" 		WHERE   ")
			.append(" 			ZM0171_TMP.CD_SBT_CD = 'CD00896' ")
			.append(" 			AND    ( ? BETWEEN ZM0171_TMP.CD_TSTAYMD AND ZM0171_TMP.CD_TENDYMD ) ")
			.append(" 			AND    ZM0171_TMP.MK_FLG = '0' ")
			.append(" 			AND    ZM0171_TMP.CD_DIV = DECODE(KK0601.PPLAN_KOTEI_AMNT, NULL, KK0601_NEXT.PPLAN_KOTEI_TANI_CD, KK0601.PPLAN_KOTEI_TANI_CD) ")
			.append(" 	) AS PPLAN_KOTEI_TANI_CD_NM ")
// ANK-0550 来月単価 START
			.append(" 	,DECODE(KK0601_NEXT.PPLAN_KOTEI_AMNT, NULL, KK0601.PPLAN_KOTEI_AMNT, KK0601_NEXT.PPLAN_KOTEI_AMNT) PPLAN_KOTEI_AMNT_NEXT_M ")
			.append(" 	, ")
			// (2)料金単価(来月)  コード名称管理より現在有効な情報を取得
			.append(" 	( ")
			.append(" 		SELECT  ")
			.append(" 			ZM0171_TMP.CD_DIV_NM ")
			.append(" 		FROM   ZM_M_CD_NM_KANRI ZM0171_TMP ")
			.append(" 		WHERE   ")
			.append(" 			ZM0171_TMP.CD_SBT_CD = 'CD00896' ")
			.append(" 			AND    ( TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE(?,'YYYYMMDD'),1)),'YYYYMMDD') BETWEEN ZM0171_TMP.CD_TSTAYMD AND ZM0171_TMP.CD_TENDYMD ) ")
			.append(" 			AND    ZM0171_TMP.MK_FLG = '0' ")
			.append(" 			AND    ZM0171_TMP.CD_DIV = DECODE(KK0601_NEXT.PPLAN_KOTEI_TANI_CD, NULL, KK0601.PPLAN_KOTEI_TANI_CD, KK0601_NEXT.PPLAN_KOTEI_TANI_CD) ")
			.append(" 	) AS PPLAN_KOTEI_TANI_CD_NM_NEXT_M ")
// ANK-0550 来月単価 END
			.append(" 	,KK0811.OPCH_DSL_TG_CHSHT_FLG ")
			.append(" 	,KK0811.OPCH_ADD_SCREEN_DSP_TG_FLG ")
			.append(" 	,DECODE(OPCH_DSL_TG_CHSHT_FLG,'1','1',DECODE(KK0351.SORT_KEY,'','4',KK0351.SORT_KEY)) AS SORT_KEY ")
			.append(" FROM  ")
			// (MAIN-1) 機器提供サービス契約、サービス契約内訳
			.append(" 	KK_T_KKTK_SVC_KEI KK0341 ")
			.append(" 	INNER JOIN KK_T_SVC_KEI_UCWK KK0161 ")
			.append(" 		ON KK0161.SVC_KEI_UCWK_NO = KK0341.SVC_KEI_UCWK_NO ")
			.append(" 	INNER JOIN ")
			.append(" 		( ")
			// (MAIN-2) 料金コース_オプションサービスより現在有効な情報を取得 (料金別の番組情報)
			.append(" 			SELECT  ")
			.append(" 				KK0811_TMP.PCRS_CD ")
			.append(" 				,KK0811_TMP.OP_SVC_CD ")
			.append(" 				,KK0811_TMP.OP_SVC_BIKO ")
			.append(" 				,KK0811_TMP.BIKO_SCREEN_DSP_STAYMD ")
			.append(" 				,KK0811_TMP.BIKO_SCREEN_DSP_ENDYMD ")
			//     オプションチャンネル解約対象抽出フラグ＝'1'の場合のみ、相関チェック開始、終了年月日が設定される。
			.append(" 				,CASE ")
			.append(" 					WHEN KK0811_TMP.OPCH_DSL_TG_CHSHT_FLG = '1' THEN ")
			.append(" 						CASE ")
			.append(" 							WHEN ? BETWEEN KK0811_TMP.SOKAN_CHK_STAYMD AND KK0811_TMP.SOKAN_CHK_ENDYMD THEN '1' ")
			.append(" 							ELSE '0' ")
			.append(" 						END ")
			.append(" 					ELSE '0' ")
			.append(" 				 END AS OPCH_DSL_TG_CHSHT_FLG ")
			.append(" 				,KK0811_TMP.OPCH_ADD_SCREEN_DSP_TG_FLG ")
			.append(" 				,KK0811_TMP.OPSV_CHPSB_SCREEN_SKBT_CD ")
			.append(" 				,KK0811_TMP.GENE_ADD_DTM ")
			.append(" 				,KK0811_TMP.RSV_APLY_YMD ")
			.append(" 				,MAX(KK0811_TMP.RSV_APLY_YMD || KK0811_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0811_TMP.PCRS_CD,KK0811_TMP.OP_SVC_CD) MAX_GENE_ADD_DTM ")
			.append(" 			FROM   KK_M_PCRS_OP_SVC KK0811_TMP ")
			.append(" 			WHERE   ")
			.append(" 				KK0811_TMP.RSV_APLY_YMD <= ?  ")
			.append(" 				AND    KK0811_TMP.MK_FLG = '0' ")
			.append(" 				AND    ( ? BETWEEN KK0811_TMP.PCRS_OP_SVC_TSTAYMD AND KK0811_TMP.PCRS_OP_SVC_TENDYMD ) ")
			.append(" 		) KK0811 ")
			.append(" 		ON KK0811.PCRS_CD = KK0161.PCRS_CD ")
			.append(" 		AND (KK0811.RSV_APLY_YMD || KK0811.GENE_ADD_DTM) = KK0811.MAX_GENE_ADD_DTM")
			.append(" 	LEFT OUTER JOIN ")
			.append(" 		( ")
			// (SUB-1) オプションサービスより、予約適用日が当日以前 かつ 世代登録年月日時分秒が最大の情報を取得 (番組の契約情報)
			.append(" 			SELECT  ")
			.append(" 				KK0821_TMP.OP_SVC_CD ")
			.append(" 				,KK0821_TMP.OP_SVC_NM ")
			.append(" 				,KK0821_TMP.DGTIA_GRP_CD ")
			.append(" 				,KK0821_TMP.OP_CHANNEL_SBT_CD ")
			.append(" 				,KK0821_TMP.UK_STA_YMDHM ")
			.append(" 				,KK0821_TMP.UK_END_YMDHM ")
			.append(" 				,KK0821_TMP.GENE_ADD_DTM ")
			.append(" 				,KK0821_TMP.OP_SVC_TSTAYMD ")
			.append(" 				,KK0821_TMP.RSV_APLY_YMD ")
			.append(" 				,MAX(KK0821_TMP.RSV_APLY_YMD || KK0821_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0821_TMP.OP_SVC_CD) MAX_GENE_ADD_DTM ")
			.append(" 			FROM   KK_M_OP_SVC KK0821_TMP ")
			.append(" 			WHERE ")
			.append(" 				KK0821_TMP.RSV_APLY_YMD <= ?  ")
			.append(" 				AND    KK0821_TMP.MK_FLG = '0'  ")
			.append(" 				AND    ( ? BETWEEN KK0821_TMP.OP_SVC_TSTAYMD AND KK0821_TMP.OP_SVC_TENDYMD ) ")
			.append(" 		) KK0821 ")
			.append(" 		ON KK0811.OP_SVC_CD = KK0821.OP_SVC_CD ")
			.append(" 		AND (KK0821.RSV_APLY_YMD || KK0821.GENE_ADD_DTM) = KK0821.MAX_GENE_ADD_DTM")
			.append(" 	LEFT OUTER JOIN ")
			.append(" 		( ")
			// (SUB-2) 料金コースより、予約適用日が当日以前 かつ 世代登録年月日時分秒が最大の情報を取得
			.append(" 			SELECT  ")
			.append(" 				KK0791_TMP.PCRS_CD ")
			.append(" 				,KK0791_TMP.OP_SVC_CD ")
			.append(" 				,KK0791_TMP.GENE_ADD_DTM ")
			.append(" 				,KK0791_TMP.PCRS_TSTAYMD ")
			.append(" 				,KK0791_TMP.RSV_APLY_YMD ")
			.append(" 				,MAX(KK0791_TMP.RSV_APLY_YMD || KK0791_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0791_TMP.PCRS_CD) MAX_GENE_ADD_DTM ")
			.append(" 			FROM   KK_M_PCRS KK0791_TMP ")
			.append(" 			WHERE   ")
			.append(" 				KK0791_TMP.RSV_APLY_YMD <= ?  ")
			.append(" 				AND    ( ? BETWEEN KK0791_TMP.PCRS_TSTAYMD AND KK0791_TMP.PCRS_TENDYMD ) ")
			.append(" 				AND    KK0791_TMP.MK_FLG = '0' ")
			.append(" 		) KK0791 ")
			.append(" 		ON KK0821.OP_SVC_CD = KK0791.OP_SVC_CD ")
			.append(" 		AND (KK0791.RSV_APLY_YMD || KK0791.GENE_ADD_DTM) = KK0791.MAX_GENE_ADD_DTM")
			.append(" 	LEFT OUTER JOIN ")
			.append(" 		( ")
			// (SUB-3) 料金プランより、情報を取得
			.append(" 			SELECT  ")
			.append(" 				KK0591_TMP.PCRS_CD ")
			.append(" 				,KK0591_TMP.PPLAN_CD ")
			.append(" 				,KK0591_TMP.PPLAN_NM ")
			.append(" 			FROM   KK_M_PPLAN KK0591_TMP ")
			.append(" 			WHERE   ")
			.append(" 				( ? BETWEEN KK0591_TMP.PPLAN_TSTAYMD AND KK0591_TMP.PPLAN_TENDYMD ) ")
			.append(" 				AND    KK0591_TMP.MK_FLG = '0' ")
			.append(" 		) KK0591 ")
			.append(" 		ON KK0791.PCRS_CD = KK0591.PCRS_CD ")
			.append(" 	LEFT OUTER JOIN ")
			.append(" 		( ")
			// (SUB-4) 当月  料金プラン固定単価より、、
			// 料金プラン種別コードが基本料金
			// かつ 契約状態種別コードが通常
			// かつ 予約適用日が当日以前
			// かつ 世代登録年月日時分秒が最大の情報を取得
			.append(" 			SELECT  ")
			.append(" 				KK0601_TMP.PCRS_CD ")
			.append(" 				,KK0601_TMP.PPLAN_CD ")
			.append(" 				,KK0601_TMP.PPLAN_KOTEI_AMNT ")
			.append(" 				,KK0601_TMP.PPLAN_KOTEI_TANI_CD ")
			.append(" 				,KK0601_TMP.PPLAN_TANKA_SBT_CD ")
			.append(" 				,KK0601_TMP.PPLAN_PRC_SBT_CD ")
			.append(" 				,KK0601_TMP.KEI_STAT_SBT_CD ")
			.append(" 				,KK0601_TMP.PPLAN_KOTEI_TANKA_TSTAYMD ")
			.append(" 				,KK0601_TMP.PPLAN_KOTEI_TANKA_TENDYMD ")
			.append(" 				,KK0601_TMP.GENE_ADD_DTM ")
			.append(" 				,KK0601_TMP.RSV_APLY_YMD ")
			.append(" 				,MAX(KK0601_TMP.RSV_APLY_YMD || KK0601_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0601_TMP.PCRS_CD, KK0601_TMP.PPLAN_CD) MAX_GENE_ADD_DTM ")
			.append(" 			FROM   KK_M_PPLAN_KTTANKA KK0601_TMP ")
			.append(" 			WHERE   ")
			.append(" 				KK0601_TMP.RSV_APLY_YMD <= ?  ")
			.append(" 				AND  ( ? ")	//12
			.append(" 				       BETWEEN KK0601_TMP.PPLAN_KOTEI_TANKA_TSTAYMD AND KK0601_TMP.PPLAN_KOTEI_TANKA_TENDYMD ) ")
			.append(" 				AND    KK0601_TMP.MK_FLG = '0' ")
			.append(" 				AND    KK0601_TMP.PPLAN_TANKA_SBT_CD = 'K01' ")
			.append(" 				AND    KK0601_TMP.PPLAN_PRC_SBT_CD = '00' ")
			.append(" 				AND    KK0601_TMP.KEI_STAT_SBT_CD = '01' ")
			.append(" 		) KK0601 ")
			.append(" 		ON  KK0591.PCRS_CD = KK0601.PCRS_CD ")
			.append(" 		AND KK0591.PPLAN_CD = KK0601.PPLAN_CD ")
			.append(" 		AND (KK0601.RSV_APLY_YMD || KK0601.GENE_ADD_DTM) = KK0601.MAX_GENE_ADD_DTM ")
			// ANK-0550 来月単価 START
			// (SUB-5) 来月 料金プラン固定単価より、、
			// 料金プラン種別コードが基本料金
			// かつ 契約状態種別コードが通常
			// かつ 予約適用日が当日以前
			// かつ 世代登録年月日時分秒が最大の情報を取得
			.append(" 	LEFT OUTER JOIN ")
			.append(" 		( ")
			.append(" 			SELECT  ")
			.append(" 				KK0601_TMP.PCRS_CD ")
			.append(" 				,KK0601_TMP.PPLAN_CD ")
			.append(" 				,KK0601_TMP.PPLAN_KOTEI_AMNT ")
			.append(" 				,KK0601_TMP.PPLAN_KOTEI_TANI_CD ")
			.append(" 				,KK0601_TMP.PPLAN_TANKA_SBT_CD ")
			.append(" 				,KK0601_TMP.PPLAN_PRC_SBT_CD ")
			.append(" 				,KK0601_TMP.KEI_STAT_SBT_CD ")
			.append(" 				,KK0601_TMP.PPLAN_KOTEI_TANKA_TSTAYMD ")
			.append(" 				,KK0601_TMP.PPLAN_KOTEI_TANKA_TENDYMD ")
			.append(" 				,KK0601_TMP.GENE_ADD_DTM ")
			.append(" 				,KK0601_TMP.RSV_APLY_YMD ")
			.append(" 				,MAX(KK0601_TMP.RSV_APLY_YMD || KK0601_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0601_TMP.PCRS_CD, KK0601_TMP.PPLAN_CD) MAX_GENE_ADD_DTM ")
			.append(" 			FROM   KK_M_PPLAN_KTTANKA KK0601_TMP ")
			.append(" 			WHERE   ")
			.append(" 				KK0601_TMP.RSV_APLY_YMD <= TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE(?,'YYYYMMDD'),1)),'YYYYMMDD')  ")
			.append(" 				AND  ( TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE(?,'YYYYMMDD'),1)),'YYYYMMDD') ")
			.append(" 				       BETWEEN KK0601_TMP.PPLAN_KOTEI_TANKA_TSTAYMD AND KK0601_TMP.PPLAN_KOTEI_TANKA_TENDYMD ) ")
			.append(" 				AND    KK0601_TMP.MK_FLG = '0' ")
			.append(" 				AND    KK0601_TMP.PPLAN_TANKA_SBT_CD = 'K01' ")
			.append(" 				AND    KK0601_TMP.PPLAN_PRC_SBT_CD = '00' ")
			.append(" 				AND    KK0601_TMP.KEI_STAT_SBT_CD = '01' ")
			.append(" 		) KK0601_NEXT ")
			.append(" 		ON  KK0591.PCRS_CD = KK0601_NEXT.PCRS_CD ")
			.append(" 		AND KK0591.PPLAN_CD = KK0601_NEXT.PPLAN_CD ")
			.append(" 		AND (KK0601_NEXT.RSV_APLY_YMD || KK0601_NEXT.GENE_ADD_DTM) = KK0601_NEXT.MAX_GENE_ADD_DTM ")
			// ANK-0550 来月単価 END
			.append(" 	LEFT OUTER JOIN ")
			.append(" 		( ")
			// (SUB-6) オプションチャンネルの契約状態を取得
			.append(" 			SELECT  ")
			.append(" 				KK0351_02.SVC_KEI_UCWK_NO  ")
			.append(" 				,KK0351_02.OP_SVC_CD ")
			.append(" 				,KK0351_02.OP_SVC_KEI_STAT ")
			.append(" 				,DECODE(KK0351_02.OP_SVC_KEI_STAT, '', '', KK0351_02.RSV_APLY_YMD) RSV_APLY_YMD ")
			.append(" 				,DECODE(KK0351_02.OP_SVC_KEI_STAT,'210','1' ")
			.append(" 				,DECODE(KK0351_02.OP_SVC_KEI_STAT,'220','1' ")
			.append(" 				,DECODE(KK0351_02.OP_SVC_KEI_STAT,'100',DECODE(TRIM(KK0351_02.IDO_RSV_DTL_CD),'014','2','1') ")
			.append(" 				,DECODE(KK0351_02.OP_SVC_KEI_STAT,'010','2' ")
			.append(" 				,DECODE(KK0351_02.OP_SVC_KEI_STAT,'020','2' ")
			.append(" 				,DECODE(KK0351_02.OP_SVC_KEI_STAT,'030','2' ")
			.append(" 				,DECODE(KK0351_02.OP_SVC_KEI_STAT,'910','3'))))))) AS SORT_KEY ")
			.append(" 			FROM ( ") // KK0351_02 start
			.append(" 				SELECT  ")
			.append(" 					KK0351_01.SVC_KEI_UCWK_NO  ")
			.append(" 					,KK0351_01.OP_SVC_KEI_NO  ")
			.append(" 					,KK0351_01.OP_SVC_CD ")
			.append(" 					,KK1681.IDO_RSV_DTL_CD ")
			// 当月中にサービス提供中の解約があったかどうか判定する。[今すぐ視聴]ボタンを押せなくする
			//（「サービス提供中の解約」は運用日が末日の場合は異動予約が作成されずに、
			//        オプションの解約が作成される。末日以外は期日到来まで異動予約。）
			//（「締結済の解約」はオプションの解約が作成される。）
			// ※ 基本的に[今すぐ視聴]＝サービス提供中、[来月から視聴]＝締結済
			// ※ バックヤード対応のもので、[申込]でとまるものもある。
			// ※ 異動予約で未処理分は「来月から視聴」で申込の予約、「サービス提供中」で解約の予約。
			//		サービス提供中の解約「サービス開始年月日≠NULL かつ サービス終了年月日の年月 = 運用年月は、当月に「解約」として扱う。」
			//		締結済の解約「サービス開始年月日＝NULL」
			//		異動予約詳細コード＝016(解約手続中),014(申込手続中)
			// @[来月から視聴]の予約が入っているか（「手続中」として表示。ボタンは使用不可。）
			// A当月内に解約があるか
			// B A以外のオプションサービス契約の解約は、「サービス提供中以外」の解約のため、 [今すぐ視聴]ボタンを有効にする
			.append(" 					,CASE WHEN KK0351_TG.OP_SVC_KEI_STAT IS NULL THEN ")
			.append(" 						CASE WHEN KK0351_01.OP_SVC_KEI_STAT = '910' THEN '' ")
			.append(" 							WHEN KK0351_01.OP_SVC_KEI_STAT = '920' THEN '' ")
			.append(" 						ELSE KK0351_01.OP_SVC_KEI_STAT ")
			.append(" 						END ")
			.append(" 					 ELSE ")
			.append(" 						CASE WHEN (KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) > KK0351_TG.TG_RSV_GENE_ADD_DTM THEN ")
			.append(" 							CASE WHEN KK0351_01.OP_SVC_KEI_STAT = '920' THEN '910'")
			.append(" 							ELSE KK0351_01.OP_SVC_KEI_STAT ")
			.append(" 							END ")
			.append(" 						ELSE KK0351_TG.OP_SVC_KEI_STAT")
			.append(" 						END ")
			.append(" 					 END AS OP_SVC_KEI_STAT")
			.append(" 					,CASE WHEN KK0351_TG.OP_SVC_KEI_STAT IS NULL THEN ")
			.append(" 						CASE WHEN KK0351_01.OP_SVC_KEI_STAT = '910' THEN '' ")
			.append(" 							WHEN KK0351_01.OP_SVC_KEI_STAT = '920' THEN '' ")
			.append(" 						ELSE KK0351_01.RSV_APLY_YMD ")
			.append(" 						END ")
			.append(" 					 ELSE ")
			.append(" 						CASE WHEN (KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) > KK0351_TG.TG_RSV_GENE_ADD_DTM THEN ")
			.append(" 							KK0351_01.RSV_APLY_YMD ")
			.append(" 						ELSE TO_CHAR(LAST_DAY(TO_DATE(?, 'YYYYMMDD')), 'YYYYMMDD') ")
			.append(" 						END ")
			.append(" 					 END AS RSV_APLY_YMD ")

			.append(" 				FROM  ")
			.append(" 					( ") // KK0351_01 start
			// オプションサービス契約より情報を取得
			.append(" 						SELECT  ")
			.append(" 							KK0351_01_TMP.SVC_KEI_UCWK_NO ")
			.append(" 							,KK0351_01_TMP.OP_SVC_CD ")
			.append(" 							,KK0351_01_TMP.OP_SVC_KEI_NO ")
			.append(" 							,KK0351_01_TMP.OP_SVC_KEI_STAT ")
			.append(" 							,KK0351_01_TMP.GENE_ADD_DTM ")
			.append(" 							,KK0351_01_TMP.RSV_APLY_YMD ")
			.append(" 							,KK0351_01_TMP.SVC_STAYMD ")
			.append(" 							,KK0351_01_TMP.SVC_ENDYMD ")
			.append(" 							,MAX(KK0351_01_TMP.RSV_APLY_YMD || KK0351_01_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0351_01_TMP.OP_SVC_KEI_NO) MAX_GENE_ADD_DTM ")
			.append(" 							,MAX(KK0351_01_TMP.RSV_APLY_YMD || KK0351_01_TMP.GENE_ADD_DTM) OVER (PARTITION BY KK0351_01_TMP.OP_SVC_CD) MAX_GENE_ADD_DTM_OPCD ")
			.append(" 							,KK0351_01_TMP.MK_FLG ")
			.append(" 						FROM   KK_T_OP_SVC_KEI KK0351_01_TMP ")
			// 								機器提供サービス契約
			.append(" 						INNER JOIN ")
			.append(" 						( ")
			.append(" 							SELECT DISTINCT SVC_KEI_UCWK_NO")
			.append(" 							FROM KK_T_KKTK_SVC_KEI KK0341 ")
			.append(" 							WHERE ")
			.append(" 							      KK0341.KIKI_SEIZO_NO = ? ")
			.append(" 							AND   KK0341.SVC_KEI_UCWK_NO = ?  ")
			.append(" 							AND   KK0341.KKTK_SVC_KEI_STAT IN ('100', '030') ")
			.append(" 							AND  (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ")
			.append(" 																				(SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) ")
			.append(" 																				FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ")
			.append(" 																				WHERE  KK0341_GENE.KIKI_SEIZO_NO = ? ")
					.append(" 																		AND    KK0341_GENE.SVC_KEI_UCWK_NO = ?  ")
			.append(" 																				AND    KK0341_GENE.KKTK_SVC_CD = 'C011' ")
			.append(" 																				AND    KK0341_GENE.RSV_APLY_YMD <= ?  ")
			.append(" 																				AND    KK0341_GENE.RSV_APLY_CD = '2'  ")
			.append(" 																				AND    KK0341_GENE.MK_FLG = '0' ")
			.append(" 																				GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO) ")
			.append(" 						) KK0341_TMP ")
			.append(" 						ON KK0351_01_TMP.SVC_KEI_UCWK_NO = KK0341_TMP.SVC_KEI_UCWK_NO ")
			.append(" 						WHERE ")
			.append(" 							KK0351_01_TMP.RSV_APLY_YMD <= ?  ")
			.append(" 						AND	KK0351_01_TMP.MK_FLG = '0' ")
			.append(" 						AND KK0351_01_TMP.RSV_APLY_CD = '2' ")
			.append(" 					) KK0351_01 ")
			.append(" 					LEFT OUTER JOIN KK_T_IDO_RSV KK1681 ")
			// 異動予約よりオプション申込予約、オプション解約予約の情報を取得
			.append(" 						ON KK1681.OP_SVC_KEI_NO = KK0351_01.OP_SVC_KEI_NO  ")
			.append(" 						AND KK1681.IDO_RSV_DTL_CD IN ('014','016') ")
			.append(" 						AND KK1681.IDO_RSV_STAT_CD IN ('00','03')  ")
			.append(" 						AND KK1681.RSV_APLY_YMD >= ?  ")
			.append(" 						AND KK1681.MK_FLG = '0'  ")
			// 当月中にサービス提供中の解約があったかどうか取得する
			.append(" 					LEFT OUTER JOIN ( SELECT ")
			.append(" 									 '910' OP_SVC_KEI_STAT  ")
			.append(" 									,KK0351_TG.OP_SVC_CD ")
			.append(" 									,KK0351_TG.SVC_KEI_UCWK_NO ")
			.append(" 									,MAX(KK0351_TG.RSV_APLY_YMD || KK0351_TG.GENE_ADD_DTM) TG_RSV_GENE_ADD_DTM ")
			.append(" 									FROM KK_T_OP_SVC_KEI KK0351_TG ")
			.append(" 					 				LEFT OUTER JOIN KK_T_IDO_RSV KK1681_TG ")
			.append(" 					 				  ON KK1681_TG.OP_SVC_KEI_NO = KK0351_TG.OP_SVC_KEI_NO ")
			.append(" 					 				  AND KK1681_TG.IDO_RSV_DTL_CD IN ('016') ")
			.append(" 					 				  AND KK1681_TG.IDO_RSV_STAT_CD IN ('00','03') ")
			.append(" 					 				  AND KK1681_TG.RSV_APLY_YMD >=  ? ")
			.append(" 					 				  AND KK1681_TG.MK_FLG = '0' ")
			.append(" 					 				WHERE KK0351_TG.RSV_APLY_YMD <= ? ")
			.append(" 					 				  AND KK0351_TG.MK_FLG = '0' ")
			.append(" 					 				  AND KK0351_TG.RSV_APLY_CD = '2' ")
			.append(" 					                  AND ( ")
			.append(" 					 						( KK0351_TG.OP_SVC_KEI_STAT = '910' ")
			.append(" 					 							AND   (TRIM(KK0351_TG.SVC_STAYMD) IS NOT NULL) AND (SUBSTR(KK0351_TG.SVC_ENDYMD, 1, 6) = SUBSTR(?, 1, 6)) ")
			.append(" 					 							AND  KK1681_TG.OP_SVC_KEI_NO IS NULL ")
			.append(" 					 						) OR ( ")
			.append(" 					 							KK0351_TG.OP_SVC_KEI_STAT = '100'  AND KK1681_TG.OP_SVC_KEI_NO IS NOT NULL ")
			.append(" 					 						) ")
			.append(" 					 					) ")
			.append(" 					 				GROUP BY KK0351_TG.SVC_KEI_UCWK_NO, KK0351_TG.OP_SVC_CD ")
			.append(" 					    ) KK0351_TG ")
			.append(" 						ON  KK0351_01.SVC_KEI_UCWK_NO = KK0351_TG.SVC_KEI_UCWK_NO ")
			.append(" 						AND KK0351_TG.OP_SVC_CD = KK0351_01.OP_SVC_CD ")

			// 同じオプションサービスコードで、最新の契約番号 かつ 最新のステータスのレコードに絞り込む
			.append(" 				WHERE ")
//			.append(" 				       KK0351_01.OP_SVC_KEI_STAT IN('010','020','030','100','210','220','910','920') ")
			.append(" 				       KK0351_01.OP_SVC_KEI_STAT IN('010','020','030','100','210','220') ")
			.append(" 				AND    KK0351_01.MK_FLG = '0' ")
			.append(" 				AND    KK0351_01.MAX_GENE_ADD_DTM = (KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) ")
//			.append(" 				AND    KK0351_01.MAX_GENE_ADD_DTM_OPCD = (KK0351_01.RSV_APLY_YMD || KK0351_01.GENE_ADD_DTM) ")
			.append(" 				) KK0351_02 ")
			.append(" 		) KK0351 ")
			.append(" 		ON KK0351.SVC_KEI_UCWK_NO = KK0341.SVC_KEI_UCWK_NO ")
			.append(" 		AND KK0351.OP_SVC_CD = KK0811.OP_SVC_CD ");
	// SQL文_個別部1
			// KK0341：機器提供サービス契約、KK0161：サービス契約内訳、KK0811：料金コース_オプションサービス(M)、
			// KK0821:オプションサービス(M)、KK0601：料金プラン固定単価(M)、
	if ( "1".equals( inMsg.getObject(EKK0351B506CBSMsg.FUNC_CODE).toString() ) ) {
		sql_Buff.append(" WHERE  ")
				.append(" 	KK0341.KIKI_SEIZO_NO = ? ")
				.append(" 	AND    KK0341.SVC_KEI_UCWK_NO = ?  ")
				.append(" 	AND    KK0341.KKTK_SVC_CD = 'C011' ")
				.append(" 	AND    KK0341.KKTK_SVC_KEI_STAT IN ('100', '030') ")
				.append(" 	AND  (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ")
				.append(" 																				(SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) ")
				.append(" 																				FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ")
				.append(" 																				WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ")
				.append(" 																				AND    KK0341_GENE.RSV_APLY_YMD <= ?  ")
				.append(" 																				AND    KK0341_GENE.RSV_APLY_CD = '2'  ")
				.append(" 																				AND    KK0341_GENE.MK_FLG = '0' ")
				.append(" 																				GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO) ")
				.append(" 	AND (KK0161.SVC_KEI_UCWK_NO,KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) =  ")
				.append(" 																				(SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) MAX_GENE_ADD_DTM ")
				.append(" 																				FROM KK_T_SVC_KEI_UCWK KK0161_GENE ")
				.append(" 																				WHERE KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ")
				.append(" 																				AND   KK0161_GENE.RSV_APLY_YMD <=  ? ")
				.append(" 																				AND   KK0161_GENE.RSV_APLY_CD = '2' ")
				.append(" 																				AND   KK0161_GENE.MK_FLG = '0' ")
				.append(" 																				GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ")
				.append(" 	AND    KK0161.SVC_KEI_UCWK_STAT IN ('100', '030') ")
				.append(" 	AND    (KK0811.OPSV_CHPSB_SCREEN_SKBT_CD IN ('1', '3') OR KK0811.OPSV_CHPSB_SCREEN_SKBT_CD IS NULL) ")
				.append(" 	AND    ( (KK0601.PCRS_CD IS NOT NULL) OR (KK0601_NEXT.PCRS_CD IS NOT NULL )) ")
				.append(" 	AND    KK0821.OP_CHANNEL_SBT_CD= ? ")
				.append(" ORDER BY  ")
				.append(" 	SORT_KEY ASC ")
				.append(" 	,OP_SVC_CD ASC ");
	}
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// PreparedStatementの指定されたパラメータカラムに 指定された値を設定
			if ( "1".equals( inMsg.getString(EKK0351B506CBSMsg.FUNC_CODE) ) ) {

				/* ++++++++++ v5.00 修正開始 ++++++++++ */
				// パラメータのカウント
				int iPCnt = 1;
				// ●運用日付取得
				String opeDate = JCCModelCommon.getOpeDate(inMsg, null);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);

				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);

				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);

				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(ＫＥＹ＿機器製造番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B506CBSMsg.KEY_KIKI_SEIZO_NO));
				// パラメータの設定(ＫＥＹ＿サービス契約内訳番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B506CBSMsg.KEY_SVC_KEI_UCWK_NO));
				// パラメータの設定(ＫＥＹ＿機器製造番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B506CBSMsg.KEY_KIKI_SEIZO_NO));
				// パラメータの設定(ＫＥＹ＿サービス契約内訳番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B506CBSMsg.KEY_SVC_KEI_UCWK_NO));

				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);

				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);

				// パラメータの設定(ＫＥＹ＿機器製造番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B506CBSMsg.KEY_KIKI_SEIZO_NO));
				// パラメータの設定(ＫＥＹ＿サービス契約内訳番号を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B506CBSMsg.KEY_SVC_KEI_UCWK_NO));

				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(運用日付を指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, opeDate);
				// パラメータの設定(ＫＥＹ＿オプションチャンネル種別コードを指定)
				CAANJDBCUtil.setParam(pstmt, iPCnt++, inMsg.getObject(EKK0351B506CBSMsg.KEY_OP_CHANNEL_SBT_CD));
				/* ++++++++++ v5.00 修正終了 ++++++++++ */
				
			}			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// EKK0351B506CBSMsgの明細にセットする項目
			String[] msgKeyList1 = {
					  EKK0351B506CBSMsg1List.OP_SVC_CD
					, EKK0351B506CBSMsg1List.OP_SVC_CD_NM
					, EKK0351B506CBSMsg1List.DGTIA_GRP_CD
					, EKK0351B506CBSMsg1List.OP_CHANNEL_SBT_CD
					, EKK0351B506CBSMsg1List.UK_STA_YMDHM
					, EKK0351B506CBSMsg1List.UK_END_YMDHM
					, EKK0351B506CBSMsg1List.OP_SVC_BIKO
					, EKK0351B506CBSMsg1List.BIKO_SCREEN_DSP_STAYMD
					, EKK0351B506CBSMsg1List.BIKO_SCREEN_DSP_ENDYMD
					, EKK0351B506CBSMsg1List.OP_SVC_KEI_STAT
					, EKK0351B506CBSMsg1List.RSV_APLY_YMD
					, EKK0351B506CBSMsg1List.PCRS_CD
					, EKK0351B506CBSMsg1List.PPLAN_CD
					, EKK0351B506CBSMsg1List.PPLAN_NM
					, EKK0351B506CBSMsg1List.PPLAN_KOTEI_AMNT
					, EKK0351B506CBSMsg1List.PPLAN_KOTEI_TANI_CD_NM
					//ANK-0550 来月単価 START
					, EKK0351B506CBSMsg1List.PPLAN_KOTEI_AMNT_NEXT_M
					, EKK0351B506CBSMsg1List.PPLAN_KOTEI_TANI_CD_NM_NEXT_M
					//ANK-0550 来月単価 END
					, EKK0351B506CBSMsg1List.OPCH_DSL_TG_CHSHT_FLG
					, EKK0351B506CBSMsg1List.OPCH_ADD_SCREEN_DSP_TG_FLG
			};
			
			// 明細に処理結果(ResultSet)をマッピング
			CAANMsg[] outMsg1 = mapMessageList(rsltQuery,msgKeyList1,"eo.ejb.cbs.cbsmsg.EKK0351B506CBSMsg1List",0);
			// inMsg(CBSMsg)に明細をセット
			inMsg.set("EKK0351B506CBSMsg1List", outMsg1);
			

		} catch(SQLException e) {
			inMsg.set(EKK0351B506CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		} finally {
			// 資源の解放
			try{
				if(rsltQuery != null){
					rsltQuery.close();
				}
				if(pstmt != null){
					pstmt.close();
				}
				if(con1 != null){
					closeConnection(con1);
				}
			}catch(SQLException e){
				inMsg.set(EKK0351B506CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
	}
}
