Myパートの契約管理(フォーム3)

Myパートの契約管理(契約明細の参照)

3.7 契約明細の参照

契約明細の全レコードを分割フォームで表示します。



「その他のフォーム」の「分割フォーム」で作成した画面です。
上には入力フォームの画面、下にデータシートが表示され、両者は連動しています。また、データシートは
EXCELのように表示順や抽出条件も設定でき、Accessらしい機能だと思います。
何も手間をかけることなくにここまで作成してくれますし、全体を把握するには便利そうです。
ただ、入力フォームはEXCELのようなセルに縛られており、あまり自由に編集できませんし、フィールド数が
多いテーブルの場合はデータシートが横長になり入力画面との照合が難くなりそうです。
利用する場合は、フィールド数を減らした上でレコードセットはスナップショットにして、照会・検索のみ
にした方がいいかと思います。

3.8 契約明細の検索・表示

契約明細レコードを選択して表示します。

⑴検索条件の指定フォーム

➀「フォームデザイン」からヘッダー領域とフッター領域を追加する。  
  レコードセレクタ=いいえ、移動ボタン=いいえ、区切り線=はい、ポップアップ=はい
➁詳細領域に検索条件となる項目の開始値、終了値を入力するテキストボックスを作成する。
    ラベルも同時に作成されてしまいますが、不要なラベルは削除してください。
    テキストやラベルはルーラーをクリックするか、右クリックを押下したまま囲むように動かすとまとめて
    選択できます。配置メニューの「サイズ・間隔」「配置」でまとめてそろえることができます。
➂フッターに検索開始ボタンとフォームを閉じるボタンを作成する。
   検索ボタンはコマンドウィザードを使用し、
     「フォームの操作」から「フォームを開く」を選択 → 「開くフォーム」は「検索結果」
      → 「すべてのレコードを表示する」→  文字列は「検索」、コマンド名は 「CmPrt」としました。
   画面で指定した条件によるレコードの抽出作業は 検索結果フォームの方で行っています。
   ここでは、開くフォームを指定しているだけです。
➃検索ボタンの フォームを取得時にマクロ1、フォームの喪失時にマクロ2を設定する。
   マクロ1,2はフォーカスが当たった時に標題の文字の書式を変更するマクロです。

自社情報の登録 ⑺ で紹介していますが、マクロ1は Fenter、マクロ2は fexit です。

このフォームはシステムが変わっても印刷や検索などの条件指定のフォームとして利用することができます。このように共通に使用できる仕様は自社のツールとして保存しておくといいと思います。

⑵検索結果の表示フォーム

➀フォームウィザードで契約明細テーブルを表形式で作成。
  書式設定:レコードセレクタ=はい、移動ボタン=はい、区切り線=はい、ポップアップ=はい
          レコードセット=スナップショット(表示のみで更新不可)      
➁レコードソースからクエリ-ビルダーを起動し、個人情報テーブルを追加して氏名と在職区分を追加。
   SQL文はこのあとで選択条件を追加していきますので、SQLビューで開いてコピーしておいてください。

➂作成されたフォームに氏名と在職区分のテキストボックスを追加し
     レコードソースに、個人情報テーブルの氏名と在職区分を指定する。
➃在職区分は「可視=いいえ」とし、区分値の内容を表示するテキストボックスを追加する。
   テキストボックスのコントロールソースには、 Iif(在職区分=1,"在","退") と登録。
                            if文の条件がtrue なら、”在"  false なら”退” と表示させます。
➄就業場所は「可視=いいえ」とし、場所名を表示するテキストボックスを追加。
   場所名のコントロールソースには、就業場所.column(1) と登録します。
➅職務内容は「可視=いいえ」とし、職務名を表示するテキストボックスを追加。 
   職務名コントロールソースには、職務内容.column(1) と登録します。
在職区分、就業場所、職務内容は、いずれもフィールド値は数値なので、そのままではわかり難いので対応する内容を表示するようにしています。フィールド値は表示する必要がないのですが、配置していないと編集もできませんので、配置したうえで見えなくしています。

⑶検索結果の「開くとき」にイベントプロシジャーを設定する

検索条件のフォームで設定した条件を組み込んだレコードソースを作成します。

➀ 条件文を書いていくための変数を定義
➁エラーが発生した場合には 「er検索」 にジャンプ
➂sql: デザインで作成されたクエリー文を貼り付ける。
   Select 契約明細.*,個人情報.氏名,個人情報.在職区分 
      契約明細.*  は、契約明細テーブルのすべてのフィールドを意味します。
   From 契約明細 INNNER JOIN 個人情報 on 契約明細.社員番号=個人情報.社員番号
     契約明細と個人情報を社員番号で連結します。連結方法は INNER JOIN です。
     個人情報にある社員番号の契約明細がない場合や、個人情報から削除された社員番号の契約明細は無視 
     します。両方のテーブルに存在する社員番号の契約明細のみが表示されます。
連結方法には内部結合と外部結合があります。
INNER JOIN(内部結合)
連結したフィールドの値が両方のテーブルに存在するレコードのみが有効となる。
LEFT/RIGHT JOIN(外部結合)
左(右)側に記述したテーブルのレコードが優先され、連結フィールドの値が連結先(反対側)の
テーブルに存在しなくても有効となる。
デザインで連結した初期値は、INNER JOIN です。
➃条件文の変数の初期化。
    変数の中身を空の状態にしています。
➄sql1:社員番号の範囲(st1 ~st2)を設定する条件文を起こす。
    規定値は 1 ~ 999999 で、全指定です。
    全指定の場合は条件文は必要ないのですが、開始値~終了値と条件設定をしています。
➅sql2:在職区分の範囲(st2 ~ st2)を設定する件文を起こす。
    規定値は 1 ~ 9 で、全指定です。 
    在職区分も全指定の場合は条件文は不要ですが、開始値~終了値と条件設定をしています。
    1 or 9 としてもいいのですが、将来、間の数値(例えば、5=休職 など)を利用することがあるかも
    しれません。固定的な数値で判定しない方がいいと思います。
  (在職者のみを表示させたい場合は、開始値、終了値ともに1、つまり1から1の入力となります。)
➆sql3:契約日の範囲を設定する条件文を起こす。
   未入力の場合、IsNull() 関数は true を返します。この場合は無視します。
   If IsNull(forms![契約明細の検索].st3)=false then 
     契約日 >= #forms![契約明細の検索].st3#         
   end if  
      開始日の条件が入力されている場合(false)は、契約日 >= 指定値 と条件設定をします。
      日付の前後には(”#” )を付けます。                              
  If IsNull(forms![契約明細の検索].ed3)=false then  
    契約日 <= #forms![契約明細の検索].ed3# 
  end if  
     終了日の条件が入力されている場合(false)は、契約日 <= 指定値 と条件設定をします。
     日付の前後には(”#” )を付けます。  
➇sql4: 契約日と同様に契約開始日の条件文を起こします。
sql5: 契約日と同様に契約終了日の条件文を起こします。
➉クエリービルダーからコピーした sql 文の後ろに 「where」追加して 上記で作成した条件文
  (sql1 ~ sql5)を結合して「検索結果」のレコードソースに登録する。
 エラーが発生した場合はそのまま終了する。

社員番号や在職区分のように規定値がそのまま選択値となっている場合は、全指定なのでクエリー文を起こす必要がないのですが、その場合は、開始値と終了値が規定値かどうかの判定が必要になります。将来、規定値が変更になる可能性もありますので、クエリー文は長くなりますが、開始値~終了値と条件文を起こした方が無難かと思います。

日付の場合は開始日付や終了日付の規定値はありませんので、空白なら条件文も不要です。
条件文の変数を最初に空の状態にしているのはこのためです。

3.7 雇用契約書原紙の印刷

原紙を印刷(プレビュー)します。

⑴簡易版雇用契約書の原紙の印刷

雇用契約書は、 A4 一枚に集約した簡易版で説明しています。設計書で紹介した通り2枚で印字する場合も条件設定や編集作業は同じですのでご了承下さい。

➀「フォームデザイン」からヘッダー領域とフッター領域を追加する。
   書式設定:レコードセレクタ=いいえ、移動ボタン=いいえ、区切り線=はい、ポップアップ=はい
➁st1:印刷枚数を指定
   規定値=1です。
   プレビュー画面に対して部数の設定はできませんので、プレビュー画面で印刷枚数を指定してください。
➂ed1,st2,ed2 は使用不可。
   指定する項目はないのですが、共通仕様の体裁上残しています。
➃プレビューボタンは「レポートのプレビュー」で、レポート名は「簡易版雇用契約書原紙」です。
➄プレビューボタンの フォームを取得時にマクロ1、フォームの喪失時にマクロ2を設定する。
  マクロ1,2はフォーカスが当たった時に標題の文字の書式を変更するマクロです。
➅開く時に最大化する
  Private Sub Report_Open(Cancel As Integer)
     DoCmd.Maximize
  End Sub
➆閉じる時に元に戻す
 Private Sub Report_Close()
   DoCmd.Restore
 End Sub
開く時に「最大化」し、閉じる時に「元に戻す」イベントは、レポートを開いたときの手間を省いています。ちょっとしたことですが操作性が上がります。

⑵簡易イベント版雇用契約書原紙

簡易版雇用契約書原紙
太い下線の箇所が記入すべき契約内容です。
赤い文書は貴社で決定されている規約事項です。適宜修正してください。

3.8 契約履歴の印刷

契約明細テーブルを社員毎にグループ化して印刷します。

⑴印刷指定画面

➀プレビューボタンはコマンドウィザードで作成。
   レポートの操作は「レポートのプレビュー」で、レポート名は「契約履歴一覧表」、
   文字列は「プレビュー」、ボタン名は 「CmPrt」 としました。
➁フォーカス取得時にマクロ1、フォーカス喪失時にマクロ2 を登録。

⑵契約履歴一覧表(レポート)を作成

レポートウィザードから、契約明細を社員番号でグループ化しブロックレイアウトを選択します。
契約明細からの選択フィールドは、
社員番号、契約日、契約開始日、契約終了日、時給単価、就業場所、職務内容です。
下記のような帳表が作成されます。

⑶個人情報テーブルを追加し契約明細の社員情報と連結し、抽出条件を設定する。

➀個人情報のテーブルを追加し、個人情報の社員番号から契約明細の社員番号に向かって連結します。
   個人情報テーブルが優先で、SQL文は、INNER JOIN となりますが LEFT JOIN に修正してください。
   契約明細がなくても個人情報に登録されている社員番号は印字するようにします。
➁契約明細の印刷フォームで指定した条件を抽出条件に設定する。
  社員番号:>=[forms]![契約明細の印刷].[st1] And <=[forms]![契約明細の印刷].[ed1]
  在職区分:>=[forms]![契約明細の印刷].[st2] And <=[forms]![契約明細の印刷].[ed2]
                    SQL文にWHERE文が追加されます。
  
SELECT 個人情報.社員番号, 個人情報.氏名, 個人情報.在職区分, 契約明細.*, 契約明細.契約日
FROM 個人情報 INNER JOIN 契約明細 ON 個人情報.社員番号 = 契約明細.社員番号
WHERE (((個人情報.社員番号)>=[forms]![契約履歴の印刷].[st1]
                       And (個人情報.社員番号)<=[forms]![契約履歴の印刷].[ed1])
    And ((個人情報.在職区分)>=[forms]![契約履歴の印刷].[st2]
                      And (個人情報.在職区分)<=[forms]![契約履歴の印刷].[ed2]))
ORDER BY 個人情報.社員番号, 契約明細.契約日;
契約明細の選択の⑶開くときにイベントプロシジャーを発生させて、個人情報テーブルを追加した段階のSQL文に、where以下の抽出条件文を追加してから、レポートのレコードソースに登録しても同じです。

⑷レポートの編集

➀プロパティの編集
   規定のビュー=印刷プレビュー 、 ポップアップ=はい
➁開く時に最大する。
   Private Sub Report_Open(Cancel As Integer)
     DoCmd.Maximize
   End Sub
➂閉じる時に元に戻す。
   Private Sub Report_Close()
     DoCmd.Restore
  End Sub
➃在職区分「可視=いいえ」、 内容を表示するテキスト「区分名」を追加
    区分名のコントロールソース=Iif(在職区分=1,"在職","退職") と登録します。
           条件がTrue なら在職、False なら退職 と表示します。
➄就業場所「可視=いいえ」、内容を表示するテキスト「就業場所名」を追加
    就業場所名のコントロールソース=就業場所.Column(1) と登録します。
➅職務内容「可視=いいえ」、内容を表示するテキスト「職務内容名」を追加
   職務内容名のコントロールソース=職務内容.Column(1) と登録します。

3.9 ログイン

起動時にパスワードの入力を求めます。登録したパスワードと一致した場合にメニューを開きます。

⑴フォームの作成

➀「空白のフォーム」クリックし、そのまま、テキストボックスとコマンドボタンを作成。
   テキストボックス名は「pass」、ラベルの標題は「password」としました。
   入力中の文字列は非表示にするため、定型入力で「パスワード」を選択します。
   入力文字は「*」になります。
  書式設定: レコードセレクタ=いいえ、移動ボタン=いいえ、区切り線=はい、ポップアップ=はい
➁コマンドボタンは、名前と標題は「ログイン」とし、クリック時にプロシジャーを設定。

⑵ログインのクリック時のプロシジャー

➀エラーが発生した場合は➄へジャンプ
➁未入力の場合は、エラーメッセージを表示して終了
➂wk=Dlookup("ID","PASSTABLE","password= '" & me.pass & "'")
   Dlookup: PASSTABLE に入力された値(Me.pass)の ID を検索します。
     検索値が文字列の場合は、「 ' 」を前後に付けます。
     検索値がテーブルに存在しない場合は、 null が返されます。   
    Nullの場合は、再度パスワードの入力へ戻ります。
DoCmd.Close:loginn フォームを閉じる。
  DoCmd.OpenForm "MENU",acNormal  : メニューフォームを開く。
➄エラーが発生した場合は、エラーの内容を表示して終了。

3.10 MENU

メニューを作成します。

➀「フォームデザイン」からヘッダー領域とフッター領域を追加。
  書式設定: レコードセレクタ=いいえ、移動ボタン=いいえ、区切り線=はい、ポップアップ=はい
➁タブコントロールを詳細領域に展開する。
   タブは2ページ作成されますが、今回は1ページにすべてのメニューを登録していますので
   2ページ目は削除してください。 
   ページ1の標題に「MENU」と登録します。
➂メニューに各「フォームを開く」コマンドボタンを配置する。
   フォーム名は文字コードで登録されており、わかり難いので修正した方がいいと思います。

➃終了ボタンでシステム(Access)を終了。
  ボタンの種類は「アプリケーション」、操作は「アプリケーションの終了」、文字列は「終了」です。
  Accessを閉じます。

3.11  オプションに起動フォームとアイコンを登録

最後に、起動した時に「login」フォームが開くように設定します。
アイコン画像は bmp ファイルも指定できます

いかがでしょうか? Access の機能だけでシステムを作成するのはちょっとしんどいですね。
操作性や外観にも多少こだわったためVBAコードも使用していますが、参考にしていただければ嬉しいです。
ご不明な点や疑問等ございましたらメールをください。よろしくお願いします。