SQLの窓

2011年09月10日


VB.net での テキストファイルの読み書きを、出力時のみキャラクタセット毎に条件コンパイル指定する



以下のように指定した文字列を使用して条件コンパイルを行います

vbc.exe vbc_textfile.vb /define:SJIS_BUILD

主なエンコード として以下の5つのエンコードを使用します
1) SHIFT_JIS
2) EUC-JP
3) UNICODE
4) UTF-8N
5) UTF-8 ( BOM付き )
( パッケージ内に簡易ダンプを同梱してますので、インストールして BOM を確認できます ) 比較的小さなファイルの場合は、ReadFile.ReadToEnd() で一度に全てメモリに 取得するのが簡単ですが、大きなファイルは行単位で処理するのが通常です。
Imports System.IO
Imports System.Text

Module Module1

	Sub Main()

		' 入力ファイルのパス ( "入力ファイルのパス" と指定する )
		Dim arguments As String() = Environment.GetCommandLineArgs()
		' 引数は一つのみ許可
		if arguments.Length <> 2 then
			Console.WriteLine("引数を指定して下さい")
			Return
		end if

		' 引数から取得
		Dim BaseFilePath As String = arguments(1)

		' **************************************************
		' 主なエンコード
		' **************************************************
		' SHIFT_JIS
		Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932)
		' EUC-JP
		Dim UJIS_Enc As Encoding = Encoding.GetEncoding(51932)
		' UNICODE 用
		Dim UNI_Enc As Encoding = Encoding.GetEncoding(1200)
		' UTF-8N
		Dim UTF8N_Enc As New UTF8Encoding()
		' UTF-8
		Dim UTF8_Enc As New UTF8Encoding(True)

		' **************************************************
		' SHIFT_JISで読み、SHIFT_JIS で出力する
		' **************************************************
		' 読み込み用
		Dim ReadFile As StreamReader = New StreamReader( BaseFilePath, SJIS_Enc )
		' 書き込み用( 第二引数が False なので、上書き )

#If SJIS_BUILD Then
		Dim WriteFile As StreamWriter = New StreamWriter( BaseFilePath + ".txt", False, SJIS_Enc )
#End If
#If UJIS_BUILD Then
		Dim WriteFile As StreamWriter = New StreamWriter( BaseFilePath + ".txt", False, UJIS_Enc )
#End If
#If UNI_BUILD Then
		Dim WriteFile As StreamWriter = New StreamWriter( BaseFilePath + ".txt", False, UNI_Enc )
#End If
#If UTF8N_BUILD Then
		Dim WriteFile As StreamWriter = New StreamWriter( BaseFilePath + ".txt", False, UTF8N_Enc )
#End If
#If UTF8_BUILD Then
		Dim WriteFile As StreamWriter = New StreamWriter( BaseFilePath + ".txt", False, UTF8_Enc )
#End If

		' SHIFT_JIS で読み込み
		Dim LineText As String = Nothing
		' Peek() は、StreamReader オブジェクトの現在位置は変わりません
		' それ以上読み取り可能な文字がない場合、戻り値は -1 です。
		' 以下は、MSDN ライブラリでのサンプルコードと同じものです
		Do While ReadFile.Peek() >= 0
			LineText = ReadFile.ReadLine()

			WriteFile.WriteLine( LineText )
		Loop

		' **************************************************
		' 終了処理
		' **************************************************
		WriteFile.Close()
		WriteFile.Dispose()
		ReadFile.Close()
		ReadFile.Dispose()

		Console.WriteLine("処理が終了しました")

		' 一時停止
		Console.Write("Enterキーを押して下さい : ")
		Console.ReadLine()

	End Sub

End Module



タグ:VB.NET
posted by lightbox at 2011-09-10 15:01 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする

Oracle : PL/SQL : 暗黙のカーソルとループブロックを使用した自動行挿入

この書き方の目的は、更新対象の行が存在しなかった場合に自動的に行を追加して、集計更新の処理を継続する事です。

一回目の UPDATE でもし対象行が無ければ、暗黙のカーソルによって条件が設定されるので、INSERT 文で初期レコードを作成してループ処理でもう一度 UPDATE 文が実行されます。その場合は必ず対象行が存在するので、初回の集計がなされた後、ループを抜ける事になります。

もし、既に行が存在する場合は UPDATE 後には即ループを抜けます
LOOP
	UPDATE 集計用テーブル SET
		"現物数量" = "現物数量" - PM_数量,
		"更新日" = sysdate
	WHERE
		"組織" = V組織
		AND "大分類" = V大分類
		AND "商品コード" = V商品コード;
	IF SQL%NOTFOUND THEN
		INSERT INTO 集計用テーブル
		 VALUES (V組織,V大分類,V商品コード,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,NULL,sysdate,NULL,sysdate,0,0
		,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0);
	ELSE
		EXIT;
	END IF;
END LOOP;




タグ:Oracle PL/SQL
posted by lightbox at 2011-09-10 09:39 | Oracle : PL/SQL | このブログの読者になる | 更新情報をチェックする

Oracle : PL/SQL : SELECT 〜 INTO 構文の一般的な使用方法

SELECT 〜 INTO は、カーソルを定義せずにデータを読みだす便利な方法ですが、対象データが where 条件で発見できなかった場合は例外が発生するので注意が必要です。

必ず、BEGIN 〜 EXCEPTION 〜 END; でブロックを作成して起こりうる例外処理に備える必要があります。( NULL 文は何もしない処理です )

但し、起こりうる例外として NO_DATA_FOUND と TOO_MANY_ROWS が考えされますが、グループ用の記述をしている場合は、必ず行が返されてかつ1行の場合もあります。( 例 : GROUP BY の無い count関数 )
BEGIN
	SELECT
		締日
		,締日区分
		,支払日
	INTO
		WK_締日
		,WK_締日区分
		,WK_支払日
	FROM 得意先マスタ
	WHERE
		得意先コード = PM_TCODE;
EXCEPTION
	WHEN NO_DATA_FOUND THEN
		NULL;
	WHEN TOO_MANY_ROWS THEN
		NULL;
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;



タグ:Oracle PL/SQL
posted by lightbox at 2011-09-10 09:17 | Oracle : PL/SQL | このブログの読者になる | 更新情報をチェックする

Oracle : PL/SQL : カーソルを使った一般的なループ処理を行うプロシージャ

カーソルは、PL/SQL 内で記述された SELECT 構文に割り当てられます。定義された
「呼び名」で OPEN、FETCH、CLOSE という一般的なファイルの I/O と同様の処理を
行います。

FETCH 時に行データがメモリに受け渡されますが、そのメモリは事前に定義しておく
必要があります。このサンプルでは最も簡単な例として、定義されたカーソルと同じ
フォーマットを持つレコード変数を定義しています

COMMENT_REC cur_main%ROWTYPE;

これ以外でも、列データを一つづつ FETCH の INTO 句に置く事もできます

カーソルでは、cur_main%NOTFOUND という書式( または cur_main%FOUND ) で、条件
として利用して FETCH 後の処理を記述する事が可能です。
CREATE OR REPLACE PROCEDURE LIST_MEMBER
(
	/* カーソルの範囲指定用  */
	PM_STRING IN VARCHAR2
)

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);

	/* カーソルの定義(主に複数読み込み用)  */
	CURSOR cur_main IS
		SELECT * FROM 社員マスタ
		where 社員コード <= PM_STRING;

	/* cur_main に対応する社員マスタのフォーマット  */
	COMMENT_REC cur_main%ROWTYPE; 

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');
	DBMS_OUTPUT.PUT_LINE('デバッグ:引数:'||PM_STRING);

	/* カーソルを開く */
	OPEN cur_main;

	/* ループ処理(ブロック) */
	LOOP 
		/* 定義したレコード変数に読み込み */
		FETCH cur_main INTO COMMENT_REC;
		/* カーソルに対するシステム変数でデータ終わりを判断 */
		if cur_main%NOTFOUND then 
			/* ループ処理を脱出 */
			EXIT; 
		end if; 

		/* デバッグの表示(実際は更新処理等を行う */
		DBMS_OUTPUT.PUT_LINE('結果:'||COMMENT_REC.氏名);
	 
	END LOOP; 

	/* カーソルを閉じる */
	CLOSE cur_main;

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
$if 1=1 $then
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
$end
END;

関連する記事

PL/SQL : プロシージャの呼び出し
Oracle : PL/SQL : Function のサンプルと使い方
PL/SQL : Function 雛形



タグ:Oracle PL/SQL
posted by lightbox at 2011-09-10 08:33 | Oracle : PL/SQL | このブログの読者になる | 更新情報をチェックする

Oracle : PL/SQL : Function のサンプルと使い方

Function は、Procedure と違って、一つの戻り値を返す仕様になっているのでselect 構文の中でシステムで定義された関数と同様の使い方ができます。

以下の Function は、引数で与えられた値を元に、社員マスタを参照して3種類の値を select の結果として返す事になります。

1) データが存在した場合 : 氏名
2) 元の値が NULL の場合 : 該当者は存在しません
3) 対象行が存在しなかった場合 : 該当データがシステムに存在しません
select 
	社員コード,
	氏名,
	GET_CNAME(管理者) as 管理者名
 from 社員マスタ
自分で構築したシステム上で使う場合、特殊な計算や複数の煩雑なテーブル参照というような処理を Function で定義しておく事によって、効率が良く見通しの良いアプリケーションを作成する事ができます
CREATE OR REPLACE FUNCTION GET_CNAME
(
	/* 文字列引数の定義 */
	PM_STRING IN VARCHAR2
)
/* 戻り値の定義 */
RETURN VARCHAR2

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000) := '初期値の設定';

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	/* デバッグ表示 */
	DBMS_OUTPUT.PUT_LINE( 'デバッグ:開始' );
	DBMS_OUTPUT.PUT_LINE( 'デバッグ:引数:' || PM_STRING );
	DBMS_OUTPUT.PUT_LINE( WK_VALUE );

	/* 代入 */
	RET_VALUE := PM_STRING;

	IF RET_VALUE is NULL THEN 
		DBMS_OUTPUT.PUT_LINE( 'NULLデータです' );
		RET_VALUE := '該当者は存在しません';
	ELSE 
		DBMS_OUTPUT.PUT_LINE( 'データ有り' );
		SELECT 氏名 INTO WK_VALUE from 社員マスタ
			WHERE 社員コード = RET_VALUE;
		RET_VALUE := WK_VALUE;
	END IF; 

	/* 戻り値 */
	RETURN RET_VALUE;

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
$if 1=1 $then
EXCEPTION
	WHEN OTHERS THEN
		WK_VALUE := '例外発生:'||SQLCODE||':'||SQLERRM;
		DBMS_OUTPUT.PUT_LINE( WK_VALUE );
		RET_VALUE := '該当データがシステムに存在しません';
		RETURN RET_VALUE;
$end
END;

SELECT INTO に対して単純に WHEN OTHERS THEN で例外処理を行っていますがこの場合は、NO_DATA_FOUND が発生しているはずです。

関連する記事

PL/SQL : Function 雛形




タグ:Oracle PL/SQL
posted by lightbox at 2011-09-10 01:18 | Oracle : PL/SQL | このブログの読者になる | 更新情報をチェックする

2011年09月07日


VB.net での DateDiff メソッドの使用方法

DateDiff 関数 : VBScript(Microsoft) 

DateDiff は、VBScript でも利用できるポピュラーなメソッドですが、Framework では、
引数は二通り用意されており、一つは VBScript と互換のあるデータ型で、もうひとつは
Framework の型を使ったものです。
Module Module1

	Sub Main()

		' DateDiff(日付差分)は、Microsoft.VisualBasic 名前空間の
		'  DateAndTime クラス内にあるメソッドで、VBScript でも定義されている関数

		Dim strBoundary As String = Nothing

		' VBScript でも実行可能な記述方法
		strBoundary = DateDiff("s", "1970/1/1 0:00:00", DateAdd("h", -9, Now))
		Console.WriteLine(strBoundary)

		' 上記結果を Framework に合った書き方で DateDiff する為に引数を用意
		Dim myDateTimeValue As String = "1970/1/1 0:00:00"
		Dim myDateTime As DateTime = DateTime.Parse(myDateTimeValue)
		Dim today As System.DateTime = System.DateTime.Now
		Dim duration As System.TimeSpan = New System.TimeSpan(0, -9, 0, 0)
		Dim target_date As System.DateTime = today.Add(duration)

		' Framework 用の実行
		strBoundary = DateDiff(DateInterval.Second, myDateTime, target_date)
		Console.WriteLine(strBoundary)

		Console.ReadLine()

	End Sub

End Module

関連する記事

VBScript で HTTPプロトコルで PHP へファイルをアップロードする方法


タグ:VB.NET DateDiff
posted by lightbox at 2011-09-07 11:39 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする
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 終わり