6 フォーム/レポートの動作テスト(1)

ここから実際にアプリケーションの各機能を動かし、問題がないかチェックしていきます。ひとつひとつのテスト手順を明記しても仕方ありませんので、ADPにしたことによって発生した問題点、あるいはADPの機能を活用するために変更した点の一部のみをピックアップし、その変更内容を説明していきます。


●顔写真のデータがクリアされない

「人材登録・編集」画面では、.BMP等の顔写真のデータを登録できるようになっていますが、[クリア]ボタンをクリックしても削除できませんでした。

従来のプログラムは次の通りです。

Me!顔写真.SetFocus
SendKeys "{DELETE}", True


やはり比較的動作の不確実なSendKeysステートメントを使っているのが原因のようです。SQL Server間との何らかのやり取りのタイミングのせいでしょうか、直接Deleteキーを押すと写真がクリアされるのですが、このSendKeysでDeleteキーの情報を送出してもスキップされてしまうようです。

そこで、このSendKeysステートメントを少しでも確実に動作させるため、Doevents関数を使ってWindowsにその時間を与えるコードを追加することで解決しました。

Me!顔写真.SetFocus
SendKeys "{DELETE}", True
DoEvents



●メールアドレス編集用ボタンが動作しない

「人材登録・編集」画面には、「メールアドレス」の入力欄があります。このメールアドレスは従来、テーブル上ではハイパーリンク型となっており、直接入力するよりは「ハイパーリンクの編集」ダイアログを表示してそこで編集した方がよいので、そのダイアログを表示するための[編集]ボタンが用意してあります。

その部分のプログラムは次のようなものです。

Me!Eメールアドレス.SetFocus
On Error Resume Next
DoCmd.RunCommand acCmdEditHyperlink


メールアドレスのテキストボックスにフォーカスを移動したあと、RunCommandメソッドによって「ハイパーリンクの編集」ダイアログを表示してします。

ところが、アップサイジングしたあとのADPでは、このボタンがまったく動作しません。

上記プログラムでは「On Error Resume Next」によってエラーを無視するようになっていたので、それをコメントアウトしてみたところ、「実行時エラー:コマンドまたはアクション’ハイパーリンクの編集’は無効です。」というエラーが発生していました。

アップサイジングウィザードによってAccessの「ハイパーリンク型」が無視されて通常のテキスト型か何かになっているのではないかと確認しましたが、SQL Server上では確かにハイパーリンクの設定がなされていました(正確に言うとSQL Serverには“ハイパーリンク型”というデータ型はなく、データ型は「ntext」で、フィールドのプロパティによって「ハイパーリンク=“はい”」という設定になっています)。

そこで、フォーム上のテキストボックスコントロールの設定を見てみると、「ハイパーリンクあり」というプロパティがあります。その設定が“いいえ”となっていたので、それを“はい”に変更してみたところ、[編集]ボタンが正しく動作するようになりました。

Access単体の場合は、テーブル上のデータ型がハイパーリンク型であることを自動認識してそのプロパティはどのような設定でも動いていたのかもしれませんが、SQL Serverのテーブルの場合には明確にその旨を指示しないといけないようです。


●フォームのFilterプロパティを使ってレポートを開けない

「人材登録・編集」画面においてマニュアル操作でフィルタを掛けたあと、「プレビュー選択」ダイアログで”画面上に表示されているフィルタのかかったデータ”を選択してプレビューを実行した場合、フォームのFilterプロパティがうまく取得できず、レポートがプレビューされません(Docmd.OpenReportでレポートを開く際のWhere条件文のエラー)。

”うまく取得できない”というのは、ADP上でフォームのFilterプロパティを取得すると、その値は下記のようになっているためです。

[tbl人材].[住所] ALike "埼玉県%"


まず、通常のAccessデータベースであれば「Like〜〜」となる部分がなぜか「ALike〜〜」となっています。また、確かに「*」ではなくSQL Serverに合わせて「%」にはなっているのですが、その全体を囲む符号が「"(ダブルクォーテーション)」となっています。SQL Serverでは「'(シングルクォーテーション)」である必要があります。

厳密にいうと、想定されるフィルタ条件をパラメータとするストアドプロシージャをレポートのソースとするなどの方法も考えられるのですが、ここではお茶を濁す形にはなりますが、次のようにプログラムを変更することで対処してみました。

【変更前】

strWhere = psfrm.Form.Filter

  • strWhere変数がOpenReportメソッドにおけるWhere条件です。


【変更後】

strWhere = psfrm.Form.Filter
strWhere = Replace(strWhere, " ALike ", " Like ")
strWhere = Replace(strWhere, """", "'")



●テーブル結合したビューをレコードソースとするフォームが編集できない

本題材のデータベースでは、「人材登録・編集」画面の[業務履歴]ボタンをクリックすると、現在画面に表示されている人材に関して、その過去の業務履歴をダイアログとして表示するようになっています。ところが、.accdbのときはその画面でデータの変更や追加ができたのですが、ADPにしたあと読み込み専用となっていて編集を行うことができません。

そこでここでは、このフォームの中味を根本的に見直し、次のようなスタイルに変更してみました。複数のテーブルを結合したビューやストアドプロシージャ(特にパラメータ付き)をフォームのレコードソースとする場合、データを更新できなかったり、ADP独自のプロパティ設定が必要になったり、あるいは追加や削除処理用のストアドプロシージャを追加する必要があったりします。そこで、ここでは作りをなるべくシンプルにした例として、ビューの内容を単一のテーブルに置き換えることにしています。

  • なお本題材の場合、「スケジュール管理」画面も同じような構成になっています。

  1. まず、「業務履歴」画面のサブフォーム「fdlg業務履歴_sub」のレコードソースであるクエリ(ビュー)の「qsel業務履歴」において、多側に結合されている「tblジョブ」テーブルを抹消します。


    • 並べ替えの条件がなければ、ビューではなくテーブルを直接レコードソースとしてもいいところです。


  2. 次に、「fdlg業務履歴_sub」のレコードソースから「業務内容」フィールドが抹消されたため、フィールドを直接参照するのではなく、コンボボックス「ジョブID」の2列目の情報を参照するにように変更します。それには、「業務内容」テキストボックスのコントロールソースを「=[ジョブID].[Column](1)」とします。つまり、ビューから値を持ってくるのではなく、あくまでもフォーム上のみでその値を表示する方法に変更することになります。



なお、この画面が編集用ではなく読み込み専用であれば、このような方法を使うよりも、ビューを使ってサーバー側でテーブル結合した方が画面表示などは速くなります。上記の方法は、コンボボックスの内容が変更されたとき、連動したテキストボックスの内容がすぐに変わるのが利点ですが、クライアント側で演算処理されるので、フォームを開いたときなどにテキストボックスの内容が初期描画されるまでに時間がかかるのが難点です。


また、レポートでも同様のケースがあると思いますが、レポートではユーザーが項目を選択するということがないので、コンボボックスは使わずテキストボックスにしている場合も多いかと思います。そのようなときは、テキストボックスをコンボボックスに変更し、フォームと同じように「値集合ソース」や「列数」を設定するようにします。そうすれば「=[ジョブID].[Column](1)」というような参照が可能になりますし、レポートの場合には同じコンボボックスであってもドロップダウンさせるための[▼]ボタンは印刷されず、外観上はテキストボックスと同じになります。





また、フォーム上でデータの更新が必要な場合でも、ビューとして表示するフィールドに主キーを追加したり、フォームの「固有のテーブル」や「再同期コマンド」プロパティなどを設定したりすることで対応することもできます。

【例】

  • ビュー(あるいはストアドプロシージャ)において、結合された多側のテーブルの主キーフィールドにチェックマークを付け、フィールドとして出力されるようにする

  • 「固有のテーブル」プロパティを主側テーブルの「tbl業務履歴」に設定する

  • 「再同期コマンド」プロパティを「SELECT * FROM qsel業務履歴 WHERE ID=?」に設定する

    • ここで“qsel業務履歴”はそのフォームのレコードソース、“ID”は固有のテーブルの主キーを表わします。

    • 「?」はそのフォーム上のキー値をそこに代入することを表わします

    • この再同期コマンドを設定した場合、レコードが保存された時点で再同期が行われ、「業務内容」のデータが更新表示されます(「ジョブID」の変更とともには更新されません)。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved