• ベストアンサー

日付の最大値を求めるには

DLookup関数と、DMAX関数を組み合わせて、検索をすれば良いのですが、 表示する項目が多い為、DAOを使って検索を考えています。 検索するコードが複数存在し、最大の日付のレコードを表示 したいと思っています。 コードの名称は・・・ Quotation_B_Noです。 日付が入っている名称は Input_dayです。 フォーム内のMe.W_Revise_Noにコードを入力して、検索を行います。 検索するテーブルは、T_Quotation_B_request_received_tableです。 この中にある。 コードを最初にあるか、どうかをチェックして、 あれば、そのコードに対する、最大の日付のレコードを 検索したいと思っています。 現在、このように組みましたが、 Dim db As DAO.Database Dim rs As DAO.Recordset Dim han As Date Set db = CurrentDb() Set rs = db.OpenRecordset("T_Quotation_B_request_received_table", dbOpenDynaset) rs.FindFirst "Quotation_B_No ='" & Me.W_Revise_No & "'" If rs.NoMatch = True Then MsgBox "Not found Supplier code" Cancel = True Me.W_Revise_No.Undo Exit Sub Else han = DMax("Input_day", "T_Quotation_B_request_received_table ", "Quotation_B_No ='" & Me.W_Revise_No & "'") rs.FindFirst "#" & "han" & "#" And "Quotation_B_No ='" & Me.W_Revise_No & "'"→ここで、エラーが発生します。 Me.W_Control_No = rs!Control_No       ・・・・・ End If rs.Close Set rs = Nothing db.Close Set db = Nothing どのように組めば良いのか、さっぱり分かりません。 ご指導、宜しくお願いします。

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

先にテーブル[T_Quotation_B_request_received_table]の列[Quotation_B_No]毎の最大日付を取得するクエリを作成しておく、ではいかがでしょう? select Quotation_B_No, max(Input_day) from T_Quotation_B_request_received_table group by Quotation_B_No; Quotation_B_Noが存在しないものは検索できませんので、(1)検索できるか(2)検索できたら最大日付を取得、の二段階を踏まなくてもすみます。

その他の回答 (2)

noname#140971
noname#140971
回答No.3

<tab1> ID___Quotation_B_No___Input_day 1____A_001________________2007/10/01 2____A_001________________2007/11/01 3____A_002________________2007/10/01 4____A_002________________2007/12/01 このようなテーブルがあるとします。 フォームには、 field_ID field_Quotation_B_No field_Input_day という検索したレコード情報を表示するテキストボックスを配置。 さらに、[W_Revise_No] を配置。 さて、コマンドボタンをクリックして該当するレコード情報を表示したいとのこと。 で、実際に以下のコードを書いて試してみました。 Private Sub コマンド0_Click()   Dim isOk    As Boolean   Dim strHiduke  As String   Dim Msg     As String      If Len(Me.W_Revise_No & "") Then     strHiduke = DBMax("input_day", "Tab1", "Quotation_B_No='" & Me.W_Revise_No & "'") & ""     If Len(strHiduke) Then       isOk = DisplayRecord(Me, "SELECT * FROM Tab1 WHERE Input_Day=#" & strHiduke & "#")       If isOk Then         Msg = "フォームに該当するレコード情報を表示しました"       End If     Else       Msg = Me.W_Revise_No & " に対応する日付はありません。"     End If   Else     Msg = "先に、'W_Revise_No' を入力して下さい。"   End If   MsgBox Msg End Sub まあ、ごくごく簡単なコードを書いているだけです。 こんなやり方もありますよ。 要は、質問者の書いているコードを関数化しただけです。 よかったら、DBMax関数とDisplayRecord関数を補足します。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

>rs.FindFirst "#" & "han" & "#" And・・・ エラーの原因はFindfirstの構文がおかしいからです 引数にはcriteria(条件式)を与えなきゃだめですよ >"#" & "han" & "#" これは日付リテラルで条件式ではありません それより >日付の最大値を求めるには > DLookup関数と、DMAX関数を組み合わせて、検索をすれば良いのですが、 この認識がおかしいですね 普通日付が最大のレコードを求めるには抽出クエリで 抽出条件にサブクエリまたはDMax関数を使います >表示する項目が多い為 だったらなおさらクエリのほうが便利だと思いますが

関連するQ&A