2015-10-26 2 views
0

Я занимаюсь углубленными панелями функциональных областей в excel, которые обновляются после команды конечного пользователя кнопки «Обновить все». Единственная проблема, с которой я сталкиваюсь, - это обновлять ежедневное производство, когда прошло полночь, тем самым обращаясь к обратному запросу «date()», к текущему дню в полночь.Доступ к запросам из Excel: переменные параметры

Это условие, в котором я хочу работать правильно: я хочу, чтобы все> = 5 утра для сегодняшнего или предыдущего дня в зависимости от времени NOW.

WHERE start_time >= 
    (iif(timevalue(now()) between #00:00# and #4:59#,date()-1,date())) 
AND timevalue(start_time) >= #5:00#; 

Дело в том, что она возвращается в такой чрезвычайно медленно.

Я не думаю, что я когда-либо ждал его завершения. Я не уверен, что он вычисляет эту логику на каждой записи, вовлеченной в задний стол или нет, что объясняет блокировку.

Я действительно хочу избежать динамического построения любой логики, поскольку я просто использую Excel для вызова этого запроса Access с помощью мастера запросов. Мне не хотелось бы прибегать к кнопке доступа, запускающей модуль для динамического построения запроса, а затем фокусировки окна excel и обновления.

Было бы неплохо создать объект, скажем, [Форма]! но это полезно только тогда, когда форма активна. Даже тогда SQL отклоняет любые подвычисления в объекте формы.

Любые мысли?

+0

Бах, я просто понял, что все равно будет игнорировать полночь - 4:59 с # 5: 00 # последнее условие. Причина, по которой я начинал в # 5: 00 #, заключалась в том, чтобы опустить данные о кровотечении вскоре после полуночи ... Я не думаю, что есть способ НЕ построить это в VBA. У меня нет проблем писать в VBA, чтобы выполнить то, что мне нужно сделать; Может ли единственный вариант использовать Excel VBA для создания динамического запроса в доступе, сохранить определение запроса в доступе и затем вызвать его через excel? –

+0

Итак, когда now() - # 5: 00 #, то вам нужно, чтобы start_time> = now()? Полагаю, это не даст много результатов, верно? Я думаю, вы должны сначала записать, возможно, псевдокод, что вы действительно хотите. Сделайте требования однозначно понятными. – trincot

+0

Если я обновляюсь в любое время в течение дня с 5:00 до 23:59, просто для того, чтобы вернуться> = дата() , если его после полуночи .. должен быть в предыдущий день после 5 утра и все для текущего дня (что быть чем-нибудь после полуночи - 4:59).Gustav сделал хороший момент ниже, я просто борюсь, по какой-то причине, с аномально длинным временем запроса –

ответ

1

Вы можете использовать:

WHERE start_time 
    (Between Date() - 1 + #05:00:00# And Date() - 1 + #23:59:59#) 
    Or 
    (Between Date() + #05:00:00# And Date() + #23:59:59#) 
+0

Это близко, мне просто нужно приложить условие now(), чтобы определить, как оно вернется. Помните, 5 утра - 11:59 сейчас() раз нужно возвращать все после 5 утра, теперь время полночь - 4:59 нужно вернуть все после предыдущего дня 5AM Я мог бы переусердствовать, потому что знаю, что это что-то я может быстро развиваться динамически, но попытка остаться на 100% в SQL иногда сложна, а im на краю пересечения этой линии с этой конкретной функцией. –

+0

Это не просто близко, это зависит от того, соответствуют ли ваши критерии _everything> = 5 AM для сегодняшнего или предыдущего дня. Смотрите, пожалуйста, мое последнее редактирование. – Gustav

2

Я считаю, разбор вплоть до математического эквивалента булевой ЧАС (Теперь) < 5 следует ускорить значительно.

WHERE start_time >= (Date + (Hour(Now)<5) + TimeSerial(5, 0, 0)) 

булево Правда считается -1.

+0

отличная точка, плохо дайте это попробовать! –

1

Это похоже на работу; Мне нужно было «правильно выполнить». Густав воспитывал «между» и «или»; это отлично работает на моем автономном тестовом db - я помечаю этот путь как возможное решение. Я также добавил секунд, чтобы захватить последнюю минуту данные 23:59:00 до 23:59:59

 WHERE 

iif(timevalue(now()) Between #00:00# And #4:59#, 
(start_time 
Between Date()-1&' '&#05:00# And Date()-1&' '&#23:59:59#) 

    OR 

(start_time Between date()&' '&#00:00# And date()&' '&#23.59:59#), 

(start_time Between date()&' '&#00:00# And date()&' '&#23.59:59#)); 

Я только теперь нужно построить в него теперь() условие в операторе IIF, чтобы решить, какие условие для exectute!

+0

Это не имеет никакого смысла. _First_, вы никогда не должны, если вообще возможно, не использовать обработку строк, включая конкатенацию, для операций даты/времени. _Second_, 'TimeValue (Now())' следует заменить на 'Time()'. _В третьем случае, если вы имеете в виду, что критерии дня должны определяться текущим временем до или после 05:00, ваш исходный критерий является неточным и его нужно перефразировать. – Gustav

+0

Я тестировал это в автономной базе данных, и он отлично работал, поэтому я не понимаю, как это не имеет смысла. Я скажу, что он не может быть оптимально написан каким-либо образом. Спасибо за время(), я никогда раньше не использовал его; ive всегда используется сейчас(), потому что я работаю в основном с приложениями, использующими ввод данных, содержащий временные метки с датами. Это, кажется, отлично работает :::: iif (время() между # 00: 00 # и # 4 : 59 #, , ) –

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