#vba #ms-access #runtime-error #recordset
#vba #ms-access #время выполнения-ошибка #набор записей
Вопрос:
Я продолжаю получать эту «ошибку времени выполнения ‘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, Borings.BoringID, Borings.HoleDepth, Samples.BoringID, " amp; _
"Samples.Number, Samples.Depth, Samples.Length, Borings.[Continuous To], " amp; _
"Borings.[Every Other], Borings.[Sample Length], Borings.[Custom Sampling Method] " amp; _
"FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID " amp; _
"WHERE Borings.ProjectID = " amp; [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
Комментарии:
1. Не связано, но используется
Option Explicit
, поэтому опечатки не создают новых переменных, аLong
вместоInteger
16-битных целых чисел в памяти все равно остаются 32-битные длины, и происходит автоматическое преобразование.
Ответ №1:
Попробуйте быть более конкретным, используя значение свойства как 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
Комментарии:
1. Спасибо! Это очень помогло. Я сделал то, что сказали вы и @Nacorid, но теперь у меня новая ошибка. Когда он попадает в
rs![Sample Number].Value = sampleNumber
строку в подпрограмме AddSample, он выделяетсяsampleNumber
, и ошибка говорит об ошибке компиляции. Переменная не определена.
Ответ №2:
У меня возникли проблемы с присвоением значения bBoringID
sBoringID
полю в наборе записей. Поскольку он добавляет новые образцы в таблицу Samples, ему необходимо взять ток bBoringID
из таблицы Borings и назначить его sBoringID
в таблице Samples. Всякий раз, когда он попадает в 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, " amp; _
"Samples.BoringID as sBoringID, Samples.Number, Samples.Depth, Samples.Length, " amp; _
"Borings.[Continuous To], Borings.[Every Other], Borings.[Sample Length], " amp; _
"Borings.[Custom Sampling Method] " amp; _
"FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID " amp; _
"WHERE Borings.ProjectID = " amp; [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, 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 = 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
Ответ №3:
Неважно, после дополнительных исследований я это исправил. Поскольку bBoringID
это автоматический номер в таблице Borings, мне не нужно вводить его в таблицу Samples . Access автоматически введет то же значение ключа в таблицу Samples . Я удалил rs!sBoringID.Value = rs!bBoringID.Value
и, наконец, вижу все значения в других rs!поля.