2008年6月13日金曜日

[MySQL]--抽出テーブルに行番号を付ける

【目的】SELECTした抽出結果に、行番号のフィールドを付加する。


-----------------------------------------------------------
SET @i:=0;
SELECT @i:=@i+1 AS 'No',
clmA,
clmB,
clmC
FROM tblHoge
WHERE ・・・・・
------------------------------------------------------------



「SET」のクエリと、「SELECT」のクエリを流す形。
①先ず、「SET」で変数『@i』に'0'をセットする。
②「SELECT」で、変数『@i』のカラムを指定し、インクリメント(@i:=@i+1)するようにする。
 ただし、他のカラムは「*」では取得できないので、抽出したいフィールド名を指定する。

 
 
 

2008年5月21日水曜日

[vc2005] -- DataTable.Computeメソッドの利用。 (Sum()のみ)

 これ見るときは、下の『[vc2005] -- カラム名&型の設定』と併せるとちょっぴり幸せかも。

 以下のコードに登場する『dtSetTable』は、既に宣言されているDataTable。



// 総合計行追加DataRow dtTotalRow = dtSetTable.NewRow();
dtTotalRow[0] = "総合計"; // 名称
int k = 0;
foreach (DataColumn col in dtSetTable.Columns)   // 列数分、
{
    if (k != 0)
{
dtTotalRow[k] = dtSetTable.Compute("Sum(" + col.ColumnName + ")", null); // 集計。条件はなし
    }
k++;
}
dtSetTable.Rows.Add(dtTotalRow); // テーブルに総合計行を追加
 
 DataTable.Computeメソッドについて:
  細かい事(型の種類とか、条件の設定とか)はMSDNに記載されているので記載しない。
  自分が使ったとこだけメモ。

   DataTable.Compute("Sum(ColumnName)", filter)
   ↑これで、対象データをSumしてくれる。

   「filter」は「式で評価される行を制限するフィルタ」と、MSDNに書いてある。
   「filter」を指定しない場合は、「null」で動いた。(vb2005なら「Nothing」)。

   Sum()以外でも、Count()などのよく利用されるものは用意されている模様。
   ちなみに、文字列で指定しないといけない。(""で括る。)
   「filter」も、利用するときは文字列にしないといけない。

   そして、この集計関数を利用する場合は、DataColumn の型指定が正しくないとダメ。
   (intとか。stringぢゃ計算しちくりんばい)
   アタシも何度怒られたことか・・・VS2005に。
 
 
 

[vc2005] -- DataTableのカラム名&型設定。

 自分、VBに慣れ親しんできたんですが(といっても数ヶ月)、VCアプリの修正頼まれまして。。。
 同じ「.NET」利用でも、構文の書き方が若干違うので戸惑う。


【目的】作成した DataTable へ、新しいカラム(列)を追加する。
 以下のコードについて:
  自作関数にて取得した DataTable (コード内:dtGetData)から、新しい DataTable (コード内:dtSetTable )へデータをコピーすることが目的のコードの一部。
  上記にあたり、列名も同じくコピーしようってトコロ。

 ※コードに登場する Get_DataTbl() は自作関数。返り値はDataTable。
  ここではこの関数の詳細は記載しない。



DataTable dtGetData = new DataTable();
DataTable dtSetTable = new DataTable();

// DataTable 取得&保持。
dtGetData = Get_DataTbl();

// 列(名)設定。
dtSetTable.Columns.Add("年月"); // 一つ目のカラムを設定
foreach (DataColumn Col in dtGetData.Columns)
{
// ↓駄目なやり方。(最初にかいたコード)
//string strCol = Col.ToString();
//dtSetTable.Columns.Add(strCol);

// ↓MSDNに載っていた方法。
DataColumn dtCol = new DataColumn(Col.ColumnName); // 新しいDataColumnを作成し、カラム名を設定する
dtCol.DataType = System.Type.GetType("System.Int32"); // 作成したDataColumnの型を設定する
dtSetTable.Columns.Add(dtCol); // 作成したDataColumnを、テーブルに追加する
Console.WriteLine("[Debug--ColumnName]" + dtCol.ColumnName); // デバッグ出力(カラム名)
}



●補足
 「駄目なやり方」の方法だと、列名は設定できるけど、型の設定ができない。
 型の設定はなくてもいいときは、一応これでも動くことは動く。
 ※でも色々間違ってる。
  ・文字列型で宣言しているし、
  ・カラム名の取得を「.ToString()」で無理やりしてる。

 ただ、今回どうしても型を設定したかった。
 ここにコードは載せていないが、上記コードを含むプログラムで行っている内容が

  1.取得した DataTable『dtGetData』から、
   新しい DataTable 『dtSetTable』へデータをコピーする処理を12回繰り返し、
  2.dtSetTable に溜めたデータを列毎に集計して「総合計」として最終行に追加する。

 というもので、この集計の際に【DataTable.Compute メソッド】を使いたかったのよ。
 【.Compute メソッド】さん、便利関数。Sum() とかCount() とか Max() とか、手軽にやってくれる。
 あ、これもメモっとこう。次で。

[vb2005] -- 継承コントロールの作成_その3。 (利用)

 作成した自作コントロールを、実際に別のアプリで利用してみる。
 ※アタシは結構これに悩んで調べてわからなくて、
  試行錯誤の上やっと利用方法がわかったのでメモるのです。


 以下では、自作したコントロールのdllファイル名を、仮に『hoge.dll』とする。

①ファイル追加
1.新規に作成したプロジェクトの、ソースファイルディレクトリにビルドしてできた「hoge.dll」ファイルを入れる。
2.プロジェクトを開いてソリューションエクスプローラを確認すると、ディレクトリに追加した「hoge.dll」が表示される。
  アイコン(?)は点線な感じ。 この時点では、まだ「hoge.dll」を参照できていない。
  (ファイルはいるけど利用できない状態。)
3.ソリューションエクスプローラの「hoge.dll」にカーソルを当てて、右クリック。
4.メニューが表示されるので【プロジェクトに含める(J)】をクリック。
5.このプロジェクトに「hoge.dll」を追加完了。


②参照設定
1.ソリューションエクスプローラの【参照設定】にカーソルを当てて、右クリック。
2.メニューが表示されるので【参照の追加(R)】をクリック。
3.『参照の追加』が表示されるので、プロジェクトに含めた 「hoge.dll」を選択して[OK]を押す。
4.追加した「hoge.dll」を参照する設定完了。


③アイテムの追加
1.ツールボックスで右クリック。
2.メニューが表示されるので【アイテムの選択(I)】をクリック。
3.『ツールボックス アイテムの選択』が開くので、[参照(B)]を押す。
4.プロジェクトに含めた 「hoge.dll」を選択して[OK]を押す。
5.[OK]を押す。
6.hogeコントロールの追加完了。
  基底のコントロールと同じように利用できるようになる。


※注意
 もしかしたら、上記には無駄があるかもしれない。
 色々弄りながらやっと辿りついたもんで。。。
 でも、これ全部やって使えるようになったんだよね。

[vb2005] -- 継承コントロールの作成_その2。 (デバッグ)

 部品の動作を確認するためには、部品単体ではできない。
 このため、デバッグ用のプロジェクトを同じソリューション内に作成する必要がある。
 このデバッグ用プロジェクトのフォームへ作成した部品を貼り付けて、やっと動作確認できるようになる。


①デバッグ用プロジェクトの作成
1.ソリューションエクスプローラで「ソリューション’ソリューション名’」にカーソルを当てて、右クリックする。
2.メニューが表示されるので【追加 -> 新しいプロジェクト(N)】をクリックする。
  『新しいプロジェクトの追加』が表示される。
3.「Windows アプリケーション」を選択。
  プロジェクト名を入力して、[OK]を押す。
4.ソリューションエクスプローラにプロジェクトが追加され、このプロジェクトのフォームが表示される。


②デバッグ方法
1.表示されたフォーム(Form1)に、自作したコントロールを乗せる。
  自作したコントロールは、ツールボックスに表示されている。
  ※ ツールボックスに自作コントロールがない場合は、一度ビルドすればOK。
2.ビルドする。
3.あとはデバッグ用アプリを、好きにプログラムる。


●注意
 ビルドしたときに、ArgmentExceptionをスローする場合がある。
 この場合は、デバッグ用に作成したプロジェクトをスタートアッププロジェクトに設定すればOK。
 ※ 細かい理由は説明できない(勉強不足)。

○スタートアップ プロジェクトに設定方法
1.ソリューションエクスプローラで、デバッグ用に作成したプロジェクトにカーソルを当てて、右クリック。
2.メニューが表示されるので【スタートアップ プロジェクトに設定(A)】をクリックする。
3.ビルドしてみる。

2008年4月28日月曜日

[vb2005] -- 継承コントロールの作成_その1。(準備)


【目的】汎用的なコントロールの作成、利用。


01.『Windowsコントロールライブラリ』で新規作成する。
02.『UserControl1』が作成されるので、「コードを表示」する。
03.コードは以下のようになっている

Public Class UserControl1

End Class

04.下記のように継承コードを一文追加する。
  (下記はラベルコントロールの継承)

Public Class UserControl1
Inherits System.Windows.Forms.Label ' ← Inherits = 継承

End Class

05.すると、「System.Windows.Forms.Label」の下に警告の波線が表示される。
06.この一文にカーソルを当てると、赤丸感嘆符と以下のようなメッセージが表示される。

 「クラス 'UserControl1' に指定された基本クラス 'System.Windows.Forms.Label' は、
  その他の partial 型の 1 つである基本クラス 'System.Windows.Forms.UserControl' と
  異なることはできません。」

07.このエラーを解消するために、赤丸感嘆符にカーソルを当ててクリックする。
08.以下の選択肢がリンクで表示される。

 ・System.Windows.Forms.Label から継承するために UserControl1 を変更します。
 ・System.Windows.Forms.UserControl から継承するために UserControl を変更します。

09.「System.Windows.Forms.Label から継承するために UserControl1 を変更します。」をクリックする。
10.すると、エラー一覧に次のエラーが表示される。

説明    :'AutoScaleMode' は 'ソリューション名.UserControl1' のメンバではありません。
ファイル  :UserControl1.Designer.vb
行     :26
列     :9
プロジェクト:(プロジェクト名)

11.このエラーをダブルクリックする。
12.エラーの箇所がエディタに表示される。
  このエラーは『UserControl1.Designer.vb』にあるので、このファイルが開く。
13.すると、26行目の「Me.AutoScaleMode」の下に警告の波線が表示されている。
14.この一文をコメントアウト、もしくは削除する。
15.「UserControl1.Designer.vb」を保存して、閉じる。
16.これで準備完了。後は好きにプログラムる。


※ 「10」のエラーや「05」のエラーの理由。
   プロジェクト作成すると、最初は「System.Windows.Forms.UserControl」を
  継承して作成されており、自動生成されるデザイン定義ファイル「~.Designer.vb」
  も最初は「Inherits System.Windows.Forms.UserControl」と記載されている。
  併せて、System.Windows.Forms.UserControlのプロパティ設定が記載されている。
   今回のエラーは「~.Designer.vb」に記載されていたUserControlのプロパティである
  「Me.AutoScaleMode」が、「System.Windows.Forms.Label 」に互換しない
  (Label のプロパティでない)ために起こった。

   「~.Designer.vb」ファイルは、「「Inherits ・・・」の部分を修正してくれても、
  このプロパティのところは自動修正できないらしい。。。

2008年4月23日水曜日

[vb2005] -- MDBのテーブルから主キー情報を取得する。

    
Dim OleDbCn As New OleDbConnection() '○ OLEDBのクラスインスタンス
Dim SchemaTbl As DataTable ' 取得情報保持用データテーブル
    ' 接続先DB
Dim strDtSrc As String
strDtSrc = "PROVIDER=Microsoft.jet.OLEDB.4.0;" & _
"DATA SOURCE=./XXX.mdb;"
    ' 対象テーブル
Dim strTblName As String
strTblName = "TBL_SAKURA"
    Try
OleDbCn.ConnectionString = strDtSrc
OleDbCn.Open()
        SchemaTbl = OleDbCn.GetOleDbSchemaTbl( & _
OleDbSchemaGuid.Primary_Keys, _
New Object() { Nothing, Nothing, strTblName } )
        ' ItemArray は配列で全ての値を取得する。ので、
' この配列分 For文をループさせている
For i As Integer = 0 To SchemaTbl.Rows(0).ItemArray.Length - 1
' 全ての配列の値を、出力
Debug.WriteLine( SchemaTbl.Rows(0).Item(i).ToString() )
Next i
        ' 主キーが存在すれば、行を取得する ( Rows.Count は "1" 以上 ) 
If SchemaTbl.Rows.Count > 0 Then
'----Debug---------------------
Debug.WriteLine( "主キーを発見。" )
Debug.WriteLine( "項目名:" & SchemaTbl.Rows(0).Item(3).ToString() )
'------------------------------
Else
'----Debug---------------------
Debug.WriteLine( "主キーは見つかりません。" )
'------------------------------
End If

Catch ex As Exception
MessageBox.Show(ex.Message, "エラー:SchemaCheck")
Finally
'○ DB閉鎖
If OleDbCn.State = ConnectionState.Open Then
OleDbCn.Close()
End If
End Try

整理は後程。ひとまずメモる。