2015-10-30 3 views
0

Я построил этот код как тест для удаления диапазона записей из базы данных Access 2013 на основе ряда дат. Я получаю недостающую ошибку оператора в выражении запроса «START_DATE> = ..... и т. Д. Я также попробовал выражение select с апострофами.Что такое недостающий оператор в этом коде VBA?

ПРИМЕЧАНИЕ: линия CALL - это одна строка в действительном коде. Кроме того, если я запустил линию CALL с помощью параметра «Между/И», а не «=» = < =, код завершается без ошибок, но ничего не выполняет. Он не находит и не удаляет строки.

Function Delete_Range() 

    Dim begdt As Date 
    Dim enddt As Date 

'user inputs date range 
    begdt = InputBox("Enter beginning date as mm/01/yyyy", "BEGINNING DATE") 
    enddt = InputBox("Enter ending date as mm/01/yyyy", "ENDING DATE") 


    Dim objectrecordset As ADODB.Recordset 
    Set objectrecordset = New ADODB.Recordset 

'initiate recordset object 
objectrecordset.ActiveConnection = CurrentProject.Connection 
Call objectrecordset.Open("select START_DATE 
from TEMP_DATE_RANGE where START_DATE IS >= " 
& begdt & " AND <= " & enddt, , , adLockBatchOptimistic) 

While objectrecordset.EOF = False 
'delete record 
objectrecordset.Delete 
objectrecordset.UpdateBatch 

'move to next record 
objectrecordset.MoveNext 
Wend 

End Function 

Благодарим всех вас за помощь. Вот код, который сработал.

DoCmd.SetWarnings (warningsoff) 

'Declare variables 
Dim begdt As String 
Dim enddt As String 

'User inputs variables 
begdt = InputBox("Enter beginning date as mm/01/yyyy", "BEGINNING DATE") 
enddt = InputBox("Enter ending date as mm/01/yyyy", "ENDING DATE") 

'Format variable as date and error handling 
If Not (IsDate(begdt) And IsDate(enddt)) Then 
    MsgBox "Please enter a date using a the date format", vbOKOnly 
    GoTo Finished 

Else 
    begdt = Format(begdt, "\#yyyy\/mm\/dd\#") 
    enddt = Format(enddt, "\#yyyy\/mm\/dd\#") 

End If 

'Delete records from tables based upon user input date range 
Dim SQL As String 
Dim SQL2 As String 
Dim SQL3 As String 

    SQL = "DELETE * FROM TEST_TBL_1 WHERE START_DATE BETWEEN " & begdt & " AND " & enddt & "" 
SQL2 = "DELETE * FROM TEST_TBL_2 WHERE START_DATE BETWEEN " & begdt & " AND " & enddt & "" 
SQL3 = "DELETE * FROM TEST_TBL_3 WHERE START_DATE BETWEEN " & begdt & " AND " & enddt & "" 

DoCmd.RunSQL SQL 
DoCmd.RunSQL SQL2 
DoCmd.RunSQL SQL3 

'Close form and show process complete page 
DoCmd.SetWarnings (warningson) 
DoCmd.Close acForm, "DELETE HISTORY", acSaveNo 
DoCmd.OpenForm "COMPLETE", acNormal, "", "", , acNormal 

Finished: 

End Function 
+0

не было бы проще использовать что-то вроде следующего ' db.execute ("DELETE * FROM TEMP_DATE_RANGE WHERE START_DATE BETWEEN #" & begdt & "# AND #" & enddt & "#") 'или я что-то упустил? зачем вам нужно выбирать и звонить? – LiamH

ответ

1

Вы путаете значения даты и строковые выражения для них, и все это начинается с InputBox, которая всегда возвращает строку:

Dim begdt As String 
Dim enddt As String 

' user inputs date range 
begdt = InputBox("Enter beginning date as mm/01/yyyy", "BEGINNING DATE") 
enddt = InputBox("Enter ending date as mm/01/yyyy", "ENDING DATE") 

If Not (IsDate(begdt) And IsDate(enddt)) Then 
    ' Show error. 
Else 
    begdt = Format(begdt, "\#yyyy\/mm\/dd\#) 
    enddt = Format(enddt, "\#yyyy\/mm\/dd\#) 

    Dim SQL As String 
    SQL = "Select START_DATE From TEMP_DATE_RANGE Where START_DATE Between " & begdt & " And " & enddt & "" 
    Dim objectrecordset As ADODB.Recordset 
    Set objectrecordset = New ADODB.Recordset 

    'initiate recordset object 
    objectrecordset.ActiveConnection = CurrentProject.Connection 
    Call objectrecordset.Open(SQL, , , adLockBatchOptimistic) 

    ' <Snip> 
    ' Clean up. 
End If 
0

В SQL, вы не пишете:

where a < 8 and > 7 

Вы пишете:

where a < 8 and a > 7 

Итак, вам нужно исправить where положение:

objectrecordset.ActiveConnection = CurrentProject.Connection 
Call objectrecordset.Open("select START_DATE 
from TEMP_DATE_RANGE where START_DATE IS >= " 
& begdt & " AND START_DATE <= " & enddt, , , adLockBatchOptimistic) 
-----------------^ 

Могут быть и другие проблемы, но это является очевидным в SQL.

-1

Возможно, вам потребуется вставить некоторые отдельные кавычки вокруг ваших дат в строку запроса. Как это:

Call objectrecordset.Open("select START_DATE from TEMP_DATE_RANGE where START_DATE BETWEEN '" & begdt & "' AND '" & enddt & "'", , , adLockBatchOptimistic) 

**** Я редактировал это заменить является> = с между утверждение слишком

-1

Ваш синтаксис сравнение даты немного, снимите IS в IS >= и не забудьте добавить START_DATE <= а не просто <=

С исправлениями, он становится:

Call objectrecordset.Open("select START_DATE 
from TEMP_DATE_RANGE where START_DATE >= " 
& begdt & " AND START_DATE <= " & enddt, , , adLockBatchOptimistic) 
1

Первая работа НУ t логика запроса и синтаксис в конструкторе запросов Access. Предполагая START_DATE является дата/время тип данных, выбрать пару статических значений для начала и конца вашей целевой диапазон дат:

SELECT START_DATE 
FROM TEMP_DATE_RANGE 
WHERE START_DATE BETWEEN #2015-1-1# AND #2015-10-30# 

Регулировка по мере необходимости.

Как только у вас есть правильный оператор SQL, создайте соответствующий текст инструкции в коде VBA.

Dim strSelect As String 
strSelect = "SELECT START_DATE FROM TEMP_DATE_RANGE " & _ 
    "WHERE START_DATE BETWEEN " & Format(begdt,"\#yyyy-m-d\#") & _ 
    " AND " & Format(enddt,"\#yyyy-m-d\#") 
Debug.Print strSelect '<- inspect this in Immediate window; Ctrl+g will take you there 

Затем вы можете использовать strSelect с objectrecordset.Open

Однако, так как ваша цель состоит в том, чтобы удалить эти строки, вы на самом деле не нужен набор записей. Вместо этого вы можете просто выполнить оператор DELETE.

DELETE FROM TEMP_DATE_RANGE 
WHERE START_DATE BETWEEN #2015-1-1# AND #2015-10-30# 
Смежные вопросы