目次
クエリの原則
こんにちは。伊川(@naonaoke)です。
今回は、クエリについて説明します。
何度かクエリは解説していますが、実際にサンプルをお見せしていません。
今日は実務で利用できる方法について紹介します。
問題提起
(株)IKAWAの阿久 世子男(アク セスオ)は同僚から下記の質問を受けました。
クエリってなに?
どのように解説したらいいだろうか?
解決策
テーブルに入ったデータを変幻自在の形にするのがクエリと回答する。
クエリの解説
クエリの解説 作成手順その1 データベースを確認
上の図のようなデータベースがあるとします。
Now関数で表示できます。
しかし、なぜこんな面倒なことをするのでしょうか?
そもそも、時間までなんて必要ありません。
Year関数 Month関数 Day関数 Hour関数 Minute関数 Second関数がなぜあるのかを考えましょう。
システムを作成する側から考えると、Now関数で、すべての時間帯をデータベースに格納します。
そうすることで、日時、時間の対してのエンドユーザーの要望は、すべてつぶすことができます。
クエリの解説 作成手順その2 クエリ作成
Now関数によって格納されたデータは、上の図のように、どのような姿にも変化させることができるのです。
これが、クエリの凄いところなのです。
なせ、Year関数 Month関数 Day関数 Hour関数 Minute関数 Second関数があるのか理解できましたか?
Year関数 Month関数 Day関数 Hour関数 Minute関数 Second関数は、ユーザーの要望ではありません。
システム作成側が、後々の面倒を回避するために、作成した関数です。
そうすると、Left関数 Right関数 Mid関数も、勉強を始めたときは、さほど重要とは思いませんでした。
しかし、文字列を操作する場合に、ユーザーから要望が出そうな関数を、開発側があらかじめ用意したと思われます。
この用にクエリを作成しますが、もうひとつACCESSには強みがあります。
上の文章をSQL文といいます。
この文章で、クエリを作成しています。
この文章を自由自在に書くことができれば、一生、お金に困ることはないと思います。
そして、SQL文は、他のシステムでも共通の言語です。
そのSQL文を、一瞬で記載するACCESSは本当に凄いシステムなのです。
クエリの解説 作成手順その3 ACCESSでクエリを作成前に、Excelで作成する
ACCESSと同じデータベースがあります。
ACCESSを利用するときは、普通は、CSVファイルなどで、一括で貼り付けることが多いと思います。
その場合を想定して、ACCESSに転送する前にデータを変形することで、労働時間を短縮できます。
ACCESSにも転送されました。
Sub 日時変換() Dim i As Long maxrow = Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To maxrow Cells(i, 3) = Year(Cells(i, 2)) & "年" Cells(i, 4) = Month(Cells(i, 2)) & "月" Cells(i, 5) = Day(Cells(i, 2)) & "日" Cells(i, 6) = Hour(Cells(i, 2)) & "時" Cells(i, 7) = Minute(Cells(i, 2)) & "分" Cells(i, 8) = Second(Cells(i, 2)) & "秒" Cells(i, 9) = Format(Cells(i, 2), "yyyy/mm/dd") Cells(i, 10) = Format(Cells(i, 2), "ggge\年mm\月dd\日") Next i Dim con As New ADODB.Connection Dim rs As New ADODB.Recordset Dim conStr As String Dim j As Long conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.Path & "\クエリ.accdb" con.Open ConnectionString:=conStr rs.Open Source:="MT_クエリ", ActiveConnection:=con, _ CursorType:=adOpenKeyset, LockType:=adLockOptimistic j = 2 With rs Do Until Cells(j, 1) = "" .AddNew .Fields("日時").Value = Cells(j, 2) .Fields("年").Value = Cells(j, 3) .Fields("月").Value = Cells(j, 4) .Fields("日").Value = Cells(j, 5) .Fields("時").Value = Cells(j, 6) .Fields("分").Value = Cells(j, 7) .Fields("秒").Value = Cells(j, 8) .Fields("西暦").Value = Cells(j, 9) .Fields("和暦").Value = Cells(j, 10) .Update j = j + 1 Loop rs.Close con.Close End With MsgBox "転送完了" End Sub
ここがポイント
ACCESSは、255までフィールドを設定できます。その中に、必要と思われるデータを格納しておけば、クエリで抽出できないデータはありません。ACCESSでは、VBAも重要ですが、クエリのほうがもっと重要なのです。
まとめ
今回の説明で、同僚も、クエリを理解してくれたようです。
今回のサンプルファイルは、No81です。
わからない事を延々と考えるのは、無駄です。
- なんで作動かないの?
- もうやだ!VBAなんか嫌い!
- ネットで調べても情報がない!
必ず作動するコードが、ここにあります。