充実した時間を過ごすには

2021の目標は?

気が付けば1月も半分過ぎてしまいました。今年も何か目標を立ててみたいと思います。

f:id:HiroCom777:20210123132006j:plain
ちなみに去年立てた目標がこれ。
hirocom777.hatenadiary.org
この目標は結構気に入っています。真面目な話大当たりでした。おかげで結構時間が作れて余裕も出来ました。まぁ、コロナのおかげでラッキーだったという面もあるのですが、準備しているといいことが有るものです。

この目標の良いところは、簡単な行動で達成感を享受できることにあると思います。目標の設定が緩い(低いではない)ので・・・ちょっと行動してみる⇒少しだけだけど結果が出る⇒ちょっとやる気出てくる⇒ちょっと行動してみる・・・の連鎖ですね。疲れたら休んで、いいころ合いで再開すればいいのですよ。

それにちょっと味を占めたので、今年も同じような目標を立ててみようと思います。つまり、今年こそ何々するぞ!!』『今年は何々を目指すぞ!!』的なものではないやつ・・・方向性を示すって感じですか。今年の目標は『充実した時間を過ごす』にしたいと思います。いくら時間が出来たとはいっても、つまらない時間を過ごしてしまえば無駄なことなのです。『充実した時間』ですから、必ずしも色々なことに手を出して活動しまくるだけではありません。ひなが一日のんびりしても、遊び惚けていても、自分が充実していると実感するのであれば全然OK!!

で、充実した時間を過ごすにはどうしたらいいのでしょうか?ちょっと考えてみました。

健康

 これが第一優先。これなしに充実した時間を過ごすことは考えられません。時間があるわけですから、規則正しい生活、食事、適度な運動を習慣づけたいと思います。

身の回りの整理

 まだまだ身の回りに無駄なものが多いので。掃除に割り当てられる時間も増えたのでここは頑張りたいと思います。

予測して行動する

 去年出来ていなかった事がこれ。同じような目標を立てていたのですが、殆んど達成できなかった。去年の目標(時間を作る)を達成できたのは運がよかった点が大きかったと思うのです。また、事前に準備をする習慣をつけたいと思います。

仕事を見直す

 最近自分でコントロールできる仕事が増え来たんで助かってるんです。今までの努力のたまものかな?さらに見直していきたいと思います。

プログラミング

 今年もこれは頑張ります!!

自分と向き合う

 そもそも自分にとって、どんなことをしたときに充実感を感じるのでしょうか?そこが判っていなければ充実した時間なんぞ過ごせないですよね。就寝前に一日の振り返りの時間を設けるのはいいかもしれません。

いい年にしていこう!!

今年に入って僕の仕事も半分近くがリモートワークになりました。今度は本格的。職場の端末に家からアクセスして業務をこなせます。ほとんどストレスフリー。通勤時間って本当に無駄だったと実感しています。今まで本を読んだり、Webをチェックしたり、SNS書き込んだりと通勤電車の中で頑張って活動してきたのですが、通勤自体が無い方がもっと時間を有効に使えるということが判りました。これを機会に時間の使い方を大きく見直していこうと思います。

こんなに大きな変化が世の中に起こることは、そうそうないでしょ?だったらいい機会だと思って楽しく過ごさなきゃ!!

と、言う訳で最後までお付き合いいただいてありがとうございました。遅ればせながら、今年もよろしくお願いします!!

SDカードとはなにか(Arduino詳解)

Arduino詳解その27です。前回の記事はこちらです。

hirocom777.hatenadiary.org

そもそもSDカードとは

 前回はArduinoUNOでSDカードを使用するために必要なSDカードシールドをご紹介しました。また、簡単な動作確認もしてみました。これから本格的に使い方に取り組みたいと思うのですが、その前にSDカードについて明らかにしていこうと思います。なんとなく便利に使っているけれど、意外と何も知りませんよね。 

f:id:HiroCom777:20210116150318j:plain

以下のサイトなんか見ると詳しいですね
www.elecom.co.jp

SDカード(SDメモリーカード)とは、1999年に開発、発表された、フラッシュメモリを使用した記録媒体です。デジタルカメラ、携帯電話、スマートフォンなどに使用されているのはご存じだと思います。現在一般的に使用されているものに、形状の違いによってSDカード(約32×24mm)とmicroSDカード(約15×11mm)の2種類があります。この連載で使用するものはmicroSDカードです。

フラッシュメモリと不揮発性メモリ

詳細については上記サイトに譲りますが、押さえておかなければならないのは使用するにあたっての特徴と注意点です。SDカードはフラッシュメモリを使用しています。フラッシュメモリとは半導体の一種でデータを記録することが出来ます。通常のPCなどに使用されているメモリは以下の2種類があります。

・ROM(Read Only Memory)
 データ読み出し専用のメモリです。通電を解除しても最初に記録した内容を失うことはないため、PCなどでは起動時に最初に読み込む内容を記録したりします。特別な条件(設備など)が無いとデータを書き込むことはできません。

・RAM(Random Access Memory)
 データの読み書きが可能なメモリです。ROMと違ってデータの書き換えが可能なメモリです。PCなどでは、呼び出したプログラムを配置したりデータを記録したりする用途に使用されます。通電を解除すると記録した内容は失われてしまいます。

それぞれ長所、短所があるのですが、上記の問題をある程度克服したものに不揮発性メモリがあります。不揮発性メモリは、通電を解除しても記録内容を失うことが無く、書き換えも可能です。不揮発性メモリとして代表的なものがEEPROM。EEPROM・・・そういえば本連載でも出てきました。
hirocom777.hatenadiary.org
そう、ArduinoUNOにもEEPROMが搭載されています。設定なんかを記憶しておく場合に使うんでした。

EEPROMの弱点

読み書き可能で電源を切っても消えない・・・EEPROM最高!!ってなりそうなのですが、EEPROMにも弱点があるのです。

・書込み回数に限度がある
 書込み回数に限度があって、大体10万回程度って言われています。コンピューターの世界での10万回は、そんなにすごい数値ではないです。ちょっとしたプログラムを走らせると、すぐに到達してしまいます。頻繁に書き換える内容についてはRAMに軍配が上がります。

・書き込み時間がかかる
 RAMよりも書き込みに時間がかかります。高速なプログラムを走らせるうえで、これは致命的ですね。

以上の弱点については、以下の記事でも言及しています。
hirocom777.hatenadiary.org
また、最近ではROMの部分をEEPROM(フラッシュメモリ)がとってかわる傾向にあります。

それではフラッシュメモリとは

 それではフラッシュメモリとは何なんでしょうか?フラッシュメモリの中身も基本的にはEEPROMです。データを扱う単位や、構造に工夫を凝らすことで大きな記憶容量を実現しています。大容量を実現したため、USBメモリSSD、そしてSDカードが実現しました。中身は基本的にEEPROMですので、先に述べた弱点も同じように持っています。SDカードも同じです。

本格的に使ってみる

 いかがでしたか?SDカードの特徴、注意点はEEPROM、フラッシュメモリのそれなんですね。ここら辺を理解したところで、次回から本格的に使ってみたいと思います。まずはファイルを作って書き込んでみましょう。お楽しみに!!
hirocom777.hatenadiary.org


Arduino UNO入門の連載記事はコチラからどうぞ!!

Accessファイル確認ツール③(ExcelでRDBその15)

ExcelRDB(リレーショナルデータベース)を操作してみようという連載のその15です。前回の記事はこちらです。
hirocom777.hatenadiary.org

改善点がある!!

 Accessファイル確認ツールに取り組んでいます。前回は、選択したテーブルのカラム情報表示に対応しました。データ型と、キーの設定情報を表示できます。これで結構便利に使えるんじゃないですか?でも、よくよく見るとまだ改善点がありますよね。今回はそこらへんを見直してみようと思います。今回の内容を適用したツールを以下に置いておきますので興味のある方はダウンロードしてみてください。

15_Accessファイル確認ツール③.zip - Google ドライブ

カラム情報の表示を表示を見やすくしたい

 カラム情報の表示はできたのですが、データ型も、キーの設定情報も数値の表記も数値による表記だけ。データ型名やキーの種類で表記すると親切です。これは簡単にできると思います。

カラム名表示の順番が・・・

 試しに使ってみて気が付いたのですが、カラムリストの表示順番がなんだかおかしい・・・。テーブルボタンを押してExcelシートに展開すると正しく左から表示されるのに、カラムリストの表示では違った順番で表示されます。この違いはどうやらADOで処理したか、ADOXで処理したかの違いの様です。ADOでは正しい順番(?)でカラム名を取得できるのですが、ADOXではカラム名を昇順にソートして返しているようです(何故!!)。そういわれてみれば、テーブル名も昇順にソートされているようです。
 テーブルリストは(ADOXでしか取得できないので)ともかく、カラムリストの順番は何とかしたいです。

数字からキー情報やデータ型名を返す

 まず、数字からキー情報やデータ型名を返す関数を作りましょう。まずはキー情報から・・・

'番号からキーの種類を返します
Private Function GetKeyInfo(keyNumber As Long) As String
  Select Case keyNumber
  Case 0: GetKeyInfo = ""
  Case adKeyPrimary: GetKeyInfo = "主キー"
  Case adKeyForeign: GetKeyInfo = "外部キー"
  Case adKeyUnique: GetKeyInfo = "キー"
  Case Else: GetKeyInfo = "???"
  End Select
End Function

こんな感じです。簡単ですね。adKeyPrimary,GetKeyInfo,adKeyUniqueはキーの種類を表す定数です。以下で説明しています。
hirocom777.hatenadiary.org
お次はデータ型の変換です。

'番号からデータ型の種類を返します
Private Function GetDataInfo(DataNumber As Long) As String
  Select Case DataNumber
  Case adVarWChar: GetDataInfo = "テキスト"
  Case adLongVarWChar: GetDataInfo = "メモ"
  Case adSmallInt: GetDataInfo "整数型"
  Case adInteger: GetDataInfo = "長整数型"
  Case adSingle: GetDataInfo = "単精度浮動小数点"
  Case adDouble: GetDataInfo = "倍精度浮動小数点"
  Case adDate: GetDataInfo = "日付"
  Case adDBTimeStamp: GetDataInfo = "日付/時刻"
  Case Else: GetDataInfo = "???"
  End Select
End Function

 adVarWCharなどは、データ型名を表す定数です。データ型はもっと沢山の型が存在するのですが、とりあえず上記を抑えておけばいいと思います。数字で表記しているところを、これらの関数で置き換えて表記すればいいでしょう。

カラム名の表示をADOで取得する

 カラム名表示の順番を修正する件ですが、ADOを使って取得すればいいですね。そこで、カラムリストを表示するDispColumnListプロシージャを以下の様に書き換えてみました。

'カラムリストを表示します
Private Sub DispColumnList(fileName As String, tableName As String)
Dim connectString As String
Dim catalogObject As Object
Dim columnObject As Object
Dim keyObject As Object
Dim db As clsAccessDbase
Dim columnName As Variant
Dim listRange As Range
Dim i As Long

  '表示がある場合にはクリアします
  If Me.Range("I10").Value <> "" Then
    Range(Me.Range("F10"), Me.Range("I10").SpecialCells(xlLastCell)).ClearContents
    Me.Range("A10").Activate
  End If
  
  'データベースに接続します(ADO)
  Set db = New clsAccessDbase
  db.dbFileName = Me.Range("FileName").Text
  db.dbTableName = Me.Range("TableName").Text
  Set listRange = Me.Range("columnList").Offset(1, 0)
  'カラム名を表示します
  For Each columnName In db.dbFieldList
    listRange.Offset(i, 0) = columnName
    listRange.Offset(i, -3) = i + 1
    i = i + 1
  Next
  Set db = Nothing
  Set listRange = Range(listRange, listRange.Offset(i, 0))
  
  'データベースを接続します(ADOX)
  Set catalogObject = CreateObject("ADOX.Catalog")
  connectString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & fileName
  catalogObject.ActiveConnection = connectString
  'データ型を表示します
  For Each columnObject In catalogObject.Tables(tableName).Columns
    listRange.Find(columnObject.Name, , , xlWhole).Offset(0, -1).Value = GetDataInfo(columnObject.Type)
  Next
  
  'キー情報を表示します
  For Each keyObject In catalogObject.Tables(tableName).Keys
    For Each columnObject In keyObject.Columns
      listRange.Find(columnObject.Name, , , xlWhole).Offset(0, -2).Value = GetKeyInfo(keyObject.Type)
    Next
  Next
End Sub

まずはADOでAccessファイルに接続できるクラスを使用して、指定したテーブルのカラム名リストを取得します。お次にADOXを使用してカラム名に対応したデータ型名とキー情報を取得します。取得した値は前項で作成した関数で表記を変換して表示しています。これでカラム名表示の順番が揃うはずです。

それでは、改定したツールを実行してみると・・・
f:id:HiroCom777:20210110130926j:plain
カラム情報の表示ばっちりです。カラム名表示の順番もちゃんと修正されています。

実はまだ問題点が・・・

 大分進歩が見られたたと思うのですが、実を言うと未だ問題点があるのです(泣)。Excelシートへの展開機能がまだまだなんです。次回はそこに焦点を当てていきたいと思います。お楽しみに!!
hirocom777.hatenadiary.org


ExcelVBAでAccessファイルを操作する連載はコチラから

Accessファイル確認ツール②(ExcelでRDBその14)

ExcelRDB(リレーショナルデータベース)を操作してみようという連載のその14です。前回の記事はこちらです。
hirocom777.hatenadiary.org

カラム情報の表示

 前回はからAccessファイル確認ツールに取り組んでいます。Accessファイルを指定して開くとテーブルのリストが確認できます。さらに、選択したテーブルの内容をExcelファイルのシートに展開できます。今回は選択されたテーブルのカラム情報表示について機能追加してみようと思います。仕様は以下になります。

・選択テーブルでテーブルを選択すると、選択されたテーブルのカラムリストが表示される。
・併せて、各カラムのキー設定、データ型設定が表示される。

この内容で、以下のツールを用意してみました。
14_Accessファイル確認ツール②.zip - Google ドライブ
f:id:HiroCom777:20210104231100j:plain

機能の説明

 操作方法については基本的に前回と一緒です。Accessファイルを指定すると指定ファイルのテーブルリストが表示されます。選択テーブルのドロップダウンリストでテーブルを選択すると該当テーブルを構成するカラムリストが表示されます。カラム名以外にも以下の情報が表示されます。
・キー
 カラムにキーが設定されている場合は、キーの情報が表示されます。1が主キー、2が外部キー、3がキーとなります。
docs.microsoft.com

・データ型
 カラムに設定されているデータ型を表示されます。数値で表示されるのですが、詳細は以下を参考にしてください。
docs.microsoft.com
代表してよく出てくる値は、3  整数型(adInteger)、7 日付型 (adDate)、202 文字列型(adVarWChar)、203 長文字列型(adLongVarWChar)くらいだと思います。

コードの解説

 コードの解説です。今回は一つのツールということで結構長くなってしまいましたので要点だけ説明します。何れも今までの連載で取り上げた手法を使用しています。全体の動作は、ツールを動かしてみて確認してみてください。

・テーブルリストの表示
 テーブルリストの表示です。

Private Sub DispTableList(fileName As String)
Dim connectString As String
Dim catalogObject As Object
Dim tableObject As Object
Dim listRange As Range
Dim i As Long
  'データベースを接続します
  Set catalogObject = CreateObject("ADOX.Catalog")
  connectString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & fileName
  catalogObject.ActiveConnection = connectString
  'テーブルリストを表示します
  Set listRange = Me.Range("TableList").Offset(1, 0)
  For Each tableObject In catalogObject.Tables
    If tableObject.Type = "TABLE" Then
      listRange.Offset(i, 0) = tableObject.Name
      listRange.Offset(i, -1) = i + 1
      i = i + 1
    End If
  Next
  Me.Range("TableName").Value = Me.Range("B10").Value
End Sub

 ADOXで作成したcatalogObject にAccessファイルを指定して開いたのちに、テーブルの一覧を取得して表示しています。この時表示されるのは、tableObject.Type = "TABLE"のものだけ。つまりデータベース本体として使用しているテーブルのみです。また、一緒に左側に通し番号を表示しています。最後に表示したテーブルリストの先頭を選択テーブルに表示しています。

・カラムリストの表示
 カラムリストの表示です。

Private Sub DispColumnList(fileName As String, tableName As String)
Dim connectString As String
Dim catalogObject As Object
Dim tableObject As Object
Dim columnObject As Object
Dim keyObject As Object
Dim listRange As Range
Dim i As Long

  '表示がある場合にはクリアします
  If Me.Range("I10").Value <> "" Then
    Range(Me.Range("F10"), Me.Range("I10").SpecialCells(xlLastCell)).ClearContents
    Me.Range("A10").Activate
  End If
  'データベースを接続します
  Set catalogObject = CreateObject("ADOX.Catalog")
  connectString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & fileName
  catalogObject.ActiveConnection = connectString
  'カラムリストを表示します
  Set listRange = Me.Range("columnList").Offset(1, 0)
  For Each columnObject In catalogObject.Tables(tableName).Columns
    listRange.Offset(i, 0) = columnObject.Name
    listRange.Offset(i, -1) = columnObject.Type
    listRange.Offset(i, -3) = i + 1
    i = i + 1
  Next
  'キーを表示します
  Set listRange = Range(listRange, listRange.Offset(i, 0))
  For Each keyObject In catalogObject.Tables(tableName).Keys
    For Each columnObject In keyObject.Columns
      listRange.Find(columnObject.Name, , , xlWhole).Offset(0, -2).Value = keyObject.Type
    Next
  Next
End Sub

 カラムリストの表示はテーブルリストと違って、ファイルを選択した後に表示を切り替えられることがあります。そこで、先頭で既に表示がある場合に表示をクリアする処理をしています。その後、ADOXで作成したcatalogObject にAccessファイルを指定して開き、指定されたテーブルを選択してカラムリストを取り出しています。また、一緒に通し番号とデータ型を表示しています。
 キー情報については、カラムリストを表示し終わった後に選択したテーブルのkeysコレクションからカラム名をキーにして読込、設定しています。
 また、先に述べた通りこの処理は選択テーブルの表示が切り替わった際に実行されるようになっています。以下の処理で呼び出されます。

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = Me.Range("TableName").Address And Target.Text <> "" Then
    DispColumnList Me.Range("FileName").Text, Me.Range("TableName").Text
  End If
End Sub

もう少し機能追加してみようか

 次回も、もう少し機能追加できたらなって考えています。あと何点か改善点もありそうなので、其方も検討してみます。お楽しみに!!
hirocom777.hatenadiary.org


ExcelVBAでAccessファイルを操作する連載はコチラから

Accessファイル確認ツール①(ExcelでRDBその13)

ExcelRDB(リレーショナルデータベース)を操作してみようという連載のその13です。前回の記事はこちらです。
hirocom777.hatenadiary.org

Accessファイル確認ツール

 今回から、Accessファイル確認ツールに取り組もうと思います。前回のおさらいですが、仕様は以下の様になります。

Accessファイルを指定すると読み込んで、テーブルの一覧をリスト表示してくれる。
・リストの中からテーブルを選択すると、テーブルの情報(レコード数、カラムの構成、キ―の設定、インデックスの設定など)が表示される。
・指定したテーブルを開いてExcelファイルの形で表示することが出来る。

この仕様をもとにツールを作っていきたいと思います。
f:id:HiroCom777:20201230223326j:plain

まずはファイル読み込みとテーブル一覧の表示

 今回は、ファイル読み込みとテーブルの表示について取り組んでいきます。動きとしては以下の様になります。

・ダイアログボックスを使用してファイルを指定する
・指定されたファイルのテーブル一覧が表示される
・テーブル一覧からテーブルを選択して実行すると新しいExcelファイルのシートにテーブルの内容を表示される

この内容で、以下のツールを用意してみました
13_Accessファイル確認ツール.zip - Google ドライブ

使い方

 使い方は次の様になります。上記ファイルをダウンロードして解凍するとAccessViewer???.xlsm(?はバージョンナンバー)が現れます。

・マクロを有効にした状態でAccessViewer???.xlsmを開きます
・ファイル指定のボタンを押すとファイルを開くダイアログボックスが表示されるので、拡張子が.accdbのファイルを選択します。
・ファイル名欄に選択されたファイルがフルパスで表示されます。テーブルリスト欄には、選択したファイル内のテーブル名リストが表示されます。
・選択テーブル欄はプルダウンリストになっています。テーブルリストに表示されているテーブル名のうち一つを選択できます。
・選択テーブル欄でテーブルが選択された状態でテーブルボタンを押すと、選択されたテーブルの内容が新しく開かれたExcelファイルのシートに展開されます。

 如何でしょうか?これでAccessファイルファイルの内容を手軽に確認できると思います。ファイルを選択された際に表示されるテーブルは、データベースとして使用されているテーブルのみです。Accessファイル内の管理用テーブルは表示されません。

 このツールではテーブル名の一覧を取得するためにADOXを使用しています。また、テーブル内容を表示させるのにはADOと以下でご紹介したクラスモジュールを使用しています。

hirocom777.hatenadiary.org

 やはりAccessファイルを自在に操るにはADOとADOX両方が必要なようです。

カラム情報の表示

 次回は今回のツールにカラム情報の表示を追加してみたいと思います。お楽しみに!!
hirocom777.hatenadiary.org

ExcelVBAでAccessファイルを操作する連載はコチラから

ツールを作ってみたい(ExcelでRDBその12)

ExcelRDB(リレーショナルデータベース)を操作してみようという連載のその12です。前回の記事はこちらです。
hirocom777.hatenadiary.org

ツールを作ってみよう

 前回までで、やってきたことを整理すると以下の様になります。
・ExcelVBAでAccessファイルを作る。
・読み書きできるようにする。
・簡単なデータベースを作る。
・関連性とキーについて学習する。
・初歩的なSQLについて学習かる。
となります。こうして見ると、ずいぶん進んできたみたいです。
f:id:HiroCom777:20201220165411j:plain
ここまできて、次は何をやろうかと考えたのですが、まず学習する環境を良くしていくべきだと思うのです。データベースの学習を続けていくとき、面倒なのが・・・

・何かしら実行した結果がどうなっているかの確認。
・データベースファイルの作成、設定。

なのです。そこで、以下のツールが欲しいかなと思うのです。

Accessファイルの内容を確認できるツール
 Accessファイルを指定すると、ファイル内を確認できるツールが欲しいです。テーブルの数、テーブル内のカラムの構成、キー(主キー)の設定、テーブルの関連性、インデックスの状態の設定などが確認できると便利です。

Accessファイルを作成、内容を修正するツール 
 Accessファイルの新規作成から、テーブルの追加削除、カラムの設定と追加削除、関連性の設定、インデックスの設定などを実行できるツールです。ファイルの設定を色々操作して動作確認したいのです。

・データ入力を簡単にできるツール
 ファイルを指定して開くとデータ入力フォームが現れて、簡単にデータに追加や削除が出来たり他のフォーマット(ExcelCSV)へのデータ変換や、データ取り込みなどが出来るツール。確認用データを作るのも結構骨が折れるので。

今まで学習してきたことを確認するとできそうな気がしてきました。最終的には一つのツールで全部できるとありがたいのですが、さすがにそれは厳しいと思います。まずは別々に作ってみようと思います。

AccessファイルとSQLを設定すると結果を表示してくれるツール
 上とは別にSQLを勉強できるツールを作れないかなって秘かに考えています。SQL BOLTというWebサイトがありまして、
sqlbolt.com
これ、結構勉強になるんですよね。データベースの例が出てきてSQL文を入力して問題を解くという形式になっています。自分で作ったデータベースでこれを出来ると面白いかなって考えているんです。

まずはファイル確認ツールから

 まずはAccessファイルの確認ツールから作っていきましょう。仕様はこんな感じでどうでしょうか

Accessファイルを指定すると読み込んで、テーブルの一覧をリスト表示してくれる。
・リストの中からテーブルを選択すると、テーブルの情報(レコード数、カラムの構成、キ―の設定、インデックスの設定など)が表示される。
・指定したテーブルを開いてExcelファイルの形で表示することが出来る。

大部分は、今まで学習してきたことで出来そうです。ツール名はそうですねぇ、シンプルに"AccessViewer"としたいと思います。

Accessファイル確認ツールを作る

 それでは次回からAccessファイル確認ツール"AccessViewer"に取り組んでいきたいと思います。お楽しみに!!
hirocom777.hatenadiary.org

ExcelVBAでAccessファイルを操作する連載はコチラから

SQLをもうちょっと(ExcelでRDBその11)

ExcelRDB(リレーショナルデータベース)を操作してみようという連載のその11です。前回の記事はこちらです。
hirocom777.hatenadiary.org

SQLをもうちょっと

 前回は、2つのテーブルからデータを抽出するSQLのJOINについてご紹介しました。で、今回はというと前回の記事をまとめている際に気が付いたり、これは大切だなって思ったところをまとめておきたいと思います。以下の記事で使用したソースコードSQL文の部分をこれからご紹介するように書き換えて実行してみましょう。
その9:関連性で何が出来るのか

f:id:HiroCom777:20201214223329j:plain

計算もしてくれませんか?

 前回のの結果で表示されるのは、ID、日付、商品名、単価、数量です。単価×数量で売り上げもわかるわけで、これも表に表示出来たら便利です。その場合には、SQLを以下の様に記述します。

"sqlCmd = SELECT 売上明細.ID,売上明細.日付,商品データ.商品名,商品データ.単価,売上明細.数量,(商品データ.単価*売上明細.数量) " _
         & "FROM 売上明細 INNER JOIN 商品データ ON 売上明細.商品ID = 商品データ.商品ID "

違いが判りますか?SELECT句の後に指定するフィールド名のあとにコンマで区切って
(商品データ.単価*売上明細.数量)
って追記しました。すると・・・

f:id:HiroCom777:20201208230023j:plain
あ、計算できてる!!商品の単価と売り上げの数量をかけた数値が取得できています。これは便利ですね!!このように記述すると、フィールドのデータ同士で掛けて計算することができます。勿論、加減乗除全て可能です。解りやすさのためにカッコで区切りましたが、無くても問題ないです。

もう少しシンプルに

 色々考えていくうちにSQL文がだんだん長くなってきて、解りづらくなることがあります。何とかして簡単にする方法はないかなって探していたのですが、エイリアス(別名)という手法がありました。テーブル名を別名に置き換えてシンプルにできます。上のコードにテーブル名のエイリアスを適用すると・・・

 "sqlCmd = SELECT a.ID,a.日付,b.商品名,b.単価,a.数量,(b.単価*a.数量) " _
          & "FROM 売上明細 AS a INNER JOIN 商品データ AS b ON a.商品ID = b.商品ID "

 ずいぶんシンプルになりましたね。FROM句とINNER JOIN句の後に続くテーブル名の記述を
テーブル名 AS 別名
と記述すると、SQL文中のテーブル名を別名に置き換えることだ出来るのです。

ちなみにASは省略してスペースに置き換えることが出来ます。更に実を言うと、フィールド名の前のテーブル名.は、フィールド名がテーブル間でかぶらない場合省略してもいいのです。つまり、今回の場合テーブル名の表記が必要なのはそれぞれのテーブルの商品IDだけとなります。結果的に以下の様になります。

sqlCmd = "SELECT ID,日付,商品名,単価,数量,(単価*数量) " _
         & "FROM 売上明細 a INNER JOIN 商品データ b ON a.商品ID = b.商品ID "

かなりシンプルになりました。でもASの省略はともかく、テーブル名の省略は解りずらくなるのでやめておいた方がいいと思います。

サブクエリ(副問い合わせ)

 他にもSQL文をシンプルに書く方法にサブクエリがあります。SELECT句のSQL文をかっこで括って一つのテーブルとして使うことが出来るのです。以下に例を示します。上の問い合わせで得られた結果のうち、商品名がバナナであるレコードを抽出したいとします。

sqlCmd = "SELECT a.ID,a.日付,b.商品名,b.単価,a.数量,(b.単価*a.数量) " _
        & "FROM 売上明細 a RIGHT JOIN 商品データ b ON a.商品ID = b.商品ID "
sqlCmd = "SELECT * FROM (" & sqlCmd & ") WHERE 商品名 = 'バナナ'"

このSQL文を実行すると、以下の様になります。
f:id:HiroCom777:20201214222925j:plain
商品名がバナナのレコードを抽出できました。
SELECT句は、データベースから条件を指定してレコードを抽出するSQL文ですが、これをかっこで括ると一つのテーブルとして扱うことが出来ます。上記の例では、一度INNER JOINで二つのテーブルを結合する処理を書いた後に、そのテーブルから商品名がバナナのレコードを抽出しています。これを一つの文で書くのはちょっと難しいのではないのでしょうか。サブクエリを使用する際には、一度サブクエリ内のSQL文だけを実行して実行結果を確認してから本体のSQL文を作成するといいと思います。あとサブクエリは動作が遅くなりがちなので、頻繁に使用したり、大きなデータを処理するのには向かないかもしれません。

ツールを作ってみるかな・・・

 ここまで来て思うのです。何かツールは作れないかな・・・って。この連載を書くにしても、Accessファイルを作ったり、内容を確認したり、編集したりって、結構面倒なんですよ。まずは、ファイルを確認できるツールから考えてみようと思います。お楽しみに!!
 
hirocom777.hatenadiary.org


ExcelVBAでAccessファイルを操作する連載はコチラから