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

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

更新クエリがシンプルにできるようなのですがわかりません。

更新クエリがシンプルにできるようなのですがわかりません。 何か良い方法があれば教えてください! 社員マスタFRM(単票フォーム)に以下のトグルボタンがあります。 標題 履 歴 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 上記のトグルボタンをクリックすると社員マスタサブフォーム(帳票フォーム)が開きます。 社員マスタFRMに以下のテキストボックスがあります。 名前 退社日 書式 yyyy/mm/dd 社員マスタサブフォームに以下のテキストボックスがあります。 名前 終了日 書式 yyyy/mm/dd 社員の退社日は最後の所属先の終了日と同じなので、 社員マスタFRMの退社日を入力したら、 その日付を社員マスタサブフォームの最後のレコードの終了日に自動で入力したいです。 更新クエリがシンプルにできるようなのですがわかりません。 何か良い方法があれば教えてください!

noname#137913
noname#137913

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

  • ベストアンサー
  • 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
質問者

お礼

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

関連するQ&A

  • access2000"社員管理システム"を利用しています。

    access2000"社員管理システム"を利用しています。 社員マスタサブフォームがあり、レコードソースは社員履歴QUE(社員履歴TBL、所属TBL)です。 社員コード 開始日 終了日 社内区分 所属コード 役職名 内線電話番号 呼出詳細 所属名 部署名 を入力していて、以下がコードです。 Sub Form_Load() On Error GoTo Form_Load_Err If ParentFormIsOpen() Then Forms![社員マスタFRM]!ToggleLink = True Form_Load_Exit: Exit Sub Form_Load_Err: MsgBox Error$ Resume Form_Load_Exit End Sub Sub Form_Unload(Cancel As Integer) On Error GoTo Form_Unload_Err If ParentFormIsOpen() Then Forms![社員マスタFRM]!ToggleLink = False Form_Unload_Exit: Exit Sub Form_Unload_Err: MsgBox Error$ Resume Form_Unload_Exit End Sub Private Function ParentFormIsOpen() ParentFormIsOpen = (SysCmd(acSysCmdGetObjectState, acForm, "社員マスタFRM") And acObjStateOpen) <> False End Function Private Sub 終了_Click() On Error GoTo Err_終了_Click DoCmd.Close Exit_終了_Click: Exit Sub Err_終了_Click: MsgBox Err.Description Resume Exit_終了_Click End Sub 終了日を入力したら次のレコードの開始日に終了日の翌日が自動的に入力されるようにしたいです。 宜しくお願いします!!

  • クエリデータの取り出し

    下記のようなコードを使い、データだけをEXCELファイルに出していますが、間違えてEXCELファイルを削除した場合データが出ません、 アクセスでEXCELファイルを作成し、クエリデータを出す事は可能でしょうか?初心者の為コードの使い方等々解りません、宜しくお願いします。 Private Sub コマンド62_Click() On Error GoTo Err_コマンド62_Click Dim stDocName As String stDocName = "集計" DoCmd.TransferSpreadsheet acExport, , "集計", "C:\Documents and Settings\user\デスクトップ\ABC\data2" Exit_コマンド62_Click: Exit Sub Err_コマンド62_Click: MsgBox Err.Description Resume Exit_コマンド62_Click End Sub

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

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

  • 入力した値が不正というよりイベントが違いそうなので教えてください!

    入力した値が不正というよりイベントが違いそうなので教えてください! 今までの質問等で社員管理システムの社員マスタサブフォームのコードに 以下を入力することはできました。 Private Sub 開始日_AfterUpdate() On Error GoTo エラー処理 '値を削除した場合は何もしない If IsNull(開始日) Then GoTo 終了処理 '『開始日』の前日の日付を『終了日』に設定 '(割り算扱いされるのを避けるため「#」で括る) Me!終了日.Value = "#" & DateAdd("d", -1, 開始日) & "#" 終了処理: Exit Sub エラー処理: MsgBox Err.Number & ":" & Err.Description, , Me.Name & "開始日" Resume 終了処理 End Sub Private Sub 終了日_AfterUpdate() On Error GoTo エラー処理 '値を削除した場合は何もしない If IsNull(終了日) Then GoTo 終了処理 '『終了日』の翌日の日付を『開始日』に設定 '(割り算扱いされるのを避けるため「#」で括る) Me!開始日.Value = "#" & DateAdd("d", 1, 終了日) & "#" 終了処理: Exit Sub エラー処理: MsgBox Err.Number & ":" & Err.Description, , Me.Name & "終了日" Resume 終了処理 End Sub これで終了日に日付を入力すると 2113:このフィールドに入力した値が不正です。 となるのを直したいです。 開始日と終了日は共に データ型 日付/時刻型 書式 yyyy/mm/dd です。 このイベントを作成する前はエラーにならなかったので 入力した値が不正というよりイベントが違いそうなので教えてください!

  • アクセス2000でのボタンのコードビルダ

    アクセス2000で、採用者のデータを管理しようと思っています。 フォームにボタンを作って、ボタンをクリックしたら条件を満たした者だけを表示する形にしたいのですが、「役職」(コード番号)と「所属」(コード番号)と「採用日」の3つを条件として、データの抽出を行いたいのですが、ボタンのコードビルダはどのようにしたら良いのでしょうか? ちなみに、ボタンの名前は「抽出採用日」でコードは下記のようになっています。 「役職」=13002「所属」=9999「採用日」=2001/04/01で検索したら、「クエリ式'[採用日[=#2001/04/01#AND[所属]='9999'#AND[役職]='13002'の日付の構文エラーです。」となります。 実際は、"&" や "#" の意味も良く分からないので、構文がどこで区切れるのかも分からない状態です。 どなたか、お教え下さい。 Private Sub 抽出採用日_Click() On Error GoTo Err_抽出採用日_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "印刷対象者フォーム" stLinkCriteria = "[採用日]=" & "#" & Format$(Me![採用予定日], "yyyy/mm/dd") & "#AND[所属]=" & "'" & Me![所属] & "'" & "#AND[役職]=" & "'" & Me![役職] & "'" 'stLinkCriteria = "[採用日]=" & "#" & Format$(Me![採用予定日], "yyyy/mm/dd") & "#AND[所属]=" & "'" & Me![所属] & "'" DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_抽出採用日_Click: Exit Sub Err_抽出採用日_Click: MsgBox Err.Description Resume Exit_抽出採用日_Click End Sub

  • 100問を超えたら終了ですのメッセージをだしたい(あくせす)

    Private Sub cmd次_Click() On Error GoTo Err_cmd次_Click DoCmd.GoToRecord acForm, "F_さあやってみよう", acNext If (Forms!F_さあやってみよう!txt番号 = 100) 'これだと100問になったときにメッセージがでてしまいます。100問を終了してボタンをクリックしたら 終了のメッセージを表示したいのですが、 101という番号はありません。 Then Beep MsgBox "終了です(*^。^*)", vbInformation, "終了" End If Exit_cmd次_Click: Exit Sub Err_cmd次_Click: MsgBox Err.Description Resume Exit_cmd次_Click End Sub よろしくお願いしますm(__)m

  • Access2000での複合条件検索

    前にも一回質問したんですが、どうしてもうまくいかないので、もう一回質問させていただきます。(すいません) Access2000での複合条件検索のコードビルダがうまくないようで、正しく動きません。 試験結果の集計なのですが、抽出するためのキーは「面接日」と「判定結果」です。 クエリには「面接日」と「総合判定コード」があります。 フォームには「試験日」と「判定結果」というテキストボックスがあります。 テキストボックスの「試験日」には日付、「判定結果」には1(=合格)か3(=不合格)を入れて抽出ボタンをクリックするのですが、構文エラーになります。 どこを、どう直したらいいのでしょうか? Private Sub 抽出ボタン_Click() On Error GoTo Err_抽出ボタン_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "印刷対象者フォーム" stLinkCriteria = "[面接日]=" & "#" & Format$(Me![試験日], "yyyy/mm/dd") & "#And[総合判定コード]=" & Me![判定結果] DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_抽出ボタン_Click: Exit Sub Err_抽出ボタン_Click: MsgBox Err.Description Resume Exit_抽出ボタン_Click End Sub

  • アクセスのVBAについて、フォームの On Error Goto についておしえてください。

    Private Sub cmd次_Click() On Error GoTo Err DoCmd.GoToRecord , , acNext Exit_Click: Exit Sub Err: MsgBox "この先にレコードがなくなると、ここをつうかするのだろうか。" Resume Exit_Click End Sub 一連の流れについて,ご解説ください。よろしくお願いいたします。

  • access vba 構文の解読

    access vba 構文の解読 はじめまして先ほどaccess2003について質問させていただいたものです。以下の構文が先ほどの続きです。こちらも皆様のお力で構文を解読していただけないでしょうか。 すみません解読とは、構文の一行一行が何を示しているのか教えていただけると助かります。 よろしくお願いいたします。 ' Exit the application. Case conCmdExitApplication CloseCurrentDatabase ' Run a macro. Case conCmdRunMacro DoCmd.RunMacro rs![Argument] ' Run code. Case conCmdRunCode Application.Run rs![Argument] ' Open a Data Access Page Case conCmdOpenPage DoCmd.OpenDataAccessPage rs![Argument] ' Any other command is unrecognized. Case Else MsgBox "不明なオプションです。" End Select ' Close the recordset and the database. rs.Close HandleButtonClick_Exit: On Error Resume Next Set rs = Nothing Set con = Nothing Exit Function HandleButtonClick_Err: ' If the action was cancelled by the user for ' some reason, don't display an error message. ' Instead, resume on the next line. If (Err = conErrDoCmdCancelled) Then Resume Next Else MsgBox "コマンド実行中のエラーです。", vbCritical Resume HandleButtonClick_Exit End If End Function Private Sub メニュー終了_Click() On Error GoTo Err_メニュー終了_Click DoCmd.Close Exit_メニュー終了_Click: Exit Sub Err_メニュー終了_Click: MsgBox Err.Description Resume Exit_メニュー終了_Click End Sub Private Sub 終了_Click() On Error GoTo Err_終了_Click DoCmd.Quit Exit_終了_Click: Exit Sub Err_終了_Click: MsgBox Err.Description Resume Exit_終了_Click End Sub

  • GoToRecordで実行時エラー '2105'

    教えてください。Access2000です。 Private Sub 次へ_Click() On Error GoTo Err_次へ_Click On Error Resume Next DoCmd.GoToRecord , , acNext Exit_次へ_Click: Exit Sub Err_次へ_Click: MsgBox ERR.Description Resume Exit_次へ_Click End Sub って書いたのですが、最後のレコードまで行った後 「次へ」をクリックすると実行時エラーになってしまいます。 移動できませんとかメッセージで逃げたいのですがどうすればいいのでしょうか? お願いします。

専門家に質問してみよう