プロが教える店舗&オフィスのセキュリティ対策術

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

どのように組めば良いのか、さっぱり分かりません。
ご指導、宜しくお願いします。

A 回答 (3件)

先にテーブル[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)検索できたら最大日付を取得、の二段階を踏まなくてもすみます。
    • good
    • 0

<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関数を補足します。
    • good
    • 0

>rs.FindFirst "#" & "han" & "#" And・・・


エラーの原因はFindfirstの構文がおかしいからです
引数にはcriteria(条件式)を与えなきゃだめですよ
>"#" & "han" & "#"
これは日付リテラルで条件式ではありません

それより
>日付の最大値を求めるには
> DLookup関数と、DMAX関数を組み合わせて、検索をすれば良いのですが、
この認識がおかしいですね
普通日付が最大のレコードを求めるには抽出クエリで
抽出条件にサブクエリまたはDMax関数を使います

>表示する項目が多い為
だったらなおさらクエリのほうが便利だと思いますが
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A