Microsoft Access 掲示板

製品・部品フォーム内でのPDF表示

10 コメント
views
4 フォロー

お世話になっております。
Access2016で製品や部品の閲覧・編集フォームを作っています。

文字での情報などは粗方完成したのですが、製品や部品のPDFを
埋め込みたいという話になり、試しに製品検索フォームでPDFの
埋込みを行おうと思いました。

フォーム:分割フォーム
レコードソース:T_製品マスタ(製品IDや名称、改訂履歴など)

今回、上記のようなフォームに、追加で
コントロールソース:外観図(OLEオブジェクト型) とした 連結オブジェクトフレーム
を置き、使用可能「はい」、編集ロック「いいえ」の設定で図面のPDFを
ドラッグ&ドロップで表示できるようにしました。
これで、検索時にパッと軽く確認しつつ、しっかりと確認したいときは
ダブルクリックすることでadobeからも図を閲覧できるようになりました。

しかし、埋め込みたいPDFは、A3サイズで10000データ近くあるはずなので、
のちのち(Accessに直接PDFが入ってる?から)重くなりそうで不安です。

PDFへのフルパスでの参照も考えましたが、ユーザによってはサーバーへの
制限がかけられている場合もあるので、あまりしたくありませんし、
年配の方も多いので、できる限り簡単な操作で、
「フォーム内の図面の簡単な参照(フォーム内に常にミニサイズで表示)」
「拡大した図の参照(Adobeとかから)」、「少ない操作での印刷およびPDFの変更」
ができるようになればと思っています。
また、使用する他のユーザーのAccessは2010~2016とややばらつきがあります。
検索等にVBAを用いていますので、VBAによる構築でも問題ありません。

何かいい案はありますでしょうか?
お知恵を拝借いただければ幸甚に存じます。
以上、よろしくお願いいたします。

ゲッキョク駐車場
作成: 2020/12/14 (月) 14:52:48
通報 ...
1
hiroton 2020/12/15 (火) 08:53:23 ebe2a@f966d

いい案ではないですが

ユーザによってはサーバーへの
制限がかけられている場合もある

この前提で「埋め込まない」をしようとすると、ACCESSにアクセス権の情報を含めることになります。ACCESSのセキュリティ性能を考えるとやるべきではありません。少なくともACCESS(データベース)のある場所のアクセス権は持っているユーザーを対象とすべきでしょう
そのうえで「埋め込まない」とするならACCESS(データベース)ある場所にサブフォルダを作ってPDF登録時にコピー、相対パスで保存とかでしょうか

「フォーム内の図面の簡単な参照(フォーム内に常にミニサイズで表示)」
「拡大した図の参照(Adobeとかから)」、「少ない操作での印刷およびPDFの変更」

これらUIの問題は埋め込みであるかどうかとは別な問題ですね。質問文前半からは「できている」ように見受けられますが問題になっているんでしょうか?

2
ゲッキョク駐車場 2020/12/15 (火) 11:38:38 cb55f@f6500 >> 1

hirotonさん、ありがとうございます。
今は直接埋込ですので、データ数が増えたときの不具合が心配で今回の質問に至りました。
常にフォーム内でPDFを表示したい、との要望でしたので、それを満たしつつ、データを
軽く(できればパスで通す)ような手が思い浮かばなかったのです。

しかしながら、先ほど社内で話し合った結果、フルパス(サーバ管理者との相談によっては相対パス)で
PDFへのリンクを貼り付けることにしました。
フォーム内にミニサイズでの表示はしないことにしました
(ユーザすべての言い分を聞いてられないという判断)

質問文の解釈にお手数おかけしてしまいましたが、今回の質問はこれで終わりにします。
ありがとうございました。

またAccessのDB管理が引き続くと思いますので、その際は以後宜しくお願い致します。

3
ゲッキョク駐車場 2020/12/15 (火) 11:45:09 cb55f@f6500

なにか、フォームでのPDFの管理(パスを通す場合)で、いいアイデアや、基本的な
設計思想等がありましたら、後学のためにもお教えいただけると
幸甚に存じます。

よろしくお願いいたします。

4
hiroton 2020/12/15 (火) 14:08:36 修正 ebe2a@f966d

ACCESS(データベース)の問題というよりはデータの一元管理の問題って感じです。まぁ、おのずと似たり寄ったりなものになると思いますが

具体的には「データベースの登録情報からPDFの保存パスを作る」感じになります。もっとも単純なのはPDFのファイル名は製品ID(+.pdf)とし、ACCESSファイルの置かれているフォルダに「PDFデータ」フォルダを作ってその中に保存する形

フルパスの保存なんかしなくてもデータベース上の製品IDがあれば
(ACCESSのパス)\PDFデータ\製品ID.pdf
でアクセスできますね。簡単です

データ管理がしっかりしているなら例えば
PDFデータ
└メーカー
_└製品区分
__└製品ID.pdf

なんてツリー構造で保存されていたりするでしょう。データベースでは製品テーブルに「メーカー、製品区分、製品ID」とフィールドを設けてやれば
(サーバーパス)\PDFデータ\メーカー\製品区分\製品ID.pdf
とPDFのパスが生成できます。データがしっかり管理されているのであればフルパスを保存しなくとも、「データベースとして正しい登録」をしてあげればファイルにアクセスすることができるわけです


そして、既にあるデータを活用したいと言われて大口取引先のデータは
「メーカー - プロジェクト名 - 製品シリーズ名 - 製品ID」
小口相手は
「メーカー - 年フォルダ - 製品ID」
のようなデータ管理を見て泣きを見ながらすり合わせをしていくわけです

5
ゲッキョク駐車場 2020/12/15 (火) 14:53:19 cb55f@f6500 >> 4

Accessからパスの通し方は、一度大学の頃に研究室の部品管理用のQRコードを
Excelのハイパーリンクで一括で作ったことがあるので、なんとなくのイメージはできていました。
(同行内のID等から、文字式結合とかでつくろうかなぁとか)

データ管理に関しましては、PDFデータがてんでバラバラな箇所にしかないので、
今回新たに共通の保存場所を作ることにしようと思っています。

また、少し違う質問になってしまうのですが、
現フォームが、ヘッダに検索用スペース、詳細に検索結果、フッタに分割フォームの表の方
が表示されており、かつ、閲覧・編集兼用フォームなっています。
基本的に、閲覧用(検索用)と、編集用(登録用)は分けた方が良いのはわかりますが

検索だけのフォーム(検索TXTBOXと検索BTNだけ的な)にも分けるかどうかを
考えているところです。
あんまりフォームを分けすぎると、一部のユーザに混乱を与えそうですし、
上記の用に分けた場合のユーザビリティを自分の技量では保てない気がしてしまって。

6
hiroton 2020/12/15 (火) 15:37:29 ebe2a@f966d >> 4

フォームの見た目が同じほうが良いのであれば、プロパティにレコードセットデータ入力用などの作業を制限する仕組みがあるのでそれらを活用する形でいいかもしれませんね

7
ゲッキョク駐車場 2020/12/15 (火) 16:00:12 cb55f@f6500 >> 4

検索フォームやメインフォームから開くときに、
検索だけなのか、編集等行いたいのかなどで場合分けをして、
開くのは同じフォームだけど、プロパティの設定変更から元データの保護等
ができるような形での実現で問題ないか、社内で相談してみます。

色々な考えの中から、最も適した構成を探すのに苦労しそうですが、
頑張ってみます。

ありがとうございました!

8
ゲッキョク駐車場 2020/12/16 (水) 17:34:47 cb55f@f6500

解決したと思ったら、また壁が立ちはだかるのが世の常です。
サーバ内のPDFを漁っていたんですが、なんとPDFが結合されて100ページほどの1つのPDFとして
存在していました。

製品IDが「A001」「B158c」のような、頭はアルファベット、それ以降尾が数字(及び改訂)と
なっており、多くのPDFが「A001.pdf」みたいな都合の良い形をしていたんですが、
一部(というには多い)のデータが「B001~149.pdf」みたいな名前になってしまっていました。
PDFでしか生きていないデータもありますので、できればこの結合されたものを利用したいんですが、
なにかいいアイデアはありますか?

重ね重ね申し訳ありません。

9
hiroton 2020/12/18 (金) 10:36:12 bcbb2@f966d >> 8

良くない案1
フォルダをエクスプローラーで開く

良くない案2
ファイル名で近似値を求めてそのファイルを開く
例えば「B030b」を開こうとした場合、ファイルの一覧を降順に捜査して

name = "B030b" & "あ"
"B150.pdf" < name => False
"B001~149.pdf" < name => True

の比較でそれっぽいファイルを見つけることはできます


複雑なことをしようとすればするほどさらなるイレギュラーが出たときに「思っていたのと違う。不具合だ」と言われるものです。全然いいアイディアになりません

本当の「いいアイディア」はPDFファイルを分割して保存しなおすことができないかを検討し、評価することでしょう

とはいっても、システムの運用開始はなるべく早くという要件もあるでしょうから、「製品ID.pdf」が見つからなかった場合はメッセージボックスを表示して(上記案のような)追加操作の実行を促す仕組みとすることはあると思います
過去の遺産の整理と並行して運用できるような限定的な仕組みという位置付けの機能としてしまいましょう

10
ゲッキョク駐車場 2020/12/18 (金) 11:20:27 cb55f@f6500 >> 9

丁寧な解説、ありがとうございます。本当に助かります。

ユーザーに多少の手間を取らせてしまいますが、とりあえず元データの
整理が完了するまでは、合致するデータが無かった場合に
該当するフォルダを開くようにします。

また、データ整理・および新たなデータを一気に登録する際には
改めてデータの参照方法を考えてみます。

本当に長々とお付き合いくださりありがとうございました。

Private Sub PDF表示_Click()
 
  Dim PDFPath As String, FldPath As String

  PDFPath = Application.CurrentProject.Path & "\PDFDATA\" & MNFCTID & ".pdf"
  FldPath = Application.CurrentProject.Path & "\PDFDATA"
  
  If Not Dir(PDFPath) = "" Then
  
    Shell "C:\Windows\explorer.exe " & PDFPath, vbNormalFocus
  Else
  
    MsgBox "データを探せませんでした。" & Chr(13) _
    & "PDFフォルダを開きます。"
    
    Shell "C:\Windows\explorer.exe " & FldPath, vbNormalFocus
    
  End If
  
End Sub