Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проверка с определенным временным интервалом. / 7 сообщений из 7, страница 1 из 1
07.06.2016, 08:33
    #39251616
Im_Max
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка с определенным временным интервалом.
Здравствуйте.
Не знаю, правильно в этой ветке данну тему разместить или VBA.

На SQL сервере каждый день формируются данные. В 00:05 стартует Джоб. Он выполняется 3 часа. Далее в 04:00 стартует Access, который обрабатывает полученные данные и формирует ряд отчетов. Отчеты формируются до 08:00. До начала рабочего дня.
При старте Access проверяется вымотались данные сервера или нет. При выполнении джоба идет логирование запросов. После завершения джоба последняя строка в логе. Finish. Access как раз запускается с проверки, есть ли в определенной таблице строка с этим текстом за сегодня. Если да, то стартуют остальные макросы. Если нет – макросы останавливаются с сообщением «Какие-то данные не выгрузились»
Раньше такая ошибка возникала если на сервере случалась какая-либо критическая ошибка. Сейчас наняли нового админа следить за базами, и время выполнения Джоба стало скакать от 3 до 7 часов. Соответственно при запуске Access в 4 часа, если джоб не выполнен, то происходит полная остановка всех запросов.
А теперь собственно вопрос:
Как сделать что бы происходила не полная остановка, а периодическая проверка таблицы на наличие в ней строки с текстом «Finish», и если ее нет, то проверка происходит через 10 минут и так далее до тех пор пока не появится. И далее запускаются остальные запросы.
Сейчас Access стартует с выполнения такого запроса:
Код: sql
1.
2.
3.
SELECT 1/1 AS Проверка INTO [001 проверка]
FROM dbo_updateLog
WHERE (((Format([occured],"dd.mm.yyyy"))=Date()) AND ((dbo_updateLog.step)="UpdateData2 finish"));


Далее запускается следующий модуль:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Function prov()

If DCount("*", "001 проверка") > 0 Then

DoCmd.RunMacro "002 Autozapusk"

Else

MsgBox "Какие-то данные не выгрузились!"

End If

End Function


Как я думаю, мне нужно подредактировать код после Else, что бы шла проверка с определенным интервалом.
VBA не знаю. За мелкими вопросами, обращался на этот форум. Буду благодарен за помощь.
...
Рейтинг: 0 / 0
07.06.2016, 08:43
    #39251620
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка с определенным временным интервалом.
Проверка по таймеру. В Access можно использовать контрол на (скрытой) форме.
...
Рейтинг: 0 / 0
07.06.2016, 09:02
    #39251635
Проверка с определенным временным интервалом.
VBA не знаю - ключевое

Я бы крутил Акс круглосуточно, а не запускал-останавливал.
Но на пальцах это не объяснить :(

Скелетик-то простой:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Do
     ' по условию 
     ' - или простой с безобидным Sleep
     ' - или обработка данных
     ' - или штатный выход
     ' - или аварийный выход
Loop



или же, покультурнее, то же самое, но через события класса таймера.

Таймер, в первом приближении, можно реализовать как класс на базе встроенного таймера специально выделяемой для этого формы. Готовый пример в сети есть.
' http://hiprog.com/index.php?option=com_content&task=view&id=251661564&Itemid=35
'Serge Gavrilov (c) SGSoft 2006
.
...
Рейтинг: 0 / 0
07.06.2016, 09:22
    #39251653
Проверка с определенным временным интервалом.
Im_Max,

VBA не знаю - ключевое

Я бы начал с Do...Loop
Когда все заработает - портировал бы под таймер.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
' *** SLEEP
Private Declare Sub fe_Sleep Lib "kernel32" Alias "Sleep" (ByVal lMilliseconds&)

' *** SLEEP
Public Sub sp_Sleep(pMsec&, 
                    Optional pDoEvBfr As Boolean = False, 
                    Optional pDoEvAft As Boolean = False)  
    If (pMsec > 0) Then
         If pDoEvBfr Then DoEvents
         Call fe_Sleep(pMsec)
         If pDoEvAft Then DoEvents
    End If
End Sub
...
Рейтинг: 0 / 0
08.06.2016, 07:11
    #39252419
Im_Max
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка с определенным временным интервалом.
Как уже заметили: "VBA не знаю - ключевое"

Просмотрел примеры с таймером и Do Loop. В итоге нагородил следующее. Вроде работает, но точно проверить смогу только завтра. Когда с сервера поступит очередная партия данных. Может кро просмотреть хотя бы бегло? Может что-то совсем кривое написал:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Option Compare Database

Function proverka1()

DoCmd.SetWarnings False

Do

DoCmd.RunSQL "SELECT DateValue([occured]) AS Дата INTO [001 проверка] FROM dbo_updateLog WHERE (([dbo_updateLog].[step]  Like 'UpdateData2 finish') AND ((DateValue([occured]))=Date()));"

If DCount("*", "001 проверка") > 0 Then

DoCmd.RunMacro "002 Autozapusk"

Else

Dim PauseTime, Start, Finish, TotalTime

    PauseTime = 600    ' Set duration.
    Start = Timer    ' Set start time.
    Do While Timer < Start + PauseTime
        DoEvents    ' Yield to other processes.
    Loop
    Finish = Timer    ' Set end time.
    TotalTime = Finish - Start    ' Calculate total time.
    'MsgBox "Paused for " & TotalTime & " seconds"

End If

Loop Until DCount("*", "001 проверка") > 0

End Function
...
Рейтинг: 0 / 0
08.06.2016, 08:17
    #39252441
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка с определенным временным интервалом.
Im_Max,

я только не поняла, зачем каждую секунду создавать таблицу, почему не работаете с обычным запросом на выборку
и сомнение вызвало Like без * или иного знака(можете пролететь, если в строке есть еще что то типа пробел,точка....)

Код: vbnet
1.
2.
3.
4.
5.
6.
dim s1
s1= "SELECT DateValue([occured]) AS Дата"
s1=s1 & "  INTO [001 проверка]"
s1=s1 & "  FROM dbo_updateLog"
s1=s1 & "  WHERE (([dbo_updateLog].[step]  Like 'UpdateData2 finish') AND ((DateValue([occured]))=Date()));"
DoCmd.RunSQL s1



и не мешало бы вставить счетчик повторов цикла --как лекарство от зацикливания
стоит подумать и о принудительной остановке цикла
...
Рейтинг: 0 / 0
08.06.2016, 08:28
    #39252445
Im_Max
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка с определенным временным интервалом.
ПЕНСИОНЕРКАIm_Max,

я только не поняла, зачем каждую секунду создавать таблицу

Разве каждую секунду? Хотел настроить на раз в 10 минут.

ПЕНСИОНЕРКАпочему не работаете с обычным запросом на выборку


Сделаю запрос. Таблица нужна была для тестов.

ПЕНСИОНЕРКАи сомнение вызвало Like без * или иного знака(можете пролететь, если в строке есть еще что то типа пробел,точка....)

Да, там уже несколько лет одни и теже названия. Если и изменят, то на что-то кардинальное. И там * * уже не помогут. Но в любом случае отработку баз контролирую каждый день.


ПЕНСИОНЕРКАи не мешало бы вставить счетчик повторов цикла --как лекарство от зацикливания
стоит подумать и о принудительной остановке цикла

По тестирую текущий алгоритм, и тоже думал добавить. Я VBA я чайник (и это еще для меня будет комплимент) Так что полный код, со всеми нюансами сразу не напишу точно.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проверка с определенным временным интервалом. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]