Что делать, если оператор SQL не находит «совпадений» в таблице? - PullRequest
1 голос
/ 27 апреля 2011

Используя MS Access, я попытался запустить оператор SQL, но не могу заставить его работать, если в таблице еще нет записей. Буду признателен за помощь! Спасибо!

Public Function GetReferenceID(RefCode As String) As Integer
    Dim RefID As Integer
    Dim rec As Recordset

    Call connectDB
    sSQL = "select RefID from Exceptions where RefCode = '" & RefCode & "'"
    Set rec = CurrentDb.OpenRecordset(sSQL)

    If (Not rec.EOF And Not rec.BOF) Then
        RefID = rec.RecordCount + 1
    Else
        RefID = 1
    End If
    GetReferenceID = RefID 
End Function

Private Sub RefCode_Change()
    Dim tr As Transactions, rID As Integer
    Set tr = New Transactions
    tr.GetReferenceID (RefCode.Value)
end sub

UPDATE! В этой строке есть ошибка ( Ошибка времени выполнения 3464, «Несоответствие типов данных в выражении критерия »):

Set rec = CurrentDb.OpenRecordset(sSQL)

... в этом коде:

Private Sub RefCode_Change()
        Dim rec As Recordset, RefID As Integer
        sSQL = "select RefID from Exceptions where RefCode = '" & RefCode.Value & "'"
        Set rec = CurrentDb.OpenRecordset(sSQL)

        If (rec.EOF And rec.BOF) Then
            RefID = 1
        Else
            rec.MoveFirst
            RefID = rec.RecordCount + 1
        End If
End Sub

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

Я думаю, вы хотите сделать это ...

If (rec.EOF And rec.BOF) Then
    'empty recordset
    RefID = 1
Else
    'at least one row
     rec.movefirst
     RefID = rec.RecordCount + 1
End If

Вы также можете упростить все это до

RefID = Dcount("*","Exceptions","refCode='" & RefCode & "'") +1
0 голосов
/ 29 апреля 2011

Я не совсем уверен, в чем проблема, но я вижу две потенциальные проблемы:

  1. вы не указали объявление набора записей, так что вы можете столкнуться с неоднозначностьюмежду типами записей DAO и ADO.Вместо этого объявите переменную набора записей как Dim rs As DAO.Recordset или Dim rs As ADOX.Recordset (я думаю, что это правильно - я никогда не использую ADO, поэтому никогда не должен указывать это!).Тот факт, что Set rec = CurrentDb.OpenRecordset(sSQL) возвращает несоответствие типов данных, настоятельно рекомендует мне объявить набор записей ADO, поскольку это может привести к несоответствию с набором записей DAO, возвращаемым CurrentDB.OpenRecordset ().

  2. Наборы записей DAO не могут гарантировать точный счет записи, пока вы не пройдете весь набор записей.Благодаря технологии Jet / ACE Rushmore начало набора записей доставляется, а его конец еще не получен.Вы можете подождать некоторое время и надеяться, что Счет записей точен, или вы можете явно сделать rs.MoveLast, и в этом случае Счет записей будет гарантированно точным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...