本文將告訴您可用來取得值,從前一個] 或 [下一筆記錄,在計算中使用的兩個方法。第一種方法在運算式中使用
DLookup() 函式 ; 第二種方法使用兩個使用者自訂函數。
注意: 您所見的範例檔案 Qrysmp00.exe 中這份文件中使用的技巧示範。如需有關如何取得這個範例檔案,請參閱下列文 「 Microsoft 知識庫 」 中的資訊:
207626?
(http://support.microsoft.com/kb/207626/EN-US/
)
ACC2000: Access 2000 範例使用中的查詢下載中心
方法 1: 使用 DLookup()
注意: 這項技術循序假設您有一個資料表的數字資料型別的一個 [識別碼] 欄位,而且任何數字 (或數字) 未遺漏 ID 值。如果您的資料表不符合這些準則,您應該使用本文稍後所述的使用的程式碼 」 方法。
您可以使用下列的範例
DLookup() 運算式來取得值,從一個表單、 一個報表或查詢的前一張或下一筆記錄中的欄位。
注意: 您必須插入正確的資料欄位、 資料表、 表單、 報表及識別碼] 欄位中下列的範例運算式的名稱。
在表單中
要從上一筆記錄中的欄位取得一個值中, 輸入下列行為文字方塊的
控制項資料來源] 屬性:
DLookUp("[MyField]","MyTable","[ID]=Forms![MyForm]![ID]-1") =
要從下一筆記錄中的欄位取得一個值中, 輸入下列行為文字方塊的
控制項資料來源] 屬性:
DLookUp("[MyField]","MyTable","[ID]=Forms![MyForm]![ID]+1") =
在報表中
要從上一筆記錄中的欄位取得一個值中, 輸入下列行為文字方塊的
控制項資料來源] 屬性:
DLookUp("[MyField]","MyTable","[ID]=Reports![MyReport]![ID]-1") =
要從下一筆記錄中的欄位取得一個值中, 輸入下列行為文字方塊的
控制項資料來源] 屬性:
DLookUp("[MyField]","MyTable","[ID]=Reports![MyReport]![ID]+1") =
在查詢中
若要取得值,從上一筆記錄之中的欄位,輸入下列命令在查詢格線的 [
欄位] 列中:
Expr1: DLookUp("[MyField]","MyTable","[ID]="& [ID]-1)
從下一筆記錄中的欄位取得一個值,請查詢格線的 [
欄位] 列中輸入下列命令:
Expr1: DLookUp("[MyField]","MyTable","[ID]="& [ID]+1)
注意: 在這些範例] 運算式-1 及 + 1 表示前一個和下一個記錄。當目前的記錄資料錄集內第一筆記錄-1 會傳回
Null 值,因為沒有上一筆記錄。同樣地,當目前的記錄資料錄集內最後一筆記錄 + 1 傳回一個
Null。若想從資料錄不是下一個或上一個傳回值,您可以指定其他數值,例如-3 第三個前一筆記錄。
方法 2: 使用程式碼
Microsoft 僅,為了說明提供程式設計範例,不提供任何明示或默示的保證。這包括,但不限於適售性或適合某特定用途之默示擔保責任。本文假設您已熟悉使用我們所示範的程式設計語言以及建立和偵錯程序所使用的工具。Microsoft 技術支援工程師可以協助解釋特定程序的功能,但它們不會修改這些範例以提供附加功能或建構程序,以符合您特定需求。
注意: 本文中的範例程式碼會使用 Microsoft 資料存取物件。這個程式碼正常執行,您必須參考 Microsoft DAO 3.6 物件程式庫。以執行這項操作,按一下
引用項目 在 [
工具] 功能表中 Visual Basic 編輯器] 中,請確定已選取
Microsoft DAO 3.6 物件程式庫] 核取方塊。
如果要使用的程式碼,從上一個或下一個資料錄,在表單中擷取欄位中的值,請依照下列步驟執行:
- 新的模組,然後輸入下列行,如果它已經不存在的宣告區段:
外顯的選項
- 鍵入下列程序:
'*************************************************************
' FUNCTION: PrevRecVal()
' PURPOSE: Retrieve a value from a field in the previous form
' record.
' PARAMETERS:
' F - The form from which to get the previous value.
' KeyName - The name of the form's unique key field.
' KeyValue - The current record's key value.
' FieldNameToGet - The name of the field in the previous
' record from which to retrieve the value.
' RETURNS: The value in the field FieldNameToGet from the
' previous form record.
' EXAMPLE:
' =PrevRecVal(Form,"ID",[ID],"OdometerReading")
'**************************************************************
Function PrevRecVal(F As Form, KeyName As String, KeyValue, _
FieldNameToGet As String)
Dim RS As DAO.Recordset
On Error GoTo Err_PrevRecVal
' The default value is zero.
PrevRecVal = 0
' Get the form recordset.
Set RS = F.RecordsetClone
' Find the current record.
Select Case RS.Fields(KeyName).Type
' Find using numeric data type key value?
Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
DB_DOUBLE, DB_BYTE
RS.FindFirst "[" & KeyName & "] = " & KeyValue
' Find using date data type key value?
Case DB_DATE
RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
'Find using text data type key value?
Case DB_TEXT
RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
Case Else
MsgBox "ERROR: Invalid key field data type!"
Exit Function
End Select
' Move to the previous record.
RS.MovePrevious
' Return the result.
PrevRecVal = RS(FieldNameToGet)
Bye_PrevRecVal:
Exit Function
Err_PrevRecVal:
Resume Bye_PrevRecVal
End Function
'************************************************************
' FUNCTION: NextRecVal()
' PURPOSE: Retrieve a value from a field in the next form
' record.
'*************************************************************
Function NextRecVal(F As Form, KeyName As String, KeyValue, _
FieldNameToGet As String)
Dim RS As DAO.Recordset
On Error GoTo Err_NextRecVal
' The default value is zero.
NextRecVal = 0
' Get the form recordset.
Set RS = F.RecordsetClone
' Find the current record.
Select Case RS.Fields(KeyName).Type
' Find using numeric data type key value?
Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
DB_DOUBLE, DB_BYTE
RS.FindFirst "[" & KeyName & "] = " & KeyValue
' Find using date data type key value?
Case DB_DATE
RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
' Find using text data type key value?
Case DB_TEXT
RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
Case Else
MsgBox "ERROR: Invalid key field data type!"
Exit Function
End Select
' Move to the next record.
RS.MoveNext
' Return the result.
NextRecVal = RS(FieldNameToGet)
Bye_NextRecVal:
Exit Function
Err_NextRecVal:
Resume Bye_NextRecVal
End Function
下列範例示範如何在表單中使用 PrevRecVal() 函數來建立里程數記錄檔。自訂函式會傳回用來計算每加侖 (MPG) 的汽車英哩先前 odometer 讀取。若要將 PrevRecVal() 函式請依照下列步驟執行:
- 建立下列新的資料表,然後將它儲存成里程數記錄檔:
欄位名稱: 識別碼
資料型別: [自動編號
建立索引: [是 (不可重複)
欄位名稱: 日期
資料型別: 日期/時間
欄位名稱: odometer
資料類型: 數字
fieldSize: 雙
欄位名稱: 加侖
資料類型: 數字
fieldSize: 雙
主索引鍵: 識別碼
- 在 [資料工作表] 檢視中檢視里程數記錄資料表並輸入下列的範例資料:
ID Date Odometer Gallons
---------------------------------
1 6/21/94 77917.8 10.2
2 6/25/94 78254.7 9.6
3 6/30/94 78582.3 10
4 7/5/94 78918.4 10.4
5 7/10/94 79223.4 9.4
- 使用 「 表單精靈 」 來建立里程數記錄資料表為基礎的新表格式表單。加入所有里程數記錄的資料表欄位,除了 [識別碼] 欄位。
- 在 [設計] 檢視中檢視表單,並將下列三個文字方塊控制項加入至表單:
文字方塊 1
名稱: PrevOdometer
控制項資料來源: =PrevRecVal(Form,"ID",[ID],"Odometer")
格式: 固定
文字方塊 2
名稱: MilesDriven
控制項資料來源: =iif([PrevOdometer]=0,0,[odometer]-[PrevOdometer])
格式: 固定
文字方塊 3
名稱: MPG
控制項資料來源: = [MilesDriven] / [加侖]
格式: 固定
- 在 [表單檢視] 中檢視表單。請注意表單會顯示下列資訊:
Date Odometer Gallons PrevOdometer MilesDriven MPG
-------------------------------------------------------------
6/21/94 77917.8 10.2 0 0 0
6/25/94 78254.7 9.6 77917.80 336.90 35.09
6/30/94 78582.3 10.0 78254.70 327.60 32.76
7/05/94 78918.4 10.4 78582.30 336.10 32.32
7/10/94 79223.4 9.4 78918.40 305.00 32.45
取得更多資訊有關資料會自動將輸入表單的使用前一筆記錄的值按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
210236?
(http://support.microsoft.com/kb/210236/EN-US/
)
ACC2000:fill 自動記錄來自前一筆記錄的資料