以下のトピックを選択して、Northwind Developer Edition の 従業員 について学習します。
従業員には、リストおよび詳細フォームとして機能する 1 つの分割フォームがあります。
従業員を使用して新しい従業員を追加し、既存の従業員に関する情報を更新します。
リボンの [ 従業員] タブを選択すると、[従業員一覧] フォームに従業員が表示されます。 frmEmployeeList は、次の機能を備えた分割フォームです。
-
フォームの上部は、1 人の従業員の 1 つのビューです。
-
フォームの下部は、すべての従業員のデータシート ビューです。
-
どちらの部分でも従業員を選択すると、分割フォームの他の部分でその従業員にフォーカスが設定されます。
-
分割フォームのいずれかの部分で、従業員を追加、編集、または削除できます。
-
データシート ビュー パーツで分割フォームを使用すると、フォームのレコード ソースに複数のレコードがあることを前提としています。
分割フォームの潜在的なパフォーマンスへの影響
ほとんどの開発者は、フィルター処理されていないテーブルまたはクエリをフォームのレコードソースとして読み込 まない 方が好きです。 フォームを 1 つのレコードにフィルター処理すると、テーブルからフォームに転送されるデータの量が最小限に抑えられます。 ローカル Access テーブルでは、フィルター処理されたレコード ソースとフィルター処理されていない小さなレコードソースの読み込みの違いが目立つ可能性があります。 ただし、Access テーブルがリモートのサーバー ベースのデータベース (SQL Server など) に置き換えられると、このパフォーマンスは失われます。
Northwind の従業員テーブルはあまり大きくなってはいけないので、フィルター処理されていないレコードソースの候補です。 ただし、注文の詳細など、他のテーブルにバインドされたフォームは、何千ものレコードに拡張される可能性があります。フィルター処理されていないレコードソースの候補ではありません。
従業員の編集
分割フォームでレコードを追加または編集する場合、ユーザーはフォーム ビューまたはデータシート ビューで値を入力できます。 必要なフィールドもあれば、省略可能なフィールドもあります。 フォームは、必須フィールドに値が存在していることを検証します。 以下の 「必須フィールドの検証」を 参照してください。
ルックアップ テーブル、値リスト、ドロップダウン コントロール
-
[ タイトル ] ドロップダウンは、事前に選択したタイトルの一覧にエントリを制限します。 タイトルは、タイトルと呼ばれる ルックアップ テーブル 内にあります。
-
一部の予想される選択肢は既にルックアップ テーブルに格納されていますが、ユーザーはコンボボックスまたはドロップダウン コントロールの既定の Access 動作を使用して、ルックアップ テーブルに新しいタイトルを追加できます。
-
[タイトル] コンボ ボックスの [リストに制限] プロパティが [はい] に設定され、[タイトル] の編集フォームは [リスト アイテムの編集フォーム] プロパティで識別されます。 フォームのドロップダウンを選択すると、下端に編集アイコンが表示されます。
-
編集アイコンをクリックすると、 タイトル の編集フォーム frmEmployeeTitles が開きます。ここで、承認されたタイトルの一覧を変更または追加できます。
メモ:ほとんどの運用環境では、タイトルの編集または追加は、強化された特権を持つユーザーに限定されます。
Self-Referential ルックアップ フィールド
従業員関数は、Self-Referential ID フィールドの概念を示しています。 従業員の上司の指定をサポートするために、テーブルには、他の従業員の EmployeeID が含まれる SupervisorIDフィールドがあります。 上司を指定するために、別の 従業員の EmployeeID がこのフィールドに入力されます。 Access では、このリレーションシップに対して参照整合性が適用されます。
SupervisorID は、ドロップダウンまたはコンボ ボックスとして従業員フォームに実装されます。その行ソースは、Employee テーブルからフィルター処理されたレコードのセットです。 これは自己参照であるため、クエリでは選択した従業員の EmployeeID を除外する必要があります。 たとえば、Employee カレン Finster の SupervisorID の行ソースには、カレン自身の EmployeeID は含まれません。 彼女は自分の上司になれない。
添付ファイルのフィールドとコントロール
従業員の画像は、テーブルの添付ファイル フィールドに格納されます。 添付ファイル フィールドの既定の Access 動作を使用して、新しいイメージを追加するか、既存のイメージを変更します。
注: Access の機能を示すために 、Employee テーブルに添付ファイル フィールドを含めます。 埋め込みイメージは accdb の サイズを大きくするため、ベスト プラクティスとは見なされません。 運用環境のアプリケーションに実装する前に、環境を慎重に評価してください。 推奨される方法は、すべてのイメージを格納するネットワーク フォルダーと、添付ファイル フィールドではなく、イメージへのパスを含むテーブル内のテキスト フィールド内のリンク です。
関連情報を含むサブフォーム
[受注] サブフォーム ([従業員] フォームの右側) には、従業員によって処理された最近の注文 (ある場合) が表示されます。 サブフォームには、データシート ビューの注文が一覧表示され、最新から最も古い順に並べ替えられます。 その従業員の既存の注文を編集するには、[受注] サブフォームでハイパーリンクされた注文 ID # をクリックします。
従業員フォームのレコードソース
qryEmployees というクエリは、フォーム内のレコードを返します。 通常、テーブルではなくクエリを使用することがベスト プラクティスと見なされます。 クエリは、1 つのテーブルからのみレコードを返します。 さらに、クエリをパラメーター化して、返されるレコードの数を制限できます。
-
このクエリの Select 句では、ワイルドカード '*' を使用して Employee テーブルからすべてのフィールドを返します。
-
クエリの 2 つの計算フィールドは 、FirstName LastName と LastName、FirstName を返します。
コントロールの計算値
注: 計算フィールドはテーブルに格納 されません 。 ただし、これらはフォームのレコードソースで使用できます。
[従業員] フォームのほとんどのコントロールは [有効] であるため、マウスまたはタブで選択でき、編集できるように [ロックされていません] になっています。
組み込みのアクセス動作に加えて、フォーム、フォームのコントロール、およびスタンドアロン モジュールの VBA サブと関数は、従業員に必要な基本的なロジックを実行します。 次のセクションでは、関数と、それらの関数を実装するコードについて説明します。
組み込みのコントロール アクション
フォームのレコード セレクターの既定の動作:
-
1 つのビューでフォームの左側にあるレコード セレクターを左クリックすると、現在のレコードが編集内容と共に保存されます。 レコード セレクターを左クリックして保存すると、適切な VBA サブと関数がトリガーされます。
-
単一ビューでフォームの左側にあるレコード セレクターを右クリックすると、メニューがポップアップ表示され、レコードの切り取り、コピー、貼り付けなどのアクションが実行されます。 レコードを削除または切断すると、以下で説明する EmployeeCanBeDeleted 関数がトリガーされます 。
-
この既定の動作を使用できるようにするには、フォームのレコード セレクターを有効にする必要があります。
フォーム内のレコードの参照整合性
参照整合性を使用すると、関連テーブルに Child レコードを持つ従業員を削除できなくなります。 そのため、ユーザーが子レコードを含むレコードを削除しようとすると、Access によってエラーが発生します。 Northwind Employee フォーム Access は、参照整合性に関する一般的な既定のエラー メッセージをカスタム メッセージに置き換えます。
フォームの Delete プロシージャのコードは、右クリック メニューから レコードを切り取るか、 Delete キーを使用してレコードを削除する試行に応答します。
プライベート関数 EmployeeCanBeDeleted は、 注文、 発注書、 従業員、従業員特権の各テーブルで、その従業員の関連レコード を チェックします。
見つかった場合、この関数は既定のエラー メッセージを抑制し、Customer フォームが 顧客 を削除できない理由をユーザーに通知するために使用するのと同じ汎用ダイアログを使用して、レコードを削除できない 理由をユーザーに通知します。
検証
従業員は、検証と標準エラー処理を実装します。 コントロールには 2 種類の検証があります。
-
必須フィールド
-
標準形式
必須フィールドの検証
すべての従業員には、次の 3 つのフィールドが必要です。
-
First Name
-
Last Name
-
役職
この開発者バージョンでは、フォームの 更新前イベントによって必須フィールドが検証されます。 ユーザーが値検証を持たない 1 つ以上の必須フィールドの値なしで従業員レコードを保存しようとすると、保存が取り消され、値を持たない必須フィールドが強調表示されます。 Northwind の Employee フォームでは、必須フィールドの検証は、個々のコントロールではなく、フォームの Before Update イベントによって処理されます。
Employee フォームの Before Update イベントは、3 つの必須フィールドの値の存在を検証します。 新しい従業員レコードまたは編集された従業員レコードを保存すると、フォームの Before Update イベントが発生します。これは、必要な値の有無をチェックし、応答する Public Functions を呼び出します。
modValidation モジュールには、次の関数が含まれています。
-
ValidateForm
-
IsValidForm
-
HighlightInvalidControls
-
HighlightControl
-
ValidateForm_RemoveHighlights
新入社員の管理
[従業員の 追加] ボタンをクリックすると、次の目的でプライベート サブ btnNewEmployee_Clickが実行されます。
-
現在のレコードを保存し、
-
フォームのフォーカスを新しいレコード
に設定する '
Select クエリのワイルドカードフィールドと名前付きフィールド
qryEmployees の SELECT 句では、ワイルドカード文字 "*" を使用して、テーブル内のすべてのフィールドを選択します。 ワイルドカード クエリデザインには、基になるテーブルから新しく追加されたフィールドが自動的に含まれます。これは、特定のフィールドの一覧では使用できません。 一方、特定のフィールドを一覧表示して、返される レコードセット を、たとえば、表示のみのフォームで必要なフィールドのみに制限する場合があります。
適切な設計の選択
設計は、要件に適したアプローチに基づいている必要があります。 ただし、可能な場合、優先設定は通常、将来のメンテナンスを必要とする可能性が最も低いアプローチ (ワイルドカードアプローチ) に進みます。
ルックアップ テーブルにバインドされた ComboBoxes — 2 つのアプローチ
従業員の上司などの関連項目は、フォームのドロップダウンまたはコンボボックスに表示されます。 そのフィールドは外部キー フィールド ( SupervisorID ) にバインドされているため、フォームの レコードソース クエリでは SupervisorID の外部キーのみが必要です。 コンボボックスには、対応するテキスト値も表示されます。
非表示の ID 列と表示される Description 列を含む 2 列のコンボボックスを使用すると、この機能が機能します。 従業員フォームでは、Supervisor コンボボックスは単純な 2 列クエリにバインドされます。 スーパーバイザーの RowSource プロパティを参照してください。
ただし、場合によっては、ルックアップ テーブルに個別の主キーがないため、テキスト値自体が主キーになります。
従業員のタイトルなど、可能な値の一覧が小さく、非常に安定している場合は、多くの場合、クローズド ドメインと呼ばれます。 Title の値の変更や追加は一般的ではありません。 Closed Domain ルックアップ テーブルは、1 列クエリアプローチの候補です。
[従業員] フォームの [タイトル] コンボ ボックスは、タイトルの 1 列クエリにバインドされます。 タイトルの RowSource プロパティを参照してください。