Acessに関する考察

@  2GBというデータベース制限と添付ファイル型
本格的なデータベースを構築するというよりは個人趣味で2023年から映画.DB(映画2023.accdb)を作成しているが、画像なども取り入れているため、あっという間に2GBの制限を超えてしまった。InternetやAmazon、Unextなどからダウンロードした映画を7TBのハードディスクに格納し、その邦題・原題・製作年・監督・出演者やポスターを登録したもの(映画テーブル)さらには出演者(あるいは監督)に関して氏名・原地名・生誕国・生年月日・逝去年月日・出演作品・顔写真などを登録したもの(人名テーブル)の2つのテーブル(前者が 1,320件、後者が3,485件)とそのフォームで構成されている。(解消後、映画も撮りだめを結構しており、現在は件数も増加している。)

実は、いまでも画像をデータベースとは別に保存してデータベースそのものは2GBというとてつもない大きさをさけることもできるのだが、(BCで方法詳述する)accdbになってからか、標準で画像をデータベースの中に取り込むことができるようになっている。ただし、テーブルの項目名はポスター・Faceとなっているのだが(デザインビューにおける項目名 なおデータ型は添付ファイル)、デザインビューにおいては項目名がなくなっており、(1)が画像有り、(0)が画像なしとなっている。(実際は(1)(0)のまえに記号めいた文字があるのではあるが)一部のwebによれば、クリップと呼ぶらしい。
左がテーブル 右がフォーム

  

添付ファイルのデータ型の特徴はテーブルの中に画像などを取り込んでいるため別途画像フォルダーを必要としない。また、テーブルの中に画像などを取り込んでいるため(単票形式のTableの場合)テーブルの1番目と2番目に取り込んだ画像が異なっていても同じ名前をつけることができる。つまり1番目のクリップボード.jpgと2番目のクリップボード.jpgは異なっていても同一の名前でテーブルまたはフォームに取り込むことができる。
また、添付ファイルのデータ型の特徴ではないと思われるが、画像が大きくてもフォームの画像
枠に合わせて縮小表示してくれる。実はそれゆえにポスターにせよ、顔写真にせよ、インターネットからダウンロードしたものをそのまま使用したためデータベースが巨大化してしまったのである。

Aとりあえずの解決策(画像の見直し)
さすがに画像を別扱いにしてデータベースを再構築する(Cに詳述)には件数が多すぎるので、やり方はCで詳述するものの(実際には映画テーブルのみ2-3件てがけてみた)今回は添付ファイルの形式のまま、(1)画像を見直して、映画テーブルの画像は4.587cm*6.196cm(横・縦)、人物テーブルの画像は4.804cm*3.005cmを限度として画像そのものを画像ソフトirFanViewで加工して貼り付けなおした。(rFanViewでは例えば映画用画像は2.39*3.39cm/282*400ピクセルと表示されているが、rFanViewとAccessで同じ画像でcm/ピクセル表示が異なる点をどこかのインターネット説明をさがして解説する必要があるだろう)C(6)でも述べているが根本的にAccessとirFanViewのサイズ違いを解明できているわけではない。(2)画像名も統一して映画画像は題名.jpg、人名は氏名.jpgとして、どうしても人物についてWikipediaや英語のWikipediaにも説明表示がない場合は一定の画像(実際はAAA.bmpという、くまさんの画像)を割り当てている。(ただし氏名.bmpという名前)本件がC(5)でも問題にはなるが、件数も10件程度なので、bmpをjpgに変更すれば解決する。
これら(1)(2)は画像を別扱いにすることも考慮した結果であるが、画像を縮小して映画と人名のフォームに貼り付けなおすことにより、2,097,088KBあった映画2023.accdbは99,916KB(97.5MB)と劇的にサイズ縮小された。(その後、映画件数も増加し、Queryなども追加したりして少し大きくなっているが相当な件数はまかなえると思われる)ただし1000件強の映画データベースおよび人物データベースの再構築に10日程度まるまるかかってしまった。(これが別途職業をもっていたら、再構築に1か月くらいかかるかもしれない)


Bテーブルとフォーム 画像を表示の3パターン
一切VBAを使用しない外部画像ファイルをAccess(xx.accdb)で表示することには下記のUrlで適例ではないかとも思える。ただし帳票フォームなのでExcelみたいなフォームである。また、画像イメージ(コントロールソース)が絶対表示なので画像フォルダーを動かすとそのままでは画像が表示されない。
https://hamachan.info/win8/access/gazou.html
項目で不要と思えるものも有ったので独自にテーブルを作成した。
テーブルはID(オートナンバー型)と画像(短いテキスト)のみ。
IDは便宜的につけたもの。テーブルの画像は001.jpg 002.jpg 003.gifなどのテキスト。
フォームのプロパティシートは既定のビューが帳票フォーム。項目はID 画像 画像イメージ。
フォームのコントロールソースをクリックするとテーブルの項目を選ぶことができる。
唯一、画像イメージが画像の存在するエリアを指定。
具体的には="D:\MS Office練習\Access\09VBA VBE\No-VB\Pic\" & [画像]
つまり、Dエリア(OSのあるCエリアではなく)のMS Office練習のもとに、Access以下のフォルダー(..Picという名前のフォルダー)に001.jpgなどの画像がはいっている。データベース(Database1.accdb)は上記で言うならNo-VBというフォルダに存在している。
(1)hamachan.info/の通りの帳票フォームで画像イメージが絶対表示のものは上記の通り。
(2)1件1ページのものはフォームのプロパティシートを既定のビューが単票フォームにすればよい。
(3)さらに相対表示の場合は="D:\MS Office練習\Access\09VBA VBE\No-VB\Pic\" & [画像]ではなく
 =D:\MS Office練習\Access\09VBA VBE\No-VBを=[CurrentProject].[Path] となる。
 すなわちDataBaseの存在する場所は[CurrentProject].[Path]であるということ。
 実際に画像の存在する場所を指定すると、=[CurrentProject].[Path] & "\Pic\" & [画像]ということになる。
プロパティシートのコントロールソースへの記載である。



商品名など不要なものも含んだDataBase1.accdbの事例。



DataBase3.accdbの事例はAccessOLD.htmlのほうにもある。
(2枚目の画像)

実際には、下記の図がDataBase3.accdbの図。(デザインビューなので概要しかわからないが)



いくつか説明もつけたフォームビューは以下の図(Database3.accdb)



C映画テーブルの単票化 [CurrentProject].[Path]の試み
あらためて現行の映画テーブルの単票化を試みた。(本当は人物テーブルもあわせて実行すべきではあるが件数も多いので試みのみとし、要するにBの注意点といったところである。)
(1)テーブルの画像を外だしするわけでデータベースの映画テーブルをコピーしておく。
 作成した新規データベースの映画テーブルから画像((1)とかなっている)フィールドを削除する。
(2)フォームはフォームデザインで升目状態のものをえらぶ。
左上の黒い四角をクリックすると、フォームのプロパティシートが現れる。レコードソースがすべての一番上に表れる。その...ではない方をクリックすると、何をもとにするか(この場合は映画テーブルである映画)を選ぶことができる。
(3)さらに例えばコントロールのテキストボックスをえらんで、フォームに配置する。
タイトルがテキスト0となっており、本体は非連結となっている。プロパティシートをみるとコントロールソースが(フォームのときにテーブルを指定していたので、)映画テーブルの項目がえらべる。例えば「邦題」を選ぶ。
テキスト0では解らないので邦題
あるいは映画タイトルなどと変更する。
(4)問題はテーブルには存在しない画像イメージをフォームに表示すること。
コントロール((3)ではテキストボックスをえらんだけれど)のイメージをえらぶ。(3枚めのうしろのほう)
一番下の右から3番目(イメージ)


テクストボックスと同じように、フォームの適当な位置に配置する。こちらはテキスト0のような物はなく、
プロパティシートをみると、イメージ1とかイメージ2という名前になっている。
コントロールソースはクリックすると映画テーブルの項目もえらべるが、=[CurrentProject].[Path] & "\Pic\" & [画像]と自分でかきこむ。
最初 イメージを選ぶと自動的になにをえらびますかというダイアローグがあらわれるが、無視してもいいと思う。
コントロールソースに=[CurrentProject].[Path] & "\Pic\" & [画像]と書き込めばよい。
例えばテーブルに指定したものが無い場合、(あるいはフォームに指定したものが無い場合)イメージの部分は空白となる。
また、自動的になにをえらびますかというダイアローグで選んだ画像が表示される。
なお、=[CurrentProject].[Path] & "\Pic\" & [画像]は正確には以下の通り。
正確には
=[CurrentProject].[Path] & "\Pic\" & "映画\" & [邦題] & ".jpg"
人物は=[CurrentProject].[Path] & "\Pic\" & "人名\" & [氏名] & ".jpg"
である。



項目として‘紛失'というものがあるが、当初、日本映画で撮ったはずなのに保存されていない映画を識別するために設けたが、AmazonやUnextを撮り直し、いわゆる紛失物はなくなっているので、この項目は削除している。

(5)フォルダーごとコピーすればデータベースもPic以下の画像もすべてコピーできる。(結局これにした)
その上で画像がテーブルにコピーられているフィールドを映画および人物テーブルから削除すればよい。
さらにフォームでテーブルから作られた画像ファイル部分を削除してあらたにフォーム作成のイメージで適当な大きさをつくり、コントロールソースを=[CurrentProject].[Path] & "\Pic\" & "映画\" & [邦題] & ".jpg"などとすれば1300件であろうが3400件であろうがデータベース内の画像格納からデータベース外画像保存への変更も楽であるはず。
これによって画像が表示されないケースがいくつかあったが個別対応せざるをえないが。

(/と/の違いというか例えばファイル名ではaaa/bbb.jpgは許されないが映画の題名はaaa/bbb等の場合)

ただし外部ファイル(pic\映画や人名であって、データベースに内蔵されてない)にしたら、2,809Kbのデータベースと非常に縮小された。


(6)なお、いわゆる画像イメージのOLEサイズはズームである。
ほかにもグリップやストレッチなどの種類があるがそのままで縮小・拡大する場合と(ズーム)枠線部分と画像の一部分を表示する場合とあるようではあるが、それと画像ソフトirFanViewにおけるサイズ(インチ、cm、ピクセル)とAccessの枠線のcmが異なる点は理由が解明できていない。  (一部分について解明できるかもしれないが。 
参考 https://job.fellow-s.co.jp/dictionary/detail/270)  
つまり映画テーブルの画像は映画ポスターなのでirFanViewでは285*400ピクセル(3.62*5.08cm  1.42*2.00インチ)で大体決まっているのだがAccessのプロパティシートでは4.598*6.199cmなのである。映画の画像はおおよそ決まっているのでAccessでは縦横の枠がほぼぎりぎりで空白がないように設定してある。実際にパソコンに定規をあててはいないがどちらかが正しくてどちらかが間違いなのではないだろうか。


DVBA
映画テーブル(一番最後の[007 01作ドクターノウ]の画像)から監督や俳優のボタンを押すと人名テーブルにジャンプするには簡単なVBAをつかっているが、VBAの使用方法はほかのインターネットの賢人に任せるとして、どういったVBAを書いているかのサンプルはとりあえず提供しておこう。

Option Compare Database
Option Explicit

Private Sub 監督A_Click()

Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "人名"

stLinkCriteria = "[氏名]=" & "'" & Me![監督1] & "'"
DoCmd.OpenForm stDocName, , , stLinkCriteria

End Sub
Private Sub 監督B_Click()

Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "人名"

stLinkCriteria = "[氏名]=" & "'" & Me![監督2] & "'"
DoCmd.OpenForm stDocName, , , stLinkCriteria

End Sub