SQLの窓

2014年03月31日


VBScript +ADO / MDB から SQLite3 へ ODBC ドライバを使ってフィールドオブジェクトを使用した同一フォーマットのテーブル間のデータコピー(データベースは自動的に作成されます)

概要

ADO で昔からよく使われる常套手段です。

件数が多いと結構時間がかかるので、そのような処理には向いていません。現在のレコードを同様のフォーマットのログテーブル等へコピーするような一回に数十件の処理に向いています

▼ 販売管理B( hanbaib.zip )


ODBC ドライバを SQLite ODBC Driver からダウンロードしてこのデータを使って、VBScript を実行(DBのパスはご自分の環境に合わせて正しく変更して下さい)するだけで、SQLite3 のデータベースを作成する事ができます。

表名と列名を日本語のままでも作成して、SQL でアクセスできますが、ADO を使ってテーブル名を取得すると化けるので英数字に変更しています。作成後は、ODBCアドミニストレータで DSN を作成すれば、一般的な ODBC 経由のソフトウェアでアクセスが可能になります。

▼ 重要
SQLite ODBC Driver は、VBScript 上の SHIFT_JIS 環境から実行して、SQLite 内に UTF-8 のデータを保存します。VBScript(SHIFT_JIS) からの ADO の通常テーブルアクセスは正しく変換して実行してくれますが、ADO の OpenSchema経由で表名や列名を取得しようとすると、SHIFT_JIS へ戻さないというバグがあります。
内部確認用ツール VBScript + ADO : 汎用CSV出力 ▼ DSN 登録 出力結果
kubun,code,name,num1,num2,create_date,update_date
1,0,男,10,10,2004/05/05,2004/05/05
1,1,女,11,12,2004/05/05,2004/05/05
2,0001,営業部第一,0,0,2004/05/05,2004/05/05
2,0002,営業部第ニ,0,0,2004/05/05,2004/05/05
2,0003,営業部第三,0,0,2004/05/05,2004/05/05
3,0,通常,0,0,2004/06/23,2004/06/23
3,1,特別,0,0,2004/06/23,2004/06/23
4,0,通常,0,0,2004/06/23,2004/06/23
4,1,特別,0,0,2004/06/23,2004/06/23
5,A,食品,0,0,2004/06/23,2004/06/23
5,B,装飾,0,0,2004/06/23,2004/06/23
5,D,衣類,0,0,2004/06/23,2004/06/23
5,G,娯楽,0,0,2004/06/23,2004/06/23
5,K,家庭一般,0,0,2004/06/23,2004/06/23
5,M,薬,0,0,2004/06/23,2004/06/23
5,P,パソコン,0,0,2004/06/23,2004/06/23
5,Z,雑貨,0,0,2004/06/23,2004/06/23


' 使用する ODBC ドライバです
strDriver = "{SQLite3 ODBC Driver}"

' ************************************************
' 処理用文字列設定
' ************************************************
' MDB の接続文字列
strConnectMdb = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\user\lightbox\sqlite3\hanbaib\販売管理B.mdb;"
strConnectSQLite3 = _
"Provider=MSDASQL;Driver="&strDriver&";DATABASE=C:\user\lightbox\sqlite3\hanbaib\db1.sqlite3;"

' ************************************************
' 初期処理
' ************************************************
Set Cn = CreateObject("ADODB.Connection")
Cn.CursorLocation = 3
Set Rs = CreateObject( "ADODB.Recordset" )

Set Cn2 = CreateObject("ADODB.Connection")
Cn2.CursorLocation = 3
Set Rs2 = CreateObject( "ADODB.Recordset" )
Rs2.LockType = 3	' 更新用レコードセット

Cn.Open strConnectMdb
Cn2.Open strConnectSQLite3

' ************************************************
' コード名称マスタ
' ************************************************
Query = _
"create table code_name (" & _
"	kubun INT" & _
"	,code VARCHAR(10)" & _
"	,name NVARCHAR(50)" & _
"	,num1 INT" & _
"	,num2 INT" & _
"	,create_date DATETIME" & _
"	,update_date DATETIME" & _
"	,primary key(kubun,code)" & _
")"
Call SSTransfer( "code_name", Query )

' ************************************************
' 終了
' ************************************************

Cn2.Close
Cn.Close

Wscript.Echo "処理が終了しました"

' ************************************************
' SQLLite 転送
' ************************************************
function SSTransfer( strTable, QueryCreate )

	Wscript.Echo strTable & " の作成を開始します"

	Dim Query

	' まず既存テーブルを削除
	Query = "drop table " & strTable
	RunSS( Query )

	' CREATE 文でテーブル作成
	RunSS( QueryCreate )

	' MDB 側はすべてのレコード
	' SQLite 側は空
	Query = "select * from " & strTable
	Rs.Open "select * from コード名称マスタ", Cn
	Rs2.Open Query, Cn2

	' フィールド数
	nCount = Rs.Fields.Count
	Do While not Rs.EOF

		' SQLite 側に新しいレコードバッファを作成
		Rs2.AddNew

		' 同一フォーマットなのでフィールド番号でループ
		For I = 0 to nCount - 1
			' 対応するデータを MDB から SQLite へコピー
			Rs2.Fields(I).Value = Rs.Fields(I).value
		Next
		' SQLite の更新
		Rs2.Update

		' MDB を次のレコードへ
		Rs.MoveNext
	Loop

	' レコードセットを閉じる
	Rs2.Close
	Rs.Close

	Wscript.Echo strTable & " の作成が終了しました"

end function

' ************************************************
' SQLLite 実行
' ************************************************
function RunSS( Query )

	on error resume next
	Cn2.Execute Query
	if Err.Number <> 0 then
		Wscript.Echo Err.Description
	end if
	on error goto 0

end function


以下は簡単に更新する為に SQLの窓 Build C++ を使っての手順です。

Excel の接続ダイアログ

DSN を作成した後、Excel の接続ダイアログにある『他のDSN』に入力します。



更新用のキーを設定

テーブル名をダブルクリックすると、データ処理用のウインドウが開くので更新用のキーを設定します。この処理では、ODBC 一般用なので、ウインドウを開くたびにキーの設定がその都度必要です。



入力した後更新できます




関連する記事

posted by lightbox at 2014-03-31 20:43 | VBS + ADO | このブログの読者になる | 更新情報をチェックする

2014年03月30日


Excel 2010 で文字を画像化する場合、図形内で24ポイント以上にします。



純粋な経験則ですが、Excel のセル内では文字のアウトラインが滑らかになる事はありません。もちろん印刷してしまえば、セル内のフォントのアウトラインが滑らかになると思いますが、インターネットや Excel や ワードそのもので『画像』として扱いたい場合は、いったん図形に対して文字を入力して、24ポイントに設定した後に画像にすると美しい文字が得られると思います。

画像化してしまえば、縮小するぶんにはある程度良い画質のものが得られると思います。

以下は、Picasa に実寸で登録した画像を URL の調整で小さく縮小して表示しています



補足ですが、『図形』内の文字列も、『段組み』が可能です。


関連する記事

Picasa のサムネイルの使い方


posted by lightbox at 2014-03-30 14:53 | Microsoft Office | このブログの読者になる | 更新情報をチェックする

2014年03月29日


JavaScript : 誰でもすぐ使える Google 円グラフ(2) : データを Google ドキュメントから取得する



Ggdoc5
Google ドキュメントを使用して、円グラフ(visualization / piechart )を作成する
Google ドキュメントへのリンク Google ドキュメントは誰にでも使えるオンラインの Excel のようなものですが、WEB 上のデータのホスティングとしても利用する事ができます。
<style>
#chart_div iframe {
	border: solid 1px #000000;
	border-radius: 30px;
}
</style>
<div id="chart_div"></div>

<script charset="utf-8" type="text/javascript" src="http://www.google.com/jsapi"></script> 
<script type="text/javascript">
google.load("visualization", "1", {packages: ["piechart"]});

google.setOnLoadCallback(getGoogleDoc);

var data;

// *********************************************************
// WEB(Google ドキュメント) からデータを取得
// *********************************************************
function getGoogleDoc() {

	// ターゲットとなる WEB 公開 URL
	var target = "http://spreadsheets.google.com/pub?key=";
	target += "0AtJymqpro6gScDZQZmVQZ0RNSkZCb0lqREg1bGNQQ3c&hl=ja&single=true&gid=3&output=html";

	// SQL でデータを取得
	var query = new google.visualization.Query(target);
	query.setQuery("select *");
	// データを取得後に呼び出す関数を指定
	query.send( drawChart );

}

// *********************************************************
// 円グラフ作成
// *********************************************************
function drawChart(response) {

	// エラー処理
	if ( response.isError() ) {
		alert(getDetailedMessage());
		return;
	}

	// テーブル用データ作成
	data = response.getDataTable();

	var chart = new google.visualization.PieChart(document.getElementById('chart_div'));

	chart.draw(data, {width: 600, height: 320, is3D: true, title: '円グラフのタイトル'});
}
</script>

関連する記事

JavaScript : 誰でもすぐ使える Google 円グラフ


タグ:google
posted by lightbox at 2014-03-29 20:37 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

JavaScript : 誰でもすぐ使える Google 円グラフ

Ggpiechart

※ 凡例をクリックすると、その部分が飛び出ます
※ グラフをクリックすると、データが表示されます。
※ 誰でもすぐ使えます

addColumn を2回していますが、Excel の表を2列作ったのと同じで、タイトルとデータ型を設定して、行を7つ作っています。後は、セルにデータとタイトルをセットしていると思って下さい。





<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>google 円グラフ</title>
</head>
<body>

<div id="chart_div" style="width: 400px; height: 240px;"></div>

<script charset="utf-8" type="text/javascript" src="http://www.google.com/jsapi"></script> 
<script type="text/javascript">
google.load("visualization", "1", {packages: ["piechart"]});

google.setOnLoadCallback(drawChart);
function drawChart() {

	var data = new google.visualization.DataTable();
	data.addColumn('string', '対象');
	data.addColumn('number', '件数');
	data.addRows(7);

	data.setValue(0, 0, '対象A');
	data.setValue(0, 1, 2000);
	data.setValue(1, 0, '対象B');
	data.setValue(1, 1, 3000);
	data.setValue(2, 0, '対象C');
	data.setValue(2, 1, 1500);
	data.setValue(3, 0, '対象D');
	data.setValue(3, 1, 500);
	data.setValue(4, 0, '対象E');
	data.setValue(4, 1, 200);
	data.setValue(5, 0, '対象F');
	data.setValue(5, 1, 215);
	data.setValue(6, 0, '対象G');
	data.setValue(6, 1, 20);

	var chart = new google.visualization.PieChart(document.getElementById('chart_div'));

	chart.draw(data, {width: 600, height: 320, is3D: true, title: '円グラフのタイトル'});
}
</script>

</body>
</html>


Google のリファレンス

Visualization: Pie Chart


関連する記事

JavaScript : 誰でもすぐ使える Google 円グラフ(2) : データを Google ドキュメントから取得する

Google ドキュメントを使用して、円グラフ(visualization / piechart )を作成する

jQuery + Google Visualization : 円グラフのプラグイン化


タグ:google
posted by lightbox at 2014-03-29 20:37 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

2014年03月28日


jQuery のプラグイン作成 : 要素のクリックイベントで、画像の実際の縦横サイズちょうどの大きさのウインドウを開いて表示する

ウインドウは、画像がデスクトップの解像度を超える場合の動作は、ブラウザによって違うので、確実に表示できる大きさの画像を指定するのがいいです。いずれにしても、一旦画像をロードしてサイズを取得するので、無駄に大きいものは良くありません。

ウインドウは、計算でデスクトップ中央に表示されます。そのあたりの位置はプラグイン内で変更できます。また、要素に data- で属性として目的の画像をセットするような仕様にするのは簡単ですが、IE の古いブラウザの場合は、コードで対応する必要があります。しかし、現在ではその対応はあまり意味が無いので具体的な記述はしていません。( この記事の最後に、IE 全てに対応し、セレクタで一括指定できるようにしたコードを掲載しました )

IE の場合は、仕様の為か、周りに余白ができます。もうちょっと作りこめば、それもどうにかできますが、画像を表示したいだけなのでこれで十分だと思います。
画像は、Picasa の画像を使用しているので URL が長くなっています。Picasa の画像は、サーバー側でサムネイルを作成できるので、このような場合に便利ですが、長い URL を避けたい場合、Google の URL 短縮を 画像の URL に対して行うといいです。

関連する記事

Picasa のサムネイルの使い方
イメージユニット作成サービス / window.open と Lightbox2 と Shadowbox

<script>
// jQuery ロード部分
if ( !window.jQuery ) {
	if ( typeof window[window.location.hostname+'.loadjQuery'] === 'undefined' ) {
		if ( window.addEventListener ) {
			window[window.location.hostname+'.loadjQuery'] = '//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js';
		}
		else {
			window[window.location.hostname+'.loadjQuery'] = '//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js';
		}
	}
	document.write("<"+"script src=\"" + window[window.location.hostname+'.loadjQuery'] + "\"></"+"script>");
}
</script>

<script>
// プラグインインストール部分
$.fn.extend({ 
	setOpenImage: function(url){
		var jq = this;
		var obj = new Image();
		$( obj ).load(function(){
			var __h = this.naturalHeight || this.height;
			var __w = this.naturalWidth || this.width;
			jq.css("cursor", "pointer").click(function(){
				window.open( url,
					"",
					"width="+__w+",height="+__h+",resizable=1,left="+(screen.width-__w)/2+",top="+(screen.height-(__h+100))/2)
			});
		});
		$( obj ).prop( "src", url );
	}
});
</script>

<script>
// ロード後の実装部分
$(function(){
	$("#open_target_1").setOpenImage("https://lh4.googleusercontent.com/-1hrl6J4BkAI/UmfOlBCk8VI/AAAAAAAAQ08/2QbL_BEtAjA/s900/UrbanFuture3_1.jpg");
	$("#open_target_2").setOpenImage("https://lh4.googleusercontent.com/-ivV-h9giVL0/Ul7TtLhF37I/AAAAAAAAQvk/AQJamcu3-mc/s640/ub3_lights.jpg");
});
</script>

<img id="open_target_1" src="https://lh4.googleusercontent.com/-1hrl6J4BkAI/UmfOlBCk8VI/AAAAAAAAQ08/2QbL_BEtAjA/s400/UrbanFuture3_1.jpg">
<img id="open_target_2" src="https://lh4.googleusercontent.com/-ivV-h9giVL0/Ul7TtLhF37I/AAAAAAAAQvk/AQJamcu3-mc/s200/ub3_lights.jpg">

カスタム属性とクラスで一括指定

IE に対する対応は、かなり特殊なので省いてもいいのですが、IE9 と IE10 の時代で outerHTML から属性を取得する処理が必要で、この処理はひょっとすると、他の実装にも役立つかもしれません。

それより何より、HTML の要素に記述する事によって、each 処理で、セレクタによる全ての要素に一括対応ができるようになります。これが一番実質的に意味があるので作成してみました。( 最初のコードでもセレクタによる一括指定はできますが、一つの指定で指定できる画像は一つです )

さらに読みやすくする為に、Google の URL短縮 を実際に使用しています。
<script>
// jQuery ロード部分
if ( !window.jQuery ) {
	if ( typeof window[window.location.hostname+'.loadjQuery'] === 'undefined' ) {
		if ( window.addEventListener ) {
			window[window.location.hostname+'.loadjQuery'] = '//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js';
		}
		else {
			window[window.location.hostname+'.loadjQuery'] = '//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js';
		}
	}
	document.write("<"+"script src=\"" + window[window.location.hostname+'.loadjQuery'] + "\"></"+"script>");
}
</script>

<script>
// プラグインインストール部分
$.fn.extend({ 
	setOpenImageAll: function(url){
		this.each(function(idx,elm){

			var jq = $(elm);
			var img_url = url;
			if ( typeof jq[0].dataset !== 'undefined' ) {
				img_url = jq[0].dataset.image;
			}
			if ( typeof jq[0]["data-image"] !== 'undefined' ) {
				img_url = jq[0]["data-image"];
			}
			if ( typeof img_url === 'undefined' ) {
				var wk = jq[0].outerHTML;
				var wk2 = wk.match(/data-image=\"([^"]+)\"/);
				img_url = wk2[1];
			}
			var obj = new Image();
			$( obj ).load(function(){
				var __h = this.naturalHeight || this.height;
				var __w = this.naturalWidth || this.width;
				jq.css("cursor", "pointer").click(function(){
					window.open( img_url,
						"",
						"width="+__w+",height="+__h+",resizable=1,left="+(screen.width-__w)/2+",top="+(screen.height-(__h+100))/2)
				});
			});
			$( obj ).prop( "src", img_url );

		});
	}
});
</script>

<script>
// ロード後の実装部分
$(function(){
	$(".open_image").setOpenImageAll();
});


</script>
<img class="open_image" src="http://goo.gl/kbi8oV" data-image="http://goo.gl/7vItxm">
<img class="open_image" src="http://goo.gl/Dl1Lrv" data-image="http://goo.gl/ZYx6VC">
img_url = jq[0]["data-image"]; は、IE8 以前の対応です。昔の IE は、HTML で書いた属性がそのままプロパティとして実装される仕様でした。ですから、obj.data-image というプロパティが実際に作成されています。しかし、参照する場合、プロパティに -( ハイフン ) は使え無いので、jq[0]["data-image"] という文字列での表現で利用します。

さらに、IE9 と IE10 で、この仕様が無くなったのですが、IE11 でやっと、カスタム属性が利用可能になります。そこで、IE9 と IE10 のみ、outerHTML から文字列を取得して、正規表現で書かれている URL を取得しています。

関連する記事

IE11 から利用可能になったカスタムデータ属性(datasetプロパティ)


タグ:IE jquery dataset
posted by lightbox at 2014-03-28 15:21 | プラグイン作成(jQuery) | このブログの読者になる | 更新情報をチェックする

PowerShell2.0 : ファイルを開くダイアログを使う

Hey, Scripting Guy! では、[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") を使う方法が紹介されていますが Add-Type で普通に使えるのでそれでいいと思いますHey, Scripting Guy!

Windows PowerShell を使用して [ファイルを開く] ダイアログ ボックスを開く方法はありますか

これらの情報は、Windows XP の頃の情報で、Windows7 の PowerShell では 以下で示されるコード内の $OpenFileDialog.ShowHelp = $true; によって正しく実行されます( これが無いとダイアログが表示されずに、PowerShell がメモリ上で停止してしまいまいます )

これ以外の方法では、"powershell -Sta -file スクリプト" で実行すると表示されます。
利用する場合は、"powershell -file スクリプト" で実行しないと、powershell 内から .\スクリプト で実行するとダイアログがアクティブにならないので注意です
Add-Type -AssemblyName System.Windows.Forms

$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog

$OpenFileDialog.initialDirectory = "c:\tmp"

$OpenFileDialog.filter = "All files (*.*)| *.*"

$OpenFileDialog.ShowHelp = $true;

$OpenFileDialog.ShowDialog() | Out-Null

$OpenFileDialog.filename

関連する記事

PowerShell2.0 : 最初の設定



posted by lightbox at 2014-03-28 01:01 | PowerShell | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

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

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