2014-01-02 3 views
0

У меня есть следующий код VBA для .mdb файла Access:Могу ли я использовать метод DoCmd в инструкции IF?

If DoCmd.RunSQL "SELECT DISTINCT Max(wk_ending_dt) FROM d2s_loader_performance" < (Date()-Weekday(Date())) Then 
    DoCmd.RunSQL "DELETE * FROM d2s_loader_performance_tbl WHERE wk_ending_dt = (Date()-Weekday(Date())-35)" 
End If 

Затем выдвигает на первый план следующий текст: "SELECT DISTINCT Max(wk_ending_dt) FROM d2s_loader_performance" и выдает ошибку Compile Error: Expected Then or GoTo.

Любые идеи? У меня есть a Then в конце моей условной проверки, и, насколько мне известно, двойные кавычки предназначены только для синтаксиса SQL. Я использую это условие If...Then, чтобы разрешить удаление записи, если максимальная дата таблицы меньше даты окончания предыдущей недели.

ответ

2

Вы, вероятно, нужно атаковать его таким образом:

Dim db as Database 
Dim rec as Recordset 

Set db = CurrentDB 
Set rec = db.OpenRecordset ("SELECT DISTINCT Max(wk_ending_dt) FROM d2s_loader_performance") 

If rec(0) < (Date()-Weekday(Date())) Then 
    DoCmd.RunSQL "DELETE * FROM d2s_loader_performance_tbl WHERE wk_ending_dt = #" & (Date()-Weekday(Date())-35) & "#" 
EndIf 

Я предполагаю, что «(Date () -Weekday (Date()) - 35) «часть должна быть вычислением, поэтому вам нужно окружить ее амперсандами (&), а даты в Access всегда должны иметь значки фунта (#) до и после них, если они являются полями «Дата».

+0

Работает как шарм, хотя я не совсем понимаю логику rec (0). FWIW, '(Date() - Weekday (Date()) - 35)' также работал. Запустите это как оператор SELECT в Query Builder, и вы получите 12/28/13. Если VBA выполняет оба стиля одинаково, есть ли смысл использовать # vs, а не здесь? –

+0

rec (0) - это первое поле (единственное поле в этом случае) в наборе записей. Поскольку ваш набор записей возвращает одно поле и одну запись, проще просто использовать rec (0) вместо rec («Max of wk_ending_dt»). re: символ #, в этом случае нет никакой пользы от использования одного над другим, поэтому используйте только то, что наиболее удобно. –

1

Проблема в том, что вы можете выполнять только запросы на действия с помощью DoCmd.RunSQL. Таким образом, вы не можете выполнить оператор Select. Для получения дополнительной информации см this

Мой подход заключается в использовании что-то вроде этого:

Sub SqlExecute() 

    Dim db As DAO.Database 
    Dim rsttemp As DAO.Recordset 
    Set db = CurrentDB 
    sql = "SELECT DISTINCT Max(wk_ending_dt) FROM d2s_loader_performance" 
    Set rsttemp = db.OpenRecordset(sql, dbOpenSnapshot) 


    If rsttemp(0)<(Date()-Weekday(Date())) Then 
     DoCmd.RunSQL "DELETE * FROM d2s_loader_performance_tbl WHERE wk_ending_dt #=" & (Date()-Weekday(Date())-35) & "#" 
    End If 
    Set rsttemp = Nothing 

End Function 
+0

Я понял, что это была проблема. Любые идеи о том, как я могу выполнить то, что хочу, как в том, чтобы выполнять только действие, соответствующее максимальной дате в таблице? –

+0

вы можете использовать Recordset для этого ... просто мгновение, я найду любую документацию с примерами для вас –

+0

Я обновил свой ответ –

Смежные вопросы