2

現在、フォームにアクセスしています。

私がやりたいことは、最後に追加されたレコードの値を取得することです。

たとえば、10 件のレコードがある場合、値「10」を取得したいとします。これは、追加された最後のレコードの ID であるためです。関数 last id insert() を使用してクエリを実行しようとしていますが、機能していません。

これは私が使用しているコードです:

Dim lastID As Integer
Query = "select last_insert_id()"
lastID = Query
MsgBox (lastID)

私は何が欠けていますか?

4

3 に答える 3

9

DMax最大数を取得する関数があります。

Dim lastID As Integer
lastID = DMax("IDField","YourTable")
' or = DMax("IDField","YourTable","WhenField=Value")
MsgBox lastID

その他のドメイン機能は次のとおりです。

  • DAvg
  • Dカウント
  • Dファースト
  • DLast
  • Dルックアップ
  • DMin
  • DStDev
  • DStDevP
  • DSum
  • DVar
  • DVarP

詳細については、フレンドリF1キーを確認してください

于 2012-11-28T21:38:56.097 に答える
1

前回のコメントに続いて、VBA で使用するためにレコード セットの最後の ID 値を変数に変換するために最近使用したコードを次に示します。ただし、レコードの ID フィールドの値を直接変数に変換する方法をまだ見つけられないため、これは素晴らしいことではありません。代わりに、レコード セットを Excel ワークブックにコピーし、変数値をコピー先のセルの値に設定するという洗練されていないソリューションを使用しました。

編集: ID を単純な変数に変換する方法を考え出しました: 最後に新しいコード

これはすべて、1 つのクライアント ワークブックから実行されます。

Option Explicit
Public AftUpD As Long
Public BfrUpD As Long

Sub AssignLstRowAftUpD2()

    Dim dbPP As DAO.Database
    Dim ResTemp As DAO.Recordset
    Dim z As Long
    Dim SelectLast As String

    SelectLast = "SELECT Max(Table1.ID) AS MaxOfID FROM Table1"
    'Debug.Print SelectLast

    Set dbPP = OpenDatabase("C:\filepath\Database11.mdb")
    Set ResTemp = dbPP.OpenRecordset(SelectLast)

    If ResTemp.EOF Then
            GoTo EndLoop
        End If

    Worksheets("Diagnostics").Visible = True
    Worksheets("Diagnostics").Range("C4").CopyFromRecordset ResTemp
    z = Sheets("Diagnostics").Range("C4").Value
    Sheets("Diagnostics").Visible = False
    AftUpD = z
    'Debug.Print AftUpD

EndLoop:
        ResTemp.Close
        dbPP.Close



    Set dbPP = Nothing
    Set ResTemp = Nothing
    'Set SelectionLast = Nothing
    'z = Nothing

End Sub

次に、この値を変数として使用して、新しい SQL クエリを作成しました。

Sub Query()
   'This query uses the highest ID value in a companion spreadsheet (the public  
   'variable BfrUpD), which is set in a sub I haven't posted here, to find out 
   'how many records have been added to the database since the last time the
   'spreadsheet was updated, and then copies the new records into the workbook

   'Be warned: If you run this query when BfrUpD is equal to or greater than AftUpD it 
   'will cause a crash. In the end user version of this, I use several If tests,
   'comparing BfrUpD with other public variables, to make sure that this doesn't
   'happen.
    Dim WBout As Excel.Workbook, WSout As Excel.Worksheet
    Dim dbPP1 As DAO.Database
    Dim qryPP1 As DAO.Recordset
    Dim ResTemp1 As DAO.Recordset
    Dim TestValue As String
    Dim strSQL2 As String


    TestValue = BfrUpD
    'Debug.Print TestValue
    strSQL2 = "SELECT * FROM Table1 WHERE (((Table1.ID)>" & TestValue & "))"
    'Debug.Print strSQL2


    Set dbPP1 = OpenDatabase("C:\filepath\Database11.mdb")
    Set qryPP1 = dbPP1.OpenRecordset(strSQL2)

    Set WBout = Workbooks.Open("C:\filepath\h.xlsm")
    Set WSout = WBout.Sheets("sheet1")
    WSout.Range("A1").End(xlDown).Offset(1, 0).CopyFromRecordset qryPP1

    qryPP1.Close
    dbPP1.Close
    WBout.Save
    WBout.Close

    MsgBox "Data copied. Thank you."

Set WBout = Nothing
Set WSout = Nothing
Set dbPP1 = Nothing
Set qryPP1 = Nothing
Set ResTemp1 = Nothing

End Sub

編集: フィールド値を変数に直接取得するためのコード

    Dim dbPP As DAO.Database
    Dim ResTemp As DAO.Recordset
    Dim z As Long
    Dim SelectLast As String

    SelectLast = "SELECT Max(Table1.ID) AS MaxOfID FROM Table1"
    'Debug.Print SelectLast

    Set dbPP = OpenDatabase("C:\filepath\Database11.mdb")
    Set ResTemp = dbPP.OpenRecordset(SelectLast)
    z = ResTemp(0) 'specifying it's array location (I think) - there is only one
    'item in this result, so it will always be (0)

    AftUpD = z
    'Debug.Print AftUpD
    ResTemp.Close
    dbPP.Close



Set dbPP = Nothing
Set ResTemp = Nothing
'Set SelectionLast = Nothing
'z = Nothing

サブ終了

于 2013-12-17T08:54:55.743 に答える
0

あなたがすることは、最初に値を取得するクエリを設定して保存することです。それをMaxIDと呼びます

例えば

SELECT Max(ID) as result FROM Your_Table_Name

次に、VBAコードで、変数をそれに設定します

例えば。

Dim IDresult As Integer
IDresult = DLookup("[result]", "MaxID")
MsgBox(IDresult)
于 2012-11-27T15:56:36.240 に答える