powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как запустить процедуру из другой БД?
25 сообщений из 27, страница 1 из 2
Как запустить процедуру из другой БД?
    #39544962
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте форумчане

Поставил себе задачу найти способ фонового выполнения тяжёлых запросов, чтобы пользователь мог дальше работать с БД.
Создал для этого другую БД и написал в ней нужные процедуры. Осталось только их запустить.
А как запустить процедуру из другой БД я не знаю :/

помогите, пожалуйста
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39544963
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тут попробовал уже...

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Sub Запустить_процедуру_из_другой_БД()

    Dim j As New Access.Application
    
    j.OpenCurrentDatabase CurrentProject.Path & "\Контент\DB2.accdb"
    j.Application.Run "Запомнить_варианты_цен"
    j.Quit
    
End Sub



Оказалось, что VBA всё равно не отдаёт управление пользователю, пока процедура из другой БД не выполнится
Попробую создать командный файл для запуска
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39544966
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сам спросил и сам отвечаю :)

короче, я создал запуск через командный файл (методом Shell)
Всё равно Access не отдаёт мне управление, пока запросы не выполнятся до конца

Единственный нормальный способ я нашёл - это заполнение ячеек по одной. То есть, вместо одного запроса, который обновляет все записи в таблице, я выполняю много раз запрос для обновления только по одной записи. А в цикле вставляю DoEvents. При этом я могу комфортно работать, но всё же это не самое элегантное решение...

Надеюсь найти лучше
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39544996
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, лучше подключить эту другую БД в референсах...

НастаевVBA всё равно не отдаёт управление пользователю, пока процедура из другой БД не выполнитсяА зачем пользователю управление, если программа выполняет затребованное им действие?
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39544998
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НастаевЯ сам спросил и сам отвечаю :)

Всё равно Access не отдаёт мне управление, пока запросы не выполнятся до конца



Учи матчасть и будет тебе щастье.

Код: vbnet
1.
ADODB.command.execute Options:= adAsyncExecute
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39545041
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, это действие заполняет одну табличку около 10 секунд.
Сама таблица не используется. Просто надо, чтобы в ней были актуальные данные.
Мне кажется неудобным, что пользователю приходится ждать выполнения этого запроса.
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39545044
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222, спасибо, ща попробую :)
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39545050
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НастаевМне кажется неудобным, что пользователю приходится ждать выполнения этого запроса.

это смотря как преподнести...
- если программа тупо висит, это одно (действительно бесит)
- а если после предупреждения "Актуализация данных!" отрабатывает еще и прогресс бар, то это как бы зеркально - наоборот...
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39545064
angro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НастаевAkina, это действие заполняет одну табличку около 10 секунд.
Сама таблица не используется. Просто надо, чтобы в ней были актуальные данные.
Мне кажется неудобным, что пользователю приходится ждать выполнения этого запроса.

а может тогда вообще пользователю не нажимать, запускать ночью или в другом окне шедулером
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39545218
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
))
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39545275
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222Учи матчасть и будет тебе щастье.

Вот что я делаю:
Код: vbnet
1.
2.
3.
    Set dbs = CurrentDb
    Set qdf = dbs.QueryDefs("Вычисление цен")
    qdf.Execute dbRunAsync



Выдаёт ошибку
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39545408
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Настаев...
А как запустить процедуру из другой БД я не знаю :/
...
вот тут я делал примерчик (правда не с запросами, а с прогрессбаром, но принцип, думаю, тот же :) )
18433008
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39545670
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport,

отличный пример, спасибо
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39545733
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаевaleks222Учи матчасть и будет тебе щастье.

Вот что я делаю:
Код: vbnet
1.
2.
3.
    Set dbs = CurrentDb
    Set qdf = dbs.QueryDefs("Вычисление цен")
    qdf.Execute dbRunAsync



Выдаёт ошибку

Трясти бесполезно - думать надо.

https://msdn.microsoft.com/en-us/library/office/ff197799.aspx

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   ' Use the StillExecuting property to determine when the  
   ' Recordset is ready for manipulation. 
   Debug.Print "Opening snapshot-type recordset based " & _ 
      "on asynchronous query to ODBC connection..." 
   Set rstTemp = conPubs.OpenRecordset("publishers", _ 
      dbOpenSnapshot, dbRunAsync) 
   Do While rstTemp.StillExecuting 
      Debug.Print "  [still executing...]" 
   Loop 
   OpenRecordsetOutput rstTemp 
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546465
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222, я попробовал этот код
Он работает с запросами типа Select
А у меня запрос на обновление
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546468
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НастаевНадеюсь найти лучше
Сменить БД.
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546471
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183, согласен
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546474
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Настаев, видимо идёт переработка множества таблиц промежуточными запросами, например для отчёта ? Если да, то можно использовать временные таблицы для хранения результатов промежуточных запросов. В общем это очень ускоряет вычисления.
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546477
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
\\\\, я создаю промежуточную таблицу "Варианты цен". Это и забирает много времени

Я скажу, что там выполняется. Есть таблицы Товары, Заявки и Наличие
Для каждого из 1200 товаров нужно вычислить три возможных варианта цен: последняя, партийная и средняя. Я не буду вдаваться в подробности, но скажу, что для вычисления используются данные из всех этих таблиц. При этом используются фильтры, группировка и сортировка. Результат заносится в уже существующую таблицу "Варианты цен".

Вот текст самого запроса:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE Товары 
LEFT JOIN [Варианты цен] ON Товары.код = [Варианты цен].код_товара 
SET 
[Варианты цен].код_товара = [товары].[код], 
[Варианты цен].партийная = нужная_цена([Товары].[код],1), 
[Варианты цен].средняя = нужная_цена([Товары].[код],2), 
[Варианты цен].последняя = нужная_цена([Товары].[код],3) 
WHERE (((Товары.выделена)=True));



"нужная_цена" - это функция, которая получает данные из рекордсета, который запрашивается для каждой записи отдельно. Потому и долго. 1200 раз подключается рекордсет.
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546479
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот запрос для вычисления только одной записи:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT First([Заявки вложенная в основной валюте].цена2) AS партийная, 
Last([Заявки вложенная в основной валюте].цена2) AS последняя, 
Sum([Заявки вложенная в основной валюте].[кол-во]) AS куплено, 
Sum([Заявки вложенная в основной валюте].[кол-во]*[Заявки вложенная в основной валюте].[цена2]) AS потрачено, 
[потрачено]/[куплено] AS средняя 
From [Заявки] 
INNER JOIN [Заявки вложенная в основной валюте] 
ON Заявки.Код = [Заявки вложенная в основной валюте].док 
WHERE (((Заявки.Код)>=партийная_накладная(3)) 
AND (([Заявки вложенная в основной валюте].Наименование)=3) 
AND ((Заявки.закрыт)=True));



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

"партийная_накладная" - это ещё одна функция, которая находит нужную накладную

Короче, тут всё запутано, поэтому я решил заполнять таблицу "Варианты цен" в фоне.
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546480
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Настаев, конкретно сказать не получится, но в своё время я брал и смотрел какой запрос в цепочке (предварительно разбив на множество запросов) использует какое время (могло перелопачиваться всё содержимое базы), далее я оптимизировал эти запросы. На тех этапах (запросах) что не получалось оптимизировать я создавал промежуточные таблицы (для этого предварительно создавалась временная БД) куда и сливались результаты. Этих таблиц была не одна. Всё заворачивалось в транзакцию.
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546482
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
\\\\,

я понял
В принципе, я узнал, что хотел
Да и с запросами у меня нет никаких проблем. Всё работает как часики. Только иногда бесят эти 10 секунд выполнения. Впрочем, для этого и придумали процессоры. Пусть думают )))))
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546483
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Настаев, временные таблицы хороши для фиксации вычислений. Если в каком-то подзапросе идёт вычисление, то частенько это вычисление для одной и той же записи проходит многократно, что очень сильно замедляет выполнение запроса.
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546484
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
\\\\,

Я бы этого избежал, если бы знал, какая запись нуждается в обновлении. Частично я это уже решил, создав поле "выделена", в котором я ставлю галочки на нужные записи. Поменялась, скажем, цена на товар - ставится галочка. А потом обновляются только нужные записи.

Спасибо за помощь. Там я ещё должен просмотреть один из ваших примеров запуска из другой БД, только руки ещё не дошли
...
Рейтинг: 0 / 0
Как запустить процедуру из другой БД?
    #39546491
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настаевaleks222, я попробовал этот код
Он работает с запросами типа Select
А у меня запрос на обновление

Наивный. Чукотский. Вьюноша.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как запустить процедуру из другой БД?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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