Microsoft Access 掲示板

コンボボックスの連携に伴うもとになるクエリの値について / 17

29 コメント
views
4 フォロー
17

ファイルの破損があるのですね。メンバー個人が入力を終了したときにテーブル作成をしてもらおうと考えたのですが、
管理者が翌朝に1回やれば済むというお話ですね。
理解しました。ここは手動で行いたいと思います。

テーブル自体必要ないです。クエリをエクスポートします。
エクスポート操作を保存したなら、朝、最初に起動したときに、
そのエクスポートをVBAで実行するようにするといいでしょう。
実行した日時を保存するテーブルを作成しておいて、実行日時を格納しておきます。
ファイルを起動したときは、今日の日付の実行履歴がなければ実行するというようにしておけば、
1日に1回だけ実行できます。

完成前サンプルファイルついて

いろいろ修正点がありますので、一つずつ指摘していきますね。

テーブル設計

  • T_勤怠 テーブルの 業務No、作業No フィールドの規定値が 0 になってますが、これは削除しましょう。
    0に設定してあると、入力せずに保存すると、0 になり未入力チェックができなくなります。

  • リレーションシップを設定しましょう。
    リレーションシップを設定する意義は下記のリンク先を参照してください。
    リレーションシップを設定した場合の利点 - hatena chips
    リレーションシップを設定して、「参照整合性」にチェックを入れておくと、マスターに存在しない値を入力なるとメッセージが出て入力できないようになります。データベースではデータの不整合が発生すると致命的ですので設定しておいた方がいいでしょう。

サブフォームの設計

  • 業務名、作業名 に関しては、クエリでマスターから引っ張ってくると、そこで編集するとマスターの方を更新してしまうので、メインフォームの方の設計のようにコンボボックスにしてコントロールソースは 業務No、作業No にして、列数、列幅の設定で業務名、作業名を表示させるようにします。
    テキストボックスを右クリックして[コントロールの種類の変更]-[コンボボックス]でコンボボックスに変更して、メインフォームのコンボボックスと同じ設定にしてください

  • レコードソースのクエリに抽出条件を設定していますが、抽出はリンク親フィールド/リンク子フィールドの設定で可能ですので、クエリの抽出条件は削除しておきましょう。
    リンク親フィールド/リンク子フィールドの設定は、社員ID;日付 というよう設定にします。複数のフィールドはセミコロンで区切って設定すればOKです。

  • 上記のように設定すれば、クエリに業務名、作業名は不要ですし、抽出条件も不要なので、レコードソースは、メインフォームと同じ Q_勤怠 にしてもOKですね。そうすれば、Q_勤怠内訳は不要なので削除しておきましょう。クエリは多くなると管理・メンテナンスが大変になりますのでなるべく少なくなるようにします。

  • メインフォームに「修正登録」というボタンがあり、そのクリック時で
    DoCmd.RunCommand acCmdSaveRecord
    を実行してますが、実は、これは無意味です。メインフォームのレコード保存になり、サブフォームとは無関係です。
    サブフォームで編集した場合、サブフォームでレコード移動するか、メインフォームへフォーカスを移動した時点で自動的に保存されます。
    「修正登録」をクリックするとメインフォームにフォーカス移動しますのでそこで自動保存されます。
    もし「修正登録」クリックするまでは登録されないとユーザーに誤解を与えますので、このボタンは削除しましょう。

修正したサンプルファイル
完成前_1.zip

通報 ...