• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:更新クエリがシンプルにできるようなのですがわかりません。)

社員マスタの更新クエリをシンプルにする方法とは?

このQ&Aのポイント
  • 社員マスタの更新クエリをシンプルにする方法についてわかりません。何か良い方法があれば教えてください!
  • 社員マスタのトグルボタンをクリックすると、サブフォームが開きます。退社日を入力すると、サブフォームの最後のレコードの終了日に自動で入力したいです。
  • 社員マスタの更新クエリを改善する方法を教えてください。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

下記質問の回答者です: http://okwave.jp/qa/q6086415.html No.7の回答にも後から画像にて追記しましたが、残念ながら 「フォームでのレコード並び順による、前(または後)レコード の連動更新」では、そちらの環境でのエラーをこちらのPCで 再現できなかったため(汗)、別のアプローチを回答します。 > 更新クエリがシンプルにできるようなのですがわかりません。 確かに、ある条件を満たす場合は、更新クエリでシンプルに 対応できますが、そのためには「現在編集中のレコード」に 対して「直前(又は直後)のレコード」を特定できるフィールド が必要です。 ※通常は「開始日/終了日」で前後が特定できるはずと   考えますが、今回はその「開始日/終了日」の修正、   という事態を想定してのコードになるので、残念ながら   このフィールドは使用できない、と判断します。  (職歴の話なので、「2010/9/6」を「2010/9/7」とした   程度なら前後関係は変わりませんが、「2001/9/6」と   していた、といった場合は前後関係の逆転もありうる、と) フィールド構成はこちらのご質問を参考としました: http://okwave.jp/qa/q5843834.html ですので、更新クエリでシンプルな対応を可能にするには、 「前/後」を特定可能にするための、社員ごとに履歴順に 連番が割り当てられる「SubID」といったフィールドの新設が 必要になります。 これがあれば、更新クエリに以下のような条件を指定すれば すぐ前の職歴の終了日を更新できるようになります: 『社員コード』の『抽出条件:』欄:  [Forms]![社員マスタFRM]![社員コード] 『SubID』の『抽出条件:』欄:  DMax("[SubID]", "社員履歴TBL", "[社員コード]='" & [Forms]![社員マスタFRM]![社員コード] & "' And [SubID]<" [Forms]![社員マスタFRM]![SubID])  ※社員コードが文字列型の場合(SubIDは確実に数値型として)。 『終了日』の『レコードの更新:』欄:  DateAdd("d",1,[Forms]![社員マスタFRM]![開始日]) 但し、データベースへのデータ入力がこれから始まるなら 問題ありませんが、既に多くのデータが蓄積されている 場合、既存のレコードにどうやってこの連番を振るか、 という問題が発生します(汗) (開始日/終了日を信用して、それを元に割り当ててしまっても  よいなら、マクロ/VBAで割り当てることは可能ですが・・・:  ループ処理が発生するので、これも複雑と感じられてしまう  可能性もあります(汗)) ・・・開始日/終了日の修正頻度がそれほど高くはないはずの ことを考慮すると、そこまで労力を掛けてつけるだけの価値が ある機能か、という検討もしてみた方がいいかもしれません(汗) ※開始日/終了日の修正幅が数日しかないと考えてよいよう   なら、上記で『SubID』としたところを、『開始日』か『終了日』   に置き換えてやっても構わないことになります。 ◆本ご質問の「退社日を最終日に反映」についても、  「現在入力済みの開始日で最も遅いもの」を最終履歴として  判断してよいなら、『開始日』の抽出条件欄に  DMax("[開始日]", "社員マスタTBL", "[社員コード]='" & [Forms]![社員マスタFRM]![社員コード])  としてやればOkです。  (上と同様に『社員コード』への抽出条件も必要:   入れないと全社員が更新対象になってしまうので要注意(汗)) ※クエリでの更新結果は、そのままでは即座にはフォームに   反映されませんので、コントロールの再クエリが必要です。   (「Me!終了日.Requery」といった感じ)

noname#137913
質問者

お礼

ありがとうございます! SubIDフィールドを作成しました。 更新クエリに抽出条件を入力するとSubIDのところで 指定した式の構文が不正です。 となります・・・ 既に多くのデータが保存されていますが、全てにSubIDをふる覚悟です(^0^) 開始日/終了日を入力する時に開始日と前勤務先の終了日のずれは必ず一日なので、自動入力されれば・・・という考えからなので、修正幅は小さいと思います。 SubIDを開始日に置き換えて進めてみます。

その他の回答 (2)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.2

更新クエリを実行するタイミング 更新値はフォームの入力値 この2点をクリアできれば・・・かと思ってます。 フォームの入力値、については ビルドを使えば、forms!フォーム名.オブジェクト名・・・・と生成できるので これを使います。 モジュールでのテーブル更新は、こういうのもあります。 (科目別点数テーブルで点数≧80に"合格"、以外に"不合格"とセットする) Public Function 合否判定更新() Dim MYDB As Database Dim MYRST As Recordset Dim MYRST2 As Recordset Set MYDB = CurrentDb Set MYRST = MYDB.OpenRecordset("科目別点数", dbOpenDynaset) MYRST.MoveFirst Do Until MYRST.EOF MYRST.Edit If MYRST!点数 >= 80 Then MYRST!合否 = "合格" Else MYRST!合否 = "不合格" End If MYRST.Update MYRST.MoveNext Loop MYRST.Close End Function 良い方法、解決策というよりは 使えるかもしれない機能のヒントということで・・・・。 サブフォームでの更新については ネットでも問い合わせ多い事項ですから探してみると良いです。 こちらでも整理してみます。

noname#137913
質問者

お礼

ありがとうございます! 教えていただいた用にモジュールを作成することだけで対応できたら希望どおりです。 まだどこに何を代入して応用したらいいのか分からないので本とHPを見つつ進めてみます!

  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

フォームの値をクエリの抽出条件に使うテクニックがあります。 応用で 社員マスタフォームの退社日を使って、社員マスタサブフォームのレコードソースの終了日値を更新させる。 何がどう複雑でシンプルと思っているイメージは何?を提示しないと何とも答えようがない感じです。

noname#137913
質問者

お礼

ありがとうございます! コードを書いたり、マクロを作成するのは複雑で、更新クエリを作成するのがシンプルと感じていました・・・ 社員マスタフォームの退社日を使って、社員マスタサブフォームのレコードソースの終了日値を更新させる方法を教えていただきたいです!