#include "wsubform.h"	//サブフォーム専用ヘッダファイルをインクルードする。

#define Textbox	1	//操作関数用(サンプルを参照)
#define Grid	2	//操作関数用(サンプルを参照)
#define Panel	3	//操作関数用(サンプルを参照)

#define Tret	199	//textboxでF12ファンクションキーが返す番号
#define Gret	299	//gridでF12ファンクションキーが返す番号
#define Pret	399	//paneltextでF12ファンクションキーが返す番号

extern int wmode;	//挿入／上書のモード切替用
extern char gridtitles[MAX_POS][MAX_LEN];	//wsubformが利用するgridのタイトル。

extern TextBox	 *begin;	//textboxで使用する連鎖ポインタの開始位置
extern TextBox	 *tp;	//textboxで使用する連鎖ポインタ

typedef struct stat Dir;	//ファイル操作用
static Dir dirptr;
static Dir  *fileptr = &dirptr;

char tmp[MAX_STR];
static int sqlcode = 0;	//PostgreSQLの返すコード
static int DBcount = 0;	//wsubformで利用するDBの現在の最大行数

int DBConnect(void)
{
	// DB接続用変数宣言です。DB名、ユーザ名、パスワードを設定してください。
	EXEC SQL BEGIN DECLARE SECTION;
		char dbname[12];
		char user[12];
		char passwd[12];
	EXEC SQL END DECLARE SECTION;

	strcpy(dbname,"apsch");
	strcpy(user,"cms");
	strcpy(passwd,"cms");

#ifdef DEBUG
	// ECPGデバッグ文出力
	ECPGdebug (0, stderr);
#endif

	// 接続
	memset (sqlca.sqlstate, '0', 5);
	EXEC SQL CONNECT TO :dbname AS dbConnection user :user USING :passwd;
	if (memcmp (sqlca.sqlstate, "00", 2) != 0)
	{
		sprintf(tmp,"CONNECT エラー。終了します。:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		popmsg((COLS/2)-24,(LINES/2)-4,tmp);
		exit (EXIT_FAILURE);
	}
}

int Fetch_apsch2(int no)
{
	static char DBbuff[MAX_STR];
	int i = 0;

	DBConnect();

	memset (sqlca.sqlstate, '0', 5);

	EXEC SQL BEGIN DECLARE SECTION;
		int rec_count;
		char	schedule_name[16 + 1];	//TEXT
		char	schedule_day[8 + 1];	//TEXT
		char	schedule_time[4 + 1];	//TEXT
		char	cmd_line[256 + 1];	//TEXT
		int		status;		//NUMERIC
		char	start_time[14 + 1];	//TEXT
		char	end_time[14 + 1];	//TEXT
		int		error_code;		//NUMERIC
		int		max_retry_count;		//NUMERIC
		int		retry_interval;		//NUMERIC
		int		current_retry_count;		//NUMERIC
		char	entry_date[22 + 1];	//DATE
		char	update_date[22 + 1];	//DATE
		char	comment1[40 + 1];	//TEXT
	EXEC SQL END DECLARE SECTION;

	sqlcode = 0;
	DBcount = 0;

	rec_count = 0;

	// DBの行数を取得
	EXEC SQL 
	SELECT 
	COUNT(*)
	INTO :rec_count
	FROM	apsch2;
	EXEC SQL END;

	// SELECTエラー 
	if(memcmp (sqlca.sqlstate, "00", 2) != 0)
	{
		sprintf(tmp,"データベースSELECT COUNTエラー:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		popmsg((COLS/2)-24,(LINES/2)-4,tmp);
		return(-1) ;
	}

	DBcount = rec_count;

	EXEC SQL DECLARE apsch2_CURSOR CURSOR FOR 
	SELECT 
		coalesce(schedule_name,' ','0'),
		coalesce(schedule_day,' ','0'),
		coalesce(schedule_time,' ','0'),
		coalesce(cmd_line,' ','0'),
		status,
		coalesce(start_time,' ','0'),
		coalesce(end_time,' ','0'),
		error_code,
		max_retry_count,
		retry_interval,
		current_retry_count,
		TO_TIMESTAMP(entry_date, 'YYYY/MM/DD HH24:MI:SS'),
		TO_TIMESTAMP(update_date, 'YYYY/MM/DD HH24:MI:SS'),
		coalesce(comment1,' ','0')
	FROM	apsch2
	ORDER BY schedule_name;
	EXEC SQL END;

	// カーソルオープン
	EXEC SQL OPEN apsch2_CURSOR;

	// SELECT OPENエラー 
	if (memcmp (sqlca.sqlstate, "00", 2) != 0)
	{
		sprintf(tmp,"データベースSELECT OPENエラー:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		popmsg((COLS/2)-24,(LINES/2)-4,tmp);
		return(-1);
	}

	for(i=0;i<DBcount;i++)
	{
		EXEC SQL FETCH apsch2_CURSOR INTO
			:schedule_name,
			:schedule_day,
			:schedule_time,
			:cmd_line,
			:status,
			:start_time,
			:end_time,
			:error_code,
			:max_retry_count,
			:retry_interval,
			:current_retry_count,
			:entry_date,
			:update_date,
			:comment1;

		if (memcmp (sqlca.sqlstate, "00", 2) != 0)
		{
			sprintf(tmp,"データベースFETCHエラー:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
			popmsg((COLS/2)-24,(LINES/2)-4,tmp);
			return(-1);
		}
	// テーブル項目をsplitbDBbuff[][]にセットする
		sf_assgetDB(no,i,0,schedule_name,16 + 1);
		sf_assgetDB(no,i,1,schedule_day,8 + 1);
		sf_assgetDB(no,i,2,schedule_time,4 + 1);
		sf_assgetDB(no,i,3,cmd_line,256 + 1);
		sf_to_text(status,DBbuff);	//NUMERIC型(int)を文字に変換する。
		sf_assgetDB(no,i,4,DBbuff,2 + 1);
		sf_assgetDB(no,i,5,start_time,14 + 1);
		sf_assgetDB(no,i,6,end_time,14 + 1);
		sf_to_text(error_code,DBbuff);	//NUMERIC型(int)を文字に変換する。
		sf_assgetDB(no,i,7,DBbuff,5 + 1);
		sf_to_text(max_retry_count,DBbuff);	//NUMERIC型(int)を文字に変換する。
		sf_assgetDB(no,i,8,DBbuff,5 + 1);
		sf_to_text(retry_interval,DBbuff);	//NUMERIC型(int)を文字に変換する。
		sf_assgetDB(no,i,9,DBbuff,2 + 1);
		sf_to_text(current_retry_count,DBbuff);	//NUMERIC型(int)を文字に変換する。
		sf_assgetDB(no,i,10,DBbuff,5 + 1);
		sf_assgetDB(no,i,11,entry_date,22 + 1);
		sf_assgetDB(no,i,12,update_date,22 + 1);
		sf_assgetDB(no,i,13,comment1,40 + 1);

		if (memcmp (sqlca.sqlstate, "00", 2) != 0)
		{
			EXEC SQL CLOSE apsch2_CURSOR;
			EXEC SQL END;
			sprintf(tmp,"データベースFETCHエラー:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
			popmsg((COLS/2)-24,(LINES/2)-4,tmp);
			return(-1);
		}
	}
	// カーソルクローズ 
	EXEC SQL CLOSE apsch2_CURSOR;
	EXEC SQL END;

	DBcount = rec_count;

	// 結果チェック
	if (sqlca.sqlcode != 0)
	{
		sprintf(tmp,"データベースFETCH結果チェック:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		popmsg((COLS/2)-24,(LINES/2)-4,tmp);
		return(0);
	}
	// 切断
	sqlca.sqlcode = 0;
	EXEC SQL DISCONNECT dbConnection;
	return(0);
}

int Insert_apsch2(int no)
{
	static char DBbuff[MAX_STR];
	int i = 0;

	DBConnect();

	memset (sqlca.sqlstate, '0', 5);

	EXEC SQL BEGIN DECLARE SECTION;
		int rec_count;
		char	schedule_name[16 + 1];	//TEXT
		char	schedule_day[8 + 1];	//TEXT
		char	schedule_time[4 + 1];	//TEXT
		char	cmd_line[256 + 1];	//TEXT
		int		status;		//NUMERIC
		char	start_time[14 + 1];	//TEXT
		char	end_time[14 + 1];	//TEXT
		int		error_code;		//NUMERIC
		int		max_retry_count;		//NUMERIC
		int		retry_interval;		//NUMERIC
		int		current_retry_count;		//NUMERIC
		char	entry_date[22 + 1];	//DATE
		char	update_date[22 + 1];	//DATE
		char	comment1[40 + 1];	//TEXT
	EXEC SQL END DECLARE SECTION;

	sqlcode = 0;

	// インサート
	// テーブル項目をsplitbDBbuff[]からDB配列にセットする
	sf_assputDB(no,0,schedule_name,16 + 1);
	sf_assputDB(no,1,schedule_day,8 + 1);
	sf_assputDB(no,2,schedule_time,4 + 1);
	sf_assputDB(no,3,cmd_line,256 + 1);
	sf_assputDB(no,4,DBbuff,2 + 1);
	status = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,5,start_time,14 + 1);
	sf_assputDB(no,6,end_time,14 + 1);
	sf_assputDB(no,7,DBbuff,5 + 1);
	error_code = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,8,DBbuff,5 + 1);
	max_retry_count = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,9,DBbuff,2 + 1);
	retry_interval = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,10,DBbuff,5 + 1);
	current_retry_count = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,11,entry_date,22 + 1);
	sf_assputDB(no,12,update_date,22 + 1);
	sf_assputDB(no,13,comment1,40 + 1);

	// 対象レコードをADD
	EXEC SQL INSERT INTO apsch2
	(
		schedule_name,
		schedule_day,
		schedule_time,
		cmd_line,
		status,
		start_time,
		end_time,
		error_code,
		max_retry_count,
		retry_interval,
		current_retry_count,
		entry_date,
		update_date,
		comment1
	)
	VALUES
	(
		coalesce(:schedule_name,' ','0'),
		coalesce(:schedule_day,' ','0'),
		coalesce(:schedule_time,' ','0'),
		coalesce(:cmd_line,' ','0'),
		:status,
		coalesce(:start_time,' ','0'),
		coalesce(:end_time,' ','0'),
		:error_code,
		:max_retry_count,
		:retry_interval,
		:current_retry_count,
		TO_TIMESTAMP(:entry_date, 'YYYY/MM/DD HH24:MI:SS'),
		TO_TIMESTAMP(:update_date, 'YYYY/MM/DD HH24:MI:SS'),
		coalesce(:comment1,' ','0')
	);
	EXEC SQL END;

	// 登録エラー
	if (memcmp (sqlca.sqlstate, "00", 2) != 0)
	{
		// ロールバック
		EXEC SQL ROLLBACK WORK;
		EXEC SQL END;
		sprintf(tmp,"データベースINSERTエラー:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		popmsg((COLS/2)-24,(LINES/2)-4,tmp);
		return(-1);
	}

	// コミット
	EXEC SQL COMMIT;
	EXEC SQL END;

	// 結果チェック
	if (sqlca.sqlcode != 0)
	{
		sprintf(tmp,"データベースINSERT結果チェック:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		popmsg((COLS/2)-24,(LINES/2)-4,tmp);
		return(0);
	}

	// 切断
	sqlca.sqlcode = 0;
	EXEC SQL DISCONNECT dbConnection;
	return(0);
}

int	Update_apsch2(int no,const char* key1,const char* key2,int sqlcode,int line)
{
	static char DBbuff[MAX_STR];
	int i = 0;

	DBConnect();

	memset (sqlca.sqlstate, '0', 5);

	EXEC SQL BEGIN DECLARE SECTION;
		int rec_count;
		char	schedule_name[16 + 1];	//TEXT
		char	schedule_day[8 + 1];	//TEXT
		char	schedule_time[4 + 1];	//TEXT
		char	cmd_line[256 + 1];	//TEXT
		int		status;		//NUMERIC
		char	start_time[14 + 1];	//TEXT
		char	end_time[14 + 1];	//TEXT
		int		error_code;		//NUMERIC
		int		max_retry_count;		//NUMERIC
		int		retry_interval;		//NUMERIC
		int		current_retry_count;		//NUMERIC
		char	entry_date[22 + 1];	//DATE
		char	update_date[22 + 1];	//DATE
		char	comment1[40 + 1];	//TEXT
	EXEC SQL END DECLARE SECTION;

	sqlcode = 0;

	strncpy((char *)schedule_name,key1,sizeof(schedule_name));	//KEY1
	strncpy((char *)schedule_day,key2,sizeof(schedule_day));	//KEY2
	// アップデート
	// テーブル項目をsplitbDBbuff[]からDB配列にセットする
	sf_assputDB(no,0,schedule_name,16 + 1);
	sf_assputDB(no,1,schedule_day,8 + 1);
	sf_assputDB(no,2,schedule_time,4 + 1);
	sf_assputDB(no,3,cmd_line,256 + 1);
	sf_assputDB(no,4,DBbuff,2 + 1);
	status = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,5,start_time,14 + 1);
	sf_assputDB(no,6,end_time,14 + 1);
	sf_assputDB(no,7,DBbuff,5 + 1);
	error_code = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,8,DBbuff,5 + 1);
	max_retry_count = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,9,DBbuff,2 + 1);
	retry_interval = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,10,DBbuff,5 + 1);
	current_retry_count = sf_to_integer(DBbuff);	//文字(char)をNUMERIC型(int)に変換する。
	sf_assputDB(no,11,entry_date,22 + 1);
	sf_assputDB(no,12,update_date,22 + 1);
	sf_assputDB(no,13,comment1,40 + 1);

	// 対象レコードをUPDATE
	EXEC SQL UPDATE apsch2
	SET
		schedule_name =	coalesce(:schedule_name,' ','0'),
		schedule_day =	coalesce(:schedule_day,' ','0'),
		schedule_time =	coalesce(:schedule_time,' ','0'),
		cmd_line =	coalesce(:cmd_line,' ','0'),
		status = 	:status,
		start_time =	coalesce(:start_time,' ','0'),
		end_time =	coalesce(:end_time,' ','0'),
		error_code = 	:error_code,
		max_retry_count = 	:max_retry_count,
		retry_interval = 	:retry_interval,
		current_retry_count = 	:current_retry_count,
		entry_date = 	TO_TIMESTAMP(:entry_date, 'YYYY/MM/DD HH24:MI:SS'),
		update_date = 	TO_TIMESTAMP(:update_date, 'YYYY/MM/DD HH24:MI:SS'),
		comment1 =	coalesce(:comment1,' ','0')
	WHERE schedule_name = :schedule_name AND schedule_day = :schedule_day;
	EXEC SQL END;

	if (memcmp (sqlca.sqlstate, "00", 2) != 0)
	{
	// 更新エラー
		// ロールバック
		EXEC SQL ROLLBACK WORK;
		EXEC SQL END;
		sprintf(tmp,"データベースUPDATEエラー:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		popmsg((COLS/2)-24,(LINES/2)-4,tmp);
		return(-1);
	}

	//コミットする
	EXEC SQL COMMIT;
	EXEC SQL END;


	// 結果チェック
	if (sqlca.sqlcode != 0)
	{
		sprintf(tmp,"データベースUPDATE結果チェック:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		popmsg((COLS/2)-24,(LINES/2)-4,tmp);
		return(0);
	}

	// 切断
	sqlca.sqlcode = 0;
	EXEC SQL DISCONNECT dbConnection;
	return(0);
}

int	Delete_apsch2(const char *key1,char *key2,int sqlcode)
{
	static char DBbuff[MAX_STR];
	int i = 0;

	DBConnect();

	memset (sqlca.sqlstate, '0', 5);

	EXEC SQL BEGIN DECLARE SECTION;
		char	schedule_name[16 + 1];	//TEXT
		char	schedule_day[8 + 1];	//TEXT
		char	schedule_time[4 + 1];	//TEXT
		char	cmd_line[256 + 1];	//TEXT
		int		status;		//NUMERIC
		char	start_time[14 + 1];	//TEXT
		char	end_time[14 + 1];	//TEXT
		int		error_code;		//NUMERIC
		int		max_retry_count;		//NUMERIC
		int		retry_interval;		//NUMERIC
		int		current_retry_count;		//NUMERIC
		char	entry_date[22 + 1];	//DATE
		char	update_date[22 + 1];	//DATE
		char	comment1[40 + 1];	//TEXT
	EXEC SQL END DECLARE SECTION;

	sqlcode = 0;

	// キー項目設定
	memset((char *)schedule_name, '\0', sizeof(schedule_name));
	memset((char *)schedule_day, '\0', sizeof(schedule_day));
	strncpy((char *)schedule_name,key1,sizeof(schedule_name));	//KEY1
	strncpy((char *)schedule_day,key2,sizeof(schedule_day));	//KEY2

	// 削除対象レコードをDELETE
	EXEC SQL DELETE FROM apsch2
	WHERE schedule_name = :schedule_name AND schedule_day = :schedule_day;
	EXEC SQL END;

	if (memcmp (sqlca.sqlstate, "00", 2) != 0)
	{
	// 削除エラー
		// ロールバック
		EXEC SQL ROLLBACK WORK;
		EXEC SQL END;
		sprintf(tmp,"データベースUPDATEエラー:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		popmsg((COLS/2)-24,(LINES/2)-4,tmp);
		return(-1);
	}

	//コミットする
	EXEC SQL COMMIT;
	EXEC SQL END;


	// 結果チェック
	if (sqlca.sqlcode != 0)
	{
		sprintf(tmp,"データベースUPDATE結果チェック:%d - %s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		popmsg((COLS/2)-24,(LINES/2)-4,tmp);
		return(0);
	}

	// 切断
	sqlca.sqlcode = 0;
	EXEC SQL DISCONNECT dbConnection;
	return(0);
}

// 以下の二つの関数は入出力画面(ウインドウ)とのインターフェース関数です。
// FETCHしたgridにDBの行列を書き込みます。
int grid_disp(int no, int startline, int maxcol)
{
	int i, j;
	char s[MAX_TMP];

	if((Fetch_apsch2(no)) == 0)
	{
		for(i=startline;i<DBcount;i++)
		{
			for(j=0;j<maxcol;j++)
			{
				sf_gputDB(no,i,j,startline,s);
			}
		}
		return(0);
	}
	else
	{
		return(-1);
	}
}

// DBから入出力(画面)ウインドウに書き込みます。
void inputwin_write(int no, int get, int line,int maxcol)
{
	int i;
	char s[MAX_TMP];
	
	sf_tbegin();
	for(i=0;tp->next !=(TextBox *)NULL;i++)
	{
		sprintf(s,"%s",ft[get].splitDBbuff[line][i]);
		sf_tput(no,i,s);
		sf_tnext();
	}
	sprintf(s,"%s",ft[get].splitDBbuff[line][i]);
	sf_tput(no,i,s);
}

int subform(void)
{
	int i,j,k;
	int ret;
	char f[256];
	int xcol,rows;
	int maxtext;
	char s[MAX_STR];

	int xcol2;
	int maxcol;
	int startline;
	
	int line;
	char key1[MAX_STR];
	char key2[MAX_STR];
	char key3[MAX_STR];

	sprintf(f,"%s","_apsch2.def");
	initscr();

	xcol = COLS;
	rows = LINES;

	cbreak();
	noecho();
	keypad(stdscr, TRUE);
	meta(stdscr, TRUE);

	if(stat(f,fileptr) != 0)
	{
		popmsg((COLS/2)-24,(LINES/2)-4,"メイングリッドフォーム定義ファイルがありあません。");
		echo();
		endwin();
		exit(0);
	}
	if(stat("_inputwin2.def",fileptr) != 0)
	{
		popmsg((COLS/2)-24,(LINES/2)-4,"入力用テキストボックスフォーム定義ファイルがありあません。");
		echo();
		endwin();
		exit(0);
	}
	if(stat("_header.def",fileptr) != 0)
	{
		popmsg((COLS/2)-24,(LINES/2)-4,"ヘッダータイトル用グリッドフォーム定義ファイルがありあません。");
		echo();
		endwin();
		exit(0);
	}
	if(stat("_footer.def",fileptr) != 0)
	{
		popmsg((COLS/2)-24,(LINES/2)-4,"ファンクションキー用グリッドフォーム定義ファイルがありあません。");
		echo();
		endwin();
		exit(0);
	}

	xcol = sf_wsubform(3,144,16,2,30,"_inputwin2.def");
	xcol = sf_wsubform(0,144,44,1,2,f);
	maxtext = sf_textbox(3,2,30,"_inputwin2.def");

	wrefresh(xt[0].form);

	xcol = sf_wsubform(2,xcol,rows,0,46,"_footer.def");
	sf_gcep(2,0,0,3,"入力画面へ");
	sf_gcep(2,12,0,3,"ESC終了");
	wrefresh(xt[2].form);

	for(i=0;i<MAX_POS;i++)
		memset(gridtitles[i],'\0',MAX_LEN);

	xcol = sf_wsubform(1,xcol,rows,0,0,"_header.def");
	sf_gcep(1,0,0,1,"v1.0.3");
	sprintf(ft[1].cp[0][0].s,"%s","APscheduler");
	mvwprintw(ft[1].st[0][0].vs,0,1,"%s",ft[1].cp[0][0].s);
	sf_wrefreshcell(1,0,0);
	sf_wrefreshform(1);

	sf_startcell(0);

	ret = Gret;

	while(1)
	{
		startline = sf_getstartline(0);	//DBgrid()の持っているスクロールに必要なＤＢグリッドの画面初期行の位置情報。
		if(grid_disp(0,startline,maxcol) == -1)	//*splitDBbuff[][]をグリッドに書き込み表示する。
		{
			popmsg(12,12,"grid_disp():error");
		}
		ret = sf_DBgrid(0,maxtext,xcol,0,DBcount,maxcol);	//データベース連結用グリッド。*splitDBbuff[][]を表示する。
		switch(ret)
		{
		case -1:
			echo();
			endwin();
			exit(0);
			break;

		//for grid
		case 200: //ESC　キーでプログラムを終了する。
			if(popmsg((COLS/2)-24,(LINES/2)-4,"Exit grid area in Subform?") == 1)
				goto end;
			ret = Pret;
			break;
		case 201: //F1
		//DBへの入力用ウインドウの作成
			line = sf_status(0,Grid,'D');
			inputwin_write(3,0,line,maxcol);
			sf_gcep(2,0,0,3,"戻る");
			sf_gcep(2,4,0,3,"更新");
			sf_gcep(2,5,0,3,"追加");
			sf_gcep(2,6,0,3,"削除 n+d+t");
			sf_gcep(2,7,0,3,"削除 n+d");
			sf_gcep(2,8,0,3,"削除 < d");
			while(1)
			{
				ret = sf_formtext(3,maxtext, 140);
				switch(ret)
				{
				case -1:
					echo();
					endwin();
					exit(0);
					break;
				case 100:
					if(popmsg((COLS/2)-24,(LINES/2)-4,"終了します") == 1)
						goto end;
					break;
				case 101:
					goto mainwin;
					break;
				case 105:
					sf_tgetDBall(3);
					sprintf(key1,"%s",ft[0].splitDBbuff[line][0]);
					sprintf(key2,"%s",ft[0].splitDBbuff[line][1]);
					if(Update_apsch2(0,key1,key2,sqlcode,line) == -1)
					{
						popmsg((COLS/2)-24,(LINES/2)-4,"データベースが更新出来ません。");
					}
					goto mainwin;
					break;
				case 106:
					sf_tgetDBall(3);
					sprintf(key1,"%s",ft[0].splitDBbuff[line][0]);
					sprintf(key2,"%s",ft[0].splitDBbuff[line][1]);
					if(Insert_apsch2(0) == -1)
					{
						popmsg((COLS/2)-24,(LINES/2)-4,"データベースが追加出来ません。");
					}
					goto mainwin;
					break;
				case 107:
					if(popmsg((COLS/2)-24,(LINES/2)-4,"名前と日付と実行時間でデータを削除しますか？") == 1)
					{
						sprintf(key1,"%s",ft[0].splitDBbuff[line][0]);
						sprintf(key2,"%s",ft[0].splitDBbuff[line][1]);
						if(Delete_apsch2(key1,key2,sqlcode) == -1)
						{
							popmsg((COLS/2)-24,(LINES/2)-4,"データベースから削除出来ません。");
						}
					}
					else
					{
						goto mainwin;
					}
					goto cleardisp;
					break;
				case 108:
					break;
				case 109:
					break;
				}
			}
			cleardisp:
			sf_initgridcell(0);
			mainwin:
			sf_gcep(2,0,0,3,"入力画面へ");
			sf_gcep(2,4,0,3,"          ");
			sf_gcep(2,5,0,3,"          ");
			sf_gcep(2,6,0,3,"          ");
			sf_gcep(2,7,0,3,"          ");
			sf_gcep(2,8,0,3,"          ");
			ret = Pret;
			break;
		case 202: //F2
			ret = Pret;
			break;
		case 203: //F3
			ret = Pret;
			break;
		case 204: //F4
			ret = Pret;
			break;
		case 205: //F5
			ret = Pret;
			break;
		case 206: //F6
			ret = Pret;
			break;
		case 207: //F7
			ret = Pret;
			break;
		case 208: //F8
			ret = Pret;
			break;
		case 209: //F9
			ret = Pret;
			break;
		case 210: //F10
			ret = Pret;
			break;
		case 211: //F11
			ret = Pret;
			break;

		default:
			break;
		}
		sf_freeDB(0,DBcount,maxcol);
	}

end:
	echo();
	endwin();
}

int main(void)
{
	subform();
}

