1  |  2  |  3  |  4  |  5    次>    

SQLをVBで扱う。(1)

テーマ:Windows
SQLをVBで扱う。

VBでDBを操作していると、動的にSQLを生成する場面がたまに出てきます。
それを、効率よく行う方法を、(半分ネタで)考えてみました。

VBでSQLを扱う場合、普通は次のような感じでしょうか。

Dim s As String = ""
s &= "Select 見積ID,顧客名,sum(見積詳細.金額) "
s &= " From 見積 Join 顧客 on 見積.顧客ID=顧客.顧客ID Join 見積詳細 on 見積.見積ID=見積詳細.見積ID "
s &= " Where 見積ID>=100 and 見積詳細.金額>=0"
s &= " Group By 見積ID,顧客名 "
s &= " Having sum(見積詳細.金額)>=100"
Debug.Print(s)
ここでのSQLは、VB的にはただの文字列です。
これではいけません。ただの文字列ではなく、意味を持たせましょう。
そのために次のようなクラスを作成しました。

Class SQL
  Dim s As String = ""

  Public Sub New()
  End Sub

  Public Sub New(ByVal s As String)
    Me.s = s
  End Sub

  Public Function [Select](ByVal ParamArray arg() As String) As SQL
    Me.s &= " Select " & String.Join(",", arg)
    Return Me
  End Function

  Public Function From(ByVal arg As String) As SQL
    Me.s &= " From " & arg
    Return Me
  End Function

  Public Shared Widening Operator CType(ByVal a As SQL) As String
    Return a.s
  End Operator
End Class
Select句とFrom句をSQLオブジェクトの関数にしたので、
Dim s As String = ""
s &= "Select * "
s &= " From 見積"
Debug.Print(s)

Dim q as New SQL
q.Select("*")
q.From("見積")
Debug.Print(q)
と書けます。どうです?これだけ見るとよさそうでしょ。

足りないSQL句を実装して最初の例を記述すると次のようになりました。
(SQLクラスの全ソースは次回に記載します。)
Dim q as New SQL
q.Select("見積ID", "顧客名", "sum(見積詳細.金額)")
q.From("見積")
q.Join("顧客", "見積.顧客ID=顧客.顧客ID")
q.Join("見積詳細", "見積.見積ID=見積詳細.見積ID")
q.Where("見積ID>=100 and 見積詳細.金額>=0")
q.GroupBy("見積ID", "顧客名")
q.Having("sum(見積詳細.金額)>=100")
Debug.Print(q)

行を分けずに書けばこんな感じです(うげ~)
Dim q as New SQL
q.Select("見積ID", "顧客名", "sum(見積詳細.金額)").From("見積").Join("顧客", "見積.顧客ID=顧客.顧客ID").Join("見積詳細", "見積.見積ID=見積詳細.見積ID").Where("見積ID>=100 and 見積詳細.金額>=0").GroupBy("見積ID", "顧客名").Having("sum(見積詳細.金額)>=100")
Debug.Print(q)


次回に続きます。
イイ!と思ったら拍手をお願いします↓
2

Smarty 部品定義プラグインを作ってみた

テーマ:インターネットのお勉強
Smartyテンプレート内でよく使うhtmlを部品として定義して、それを再利用するプラグインを作りました。

使い方はこんな感じです
{* 部品を定義します *}
{define_part name='part1'}
    {literal}
        <div class="{$class}">{$message}</div>
    {/literal}
{/define_part}

{* 部品を使用します *}
{part name='part1' class='info' message='メッセージ1'}
{part name='part1' class='error' message='メッセージ2'}


こんな感じの出力が得られます。
<div class="info">メッセージ1</div>
<div class="error">メッセージ2</div>


define_partで部品を定義し、partでそれを使用します。

定義時に変数が展開されてしまうのを防ぐため、define_part内はliteralで括っています。
partで指定された属性は、テンプレート変数に割り当てられます。

ソース(pluginsディレクトリに入れてください。)
function.part.php
<?php
function smarty_function_part($params,&$smarty) {
    require_once $smarty->_get_plugin_filepath('function', 'eval');

    $tmpl=$smarty->get_template_vars($params['name']);

    foreach($params as $k=>$v) {
        if($k=='name') continue;
        $smarty->assign($k,$v);
    }

    return smarty_function_eval(array('var'=>$tmpl) , $smarty);
}
?>

block.define_part.php
<?php
function smarty_block_define_part($params, $content, &$smarty, &$repeat) {
    if(isset($content)) {
        $smarty->assign($params['name'],$content);
    }
}
?>


#村ブロってファイル添付出来ないのかな?
イイ!と思ったら拍手をお願いします↓
1

明日は舞洲でカート

テーマ:
明日は1ヶ月ぶりに休みが取れそうです。

3連休なので舞洲のレンタルカートに遊びに行く予定です。

昔(福井に住んでいた頃)はサーキットやジムカーナ場に行って、スカイラインで走ってたのですが、
田辺に帰ってきてからはめっきり走りに行かなくなりました。

その代わりとして、最近始めたのがレンタルカートです。
高速代も安くなったので、生駒や舞洲のレンタルカートに行ってます。
カートと言ってもアドベンのゴーカートなんかとは別物で、
パワーもそれなりにあり、スピードも出るので走りがいがあります。

舞洲は規定タイムをクリアすると、よりハイパワーなカートに乗れるようになるシステムなので、
明日はそれを目標に走ってきます。
前回走った時は、規定タイムまで0.8秒ぐらいだったので、今回こそは!!!
1

コマンドラインからCD-R/DVD-Rの制御

テーマ:Windows
コマンドラインからCD-R/DVD-Rの制御

Windows SDK 付属の imapi2sample を使用すると
コマンドラインから DVD-R や CD-R の書き込みが出来るようになります。
今回は、imapi2sample をビルドするのに Visual Studio 2005 を使用しました。

まず、Windows SDK をダウンロードし、インストールします。
「for Windows Vista」となっていますが、Windows XP もサポートOS に含まれています。

Windows SDK for Windows Vista
http://www.microsoft.com/downloads/details.aspx?FamilyID=7614fe22-8a64-4dfb-aa0c-db53035f40a0&DisplayLang=ja


Windows SDK の インストールが完了したら、Visual Studio に統合します。
スタートメニューに「Windows SDK と Visual Studio 2005の統合」が追加されれているので、これを実行します。

imapi2sample が Windows SDK をインストールしたディレクトリの
Samples\WinBase\imapi に有るので、これを適当なディレクトリにコピーし
Visual Studio で開きます。

そのままだと進捗の表示が化けるので、次のように変更しビルドを行います。

(unidiff形式です。)

--- consoleUtil.cpp Thu Jan 15 17:52:48 1970
+++ consoleUtil.cpp Thu Jan 15 17:52:48 1970
@@ -36,20 +36,20 @@
 
     // NOTE: Overflow possibility exists for large numerators.
 
     percent = (Numerator * 100) / Denominator;
 
     // each block is 2%
     // ----=----1----=----2----=----3----=----4----=----5----=----6----=----7----=----8
     // ア.....................
 
     for (i=1; i<100; i+=2) {
         if (i < percent) {
-            putchar(178);
+            putchar('#');
         } else if (i == percent) {
-            putchar(177);
+            putchar('*');
         } else {
-            putchar(176);
+            putchar('-');
         }
     }
     printf(" %d%%", percent);
 }
--- Erase2Event.cpp Thu Jan 15 17:52:48 1970
+++ Erase2Event.cpp Thu Jan 15 17:52:48 1970
@@ -35,27 +35,27 @@
 
     // NOTE: Overflow possibility exists for large numerators.
 
     percent = (Numerator * 100) / Denominator;
 
     // each block is 2%
     // ----=----1----=----2----=----3----=----4----=----5----=----6----=----7----=----8
     // ア.....................
 
     for (i=1; i<100; i+=2) {
         if (i < percent) {
-            putchar(178);
+            putchar('#');
         } else if (i == percent) {
-            putchar(177);
+            putchar('*');
         } else {
-            putchar(176);
+            putchar('-');
         }
     }
     printf(" %d%%", percent);
 }
 
 STDMETHODIMP_(VOID) CTestErase2Event::Update(IDispatch* object, LONG elapsedTime, LONG totalTime)
 {
     UNREFERENCED_PARAMETER (object);
 
     DeleteCurrentLine2();
     UpdatePercentageDisplay2(elapsedTime, totalTime);


imapi2sample を実行するには IMAPIv2 が必要です。
Vista 以降で有れば標準で対応しているようですが、
XP の場合は別途マイクロソフトのサイトからダウンロードする必要があります。

Windows XP 用 Image Mastering API v2.0 (IMAPIv2.0) (KB932716)
http://www.microsoft.com/downloads/details.aspx?FamilyID=B5F726F1-4ACE-455D-BAD7-ABC4DD2F147B&displaylang=ja


以上で imapi2sample の用意が出来ました。

imapi2sample.exe -eject
imapi2sample.exe -inject

でトレイの開閉が出来ます。

imapi2sample.exe -erase

で CD-RW/DVD-RW の消去が出来ます。

imapi2sample.exe -write ディレクトリ

でディレクトリを書き込むことが出来ます。
0

twitterはじめました

テーマ:ブログ
twitterを初めてみました。

http://twitter.com/narrowband1919

twitterのブログパーツを貼ろうかと思ったんだけど、タグの制限で出来なかった。
残念。


TwitGIF(http://labs.creazy.net/twitgif/)を使ったらできた。
1
1  |  2  |  3  |  4  |  5    次>    

プロフィール

すかぽん

すかぽん

スカイラインとLinuxを愛するITベンチャー屋です。

FreeBSDでルータを作ったり、Windowsアプリを作ったりして糊口をしのいでいます。

最近の記事一覧

フリースペース

Twitter / narrowband1919
外部リンク


マリンテック いつもお世話になっている方の会社。世界中を飛び回っているようです。


紀州紅梅園 いつもお世話になっている梅干屋さん。


ふっくんのブログっぽいサイト 大学時代の同級生。


ハニリイト うちの会社です。

カレンダー

<<      2010年03月      >>
28 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 1 2 3

村ぶろランキング

村ぶろバナー

村ぶろ
体験入学