• ベストアンサー

MicrosoftAccess2000「社員管理システム」退社日を他のフォームに反映させたいです。

MicrosoftAccess2000「社員管理システム」を使用しています。 社員の退社日を入力した時に、その日付を社員履歴(派遣先履歴) の最後の終了日に反映させたいです。 社員基本TBL内に退社日 社員履歴TBL内に終了日 社員履歴QUE内に終了日 社員マスタFRMに退社日 社員マスタサブフォームに終了日 があります。 退社日は必ず社員履歴の最後の終了日と同じになるので反映させたいです。 情報不足だと思うので申し訳ないのですが宜しくお願い致します!!

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

その退社日は、どこから入力されているのでしょうか。 実体に設定すれば、後はクエリ、フォーム等は再クエリ操作で更新されます。 ということは、 社員基本TBL内に退社日 社員履歴TBL内に終了日 について考えればよいのでは? テーブル構成、タイミングが全くわからないので、雰囲気になりますが、 社員基本TBL内に退社日を設定したタイミングで、 更新クエリで社員履歴TBL内に終了日を設定すればよいと思います。 UPDATE 社員履歴TBL SET 終了日 = 退社日に設定した日 WHERE XXXXXX; WHERE の XXXXXX 部分に、その人/履歴の最後を特定する条件を指定します。 ご質問の解釈を少し変えてみます。 単票フォームにサブフォームの構成になっていて、 サブフォーム側のレコードソースが、 社員履歴TBLをベースに単票フォーム側のコントロールを参照抽出するクエリ 社員履歴QUEが指定してあり、帳票フォームとして作っている。 単票フォームのレコードソースは、社員基本TBLになっている。 単票フォーム側にある「退社日」を入力した時点で、 サブフォーム側の最後の終了日に値を設定したい。 としてみます。 サブフォーム側の表示順は、どのような順なのかはわかりませんが、 最後(最終行)の終了日に設定するものとします。 サブフォームコントロール名を「FSUB」と仮定します。 サブフォーム側に記述するもの) Public Sub SetLastDay()   Me.Recordset.MoveLast   Me.終了日 = Me.Parent.退社日 End Sub 親フォーム側に記述するもの) Private Sub 退社日_AfterUpdate()   Call Me.FSUB.Form.SetLastDay End Sub 親フォームの「退社日」の更新後処理で、サブフォーム側に記述した関数を呼び出します。 呼び出された関数内では、レコードを最後に移動させてから、親の退社日を終了日に設定します。 (親からみれば子でどんな順になっているか知りたくもない。 変更された時点で関数呼ぶので、最後/最初など、後は好きにして・・・ってな感じで) 退社日に入力があると最後の終了日に値が設定されますが、双方でレコード確定動作が起きるようです。 エラーとかあった場合の動作など見ていないので、使えるものなのかは検証してください。 (たまたま動いているように見えているだけかも) (サブフォーム側に表示しているものがなければエラーになる・・・など) 退社日の更新後処理ではなく、フォームの更新後処理でも良いと思います。 関数名等は適宜変更してください。 なお、親フォームが面倒をみるのなら Private Sub 退社日_AfterUpdate()   With Me.FSUB.Form     .Recordset.MoveLast     .終了日 = Me.退社日   End With End Sub でも良いかも。 解釈/仮定が違ってましたら、補足してください。 (かなりの情報が不足しています)

noname#137913
質問者

お礼

30246kikuさんありがとうございます! 退社日は社員マスタFRMから入力しています。 退社日反映クエリ フィールド:退社日 テーブル:社員基本TBL レコードの追加:終了日 抽出条件に UPDATE 社員履歴TBL SET 終了日 = 退社日に設定した日 WHERE XXXXXX;退社日に設定した日 WHERE XXXXXX; を入力したところ フィールド:"UPDATE 社員履歴TBL SET 終了日" 抽出条件:"退社日に設定した日 WHERE XXXXXX;" という新しい列ができました。 社外社員名簿QUEは現在の社員の勤務先のみ表示されるのでここからXXXXXXに入れる条件を探したのですがわからなかったのでまず二つ目の方法に移りました。 単票フォーム(社員マスタFRM?)のレコードソースは社員基本QUE(社員基本TBL,社員住所TBL)です。 サブフォームコントロール名は「ToggleLink」なので以下のようにしました。 社員マスタサブフォーム Public Sub SetLastDay() Me.Recordset.MoveLast Me.終了日 = Me.Parent.退社日 End Sub 社員マスタFRM Private Sub 退社日_AfterUpdate() Call Me.ToggleLink.Form.SetLastDay End Sub 上記のようにして退社日を入力すると".Form"が反転して コンパイルエラー: メソッドまたはデータメンバが見つかりません。 となります。 Private Sub 退社日_AfterUpdate()   With Me.ToggleLink.Form     .Recordset.MoveLast     .終了日 = Me.退社日   End With End Sub とした場合も同じ結果でした。情報不足で申し訳ありませんが宜しくお願いします!!

noname#137913
質問者

補足

30246kikuさんありがとうございます! 初心者の為、御礼補足等が前後してしまって申し訳ありません・・・ UPDATE 社員履歴TBL SET 社員履歴TBL.終了日 = 退社日  WHERE ((("WHERE 社員履歴TBL ")=(select max(終了日) from 社員履歴TBL))); 上記のようなSQLを作ってみましたがうまくいきません・・・ 宜しくお願いします!

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

回答の中で、 http://www.mahoutsukaino.com/ac/ac2002/ac2002/kihon2/006.htm のサブフォームの形式をデータシートといいましたが、 帳票形式です。訂正します。

noname#137913
質問者

お礼

piroin654さんありがとうございます!! (1)フォームを作っていないので手順はわかりません・・・ メインフォームは単票フォーム サブフォームは帳票フォーム です。 (2)funcAGEに数式を変更しました。 (3)社員履歴QUEは社員TBLではなく所属TBLと社員履歴を繋げる為かと思います。 言い間違えたので申し訳ないです・・・ 以上。宜しくお願いします!!

noname#137913
質問者

補足

piroin654さんありがとうございます! 更新クエリについて勉強しながら以下の構文を作ってみました。 UPDATE 社員履歴TBL SET 終了日=退社日 WHERE LAST([終了日]) そうすると以下のエラーになります。 “WHERE句で集計関数を使用することはできません。” またご回答お願いします・・・

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

追加しておきます。 funcAGEは社員基本QUEの中の、 >生年月日/社員基本TBL >現在の年令: 年令([生年月日]) のところの、 >現在の年令: 年令([生年月日]) を、 現在の年令: funcAGE([生年月日]) にしてください。 以上です。

noname#137913
質問者

お礼

piroin654さんありがとうございます!! funcAGEに更新後、メインフォームとサブフォーム両方にコードを書く方法とメインフォームのみに書く方法と、両方試しましたが、共に".Form"の部分が反転し コンパイルエラー: メソッドまたはデータ メンバが見つかりません。 となります。 確かにToggleLink.と入力した後で出てくる候補にFormはありません。 名前:ToggleLink 標題:履 歴 クリック時イベント Sub ToggleLink_Click() On Error GoTo ToggleLink_Click_Err Me![確定].Enabled = False If ChildFormIsOpen() Then CloseChildForm Else OpenChildForm FilterChildForm End If ToggleLink_Click_Exit: Exit Sub ToggleLink_Click_Err: MsgBox Error$ Resume ToggleLink_Click_Exit End Sub となっているのでサブコントロール名をToggleLinkにしたのですが、これが間違っているのでしょうか・・・ 以上。宜しくお願いします!!

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

遅くなりました。一つ一つ疑問点問題点をあたっていきます。 まずはNo1の二つの補足から。 (1) まず、フォームの形式ですが、フォームはメインとサブ があるようですが、ごく簡単にフォームを作ったときの 手順を教えてもらえますか。後の混乱を避けるために 必要です。 たとえば、メインフォームにサブフォームコントロール を設定。サブフォームになるフォームを別に作成。 サブフォームにレコードソースを設定。サブフォームに テキストボックスを置き、コントロールソースを 設定。サブフォームの形式をデータシートに設定。 メインフォームのサブフォームを表示するコントロールの ソースオブジェクトにサブフォームを指定。 このような感じです。フォームの形式はプロパティの 既定のビューに表示されています。メイン、サブの 両方について教えてください。 たとえば、メインとサブの関係は以下の下にあります。 http://www.mahoutsukaino.com/ac/ac2002/ac2002/kihon2/006.htm この場合のサブフォームの形式はデータシート形式です。 サブフォームに一人の社員しか表示しない場合は、 単票形式でもできますが、そのようになっている のでしょうか。 (2) >式に未定義関数’年令’があります。 年齢計算の方法は以下の、 マイクロソフトの年齢計算 http://support.microsoft.com/kb/401946/ja にありますが、関数名に年令などを使うとエラー が起こるので以下のようにしてください。 年令という関数名を使っている箇所はfuncAGE にしてください。また、関数の引数に日本語を 使う必要はありません。生年月日ではなく、 単純にmyBDでもiいいのです。 Function funcAGE(Birth_Day As Variant) As Variant Dim varAge As Variant If Not IsNull(Birth_Day) Then If IsDate(Birth_Day) Then varAge = DateDiff("yyyy", Birth_Day, Now) If Date < DateSerial(Year(Now), Month(Birth_Day), Day(Birth_Day)) Then varAge = varAge - 1 End If Else funcAGE = "0" Exit Function End If Else funcAGE = "0" Exit Function End If funcAGE = varAge End Function これを変更してみてください。エラーが解消されるか 確認してください。 (3) >社員履歴QUEは社員TBLと社員履歴TBLを所属コードで >繋げる為に作っているのかなと思います。 社員を特定するのは所属コードではなく、社員コード でなければならないのでは?このあたりも今後の やり取りで問題になるかもしれないので、頭の 中にいれておいてください。 以上、まずはこれからです。

noname#137913
質問者

お礼

piroin654さんありがとうございます!! SQLについて何も知らなかったのでとばしてしまったのですが、クエリのビューの一つなんですね!! どこに記入するかが分かったので、以下のように考えています・・・ update 社員履歴TBL set 終了日 = 退社日 WHERE句で今社員マスタFRMで開いている社員の最後のレコードを示す方法がわかりません・・・ 宜しくお願いします!!

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

Private Sub cmd退社日_Click() Forms!社員マスタFRM!社員マスタサブフォーム!終了日 = Forms!社員マスタFRM!tx退社日 Forms!社員マスタFRM!社員マスタサブフォーム.Form.Refresh End Sub のほうが保存処理がスマートかも。 スベッタかな、アタッタかな。

noname#137913
質問者

お礼

piroin654さんありがとうございます! Private Sub cmd退社日_Click() Forms!社員マスタFRM!ToggleLink!終了日 = Forms!社員マスタFRM!退社日 Forms!社員マスタFRM!ToggleLink.Form.Refresh End Sub 上記のようにした後で確認のために社員マスタFRMを開こうとすると 式に未定義関数’年令’があります。 アクションの実行エラー マクロ名:マスタメンテ選択MCR抽出OK 条件:true アクション名:フォームを開く 引数:社員マスタFRM,フォーム ビュー,,,,標準 となります。年令についてですが、以前からユーザー定義(標準モジュール)で下記のようにしてあります。 Function 年令(生年月日) As Integer If IsDate(生年月日) = True Then [年令] = DateDiff("yyyy", [生年月日], Date) If Date < DateSerial(Year(Date), Month([生年月日]), Day([生年月日])) Then [年令] = [年令] - 1 End If End If End Function アクセスの勉強をしておきますのでご回答お願い致します!

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

情報がまったく少ないので、推測で、 メインフォームにtx退社日というテキストボックス。 社員マスタサブフォームに終了日というフィールド があるとします。 メインフォームにボタンを一つ作り、名前をmcd退社日 とします。そのボタンのクリック時のイベントに、 Private Sub cmd退社日_Click() Forms!社員マスタFRM!社員マスタサブフォーム!終了日 = Forms!社員マスタFRM!tx退社日 End Sub で、サブフォームのカレントになっているレコードの 終了日フィールドに退社日が入力されます。 この場合のカレントとはサブフォームがデータシート 形式などの場合、黒い矢印が当たっているレコードの 並びを指します。 コード中の社員マスタサブフォームはサブフォーム そのもの名前ではなく、メインフォームのサブフォームを 表示するコントロールの名前です。この場合は サブフォームの名前と同じにしていると 仮定しています。 社員履歴QUEは何のために作っているのか。 メインフォームの構造と、レコードソース。 サブフォームの構造と、レコードソース。 などが記載されていないと回答する側も なんだかな、という感じです。 大スベリ?それとも大アタリ?

noname#137913
質問者

お礼

piroin654さんありがとうございます! 社員マスタFRMのレコードソースは以下の社員基本QUEで、全て表示しています。 フィールド/テーブル/並べ替え/抽出条件/または 社員コード/社員基本TBL/昇順/Between [Forms]![抽出FRM]![社員コード1] And [Forms]![抽出FRM]![社員コード2]/ Between [Forms]![抽出FRM]![社員コード1] And [Forms]![抽出FRM]![社員コード2] 氏/社員基本TBL 名/社員基本TBL 氏カナ/社員基本TBL//Like [Forms]![抽出FRM]![検索カナ]/ Like [Forms]![抽出FRM]![検索カナ] 名カナ/社員基本TBL//Like [Forms]![抽出FRM]![検索名カナ]/ Like [Forms]![抽出FRM]![検索名カナ] 性別/社員基本TBL 本籍/社員基本TBL 生年月日/社員基本TBL 現在の年令: 年令([生年月日]) 入社日/社員基本TBL 退社区分/社員基本TBL//[Forms]![抽出FRM]![在籍区分1]/ [Forms]![抽出FRM]![在籍区分2] 退社日/社員基本TBL 分野区分/社員基本TBL 雇用保険被保険者番号/社員基本TBL 基礎年金番号/社員基本TBL 健康保険番号/社員基本TBL 配偶者区分/社員基本TBL 郵便番号/社員住所TBL 住所1/社員住所TBL 住所2/社員住所TBL 電話区分/社員住所TBL 電話番号/社員住所TBL 携帯電話番号/社員住所TBL 緊急連絡先区分/社員住所TBL 緊急連絡先郵便番号/社員住所TBL 緊急連絡先住所1/社員住所TBL 緊急連絡先住所2/社員住所TBL 緊急電話番号/社員住所TBL メインフォームにcmd退社日を作り、そのボタンのクリック時のイベントに以下を入力しました。 Private Sub cmd退社日_Click() Forms!社員マスタFRM!ToggleLink!終了日 = Forms!社員マスタFRM!退社日 Forms!社員マスタFRM!ToggleLink.Form.Refresh End Sub 社員マスタサブフォームでカレントになる(今入力できる?)レコードが最初のレコードなのでその設定を最後のレコードに変えたいです。 社員マスタサブフォームのレコードソースは以下の社員履歴QUEで全て表示しています。 フィールド/テーブル/並べ替え 社員コード/社員履歴TBL/昇順 開始日/社員履歴TBL/昇順 終了日/社員履歴TBL 社内区分/社員履歴TBL 所属コード/社員履歴TBL 役職名/社員履歴TBL 内線電話番号/社員履歴TBL 呼出詳細/社員履歴TBL 所属名/所属TBL 部署名/所属TBL 今の状況でcmd退社日をクリックすると実行時エラー’451’: property letプロシージャが定義されておらず、property getプロシージャから オブジェクトが返されませんでした。となり Forms!社員マスタFRM!ToggleLink!終了日 = Forms!社員マスタFRM!退社日 が反転します。 宜しくお願いします!

noname#137913
質問者

補足

社員マスタFRMに退社日というテキストボックスがあります。 社員マスタサブフォームに終了日というテキストボックスがあります。 コマンドボタン(cmd退社日)を作成しイベントは下記のようにしました。 Private Sub cmd退社日_Click() Forms!社員マスタFRM!社員マスタサブフォーム!終了日 = Forms!社員マスタFRM!退社日 End Sub <サブフォームのカレントになっているレコードの 終了日フィールドに退社日が入力されます。 この場合のカレントとはサブフォームがデータシート 形式などの場合、黒い矢印が当たっているレコードの 並びを指します。> とのことでしたがIT辞典などで調べ、カレントはファイルのようなものだと理解したのですが黒い矢印などは心当たりがありません・・・ サブフォームを表示するコマンドボタンは以下のようになっています。 名前 ToggleLink 標題 履歴 クリック時イベント Sub ToggleLink_Click() On Error GoTo ToggleLink_Click_Err Me![確定].Enabled = False If ChildFormIsOpen() Then CloseChildForm Else OpenChildForm FilterChildForm End If ToggleLink_Click_Exit: Exit Sub ToggleLink_Click_Err: MsgBox Error$ Resume ToggleLink_Click_Exit End Sub 社員履歴QUEは社員TBLと社員履歴TBLを所属コードで繋げる為に作っているのかなと思います。 社員マスタFRMのレコードソースは社員基本QUEで、社員マスタサブフォームのレコードソースは社員履歴QUEです。 説明不足で申し訳ありませんが宜しくお願い致します!!

すると、全ての回答が全文表示されます。

関連するQ&A