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

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

3.5 契約明細の登録

⑴概略フローと画面

(2)フォームを作成する

Myパートの契約管理(フォーム1)を参考にして下さい。

➀フォームウィザードで契約明細テーブルから作成。
 規定ビュー:単票、レコードセレクタ:いいえ、区切り線:はい、移動ボタン:いいえ、
ポップアップ:はい
➁社員番号は使用不可。(社員は社員一覧からダブルクリックで選択するようにしています)
 選択された社員番号の、氏名、在職区分を表示するテキストボックスを設ける。
氏名ボックスには個人情報テーブルから氏名を検索して表示するコードを記述する。
コントロールソース=DLookUp("氏名","個人情報","社員番号= " & [社員番号])
同様に在職区分ボックスにもコードを登録する。
コントロールソース=DLookUp("在職区分","個人情報","社員番号= " & [社員番号])
➂ListBoxで個人情報テーブルから社員一覧リストを作成する。
表示項目は、社員番号、氏名、在職区分。社員番号の昇順。 連結列は1(社員番号)
➃ListBoxで契約明細テーブルから契約一覧リストを作成する。
表示項目は、社員番号、契約日、契約開始日、契約終了日 。
社員番号、契約日の昇順。連結列は2(契約日)
➄クエリービルダーを開いて抽出条件に社員番号を設定する。(下記の図)
選択された社員のみの明細を表示します

クエリービルダーで設定した内容はSQL文に変換されます。SQLビューで確認できます。
➅休日の入出力用に7つのチェックボックスを作成する。
チェックボックス名は、w1~w7 とし、それぞれ順に月曜日から日曜日に対応させます。
W1(=月)、W2(=火)、w3(=水)、w4(=木)、w5(=金)、w6(=土)、w7(=日)
休日はON(true)、出勤日はOFF(false)です。

チェックボックスはテーブルと連結していませんので、レコードに保存したりレコードから展開するため、コードを書く必要があります。かなり面倒ですが、ここは操作性を重視しました。
コードは⑶標準モジュールにFunction コードコードを作成 で記述しています。

➆フィールドの休日ボックスは非表示にする。フィールドと連動しているラベルも非表示になってしまいます。
改めて休日ラベルを作成してください。

➅就業場所はコンボボックスの値リストから、場所名を表示するテキストボックスを追加する。
就業場所名=[就業場所].[column](1)
(就業場所のコンボボックスの2列目(1列目はゼロ)です)
➆フッターに、レコードの保存、元に戻す、削除、追加、とフォームを閉じる、ボタンを作成。
 更に、契約の更新ボタンと契約書の印刷ボタンを作成する。

保存ボタン追加ボタンは埋め込みマクロを編集します。
契約の更新ボタン契約書の印刷はイベント処理を記述します。

(3)標準モジュールにFunctionコードを作成

⑶‐1 Holidaysave Function(チェックボックスの内容を休日フィールドに保存)

➀Dim :変数を定義します。
wno As Control:w1からw7までのチェックボックスを順に操作するためのコントロール。
i As Integer:7回繰り返し処理を行うためのカウント。
Integer は正整数で、-32768 ~ 32767 です。
wkholiday As String:変換された文字列の保存ワーク。
➁wkholiday=""
順に1文字ずつ追加していくため最初は空白(文字数がゼロ)の状態にしています。
➂"w"+Right$(Str$(i),1)
チェックボックス名の w1,w2,w3,w4,w5,w6,w7 を作り出しています。
i は1~7までのカウントで、Str$ で数値を文字列変換しています。
変換すると前にサインが付加されますので2文字になります。Right$で右の1文字を
取り出し、"w" に連結してチェックボックスの名前を生成しています
Set wno=Forms![契約明細の登録].Contros(w-) (w1~ w7まで変化)
Forms![契約明細の登録]は「契約明細の登録」という名前のフォームを指しています。
「.Controls(w-)」で、そのフォームのコントロールを「wno」で定義しています。

これで、チェックボックス w1と、i が 1 の時の wno は同じチェックボックス
指すことになります。
wno=true (チェックボックスが ON)の場合は"1"、False の場合は"0"に変換して
wkholidayに追加保存する作業を7回繰り返しています。
(文字の加算は後ろに追加されていきます。)
➃7回行った結果の wkholiday を休日フィールドに保存。

⑶‐2 Holidaydisp Function(休日フィールドをチェックボックスに展開する。)

➀Dim:変数を定義します。
wno As Control:w1からw7までのチェックボックスを順に操作するためのコントロール。
i As Integer:7回繰り返し処理を行うためのカウント。
➁Set wno = Forms![契約明細の登録].Controls(w-) (w1~W7まで変化)
Holidaysave Functionと同様に、チェックボックス(w1~W7)を wno に順に定義します。
Mid$(Forms![契約明細の登録].休日,i,1):
Mid$ で 変数(この場合は休日)の指定位置から指定文字数を取り出しています。
休日フィールドのi番目の1文字が、"1"ならチェックボックスをON、"0"ならOFFに変換
する作業を7回繰り返しています。

⑷フォームプロパティの 読み込み時にイベントプロシジャーを設定

起動時には最終レコードに移動し社員一覧と契約一覧の該当行を反転する。

Private Sub Form_Load()
DoCmd.GoToRecord , , acLast '最終レコードに移動
Me.社員一覧 = Me.社員番号 '社員一覧リストの該当社員番号を反転
Me.契約一覧.Requery '契約一覧リストのクエリーを再実行
Me.契約一覧 = Me.契約日 '契約一覧リストの該当契約を反転
End Sub

社員一覧リストの連結列が社員番号なので、me.社員一覧=me.社員番号 で社員一覧リスト
の該当社員番号が選択されたことになり反転表示されます。
同様に契約一覧リストの連結列は契約日なので、me.契約一覧=me.契約日 としています。

⑸フォームプロパティのレコード移動時にイベントプロシジャーを設定

レコードの移動時には holidaydisp Function を実行する。
コードの表示時は必ずチェックボックスに展開する必要があります。
移動先が新規レコードの場合は、
社員リストをクリヤ、契約一覧を再表示、契約日は使用可能、後契約日にカーソルを移動、
既登録の場合は、契約日は使用不可で契約開始日にカーソルを移動します。

⑹社員一覧リストのダブルクリックにイベントプロシジャーを設定する

選択された社員の過去の履歴を契約一覧リストに表示する。
履歴がなければそのまま新規登録処理。

➀エラーが発生した場合は➆へジャンプする。
➁現在入力しているデータを無効にする。
レコードの保存は保存ボタンでのイベント処理でのみ行う仕様にしています
➂選択された社員コードを wkcode に保存し、新規レコードへ移動する。
新規レコードに移動すると、選択された社員番号が失われますので変数に保存しています。
➃改めて、wkcode に保存された社員コードで社員一覧と契約一覧を再表示する。
➄契約一覧にデータがない場合(選択された社員の過去の履歴がない)
退職者の場合は「退職者の新規契約は登録できません」と表示して終了する。
在職者の場合はそのまま新規登録の処理とする。
履歴が存在した場合は、選択された社員の最終レコードに移動する
➆エラーが発生した場合は、エラーの内容を表示させて終了する。

⑺契約一覧のダブルクリックにイベントプロシジャーを設定する

契約一覧からダブルクリックで選択された契約内容を表示する。

➀エラーが発生した場合は➅へジャンプする。
➁契約一覧のクエリーを再実行する。
➂契約一覧から選択された、社員番号を wkcode と契約日を wkdate に保存する。
最終レコードから移動して検索するため、変数に保存しています。
➃wk=Count("*","契約明細","社員番号 <=" & wkcode)
選択された社員番号の最終の契約明細の登録順番を計算して wk に保存しています。
   テーブルは社員番号、契約日順に保存されていますので、選択社員番号以下のレコード数が
選択社員の最終契約明細となります。
Access のレコードの移動機能は登録順を指定します
➄Docmd.GotoRecord,,acGoto,wk
WK番目(最終)のレコードに移動します。
Do Until Me.契約日=wkdate ~ Loop
条件(契約日)に一致するまで順に一つ前のレコードに移動しています
一致したら終わります。
➅エラーが発生した場合はイベントをキャンセルする

⑻契約更新ボタンのクリックイベントにプロシジャーを設定する

最終レコードから契約更新レコードを用意する。

➀エラーが発生した場合は➆へジャンプする。
➁現在の表示が新規レコードの場合は更新不可。(社員番号が選択されていない)
➂退職者の場合は新規追加は不可。
➃選択社員の最終レコードに移動し、最終レコードの契約終了日を保存する。
➄DateAdd("d",1,wkdate)
wkdate に "d"(日)を 1 加算する
最終契約日の翌日を新規契約の契約開始日として算出しています
➅新規レコードに移動し、社員番号と算出された契約開始日を表示する。
➆エラーが発生した場合は終了する。

⑼保存ボタンの埋め込みマクロの編集

退職者の更新を止め、holidaysave Function (休日フィールドに保存)を実行するプロシジャーを追加する。

⑽追加ボタンの埋め込みマクロを編集

退職者の追加処理を止める処理を追加する。

⑾契約書の印刷ボタンで契約書を印刷(プレビュー)する

➀現在のレコードを保存
Me.在職区分=9 (退職者)の場合
 DoCmd.RunCommand acCmdUndo
更新内容を無効とする。 保存マクロのイベントは終了します。
在職者の場合
  DoCmd.RunCommand acCmdSaveRecord
更新内容を登録する。
➁wksql = " (((契約明細.社員番号)=[forms]![契約明細の登録].[社員番号])"
wksql = wksql + " AND ((契約明細.契約日)=[forms]![契約明細の登録].[契約日]))”
wksql 文が長いので、途中で改行して、1行目と2行目を連結しています
wksql に印刷するレコードの条件(社員番号と契約日が等しい)を指定しています。
契約明細は、社員番号と契約日でユニークですので特定のレコードを指すことになります。
➂DoCmd.OpenReport "簡易版雇用契約書", acViewPreview, , wksql
レポート名は簡易版雇用契約書、➁で設定された条件のレコードをプレビューします。
(3.6 雇用契約書の印刷を参照)
➃エラーが発生した場合はそのまま抜け出す。

今は退職者の場合のみ更新ができないように制限をかけていますが、運用が慣れてきたら
契約日が過ぎた後の契約も更新できないようにした方がいいと思います。
〇契約日で制限する場合は、保存ボタンの埋め込みマクロに IF 文 を追加してください。
   if  forms![契約明細の登録].契約日 > Date() then
        msgbox(“契約確定後の当契約内容の変更はできません”)    ’ イベントの取り消し
    end if
Date() は本日を示す関数です
Now()からも本日の日付を取り出せますが、こちらは時間もついてきます
〇RecordsetType を変更して更新作業を止めることもできます。
   契約一覧のダブルクリックイベントに次の行を追加します。
  If CDate(Me.契約一覧.Column(2)) > Date Then      ’Date関数で本日と比較
     Me.RecordsetType = 2      ‘スナップショット       ’読み取りのみ
    Else
       Me.RecordsetType = 0       ‘ダイナセット            ’更新
 End If

3.6 雇用契約書の印刷

⑴レポートの作成

レポートウィザードを利用するとフォームと同様にテーブルのフィールドが配置されますが、雇用契約書を作成する作業には適していませんので、レポートデザインで空の状態から作成します。なお、契約書は簡易版で説明しています。
設計書通りの2枚の契約書を作成する場合も、埋め込むべきテキストは同じです。
埋め込むテキストはフィールド名を緑色にしています。
また、自社の規定による箇所は赤色にしていますので、適宜修正してください。

⑵レポートのプロパティを修正

レポートを開いたときに画面いっぱいにプレビューされるように、最大化します。(Maximize)
閉じるときには元に戻します(Restore)。
ちょっとしたことですが、プレビューした時に見やすくするための手間を省いています。

⑶レポートのレコードソースで使用テーブルとフィールドを指定する

➀レコードソースの(…)をクリックしてクエリービルダーを起動する。
➁テーブル一覧表が表示されるので、契約明細、個人情報、自社情報を選択して追加。
➂契約明細の社員番号は個人情報の社員番号に紐づけられているので、クリックで連結する。
➃テーブルをクリックして、契約明細を選択してフィールドは(*)すべてを選択
➄個人情報からは、氏名と住所1、住所2を選択。
➅自社情報からは、すべて(*)を選択。

⑷ヘッダーに選択フィールドを配置

地の文言はラベルで作成します。テーブルから埋め込んでいく箇所はテキストボックスを作成し、コントロールソースにフィールドを選択して指定していきます。

➀社名のテキストボックスを作成し、自社情報の社名を選択する。
コントロールソースの(…)をクリックするとクエリービルダーで選択した全フィールドが
表示されます。該当フィールドを選択してください。
同じフィールド名がある場合は、テーブル名がフィールド名の前に付加されています
➁氏名のテキストボックスを作成し、個人情報の氏名を選択する。

⑸詳細領域に選択フィールドを配置する

太い下線の箇所がテーブルから埋め込んでいくキストボックスです。

➀契約開始日と契約終了日は和暦で印刷。
書式設定は、「ggge¥年m¥月d¥日」と登録する
➁就業場所はコンボボックスで作成し、可視=いいえ とする。
契約書には別のテキストボックスを用意し、コントロールソースに「就業場所.Column(1)」
と登録する。
➂職務内容はリストボックスで作成し、可視=いいえ とする。
契約書には別のテキストボックスを用意し、コントロールソースに「職務内容.Column(1)」
と登録する。
➃就業開始時刻、就業終了時刻、休憩時間は 時:分 で印字
書式設定は 「時刻(s)」を選択
➆時給単価の書式設定は「標準」(3桁ごとにカンマ)を選択。

就業場所、職務内容、休日を「可視=いいえ」にしているのは、フィールドの値そのものは印字する必要がないからです。対応する値を取り出したり編集するためには配置しておく必要があるため見えなくして配置しています。
このようなボックスには指定するテーブル上のフィールドがありませんので、レコードソースには、「非連結」と表示されます。

⑹詳細領域のフォーマットにイベントプロシジャーを作成する

休日を曜日に変換するため、詳細タブの フォーマット時にイベントプロシジャーを設定する。

➀Const wkweek :固定値を定義
 曜日を漢字で用意しています。(空白を1文字追加していますので、1曜日は2文字です)
➁エラーが発生した場合は➄へジャンプ
➂休日フィールドから漢字の曜日に変換
  wkholiday="" : 1文字ずつ順に結合していくため最初は空白(文字数ゼロ)にします。
Mid$(me.休日,i,1) :休日フィールドの i 番目の1文字を取り出します。
  "1" なら、漢字の曜日に、"1"でなければ空白に置換しています。
 Mid$(wkweek,( i - 1) * 2 +1 ,2):
wkweek からは、1曜日が2文字なので、指定位置は 1,3,5,7,9,11,13 となり、
取り出す文字は2文字です。
7回繰り返し、「wkholiday」 に順次追加していきます。
➃契約書に「wkholiday」 を保存。
➄エラーが発生した場合はイベントをキャンセル

⑺フッター領域に選択フィールドを配置する

➀契約日は和暦で印字します。書式設定は、「ggge\年m\月d\日」 です。
印刷はプレビューです。確認後、2部必要なので部数を2に変更して印字してください。

ちょっと時間がかかってしまいましたが、次回は検索とメニューを予定しています。