Показать полную графическую версию : Ускорить работу макроса
правда надо все делать средствами sql встроенными в vba, ТК акссес не у всех есть. »с SQL надо работать средствами SQL - то есть процедура на сервере которая возвернет таблицу значений, а как это будет инициировано и передано на клиента - это не суть важно.
Быстродействие ПРАВИЛЬНОГО SQL-запроса должно быть зависимым от размера итоговой выборки и слабо зависимо от объема обрабатываемых данных...
Iska, SELECT можно и для Рабочего листа Excel выполнять, не в том дело. »дело в производительности - СУБД штука замысловато заточенная под быструю обработку селектов, а в VBA это по-любому курсором будет - то есть производительность в лучшем случае пропорционально n*ln(n) от объема обрабатываемых данных - а это не айс...
blackeangel
01-12-2017, 21:02
y--, у нас ситуация другая. Работать только на текущем пк. С сервера мы только можем запросить отфильтрованные данные. Дальше, если существует такое, создать виртуальные таблицы и работать в них как на сервере. Но как это кодить вообще не знаю. От слова совсем.
blackeangel,
На текущем компе:
1. Ставим SQL-сервер, создаем пустую базу, создаем две таблицы правильной структуры
2. Разово через DTS заливаем данные в таблицы из двух разных источников данных
3. Пишем нужный селект в виде сторки которая возвращает таблицу нужных данных
4. Настраиваем интерфейс запуска сторки - вот тут мороки больше всего и в зависимости от потребностей конечного пользователя надо будет подобрать нужный инструментарий(и как следствие определиться с видом СУБД).
5. Настраиваем источники ODBC к двум разным источникам данных.
6. В планировщике SQL пишем задания на периодическую синхронизацию с настроенными источниками
blackeangel
02-12-2017, 11:26
1. Ставим SQL-сервер, создаем пустую базу, »
Дальше читать не стал, тк нет прав на установку стороннего ПО.
y--, что-то мне подсказывает, что таким макаром «…и до аэродрома недалеко» ;).
blackeangel
02-12-2017, 17:37
Я о том, что на всё описанное куча вопросов «Зачем?», «Зачем так?» и «Почему именно так, а не иначе?». »
Так спрашивайте - отвечу. Для этого я тут, чтоб отвечать на вопросы и задавать свои. На то он и форум.
blackeangel, Дальше читать не стал, тк нет прав на установку стороннего ПО. »ну я так прикинул - в принципе 6 часов это нормально для используемых методов и имеющихся объемов ;)
Возможная оптимизация времени исполнения в пределах поставленных условий может составлять десятки процентов - то есть(для меня) не имеет смысла и находится в пределах погрешности на загруженность самой системы... Всего лишь замена HDD на SSD(или на RAM-диск) для времени исполнения будет иметь больший эффект.
Iska, что таким макаром «…и до аэродрома недалеко» . »когда речь ведется о оптимизации времени исполнения в десятки/сотни раз (на сотни/тысячи процентов) - вправе и ВПП готовить - ну там для легкомоторников хотя бы ;)
blackeangel,
я к тому что даже без прав на установку софта - я пас... Если админ считает что не надо - значит он прав. Если он не прав - смотри предыдущее предложение.
blackeangel
02-12-2017, 21:32
y--, самое странное то, что вы предлагаете что то установить, вместо того чтобы работать с имеющейся информацией. Если бы можно было бы ставить, я б поставил, и не упирался бы в оптимизацию кода. К примеру можно было б написать макрос для Акссеса.В акссесе это операция занимает пару минут.
Всего лишь замена HDD на SSD(или на RAM-диск) для времени исполнения будет иметь больший эффект. » это тут каким боком? Все работает в оперативке.
Если админ считает что не надо - значит он прав. Если он не прав - смотри предыдущее предложение. »
"Если человек идиот, то это на долго" (с) Брильянтовая рука
А если серьёзно, если админ скажет считать столбиком, вы его послушаете?
blackeangel, А если серьёзно, если админ скажет считать столбиком, вы его послушаете? »если я своим скажу что надо считать на абаке - уточнят что это точно счеты и будут считать на них - мне виднее.
blackeangel
03-12-2017, 09:09
y--, ну что же, это прискорбно, что вы так думаете, в лучшем случае - они принесут калькуляторы
blackeangel, в виде исключения на письмо ответил. Но общаться лучше на форуме.
Как ускорить работу скрипта? »
расстрелять автора
К сожалению, здесь нерационально практически всё: и структура данных, и тягание данных туда-сюда, и сам алгоритм.
SELECT можно и для Рабочего листа Excel выполнять, не в том дело. »
как раз в том: данные будут на одном сервере, нормализованные и проиндексированные. Весь запрос выполнится за несколько секунд.
blackeangel
04-12-2017, 13:19
К сожалению, здесь нерационально практически всё: и структура данных, »
Что имеем с тем и работаем. Повлиять на структуру данных их свойств и тд нет и не будет возможности. Посему нечего переливать из пустого в порожнее.данные будут на одном сервере, нормализованные и проиндексированные. »
Из той же оперы. С сервера можно только взять данные.расстрелять автора »
Аргументируйте
в виде исключения на письмо ответил. Но общаться лучше на форуме. »
Письмо отправил раньше чем написал на форуме...
Iska, хорошо, допустим мы выполним 2 запроса: один соберёт данные с сервера, второй с листа. Как выполнить 3й запрос на основе этих 2х запросов?
Как выполнить 3й запрос на основе этих 2х запросов? »
blackeangel, ответ простой — никак. Это главная беда OLE DB — имея уже готовый объект Recordset, мы не можем сделать к нему запрос.
blackeangel
04-12-2017, 15:42
Iska, значит аксесс использует другое что то?
Iska, задам тупой вопрос: а что можно с Recordset делать?
Iska, значит аксесс использует другое что то? »
blackeangel, в Microsoft Access всё ровно так же — мы не можем обратиться запросом к объекту Recordset. Но в Access'е мы можем составить SQL-запрос, сохранить его в базе как именованный запрос и затем использовать его как источник данных. Мы можем сохранить содержимое Recordset как таблицу в базе и затем обращаться к ней впоследствии (последнее, в принципе, возможно и вовне Access). Но именно к самому объекту Recordset мы обратиться с запросом не можем.
Iska, задам тупой вопрос: а что можно с Recordset делать? »
Перебирать записи. Фильтровать записи. Сортировать записи. Что-то искать внутри. Обращаться к полям текущей записи. В том же Access'е нажмите F11, затем F2, введите «Recordset», найдите в браузере объектов данный класс для библиотеки ADODB (такой же класс есть и в библиотеке DAO, но нам нужен не он) и посмотрите его доступные методы и свойства.
blackeangel
04-12-2017, 16:07
Iska, насколько запрос медленнее чем перебор массива?)
Просто есть мысль о том, что данные с сервера получить, сохранить на жёсткий диск базой, и уже в цикле обращаться к ней. Ужасная идея?
Iska, насколько запрос медленнее чем перебор массива?) »
Во много раз быстрее.
Просто есть мысль о том, что данные с сервера получить, сохранить на жёсткий диск базой, и уже в цикле обращаться к ней. Ужасная идея? »
Ну, так коллеги Вам выше это и предлагают, только работать не перебором в цикле, а напрямую запросом. Насколько это возможно в Ваших условиях с кучей InStr(), я не знаю, судить не берусь. Но в частности отмечу: Microsoft Access позволяет использовать в своих запросах часть функций, и, насколько я помню, Instr() входит в их число.
blackeangel
04-12-2017, 16:24
Iska, нее, они предлагают ставить сервер, стороннее ПО.
а напрямую запросом »
Вот тут многое непонятно. Если перебором одной таблицы делать запрос к другой, тк в какой то придется обрезать или добавлять к имеющимся(как раз о том чего у меня вагон в массиве), и каждый раз это проверять, мне это понятно, то простым запросом двух таблиц... Мне кажется что у меня фантазия иссякла, и требует живого примера, чтоб убедиться что это не миф. Даже с простыми вхождениями в аксессе я не знаю как.(хотяб простое с наличием "-").
Так понимаю, вы в этом направлении практиковались мало?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.