问题描述
我一直收到“运行时错误'3265':在此集合中找不到项目”。错误消息。
它发生的行是:If rs!Borings.[Custom Sampling Method] = False Then
,这是被引用字段的第一个实例,因此让我想知道sql是否已正确添加到字符串中。但是我将字符串打印到“立即”窗口中,并显示:
SELECT Borings.ProjectID,Borings.BoringID,Borings.HoleDepth,Samples.BoringID,Samples.Number,Samples.Depth,Samples.Length,Borings.[Continuous To],Borings.[Every Other],Borings.[Sample Length],Borings.[Custom Sampling Method]
FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID
WHERE Borings.ProjectID = 462
对我来说看起来是正确的..错了吗?我想知道最后的值是否应该用引号引起来?
如果我改用Set rs = db.OpenRecordset("qryAddSamples")
,则该方法不起作用。我最终遇到另一个运行时错误'3061',参数太少。应该是1.我不知道那是什么意思。
要了解代码的用途,应根据钻孔表中的采样信息为当前装载的每个项目的每个土壤钻孔生成土壤样本。
Option Compare Database
Dim db As DAO.Database
Dim rs As DAO.Recordset
Private Sub Update_Samples_Click()
DoCmd.runcommand acCmdsaveRecord
Dim strsql As String
Dim sampleDepth As Integer
Dim sampleNumber As Integer
strsql = "SELECT Borings.ProjectID," & _
"Samples.Number," & _
"Borings.[Every Other],Borings.[Custom Sampling Method] " & _
"FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID " & _
"WHERE Borings.ProjectID = " & [TempVars]![tmpProjectID]
Debug.Print strsql
Set db = CurrentDb
Set rs = db.OpenRecordset(strsql)
sampleDepth = 0
sampleNumber = 1
do while Not rs.EOF
If rs!Borings.[Custom Sampling Method] = False Then
do while sampleDepth + rs!Borings.[Sample Length] <= rs!Borings.[Continuous To]
rs.AddNew
AddSamples
sampleNumber = sampleNumber + 1
sampleDepth = sampleDepth + rs!Samples.[Length]
Loop
do while sampleDepth + rs!Borings.[Sample Length] <= rs!Borings.HoleDepth
rs.AddNew
AddSamples
sampleNumber = sampleNumber + 1
sampleDepth = sampleDepth + rs!Borings.[Every Other]
Loop
End If
rs.MoveNext
Loop
rs.Close
Set rs = nothing
Set db = nothing
DoCmd.Close
DoCmd.OpenForm "Main"
End Sub
Private Sub AddSamples()
rs!Samples.[BoringID] = rs!Borings.BoringID
rs!Samples.[Sample Number] = sampleNumber
rs!Samples.[Depth] = sampleDepth
rs!Samples.[Length] = rs!Borings.[Sample Length]
rs.Update
End Sub
解决方法
尝试使用属性 Value 来更具体,因为rs!SomeField
是字段对象。
另外,在不需要的地方省略表名:
Do While Not rs.EOF
If rs![Custom Sampling Method].Value = False Then
Do While sampleDepth + rs![Sample Length].Value <= rs![Continuous To].Value
rs.AddNew
AddSamples
sampleNumber = sampleNumber + 1
sampleDepth = sampleDepth + rs!Length.Value
Loop
Do While sampleDepth + rs![Sample Length].Value <= rs!HoleDepth.Value
rs.AddNew
AddSamples
sampleNumber = sampleNumber + 1
sampleDepth = sampleDepth + rs![Every Other].Value
Loop
End If
rs.MoveNext
Loop
,
在将bBoringID
的值分配给记录集中的sBoringID
字段时遇到麻烦。在向Samples表中添加新样本时,需要从Borings表中获取当前bBoringID
并将其分配给Samples表中的sBoringID
。每当到达rs!sBoringID.Value = rs!bBoringID.Value
行时,我都会收到“运行时错误3162:您试图将Null值分配给不是Variant数据类型的变量”错误。
但是,将值正确打印到立即窗口中,除了在值的前面和结尾有一个空格。但是当我将鼠标悬停在变量上并且监视变量时,标题都显示为Null。
Dim db As DAO.Database
Dim rs As DAO.Recordset
Private Sub Update_Samples_Click()
DoCmd.RunCommand acCmdSaveRecord
Dim strSQL As String
Dim sampleDepth As Long
Dim sampleNumber As Long
strSQL = "SELECT Borings.ProjectID,Borings.BoringID as bBoringID,Borings.HoleDepth," & _
"Samples.BoringID as sBoringID,Samples.Number,Samples.Depth,Samples.Length," & _
"Borings.[Continuous To],Borings.[Every Other],Borings.[Sample Length]," & _
"Borings.[Custom Sampling Method] " & _
"FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID " & _
"WHERE Borings.ProjectID = " & [TempVars]![tmpProjectID]
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL)
rs.MoveFirst
Debug.Print strSQL
Debug.Print rs!ProjectID.Value 'Borings Table
Debug.Print rs!bBoringID.Value 'Borings Table
Debug.Print rs!HoleDepth.Value 'Borings Table
Debug.Print rs![Continuous To].Value 'Borings Table
Debug.Print rs![Every Other].Value 'Borings Table
Debug.Print rs![Sample Length].Value 'Borings Table
Debug.Print rs![Custom Sampling Method].Value 'Borings Table
Debug.Print rs!sBoringID.Value 'Samples Table
Debug.Print rs!Number.Value 'Samples Table
Debug.Print rs!Depth.Value 'Samples Table
Debug.Print rs!Length.Value 'Samples Table
Debug.Print [TempVars]![tmpProjectID]
sampleDepth = 0
sampleNumber = 1
Do While Not rs.EOF
If rs![Custom Sampling Method].Value = False Then
Do While sampleDepth + rs![Sample Length].Value <= rs![Continuous To].Value
rs.AddNew
>>this line >> rs!sBoringID.Value = rs!bBoringID.Value
rs![Sample Number].Value = sampleNumber
rs!Depth.Value = sampleDepth
rs!Length.Value = rs![Sample Length].Value
rs.Update
Immediate window output:
SELECT Borings.ProjectID,Samples.BoringID as sBoringID,Borings.[Continuous To],Borings.[Custom Sampling Method] FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID WHERE Borings.ProjectID = 462
462 'Why is there a space before and after all these integer values?
848 'Why is there a space before and after all these integer values?
60 'Why is there a space before and after all these integer values?
10 'Why is there a space before and after all these integer values?
5 'Why is there a space before and after all these integer values?
2 'Why is there a space before and after all these integer values?
False
Null
Null
Null
Null
462
,
没关系,经过更多研究后,我修复了它。由于bBoringID
是Borings表中的一个自动编号,因此不需要将其输入到Samples表中。 Access将在“样品”表中自动输入相同的键值。我删除了rs!sBoringID.Value = rs!bBoringID.Value
,终于看到了其他rs!字段中的所有值。