03.コードを書いてみよう (3)

では、プログラムソースを見ていきましょう。
まずはこのプログラムの一番最初に実行される、Form_Loadイベントからです。
Private Sub Form_Load()
    Set dgrCategoly.DataSource = Nothing      -----(1)
    With adoCategoly.Recordset                -----(2)
        .MoveFirst                            -----(3)
        While Not (.EOF)                      -----(4)
            lstCategoly.AddItem .Fields("CategolyID") & " " & .Fields("Categoly")  -----(5)
            .MoveNext                         -----(6
        Wend
        .MoveFirst
    End With
    Set dgrCategoly.DataSource = adoCategoly   -----*(1)
    dgrCategoly.Columns(0).Visible = False     -----(7)
    dgrCategoly_RowColChange 0, 0              -----(8)
End Sub
  1. Set dgrCategoly.DataSource = Nothing
    と、カテゴリー表示データグリッドのDataSourceを空っぽにして、
    Set dgrCategoly.DataSource = adoCategoly
    とadoCategolyをセットしています。これは後で説明する、dgrCategoly_RowColChange()でエラーが起こるの防ぐためです。
  2. ここからは下段カテゴリ選択コンボボックスの値をセットしています。
  3. .MoveFirst でレコードセットの最初の行が参照されます。
  4. EOF(EondOfFile)つまりレコードの終わりでない間続ける
  5. lstCategolyにアイテムを追加していますが、ここの.Fields("CategolyID")という呼び方は便利です。
    例えば、何らかの理由でテーブルの構成が変わってフィールドが増えたりした場合でもCategolyIDというフィールドが残っていれば、レコード内のCategolyIDフィールドの値を参照できるからです。
  6. .MoveNext は次のレコードを読むということです。
  7. グリッドの1列目「CategolyID」の列を不可視にしています。グリッドにはCategolyの列だけが表示されます。
  8. グリッドの1行1列目が押されたというイベントをわざと起こしています。

次はデータグリッドdgrCategolyが選択された時のイベントです
Private Sub dgrCategoly_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
    categolyID = adoCategoly.Recordset.Fields("categolyID")                       -----(1)
    adoPhotos.ConnectionString = adoCategoly.ConnectionString                     -----(2)
    adoPhotos.RecordSource = "select * from Photos where categoly=" & categolyID  -----(3)
    adoPhotos.Refresh                                                             -----(4)
    Set dgrPhotos.DataSource = adoPhotos.Recordset                                -----(5)
End Sub
  1. 変数categolyIDにadoCategoly(Categolyテーブル)のcategolyIDフィールドの値をセットしています。
    ここで、データグリッドdgrCategolyはadoCategolyに連動しているので、グリッドで選択された行とテーブルの行が一致していることになります。
  2. adoPhotosのConnectionStringにadoCategolygと同じもの、つまり「DSN=DbPhotos」をセット
  3. adoPhotosのRecordSourceに"select * from Photos where categoly="と変数categolyIDを連結したものをセット
  4. adoPhotos.Refreshで実際に変更が反映されます
  5. 中段のデータグリッドdgrPhotosのDataSourceをadoPhotos.Recordset(3.で指定した問合せ文)にしています。

さて、上の3."select..."という文字列が出てきましたが、これはSQLと呼ばれるものです。
SQLに関しての詳細は述べませんが、簡単に言うと、データベースに対しての問合せや何かの変更、挿入をするための標準的な言語のことです。
"select ..."は、テーブルからある条件で抽出する問合せ文です。ここでは、「Photoテーブルのcategolyカラムの値が変数CategolyIDと等しいレコードを抽出せよ」という命令文になっています。また、抽出結果は普通のテーブルと同じように扱うことができます。
5.の行の、adoPhotos.Recordsetは上記問合せ文の結果セットが入っていることになります。
この操作により、中段のデータグリッド(選択されたカテゴリーの一覧)が自動的に表示されることになります。


次は中段のデータグリッドdgrPhotosが選択された時のイベントです
Private Sub dgrPhotos_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
    Dim sep() As String
    categoly = adoPhotos.Recordset.Fields("Categoly")   -----(1)
    For i = 0 To lstCategoly.ListCount - 1              -----(2)
        sep = Split(lstCategoly.List(i), " ")           -----(3)
        If sep(0) = categoly Then
            lstCategoly.Text = lstCategoly.List(i)
            Exit For
        End If
    Next
End Sub
  1. ここからは、中段のデータグリッドdgrPhotosのある行が選択された時にフォーム下段、データ詳細エリアに表示する内容をセットする処理です。
    変数categolyに選択行のレコードのカラムCategolyの値をセットしています。
  2. ここからのForループは、コンボリストlstCategolyの選択行を現在のレコードのCategolyと同じものにするためのループです。
  3. Split関数は文字列の特定の文字で分割する便利な関数です。CSVなどのカンマ区切りテキストの読み込み処理などにも応用できます。

「確定」ボタンが押された時のイベントです
Private Sub cmdOK_Click()
    Dim sep() As String    
    sep = Split(lstCategoly.Text, " ")
    adoPhotos.Recordset.Fields("Categoly") = sep(0)
    adoPhotos.Recordset.Update                       -----(1)
    adoPhotos.Recordset.Requery                      -----(2)
End Sub
  1. Recordset.Updateを使ってレコードの更新を行います
  2. Recordset.RequeryでRecordsetを再読込します

「キャンセル」ボタンが押された時のイベントです
Private Sub cmdCancel_Click()
    adoPhotos.Recordset.CancelUpdate  -----(1)
    adoPhotos.Refresh
End Sub
  1. Recordset.CancelUpdateはレコードに対する変更の取り消しを行います

最後に「新規登録」ボタンのイベントです
Private Sub cmdNew_Click()
    CommonDialog1.FileName = ""                     -----(1)
    CommonDialog1.ShowOpen
    If CommonDialog1.FileName <> "" Then
        adoPhotos.Recordset.AddNew                  -----(2)
        adoPhotos.Recordset.Fields("Categoly") = 0  -----(3)
        adoPhotos.Recordset.Fields("FileName") = CommonDialog1.FileName
        adoPhotos.Recordset.Update                  -----(4)
        adoPhotos.Refresh
    End If
End Sub
  1. ダイアログボックスを表示して、JPGファイル名を取得します
  2. Recordset.AddNeweはテーブルに新規レコードを追加します
  3. 初期値をセットします
  4. Recordset.Updateで新規レコードの更新を行います

プログラムソースの内容は以上です。
全体的に、そう難しくはないと思いますが、一番のポイントは2つ目のADODCコントロール「adoPhotos」のレコードソースを、カテゴリの一覧から選択されたもので絞込みを行い、その都度表示しているという所です。
「SQL文」という言葉が出ましたが、SQL言語を使うことで上のように絞込み検索を行なうことができるほか、複数レコードの一括更新やテーブルの挿入、複数テーブルを連結して1テーブルのように見せるなど複雑な処理を簡単な命令で実現することができます。
ADODCコントロールを使ってプログラムを書くことで実用的なプログラムにすることができるのです。
今回の講座は長かったですが、色々な応用ができると思いますので是非モノにしてください。

戻る