SQLの窓

2018年07月15日


CSS の calc 関数を使って、IFRAME を画面下半分にフィットさせる



デモページ



以前は、JavaScript で実装してたのですが、知らない間に calc 関数というものがあったのを知り、IE11 ですらうまく動作する結果になっていました。

以下は php を使って、高さの部分を PHP の側の変数を使用して埋め込んでいます。IE11 以外のブラウザならば、var 関数を使用できるのですが、IE11 が実装する見通しも無いのでこのような形にするか、固定値を2度設定する必要があります。
<?php
require_once('view_config.php');

# **************************************
# js キャッシュ用
# **************************************
$tm = mktime();

# **************************************
# 画面定義
# ( Ruby や Python に合わせた画面形式 )
# **************************************
$out_client = <<<HTML
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" />

<script src="{$view_js}?{$tm}"></script>

<style>
/* ブロックを左右に表示  */
.ttl {
	display: inline-block;
	width: 150px;
}
.entry {
	display: inline-block;
}
.line {
	margin-bottom: 0;
}


/* IFRAMEコントロール用  */
html,body {
	height: 100%;
}

body {
	margin: 0;
}
#head {
	padding: 16px;
	width: 100%;
	height: {$view_head_height}px;
	background-color: #e0e0e0;
}
#extend {
	display: block;
	margin-left: auto;
	margin-right: auto;
	width: calc( 100% - 3px );
	height: calc( 100% - {$view_head_height}px - 2px );
	border: solid 2px #c0c0c0;
}
</style>
</head>
<body>

<div id="head">
	<p class="ttl">
		氏名で検索
	</p>
	<p class="entry">
		<input
			id="cond"
			type="text">
		<input
			class="ml-4 btn btn-success"
			id="btn"
			type="button"
			value="問合せ">

		<a
			class="ml-4 btn btn-info btn-sm"
			href="{$_SERVER["PHP_SELF"]}">GET 再読み込み</a>
	</p>
	<p class="line"></p>

	<h4 class="text-danger">{$check_message}</h4>

</div>

<iframe id="extend" name="extend" class="iframe-option" src="req/control.php"></iframe>

</body>
</html>
HTML;

print $out_client;


?>


まず、高さを正しく計算させる為に html と body 要素の高さを 100% として明示します。次に基本部分の body 要素の margin を 0 として余白は #head 側で作成します。

そして、calc 関数で IFRAME の高さブラウザに計算させます。(他の小さな数値は縦と横の小さな余白用に使用しています)

view_config.php
<?php
$view_js = "entry.js";

$view_head_height = "100";


?>





【IFRAME パッケージの最新記事】
posted by lightbox at 2018-07-15 01:11 | IFRAME パッケージ | このブログの読者になる | 更新情報をチェックする

2018年07月12日


HTA + Basp21 + jQuery + twitter-bootstrap(4.1.1) でメール受信ツール

Basp21 は SSL に対応していない(POP3:110番ポートでのアクセスです)ので、運用の範囲内でうまく利用する事が必要です。アプリケーションのテスト用のツールとして使うなどして、実際の重要な文書のやりとりに使うのはおすすめではありません。

このサンプルの趣旨は、HTA でも最新 jQuery + twitter-bootstrap が動作する事の確認です
( ここでは実装していませんが、jQuery UI の Resizable のテストは行いました )

関連する記事

HTA + Basp21 + jQuery + twitter-bootstrap(4.1.1) でメール送信ツール

HTA(HTMLアプリケーション) のコードを html として IE11 でデバッグする方法


▼ 初期画面

画面下部はIFRAME で、ウインドウの大きさを変えてもフィットするようになっています。この実装には CSS の calc 関数を使用しています。

IFRAME 部分には、iframe_in.html を使用していますが、IFRAME に APPLICATION="yes" を指定する事によって、HTA として動作します。
▼ 受信済メールデータ一覧の実行結果
『メール一覧』と同じ結果ですが、『メール一覧』ではパスワードの入力が必要で、実際にインターネットからデータを取得します。

『受信済メールデータ一覧』では、『メール本体を全て受信』でいったんデータを可能な限り(256件)受信し、ディレクトリに保存します。そして、『受信済メールデータ一覧』の実行でディレクトリよりデータを取得して表示します(その際、添付ファイルがあれば分離して保存します)

さらに、データ行をクリックすると、本文のテキストエリアに受信データの本文を表示します
メールサーバーは 『さくらインターネット』を使用しています main.hta( メール送信部分 )
<html>
<head>
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" />
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script>

	// ウインドウの位置とサイズ
	top.moveTo( 30, 30 );
	top.resizeTo( 800, 800 );

	// エラーメッセージ
	var ErrMessage;

	// 
	var WshShell = new ActiveXObject("WScript.Shell");
	var Basp21 = new ActiveXObject("Basp21");

	$(function(){

		$("#send").on("click", function(){

			pass = $("#pass").val();
			if ( pass.trim() == "" ) {
				alert("パスワードを入力して下さい");
				$("#pass").focus();
				return;
			}
			if ( $("#to").val() == "" ) {
				alert("宛先を入力してください");
				$("#to").focus()
				return;
			}

			ErrMessage = Basp21.SendMail( 
				"user.sakura.ne.jp:587", 
				$("#to").val(), 
				"username@user.sakura.ne.jp" + "\t" + "account" + ":" + pass, 
				$("#subject").val(), 
				$("#body").val(), 
				"" 
			);

			// 成功すると空文字列が返り、失敗するとエラメッセージ			
			if ( ErrMessage != "" ) {
				alert(ErrMessage);
			}
			else {
				alert("メール送信が終了しました。");
			}
		});
		
		$("#taskmgr").on("click", function(){

			WshShell.Run("ms-settings:windowsupdate");

		});

	});

</script>
<style>
html,body {
	height: 100%;
}

body {
	margin: 0;
}

/* ブロックを左右に表示  */
.ttl {
	display: inline-block;
	width: 150px;
	vertical-align: top;
}
.entry {
	display: inline-block;
}
.line {
	margin-bottom: 0;
}

#head {
	padding: 16px;
}

/* IFRAMEコントロール用  */
#head {
	padding: 16px;
	width: 100%;
	height: 360px;
	background-color: #e0e0e0;
}
#extend {
	display: block;
	margin-left: auto;
	margin-right: auto;
	width: calc( 100% - 3px );
	height: calc( 100% - 360px - 2px );
	border: solid 2px #c0c0c0;
}

</style>
</head>
<body>
<div id="head">

	<p class="ttl">
		宛先
	</p>
	<p class="entry">
		<input
			id="to"
			type="text">

		<span
			class="ml-5">パスワード</span>
		<input
			class="ml-3"
			style="width:120px;"
			id="pass"
			type="password">
	</p>
	<p class="line"></p>

	<p class="ttl">
		件名
	</p>
	<p class="entry">
		<input
			style='width:500px;'
			type="text"
			id="subject">
	</p>
	<p class="line"></p>

	<p class="ttl">
		本文 
	</p>
	<p class="entry">
		<textarea
			style='width:500px;height:150px;'
			id="body"></textarea>
	</p>
	<p class="line"></p>

	<p>
		<input
			id="send"
			class="btn btn-outline-primary"
			type="button"
			value="メール送信">

		<input
			id="taskmgr"
			class="btn btn-info ml-5"
			type="button"
			value="Windows Update">
	</p>

	<h4 class="text-danger"></h4>

</div>

<iframe id="extend" name="extend" APPLICATION="yes" src="iframe_in.html"></iframe>


</body>
</html>


iframe_in.html

Basp21 の RcvMail メソッドが返す配列は、VBArray なので、toArray() メソッドで JavaScript の配列に変換しています。
<html>
<head>
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" />
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script>

	// 親ウインドウのオブジェクトを使用
	var Basp21 = parent.Basp21;
	var rcv_data;

	// テーブルの行作成用
	var row_data;


	$(function(){

		// *********************************
		// Subject,From,Date の一覧のみ
		// *********************************
		$("#list").on("click", function(){

			// テーブル表示リセット
			$("#tbl .row_data").remove();

			// 親ウインドウの入力チェック
			pass = parent.$("#pass").val();
			if ( pass.trim() == "" ) {
				alert("パスワードを入力して下さい")
				parent.$("#pass").focus();
			return;
			}
			
			// 実行中カーソル
			$("*").css({"cursor": "wait"});
			
			result = Basp21.RcvMail("user.sakura.ne.jp", 
				"username@user.sakura.ne.jp",
				pass,
				"LIST",
				">C:\\temp\\rcvmail")

			// 失敗した場合はエラーメッセージが文字列として戻されます
			if ( typeof result !== "string" ) {
			
				// *********************************
				// result は、VBArray なので、
				// JScript の標準配列に変換
				// *********************************
				rcv_data = result.toArray();

				for( i = rcv_data.length-1; i >= 0; i-- ) {
					headers = rcv_data[i].split("\t")
					
					// IFRAME 内で行を作成して IFRAME 内のテーブルに追加
					row_data = $("<tr></tr>")
						.addClass("row_data")
						.appendTo( "#tbl" );

					// Subject
					$("<td></td>")
						.text(headers[0].substring(9))
						.appendTo( row_data );

					// From
					$("<td></td>")
						.text(headers[1].substring(6))
						.appendTo( row_data );

					// Date
					$("<td></td>")
						.text(headers[2].substring(6))
						.appendTo( row_data );

				}

			}
			else {
				// エラーメッセージ
				alert( result );
			}
			
			// 通常カーソル
			$("*").css({"cursor": "auto"});

		});

		// *********************************
		// メールデータを最大256受信して保存
		// *********************************
		$("#recieve").on("click", function(){

			// 親ウインドウの入力チェック
			pass = parent.$("#pass").val();
			if ( pass.trim() == "" ) {
				alert("パスワードを入力して下さい")
				parent.$("#pass").focus();
				return;
			}

			// 実行中カーソル
			$("*").css({"cursor": "wait"});

			result = Basp21.RcvMail("user.sakura.ne.jp", 
				"username@user.sakura.ne.jp",
				pass,
				"SAVEALL",
				">C:\\temp\\rcvmail")
				
			// 通常カーソル
			$("*").css({"cursor": "auto"});

			// 失敗した場合はエラーメッセージが文字列として戻されます
			// 成功した場合はファイル名の VBArray になります
			if ( typeof result == "string" ) {
				alert( result );
			}
			else {
				alert( "正しくデータを取得しました" )
			}

		});

		// *********************************
		// 受信したデータより一覧を表示
		// *********************************
		$("#datalist").on("click", function(){

			// テーブル表示リセット
			$("#tbl .row_data").remove();

			// 実行中カーソル
			$("*").css({"cursor": "wait"});
			
			// 最新日付順
			result = Basp21.SortMail("C:\\temp\\rcvmail","date:",1)

			if ( typeof result == "string" ) {
				alert( result )
				$("*").css({"cursor": "auto"});
				return;
			}

			// *********************************
			// result は、VBArray なので、
			// JScript の標準配列に変換
			// *********************************
			rcv_data = result.toArray();

			for( i = 0; i < rcv_data.length; i++ ) {
			
				filename = rcv_data[i];
				
				// メールデータ取得
				result = Basp21.ReadMail("C:\\temp\\rcvmail\\" + filename,"subject:from:date:","C:\\temp\\rcvdata")
				if ( typeof result == "string" ) {
					alert( result )
					$("*").css({"cursor": "auto"});
					return;
				}
				
				row_cols = result.toArray();


				// IFRAME 内で行を作成して IFRAME 内のテーブルに追加
				row_data = $("<tr></tr>")
					.addClass("row_data")
					.appendTo( "#tbl" )
					.on("click", function(){
					
						filename = $(this).find("td").eq(0).text();
						// メールデータの本文取得
						result = Basp21.ReadMail("C:\\temp\\rcvmail\\" + filename,"body:","C:\\temp\\rcvdata");
						if ( typeof result == "string" ) {
							alert( result )
							$("*").css({"cursor": "auto"});
							return;
						}
						
						body_data = result.toArray();
						parent.$("#body").val( body_data[0].substring(6));

					})
					;

				// ファイル名(非表示)
				$("<td></td>")
					.text(filename)
					.css({ "display": "none" })
					.appendTo( row_data );

				// Subject
				$("<td></td>")
					.text(row_cols[0].substring(9))
					.appendTo( row_data );

				// From
				$("<td></td>")
					.text(row_cols[1].substring(6))
					.appendTo( row_data );

				// Date
				$("<td></td>")
					.text(row_cols[2].substring(6))
					.appendTo( row_data );

			}

			// 通常カーソル
			$("*").css({"cursor": "auto"});
		});



	});

</script>
<style>
.row_data td {
	cursor: pointer!important;
}

html,body {
	height: 100%;
}

body {
	margin: 0;
}

/* ブロックを左右に表示  */
.ttl {
	display: inline-block;
	width: 150px;
	vertical-align: top;
}
.entry {
	display: inline-block;
}
.line {
	margin-bottom: 0;
}

#head {
	padding: 16px;
}

/* IFRAMEコントロール用  */
#head {
	padding: 16px;
	width: 100%;
	height: 70px;
	background-color: #e0e0e0;
}
#extend {
	display: block;
	margin-left: auto;
	margin-right: auto;
	width: calc( 100% - 3px );
	height: calc( 100% - 70px - 2px );
	border: solid 2px #c0c0c0;
}

</style>
</head>
<body>
<div id="head">

	<p>
		<input
			id="list"
			class="btn btn-outline-primary"
			type="button"
			value="メール一覧">

		<input
			id="recieve"
			class="btn btn-outline-primary ml-5"
			type="button"
			value="メール本体を全て受信">

		<input
			id="datalist"
			class="btn btn-outline-primary ml-5"
			type="button"
			value="受信済メールデータ一覧">

	</p>

	<h4 class="text-danger"></h4>

</div>

<table class="table table-hover">
	<tbody id="tbl">
	</tbody>
</table>


</body>
</html>


関連する記事

HTA(HTMLアプリケーション) のコードを html として IE11 でデバッグする方法





posted by lightbox at 2018-07-12 16:18 | HTA ( HTMLアプリケーション ) | このブログの読者になる | 更新情報をチェックする

2018年07月11日


HTA + Basp21 + jQuery + twitter-bootstrap(4.1.1) でメール送信ツール

Basp21 は SSL に対応していないので、運用の範囲内でうまく利用する事が必要です。バッチ処理のログ代わり使うなど、レンタルサーバのメールアカウント等(すぐに変更削除可能なもの)を使って、外部に出ても問題の無いデータに利用しましょう。

また、このサンプルの趣旨は、HTA を使った小回りの効く運用ツールとしての使い方の紹介です。



Basp21 は、32ビットですが、HTA はそもそも 32ビットで動作します。
Basp21 は、Down Load! BASP21-2003-0211.exe (1.44MB) 2003/02/11 Update!  推奨です。


<meta http-equiv="x-ua-compatible" content="ie=edge" /> で、bootstrap(4.1.1) が動作したので、たぶん jQuery も最新版が動作するとは思いますが、IE系で JavaScript の動作確認はいろいろ大変なので古い jQuery を使用しています

※ メールアカウントは、さくらインターネットを使用しています

▼ ソースコード
<html>
<head>
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" />
<script>

	top.moveTo( 300, 150 );
	top.resizeTo( 800, 600 );

	var ErrMessage

	var WshShell = new ActiveXObject("WScript.Shell");
	var Basp21 = new ActiveXObject("Basp21");

	$(function(){

		$("#send").on("click", function(){
			ErrMessage = Basp21.SendMail( 
				"サーバーアドレス:587", 
				$("#to").val(), 
				"差出人メールアドレス" + "\t" + "アカウント" + ":" + $("#pass").val(), 
				$("#subject").val(), 
				$("#body").val(), 
				"" 
			);
			
			if ( ErrMessage != "" ) {
				alert(ErrMessage);
			}
			else {
				alert("メール送信が終了しました。");
			}
		});

	});

</script>
<style>
html,body {
	height: 100%;
}

body {
	margin: 0;
}

/* ブロックを左右に表示  */
.ttl {
	display: inline-block;
	width: 150px;
	vertical-align: top;
}
.entry {
	display: inline-block;
}
.line {
	margin-bottom: 0;
}

#head {
	padding: 16px;
}

</style>
</head>
<body>
<div id="head">

	<p class="ttl">
		宛先
	</p>
	<p class="entry">
		<input
			id="to"
			type="text">

		<span
			class="ml-5">パスワード</span>
		<input
			class="ml-3"
			style="width:120px;"
			id="pass"
			type="password">
	</p>
	<p class="line"></p>

	<p class="ttl">
		件名
	</p>
	<p class="entry">
		<input
			style='width:500px;'
			type="text"
			id="subject">
	</p>
	<p class="line"></p>

	<p class="ttl">
		本文 
	</p>
	<p class="entry">
		<textarea
			style='width:500px;height:300px;'
			id="body"></textarea>
	</p>
	<p class="line"></p>

	<p>
		<input
			id="send"
			class="btn btn-outline-primary"
			type="button"
			value="メール送信">
	</p>

	<h4 class="text-danger"></h4>

</div>
</body>
</html>


Bootstrap Buttons

Bootstrap Spacing




posted by lightbox at 2018-07-11 16:26 | HTA ( HTMLアプリケーション ) | このブログの読者になる | 更新情報をチェックする

MySQL Connector/Python の使用方法概要のまとめ

接続
import mysql.connector

# **************************************
# 接続 / 更新兼用
# **************************************
cnn = mysql.connector.connect(
	host='localhost',
	port=3306,
	db='lightbox',
	user='root',
	passwd='',
	charset="utf8",
	autocommit='True')

# データベース処理

# **************************************
# 接続解除
# **************************************
cnn.close()


MySQLCursor.fetchone() Method
このメソッドはクエリ結果セットの次の行を取得し、単一のシーケンスを返し、使用可能な行がない場合はNoneを返します。 

デフォルトでは返されたタプルはMySQLサーバから返されたデータで構成され、Pythonオブジェクトに変換されます。(カーソルが生のカーソルの場合そのような変換は行われません : 「cursor.MySQLCursorRawクラス」 )

fetchone メソッドは fetchall および fetchmany によって使用されます。 また、カーソルがイテレータとして使用さる場合にも使用されます。

次の例はカーソルをイテレータとして使用し、内部では fetchone  が使用されます。
cursor.execute("SELECT * FROM employees")
for row in cursor:
	print(row)
関数で処理
# ***************************
# 参照
# ***************************
def get_data( cnn ):

	log("get_data")

	cursor = cnn.cursor(dictionary=True)

	sql = f"""select
			社員コード,
			氏名,
			フリガナ,
			所属,
			性別,
			作成日,
			更新日,
			給与,
			手当,
			管理者,
			DATE_FORMAT(生年月日,'%Y/%m/%d') as 生年月日
		from 社員マスタ
		where 社員コード = '{forms("社員コード")}'"""

	log(sql)

	cursor.execute(sql)

	row = cursor.fetchone()

	if row is None:
		set("check_message", "データが存在しません")
		return False

	pplog(row)

	forms("氏名", row["氏名"])
	forms("フリガナ", row["フリガナ"])
	forms("給与", row["給与"])
	forms("生年月日", row["生年月日"])

	cursor.close()

	return True

pplog の結果
{'フリガナ': 'ウラオカ トモヤ',
 '作成日': datetime.datetime(2005, 9, 12, 0, 0),
 '性別': 0,
 '所属': '0003',
 '手当': 9000,
 '更新日': datetime.datetime(2005, 11, 28, 0, 0),
 '氏名': '浦岡 友也',
 '生年月日': '2001/01/10',
 '社員コード': '0001',
 '管理者': None,
 '給与': 80000}
MySQLCursor.execute() Method
このメソッドは指定されたデータベース操作(クエリまたはコマンド)を実行します。

タプルまたはディクショナリ(PHP:連想配列/Ruby:ハッシュ)の値は、SQL文字列内の変数にバインドされます。 

変数を%sまたは%(name)s として埋め込んで使用します。 
▼ 例
select_stmt = "SELECT * FROM employees WHERE emp_no = %(emp_no)s"
cursor.execute(select_stmt, { 'emp_no': 2 })

▼ 非推奨
execute は、multiがTrueの場合はイテレータを返します。
Pythonでは、単一の値を含むタプルにカンマを含める必要があります。
たとえば ('abc') はスカラとして評価され、('abc',)はタプルとして評価されます。
print( type(('abc')) )
print( type(('abc',)) )

▼ 処理結果
<class 'str'>
<class 'tuple'>
関数で処理
# ***************************
# 更新
# ***************************
def update_data( cnn ):
	log("update_data")

	cursor = cnn.cursor()

	# 文字列複数行連結
	sql = f"""update 社員マスタ set 
		氏名 = %s,
		フリガナ=%s,
		給与 = %s,
		生年月日 = %s
	where 社員コード = '{forms("社員コード")}'"""

	log( sql )

	try:
		data = (forms("氏名"), forms("フリガナ"), int(forms("給与")) , forms("生年月日") )
	
		log( data )
	
		cursor.execute(sql, data)
	except:
		error_info = str(sys.exc_info()[1])
		set("check_message", "更新に失敗しました : " + error_info)
		log(str(sys.exc_info()[0]))
		log(error_info)
		return False

	cursor.close()

	return True


sys.exc_info()
現在処理中の例外を示す 3 個のタプルを返します。

例外が発生している場合、(type, value, traceback) を返します。type は処理中の例外のクラス(BaseException のサブクラス)を示します。value は例外インスタンス (例外の型のインスタンス) を返します(エラーメッセージはここに格納されています)
▼ エラーメッセージ例(MySQL)
1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'aaa' at line 1
ログ関数
import pprint

# **************************************
# ログ出力
# **************************************
def log( message ):
	with open('debug.log', 'a') as f:
		print(message,end='\n',file=f)
	
# **************************************
# ログ出力( pprint )
# **************************************
def pplog( obj ):

	with open("debug.log", "a") as f:
		pprint.pprint(obj, stream=f)






posted by lightbox at 2018-07-11 13:39 | Python | このブログの読者になる | 更新情報をチェックする

2018年07月06日


WindowBuilder JFace : WEB より JSON を取得して Table に表示する

Okhttp(ダウンロード) を使用した HttpAccess クラス を使用して、WEB 上から JSON 文字列を取得して Table コントロールにデータの一覧を表示します。
(重要) Okio(ダウンロード) も必要です

JSON 文字列を オブジェクトに変換する為に、Google Gson(各バージョンダウンロードページ) を使用します

使用するのは fromJson メソッドのみです。
// ▼ オブジェクト化用クラス定義
// JSON のプロパティ名と 以下のフィールド名が一致します
private class MyData {
	String 社員コード;
	String 氏名;
	String フリガナ;
	String 所属;
	String 性別;
	String 作成日;
	String 更新日;
	String 給与;
	String 手当;
	String 管理者;
	String 生年月日;
}
--------------------------------------------------------
// ▼ 使用方法
// JSON 文字列 => オブジェクト用
Gson gson = new Gson();
 
// JSON では、{} が配列となっています
MyData[] array = gson.fromJson(s, MyData[].class);
--------------------------------------------------------
// ▼ データ( 一件分 )
[
    {
        "社員コード": "0001",
        "氏名": "山田 太郎",
        "フリガナ": "ウラオカ トモヤ",
        "所属": "0003",
        "性別": "0",
        "作成日": "2005-09-12 00:00:00",
        "更新日": "2005-11-28 00:00:00",
        "給与": "1002",
        "手当": "9000",
        "管理者": "0001",
        "生年月日": "2012\/03\/21"
    }
]
データを MyData のインスタンスとして取得した後、MyData のクラス定義より、java.lang.reflect.Field (getName メソッド) を使用してデータのタイトル用に MyData のフィールド名を取得します。さらに、get メソッドを使用してデータを取得して Table コントロールに反映させます。
// MyData のフィールドよりタイトルを作成
Field[] flds = MyData.class.getDeclaredFields();
int fldCount = 0;
for( Field fld : flds ) {
	// このクラス名 "Main" を排除
	if ( !fld.getType().getName().equals("Main") ) {
		// 列
		tableColumn = new TableColumn(table, SWT.NONE);
		// 表示幅
		tableColumn.setWidth(100);
		// タイトルとして、フィールド名
		tableColumn.setText(fld.getName());

		// 列数
		fldCount++;
	}
}
※ 1行目の getDeclaredFields メソッドは、java.lang.Class.getDeclaredFields

Table コントロールは、org.eclipse.swt.widgets.Table です。

▼ 列定義用
TableColumn
▼ 行データ用
TableItem
// 列数ぶん配列を作成
String[] columnData = new String[fldCount];
 
// データを一行ぶん作ったら...

// 行作成( Table と関係づけ )
tableItem = new TableItem(table, SWT.NONE);
// 列データを配列で一括設定( 配列で一括設定 )
tableItem.setText(columnData);

// public void setText(String[] strings)
// Sets the text for multiple columns in the table.
// Note: If control characters like '\n', '\t' etc. are used in the string, 
// then the behavior is platform dependent.
// 
// Parameters:
// strings - the array of new strings
※ メニューの作成は、『Pleiades Oxygen + WindowsBuilder で MySQL を使用して SQL(select) からデータの一覧を表示する』を参照して下さい。
import java.lang.reflect.Field;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

import com.google.gson.Gson;

public class Main extends ApplicationWindow {

	private Table table;
	private String url = "http://localhost/web/form/basic-php-0628-iframe-client/data.php";
	private HttpAccess httpAccess;

	// メニユーアイテム
	private Action action;

	private class MyData {
		String 社員コード;
		String 氏名;
		String フリガナ;
		String 所属;
		String 性別;
		String 作成日;
		String 更新日;
		String 給与;
		String 手当;
		String 管理者;
		String 生年月日;
	}

	// *******************************
	// コンストラクタ
	// *******************************
	public Main() {
		super(null);
		createActions();
		addMenuBar();
		httpAccess = new HttpAccess(url);
	}

	// *******************************
	// コントロール追加
	// *******************************
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.addControlListener(new ControlAdapter() {
			@Override
			public void controlResized(ControlEvent e) {

				Rectangle size = container.getClientArea();
				table.setSize(size.width-21, size.height-84);

			}
		});

		// *******************************
		// ボタン
		// *******************************
		Button btnNewButton = new Button(container, SWT.NONE);
		btnNewButton.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				table.removeAll();
				loadMySQL();
			}
		});
		btnNewButton.setBounds(10, 10, 75, 25);
		btnNewButton.setText("実行");

		// *******************************
		// テーブル
		// *******************************
		table = new Table(container, SWT.BORDER | SWT.FULL_SELECTION);
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDoubleClick(MouseEvent e) {

				int row_no = table.getSelectionIndex();
				// 行 は 0 以上
				if ( row_no >= 0 ) {

					// タイトル部分の表示
					TableColumn[] tableColumns = table.getColumns();
					for( TableColumn column: tableColumns ) {
						System.out.println( column.getText() );
					}

					// 行部分の表示
					TableItem tableItem = table.getItem(row_no);
					int columnCount = tableColumns.length;
					for( int i = 0; i < columnCount; i++ ) {
						System.out.println( tableItem.getText(i));
					}

				}
			}
		});
		table.setBounds(10, 41, 591, 333);
		table.setHeaderVisible(true);
		table.setLinesVisible(true);

		return container;
	}

	// *******************************
	// データ表示
	// *******************************
	protected void loadMySQL() {

		// 引数のインターフェイスが内部より呼ばれる
		httpAccess.sendGet(new HttpAccess.SendGetListener() {

			// インターフェイス内で定義したメソッド
			public void sendGetListener(String s) {
				
				if ( s.equals("{}")) { 
					MessageBox message = new MessageBox(Main.this.getShell(),SWT.OK);
					message.setMessage("データを取得できませんでした");
					message.open();
					return;
				}

				// JSON 文字列 => オブジェクト用
				Gson gson = new Gson();

				// JSON では、{} が配列となっています
				MyData[] array = gson.fromJson(s, MyData[].class);

				// 列定義用
				TableColumn tableColumn = null;

				// MyData のフィールドよりタイトルを作成
				Field[] flds = MyData.class.getDeclaredFields();
				int fldCount = 0;
				for( Field fld : flds ) {
					// このクラス名 "Main" を排除
					if ( !fld.getType().getName().equals("Main") ) {
						// 列
						tableColumn = new TableColumn(table, SWT.NONE);
						// 表示幅
						tableColumn.setWidth(100);
						// タイトルとして、フィールド名
						tableColumn.setText(fld.getName());

						// 列数
						fldCount++;
					}
				}

				// 行
				TableItem tableItem = null;

				// array に MyData の配列が格納されています
				for (MyData data: array) {

					// 列数ぶん配列を作成
					String[] columnData = new String[fldCount];

					// 配列参照用
					int idx = 0;
					// フィールド単位でデータを取得する
					for( Field fld : flds ) {
						// このクラス名 "Main" を排除
						if ( !fld.getType().getName().equals("Main") ) {
							try {
								if ( fld.get( data ) == null ) {
									// データが NULL の場合は空白
									columnData[idx] = "";
								}
								else {
									columnData[idx] = fld.get( data ).toString();
								}
							} catch (Exception e) {
								// エラーの場合は空白
								columnData[idx] = "";
							}
							idx++;

						}
					}

					// 行作成
					tableItem = new TableItem(table, SWT.NONE);
					// 列データを配列で一括設定
					tableItem.setText(columnData);

				}

			}

		});


	}

	// *******************************
	// メニューのアイテム
	// *******************************
	private void createActions() {
		// Create the actions
		{
			action = new Action("実行") {

				@Override
				public void run() {
					table.removeAll();
					loadMySQL();
				}

			};
		}
	}

	// *******************************
	// メニュー
	// *******************************
	@Override
	protected MenuManager createMenuManager() {
		MenuManager menuManager = new MenuManager("menu");

		MenuManager menuManager_item = new MenuManager("メニュー");
		menuManager.add(menuManager_item);
		menuManager_item.add(action);
		return menuManager;
	}

	// *******************************
	// エントリポイント
	// *******************************
	public static void main(String args[]) {
		try {
			Main window = new Main();
			window.setBlockOnOpen(true);
			window.open();
			Display.getCurrent().dispose();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// *******************************
	// Shell の初期処理
	// *******************************
	@Override
	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);
		newShell.setText("タイトル");
	}

	// *******************************
	// 画面の初期処理
	// *******************************
	@Override
	protected Point getInitialSize() {
		return new Point(800, 600);
	}
}



HttpAccess クラス

SendGetListener インターフェイスを定義して、JSON 文字列を受信した後の処理を、呼び出し元で処理させるようにしています。=> ※ listner.sendGetListener(data); の部分
import java.io.IOException;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class HttpAccess {

	private OkHttpClient okHttpClient;
	private String url;

	// 受信イベント
	public interface SendGetListener {
		abstract public void sendGetListener(String s);
	}

	// コンストラクタ
	public HttpAccess(String url) {

		this.okHttpClient = new OkHttpClient();
		this.url = url;

	}

	public HttpAccess() {
		this.okHttpClient = new OkHttpClient();
	}

	public void setUrl(String url) {
		this.url = url;
	}


	public void sendGet(SendGetListener listner) {

		// 汎用的に 初期値は {} としています
		String data = "{}";

		Request.Builder builder = new Request.Builder();
		builder.url(url);
		Request request = builder.build();

		Response response = null;
		try {
			response = HttpAccess.this.okHttpClient.newCall(request).execute();
			data = response.body().string();
		}
		catch (IOException e) {
			e.printStackTrace();
		}

		listner.sendGetListener(data);

	}

}


関連する記事

Pleiades Oxygen + WindowsBuilder で MySQL を使用して SQL(select) からデータの一覧を表示する






posted by lightbox at 2018-07-06 13:55 | java : WindowBuilder | このブログの読者になる | 更新情報をチェックする

2018年06月26日


バッチファイル(コマンドプロンプト)で使用できる特殊な3つの環境変数



昔、Windows の ヘルプとサポートセンターで コマンドシェル で検索すると、コマンドシェルの概要 というのがリストの中に出てきました。
1) %CD%
2) %ERRORLEVEL%
3) %RANDOM%
当然バッチファイル内でのプログラミング目的です。環境変数は、コマンド内で置き換えられてそのまま実行されるので以下のような使い方ができるので便利です
title ユーザーコマンドプロンプト / %cd%
これは、コマンドプロンプトのタイトルに現在のディレクトリを表示します。 cur.bat(laylaClass バッチ処理支援パッケージ) の中身です。 例えばユーザ変数に現在のカレントディレクトリへ戻るコマンドをセットします
set ROOT=cd %CD%
その後(同じドライブであれば)、cd コマンドであちこち移動しても %ROOT% と実行すれば、元に返ってこれます ※ 初期投稿 : 2009-08-28 17:56:27
posted by lightbox at 2018-06-26 16:12 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり