|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Комрады, приветствую! Имеется разделенная БД Access (локально формы и запросы для каждого юзера, в сети - таблицы). Файл с формами я иногда обновляю: где-то код допишу, где-то форму исправлю). Раньше, когда базой только начали пользоваться и у юзеров было мало (или совсем отсутствовали свои запросы) обновление заключалось в простом удалении файла с формами и заменой его на новый. Сейчас это сделать проблематично без ручного пересохранения большого количества запросов, которые у каждого юзера свои. Вопрос: как реализовать отдельное обновление модулей и форм внутри accdb так, чтобы со стороны юзера было меньше всего телодвижений? _____________________ А что на самом деле хотел сказать "Frost_Imp" никто не знает, так как администрация форума попросила его быть вежливым. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 10:36 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_Imp, хранить настройки в другой БД. Или организовать автоматическое обновление пользовательских данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 10:41 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
\\\\, настройки совсем отдельно - уже, наверное, поздно, переделки того не стоят. А автоматическое обновление - это, извините, как? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 10:43 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_Imp, у меня есть БД, которая обновляется стандартно с заданного места. Пользователь запускает "пускатель", а тот проверяет актуальность версии и если надо обновляет и переписывает настройки пользователя, и/или просто запускает основную БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 10:48 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
\\\\, поделитесь примером? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 10:50 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_Imp, свой рабочий вариант выкладывать не буду, в размер не укладываюсь, да и решает он специфические задачи (а править некогда). Но вот несколько возможных вариантов решения Как хранить версию базы? OpenDatabase ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 11:08 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Если фантазировать, как это могло бы быть... 1. В сетевом файле есть таблица, в которой лежит номер актуальной версии. Либо id обновления. 2. При каждом открытии пользовательского файла средствами VBA происходит запрос в эту таблицу и извлечение единственного либо последнего (соответственно) значения. 3. Это значение сравнивается со значением в модуле пользовательского файла, например "update_history". Если значения совпадают - ничего не происходит (ну или запускается обычная последовательность процедур). Если значения не совпадают - происходит запрос в таблицу примерно следующего вида: № обновления заменить2 main.bas3 main.bas3 Form_frmResp.clc Находим номер обновления (п.1), средствами VBA удаляем файл, имя которого указано в поле "заменить", экспортируем новое, которое лежит по заранее определенному пути. Сохраняем файл проекта. При необходимости повторяем процедуру. 4. В модуль "update_history" записываем номер обновления. Коряво? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 11:11 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpСейчас это сделать проблематично без ручного пересохранения большого количества запросов, которые у каждого юзера свои Это как? Еще ни разу не видел приложения в котором для каждого юзера свои запросы... Это нужно всем отдать только таблицы и сказать типа - ребята, а запросы каждый себе делайте сами ? Обычно запросы, формы, отчеты и модули для всех одинаковые и всё это вместе называется интерфейсом, который потом и обновляется на ура путем замены только одного файла (интерфейса). По нормальному, юзеры кроме форм и отчетов больше ничего и видеть то не должны, а если давать всем вольную на то, чтобы самому что-то ваять - то никакой речи об автоматическом обновлении интерфейса уже и быть то не может... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 11:15 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
vmag, смотрите, для работы форм у меня все запросы либо в рекордсоурсах форм, либо в VBA. Сохраненные запросы - это когда в сети лежит файл на десяток миллионов записей, а юзеру нужна аналитика. Какая-то своя. Которая не нужна соседу справа и соседу слева. Он делает запрос и периодически к нему обращается. Или 20 запросов. То же самое делают соседи справа и соседи слева. То есть мой Access делает 2 вещи: 1. Выполняет заранее запрограммированные функции 2. Служит хранилищем. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 11:21 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpКоряво?Очень. Первую ссылку не смотрел. Версия хранится в свойствах бд. Файл front-end копируется к пользователю с временным названием, туда программно добавляются/копируются пользовательские данные, старый front-end удаляется, новый переименовывается и запускается. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 11:22 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpКоряво? Есть немного. Служебная таблица по п. 1 - такие же данные, как и остальные, обрабатываемые приложением. Так что место ей - в БД с данными. Сведения об обновлении блоков по п. 3 - должны имхо храниться как в БД локального интерфейса (custom properties), так и в общей БД с данными в служебной таблице. Более того, БД с данными должны хранить, вероятно, и историю обновления, и даже прогресс текущего обновления. Frost_ImpНаходим номер обновления (п.1), средствами VBA удаляем файл, имя которого указано в поле "заменить", экспортируем новое, которое лежит по заранее определенному пути. Сохраняем файл проекта. При необходимости повторяем процедуру. Основная проблема предлагаемой схемы - её неустойчивость. Во-первых, совершенно непонятно, что делать, если в процессе обновления произошла ошибка. Во-вторых, неясно, как в этой схеме обновлять модуль обновления. Гораздо разумнее такая схема: 1) При запуске модулем интерфейса выполняется версионный контроль. Если текущая версия равна актуальной - начинается сеанс работы. Если версионная информация недоступна - разумнее аварийно завершить работу, чем запустить интерфейс, рискуя порушить данные. 2) Если текущая версия младше (или просто не равна - но вот тут надо много думать) актуальной - выполняется защищённое (от сбоев и искажений) копирование с общего ресурса двух модулей. Первый - модуль обновления. Второй - актуальная версия интерфейса. Если имеются предыдущие копии (проверка выполняется перед копированием) - сперва они проверяются на целостность и актуальность версии, разрушенные и неактуальные - удаляются и загружаются новые. Если в процессе копирования обнаружено повреждение копируемых модулей - выполняется аварийное завершение с выводом диагностики. 3) Если копирование прошло нормально - асинхронно запускается модуль обновления, ему передаётся необходимая информация о текущем процессе, и работа основного модуля завершается. 4) Модуль обновления ожидает завершения работы основного приложения (по переданным ему данным), после чего выполняет переименование модулей (current -> bak, new -> current). Если оно неудачно - диагностика и аварийное завершение. 5) Если переименование прошло удачно - модуль обновления асинхронно запускает обновлённый интерфейс и завершает работу. Вопрос удаления старых версий надо решать дополнительно. Я бы оставил его на чисто удаление вручную. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 11:33 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpФайл с формами я иногда обновляю: где-то код допишу, где-то форму исправлю). Для общего развития - DoCmd.TransferDatabase может импортировать любой объект. Существующий перед этим можно удалить (DoCmd.DeleteObject) или переименовать (DoCmd.Rename). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 11:38 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )Для общего развития - DoCmd.TransferDatabase может импортировать любой объект.Включая объект (модуль или макрос), в котором располагается этот самый выполняемый в текущий момент DoCmd.TransferDatabase? чёта я засомневался... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 11:40 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
\\\\, не разберусь в прилагаемом вами примере. В нем говорится следующее авторFile>Database Properties вкладка Custom, в поле Name пишем "DB Version" ставим тип "Number" и всякий раз увеличиваем это значение. В 7 VBA нет Database Properties, есть Project Properties. Не понимаю, как там добавить поле с произвольным типом, куда сохранять значение версии? Есть некое поле Conditional compilation arguments. Это оно? Как вызвать его значение из VBA? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 12:11 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_Imp, ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 12:35 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )Для общего развития - DoCmd.TransferDatabase может импортировать любой объект. Существующий перед этим можно удалить (DoCmd.DeleteObject) или переименовать (DoCmd.Rename). авторDoCmd.TransferDatabase Осуществляет экспорт/импорт данных между открытой базой данных (или проектом Microsoft Access) и другой (внешней) базой данных. А мне нужно, например, *.bas импортировать в открытую базу данных просто с жесткого диска, эта макрокоманда не подходит. А что подойдет? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 18:18 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
То есть сейчас задачу сузилась до: импортировать файл *.bas или *.cls в текущую базу данных без диалоговых окон. Имена файлов знаю, пути знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 19:18 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Простая замена файла-библиотеки. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 19:22 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Отделите мух от котлет, отделите БД с данными и вашу интерфейсную часть от файла БД с индивидуально-пользовательской частью, где каждый может делать какие угодно запросы. Для поддержки ощущения целостности системы сделайте в своей интерфейсной БД кнопку "Открыть мои запросы".. Всё что ваше - это ваше и не надо туда пускать пользователей НЕ через ваш интерфейс, а в своем файле пользователи пусть веселятся без вас. При такой схеме задача сводится к типовой - как подменить файл на более новый. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 19:36 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
PredeclaredПростая замена файла-библиотеки.не понимаю Мухи-КотлетыОтделите мух от котлет, отделите БД с данными и вашу интерфейсную часть от файла БД с индивидуально-пользовательской частью, где каждый может делать какие угодно запросы. Для поддержки ощущения целостности системы сделайте в своей интерфейсной БД кнопку "Открыть мои запросы".. Всё что ваше - это ваше и не надо туда пускать пользователей НЕ через ваш интерфейс, а в своем файле пользователи пусть веселятся без вас. При такой схеме задача сводится к типовой - как подменить файл на более новый. Я уже писал в самом начале, что если бы все было по описанной вами схеме - проблем бы не было. Проблема возникла сейчас на уже готовой базе. Мухокотлеты это или нет - решать, уж извините, в конечном итоге юзерам на местах. Я не вижу ничего критичного в том, что юзеры используют мой функционал через формы, а также сами ведут аналитическую работу (они, а не я). Меня (и поставленные бизнес-задачи) на все сто устраивает текущая схема. Отдавать дань красоте я не хочу: для этого нет ни ресурсов, ни необходимости. Поэтому, если вам не сложно, давайте вернемся не к обсуждению правильности структуры моей БД, а к конкретному вопросу: как средствами VBA без диалоговых окон импортировать модуль (*.bas) из внешнего файла? Прежний файл я удаляю без проблем Код: vbnet 1.
а вот с импортом разобраться не могу ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 09:05 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpЯ не вижу ничего критичного в том, что юзеры используют мой функционал через формы, а также сами ведут аналитическую работу (они, а не я).Я тоже ничего критического не вижу, не пойму с чего вы об этом заговорили. Предложенный мной вариант никак не исключает "мой функционал через формы, а также сами ведут аналитическую работу". Frost_ImpМеня (и поставленные бизнес-задачи) на все сто устраивает текущая схема.Вы лукавите. Данный топик тому подтверждение. Но то ли еще будет.. Frost_ImpОтдавать дань красоте я не хочу: для этого нет ни ресурсов, ни необходимости.И ресурсов станет еще меньше, поскольку вы будете возвращаться сюда с вопросами "Как обновить лишь часть модулей (пользователи пишут свои модули)?", "Как обновить лишь часть модуля (пользователи дописывают мои модули)?", "Как обновить лишь часть функций (пользователи переписывают мои функции)?". А уж сколько ресурсов будет уходить на каждого (!) пользователя после очередного апдейта, ибо что-то не заработало в индивидуальной уникальной (у каждого пользователя своя личная версия) системе. Не буду говорить о зажатости в изменении дизайна (это вообще будет чем-то непонятным) и прочих граблях. Но вы правы в одном - мои посты являются оффтопом в данной теме, за что извиняюсь. Удачки вам ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 09:43 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Мухи-КотлетыFrost_ImpЯ не вижу ничего критичного в том, что юзеры используют мой функционал через формы, а также сами ведут аналитическую работу (они, а не я).Я тоже ничего критического не вижу, не пойму с чего вы об этом заговорили. Предложенный мной вариант никак не исключает "мой функционал через формы, а также сами ведут аналитическую работу". Frost_ImpМеня (и поставленные бизнес-задачи) на все сто устраивает текущая схема.Вы лукавите. Данный топик тому подтверждение. Но то ли еще будет.. Frost_ImpОтдавать дань красоте я не хочу: для этого нет ни ресурсов, ни необходимости.И ресурсов станет еще меньше, поскольку вы будете возвращаться сюда с вопросами "Как обновить лишь часть модулей (пользователи пишут свои модули)?", "Как обновить лишь часть модуля (пользователи дописывают мои модули)?", "Как обновить лишь часть функций (пользователи переписывают мои функции)?". А уж сколько ресурсов будет уходить на каждого (!) пользователя после очередного апдейта, ибо что-то не заработало в индивидуальной уникальной (у каждого пользователя своя личная версия) системе. Не буду говорить о зажатости в изменении дизайна (это вообще будет чем-то непонятным) и прочих граблях. Но вы правы в одном - мои посты являются оффтопом в данной теме, за что извиняюсь. Удачки вам 100500 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 09:55 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Комрады, я очень рад, что мой вопрос вызвал такое бурное обсуждение. К сожалению, мне н ехватает профессиональных знаний, чтобы объяснить вам на понятном (и однозначно понимаемом) языке, почему я не хочу сейчас разделять базу для того, чтобы решить точечную задачу. В очередной раз попрошу ответить на вопрос - как средствами VBA без диалоговых окон импортировать модуль (*.bas) из внешнего файла? Если угодно - я соглашусь со всеми вашими "обвинениями", посыплю голову пеплом и приму факт, что я безрукая обезьяна, если это поможет в решении моей задачи. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 10:01 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
не верю, что я это делаю... пара разных решений тут: http://stackoverflow.com/questions/31596339/importing-a-module-into-access-programmatically-from-a-cls-or-similar-file если не устроит, то гуглить по "ms access VBProject.VBComponents import" ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 10:19 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Мухи-Котлетыне верю, что я это делаю...Но вы действительно это делаете, за что вам респект и лучи добра. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 10:41 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Таки позволю себе уточнение Код: vbnet 1.
замечательно удаляет модуль. Но этой макрокомандой не удается удалить class objects, который form_*, а при экспорте выглядит как *.cls Перебрал все objects type - ничего не подходит ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 11:05 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpКомрады, приветствую! Имеется разделенная БД Access (локально формы и запросы для каждого юзера, в сети - таблицы). Файл с формами я иногда обновляю: где-то код допишу, где-то форму исправлю). Раньше, когда базой только начали пользоваться и у юзеров было мало (или совсем отсутствовали свои запросы) обновление заключалось в простом удалении файла с формами и заменой его на новый. Сейчас это сделать проблематично без ручного пересохранения большого количества запросов, которые у каждого юзера свои. Вопрос: как реализовать отдельное обновление модулей и форм внутри accdb так, чтобы со стороны юзера было меньше всего телодвижений? _____________________ А что на самом деле хотел сказать "Frost_Imp" никто не знает, так как администрация форума попросила его быть вежливым. Попробую: 1 У вас на клиенте пользователи создают запросы? получается что они видят таблицы и модули VBA и тд. 2 Создав запрос на обновление пользователи могут изменять данные? 3 Получется что каждый клиент уникальный (об этом вам и говорил "Мухи-Котлеты ") никакой VBA вам не поможет так как каждово клиента будете править рученьками. даже написав код VBA для импорта модуль (*.bas) придется подключаться к каждому клиенту (они у вас по определению уникальны) 4 проектирование очень плохое и не надо прикрываться словами что оно вас устраивает (вот видишь не устроило) С уважением. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 11:08 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
ROIПопробую: 1 У вас на клиенте пользователи создают запросы? получается что они видят таблицы и модули VBA и тд. 2 Создав запрос на обновление пользователи могут изменять данные? 3 Получется что каждый клиент уникальный (об этом вам и говорил "Мухи-Котлеты ") никакой VBA вам не поможет так как каждово клиента будете править рученьками. даже написав код VBA для импорта модуль (*.bas) придется подключаться к каждому клиенту (они у вас по определению уникальны) 4 проектирование очень плохое и не надо прикрываться словами что оно вас устраивает (вот видишь не устроило) С уважением. Спасибо за критику. С удовольствием расскажу еще раз. 1. Да, именно так. Они видят таблицы, модули. Запросы - нет, все мои запросы - в VBA. 2. Технически - да 3. Не совсем понятно. Клиенты уникальны только с точки зрения сохраненных пользовательских запросов. Все остальное (формы, модули, классы, процедуры) идентично. Именно эти идентичные вещи я и буду обновлять. 4. База проектировалась, как однопользовательская. Затем для решения бизнес-целей пришлось ее разделить и сделать многопользовательской. Какие-либо доработки уже не планировались, так как, во-первых, база была достаточно вылизана с т.з. необходимого функционала, а во-вторых через 3-4 месяца необходимость в ее использовании отпадет. Вчера мной была найдена некритичная ошибка в одном из модулей. Ошибку я исправил, но возник вопрос - как этот модуль обновить у пользователей, не затрагивая их многочисленные запросы. В связи с чем и был создан топик. В результате диалога в топике родился код на 50 строк, который решает мою задачу без глобальных доработок по еще одному разделению баз и вынесением пользовательских запросов в отдельный файл. И небольшое дополнение по п.2. Это сложно объяснить, но я и пользователи делаем одну общую работу, достигая общие цели. Сделать вопрос на удаление/обновление можно - но зачем? После этого конечный пользователь выйдет в свете "сам себе злобный буратино" и "отморожу уши назло бабушке". В это сложно поверить разработчикам, находящимся по другую сторону баррикад от бизнес-пользователей, но в моем случае - я и пользователи на одной стороне. И все прекрасно отдают себе отчет в своей работе. P.S. И, да - файл с таблицами у меня бэкапится регулярно, восстановить поврежденные данные - дело двух кликов мыши. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 11:23 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_Imp, Я полностью согласен с Мухи-Котлеты, но рас уж это действительно для меня такой цирк впервые, то просто расшифрую на примере самый подходящий (на мой взгляд) тут ответ от PredeclaredПростая замена файла-библиотеки. Итого: 1. Распаковываем в корень диска С моё вложение дабы на нем иметь папку C:\modulator с пятью файлами mdb (ВАЖНО! Распаковать нужно именно так и именно туда, иначе не будет работать - это всего лишь пример). Основные файлы: - таблицы (это просто таблицы, типа сама база данных, хранилище) - приложение_лузера (это то, что у каждого юзера своё персональное), к нему привязана таблица из хранилища из файла таблицы, в нем создан модуль tmp (заглушка) и в референсах есть ссылка на авторский файл (приложение_автора) - приложение_автора собственно тот файл, который поставляет всем автор в нем пока одна функция f1_ Дополнительные (для тестирования): - приложение_автора1 (сейчас один в один соответствует файлу приложение_автора) - приложение_автора2 (в нем изменена функция f1_ тут она не складывает, а умножает, например) Как проверить: 1. Запускаем Запрос1 из приложение_лузера и видим, что он суммирует поля... закрываем всё... 2. Удаляем нафик приложение_автора, и делаем его по новой из приложение_автора2 (делаем копию и переименовываем в приложение_автора). 3. Запускаем Запрос1 из приложение_лузера и видим, что он уже перемножает поля... Вывод: приложение_лузера тупо оперирует данными из таблицы, но в соответствии с алгоритмами из приложение_автора, которое ему подсунули в виде файла... НО ЭТО ОЧЕНЬ ПОХОЖЕ НА ТУПИКОВЫЙ ПУТЬ !!! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 11:24 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpP.S. И, да - файл с таблицами у меня бэкапится регулярно, восстановить поврежденные данные - дело двух кликов мыши. Чепуха ни чего вы не востановите у вас же не каждую секунду бекап делается! Да откатится на день может и получиться, но это не есть айс. Советую (ИМХО) Клиентская база имет ссылку на дополнительную базу так сказать (сборник вашеих модулей и процедур) тогда обновление будет проще обновили вашу дополнительную базу с заменой файла и проблем нет. А ковыряться в каждом клиенте (бр в смысле та есче петня) С уважением. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 11:32 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
ROIЧепуха ни чего вы не востановите у вас же не каждую секунду бекап делается! Да откатится на день может и получиться, но это не есть айс. Советую (ИМХО) Клиентская база имет ссылку на дополнительную базу так сказать (сборник вашеих модулей и процедур) тогда обновление будет проще обновили вашу дополнительную базу с заменой файла и проблем нет. А ковыряться в каждом клиенте (бр в смысле та есче петня) С уважением. А мне нет необходимости делать это каждую секунду. Важные данные туда заливаются раз в неделю. Пользователи делают аналитику на основе этих данных. Разную. Разнообразную. Испортили файл - получили по шее от начальства (даже не от меня). Нафига им это делать?) Давайте я расскажу, что я в итоге сделал, может, так будет понятнее, что задача решается довольно просто и проблемы, которые вы озвучиваете, для моего случая надуманные. Итак, при загрузке приложения запускается это Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94.
Все! За исключением проблемы, которую я указал в коде, все замечательно работает. Да, код грязноватый, но да и я не профи. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 11:54 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_Imp, ню-ню... А "мусор" который остаётся после удаления модулей? Не проще ли копировать файл с кодом, а туда уже добавлять запросы/таблицы(?) пользователя? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:16 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
\\\\Frost_Imp, ню-ню... А "мусор" который остаётся после удаления модулей? Не проще ли копировать файл с кодом, а туда уже добавлять запросы/таблицы(?) пользователя? Какой именно мусор? Свой способ выбрал потому, что мне легче скопировать заранее заданный список файлов, нежели парсить и составлять рандомный список из запросов юзера. Ну и как бы все рвно не понимаю, чем ваш вариант радикально лучше, возможно ответ про мусор поможет мне разобраться. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:18 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpКакой именно мусор? Для начала вот, а там дальше сам... Модификация модуля очистки от "мусора" ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:36 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_Imp, А почему Вас не устраивает библиотечный вариант базы? Т.е. создаете файл с формами, отчётами, модулями и т.д. (назовём условно "Библиотека"), потом создаете ещё один файл для юзера (назовём "Пользовательская база"), где НЕ будут ни форм, ни отчётов и т.д. Подключаете в пользовательской базе через референс библиотеку. Единственное - надо будет функционал состряпать как вызвать объекты из библиотеки находясь в пользовательской базе. Пользовательской базе пусть юзеры экспериментируют всё что угодно, создают какие угодно запросы и прочие объекты (хотя и такой вариант некоторые программисты не любят, мало ли что натворит пользователь!). Каждый раз Вы будете обновлять только библиотеку, а пользовательскую базу вообще не будете трогать. Разве не вариант в Вашем случае? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:36 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpСвой способ выбрал потому, что мне легче скопировать заранее заданный список файлов, нежели парсить и составлять рандомный список из запросов юзера. Ну и как бы все рвно не понимаю, чем ваш вариант радикально лучше, возможно ответ про мусор поможет мне разобраться.Так и не нужно парсить, копируй усё скопом. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:39 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
studierenFrost_Imp, А почему Вас не устраивает библиотечный вариант базы? Т.е. создаете файл с формами, отчётами, модулями и т.д. (назовём условно "Библиотека"), потом создаете ещё один файл для юзера (назовём "Пользовательская база"), где НЕ будут ни форм, ни отчётов и т.д. Подключаете в пользовательской базе через референс библиотеку. Единственное - надо будет функционал состряпать как вызвать объекты из библиотеки находясь в пользовательской базе. Пользовательской базе пусть юзеры экспериментируют всё что угодно, создают какие угодно запросы и прочие объекты (хотя и такой вариант некоторые программисты не любят, мало ли что натворит пользователь!). Каждый раз Вы будете обновлять только библиотеку, а пользовательскую базу вообще не будете трогать. Разве не вариант в Вашем случае? Дык оне не ищют легких путей ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:43 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_Imp, Есть ещё и такой вариант. У объекта "Application" есть скрытые методы "SaveAsText" (сохраняет в отдельный текстовый файл все свойства объекта) и "LoadFromText" (создаёт объект базы согласно текстовому файлу, который был создан с помощью "SaveAsText"). Допустим, где-то в сети находится некий файл, где модули и прочие объекты обновлены. В пользовательской базе подключаетесь к сетевому файлу, оттуда "списываете" объект с помощью "SaveAsText". Ну а потом запускаете "LoadFromText". А в конце можете удалить текстовый файл, который был создан (если хотите замести следы). И тем не менее, библиотечный вариант всё таки лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:45 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
\\\\Frost_ImpКакой именно мусор? Для начала вот, а там дальше сам... Модификация модуля очистки от "мусора" Полезно, безусловно. В моем случае - нет острой необходимости. 1. Размер пользовательского файла с формами некритичен. 2. Обновления происходят очень редко. Конечно, я понимаю ваше желание делать сразу "чтоб красиво и блестело". Возможно, это ваш хлеб. Возможно, вы получаете за это деньги. Но это не мой случай. Мне нужно решить конкретную задачу, не тратя на это месяц своего рабочего времени. Я не пытаюсь вас обидеть. Я пытаюсь объяснить, почему я на хочу тратить 10Х своего времени, вместо того, чтобы потратить Х. Ну это же просто: незачем покупать автомобиль, чтобы пару раз попасть в магазин за продуктами. studieren, это и на ваш пост ответ, в общем-то. Кроме того, без обид, но вы, видимо, пропустили мои подобные развернутые ответы выше. И снова вернусь к своей проблеме авторТаки позволю себе уточнение Код: vbnet 1.
замечательно удаляет модуль. Но этой макрокомандой не удается удалить class objects, который form_*, а при экспорте выглядит как *.cls Перебрал все objects type - ничего не подходит ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:51 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_Imp, То что ТС не понимает всех нюансов проектирования, советовать ему бесполезно. Схема базы и доступ к функционалу полное г..но. Я умываю руки (не хочу участвовать в теме "как из г..на сделать конфетку" ) С уважением. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 12:52 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
ROI, при всем уважении, но я тоже не люблю, когда меня не слушают. Пятница, время потрепаться - ок, но это не оправдывает вашего желания поговорить о наболевшем для вас и ненужном для меня, вместо того, чтобы просто дать совет или рекомендацию по простому вопросу "как программно удалить class objects?" без привязки к качеству моей бд, цвету моей кожи или моей пряморукости. Спасибо за критику, но не более. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 13:01 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpROI, при всем уважении, но я тоже не люблю, когда меня не слушают. Пятница, время потрепаться - ок, но это не оправдывает вашего желания поговорить о наболевшем для вас и ненужном для меня, вместо того, чтобы просто дать совет или рекомендацию по простому вопросу "как программно удалить class objects?" без привязки к качеству моей бд, цвету моей кожи или моей пряморукости. Спасибо за критику, но не более. Дык я пытаюсь донести до вас: 1 Вам придется подключаться своим кодом на VBA к каждому клиенту. 2 Удалить из базы модуль, накатить новый, как-же предворительная компиляция (это если вы не в теме В VBA Debug-> Compile DataBase ) 3 Ну с мусором тебе объяснили, но ты я так понял не в курил (твои проблемы). 4 У вас есть стойкое желание делать все через одно место (флаг вам в руки) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 13:15 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
ROIДык я пытаюсь донести до вас: 1 Вам придется подключаться своим кодом на VBA к каждому клиенту. 2 Удалить из базы модуль, накатить новый, как-же предворительная компиляция (это если вы не в теме В VBA Debug-> Compile DataBase ) 3 Ну с мусором тебе объяснили, но ты я так понял не в курил (твои проблемы). 4 У вас есть стойкое желание делать все через одно место (флаг вам в руки) Вы придумываете проблемы на пустом месте. 1. Да нет же. Ну откуда вы это берете? Писал же (именно писал, комрады, почему никто не читает?) авторИтак, при загрузке приложения запускается это При загрузке! Где здесь слово "вручную"? 2. Компиляцию и отладку кода я делаю на своей машине. На своей же машине проверяю работоспособность. Со своего проекта делаю экспорт файл, кладу его в папку для обновлений. При условии, что остальные модули и процедуры абсолютно идентичны моим - почему у них не должно это запуститься? 3. Я все прекрасно вкурил, проблема имеет место быть. Только я мыслю не булевыми функциями "есть проблема/нет проблемы", а взвешиваю необходимость ее решения с точки зрения здравого смысла и моих бизнес-задач. 4. Объясните мне, как вопрос "как программно удалить class objects?", будучи заданный в вакууме (о чем я прошу уже не в первый раз), является методом решения задач через одно место? Есть задача, нужен совет по решению. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 14:33 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
по п.4. Если вопрос о бэк модуле формы/отчета, то: HasModule Property. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 14:46 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Predeclaredпо п.4. Если вопрос о бэк модуле формы/отчета, то: HasModule Property. Что-то я накуролесил. Как я понял, изменение свойства формы HasModule с True на False ведет к удалению модуля формы. Об этом, по крайней мере, честно предупредил Access при попытке сделать это руками через интерфейс свойств. Я согласился. В итоге модуль формы по-прежнему визуально присутствует в списке модулей, но не открывается, ругаясь на File not found. Также я пришел к выводу, что простая попытка импорта cls файла не превратит модуль класса в модуль формы :( Теперь у меня 4 модуля класса, которые открываются (и имеют содержимое модуля формы), но не удаляются методом DoCmd.DeleteObject 5, Class1 ругаясь на тот же File not found ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 15:34 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Ожидаемо. Вообще лучше пользовать малодокументированные SaveAsText LoadFromText ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 15:44 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
PredeclaredВообще лучше пользовать малодокументированные SaveAsText LoadFromText Отличный совет. Особенно после PredeclaredОжидаемо. на использование хорошодокументированных. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 16:18 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_Imp... 4. Объясните мне, как вопрос "как программно удалить class objects?", .., является методом решения задач через одно место? ... Вы просили объяснить? Я таки объяснил. Наглядно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 16:24 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
PredeclaredFrost_Imp... 4. Объясните мне, как вопрос "как программно удалить class objects?", .., является методом решения задач через одно место? ... Вы просили объяснить? Я таки объяснил. Наглядно. Смирюсь с вашим сарказмом, все-таки на вашей территории, вынужден терпеть снисхождение. Передумал спрашивать. В мои седые года быть подушечкой для иголок, наверное, неправильно. Подожду, может еще кто на огонек заглянет. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 16:30 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
сорри за оффтоп, но.. Frost_ImpСмирюсь с вашим сарказмом, все-таки на вашей территории, вынужден терпеть снисхождение. Передумал спрашивать. В мои седые года быть подушечкой для иголок, наверное, неправильно. Подожду, может еще кто на огонек заглянет.Не обижайтесь. Просто лично для меня, да и для многих других тут наверное, все выглядит примерно так: - Привет! Как выстрелить из дробовика в сапог, его не снимая? - А зачем? - Ну чтобы шнурки можно было в дырочки вставлять. - Зачем шнурки в сапогах??? - Ну мне так нужно! Просто ответьте на вопрос! - Берете ружье и стреляете в сапог. - Попробовал, но появилась только одна дырочка, а надо много, да и к тому же теперь нога болит. - Вы что, не сняли сапог??? - Ну да, я же написал, что хочу стрелять не снимая... - Так делать нельзя! Это плохо для вас закончится! Ну да ладно... Патрон должен быть с дробью, попробуйте. - Хм.. теперь челюсть болит... - ??? - Ну я дуплетом, а там отдача прилетела в виде приклада.. Еще раз.. всё это без злобы и стёба.. по-дружески.. разрядить обстановку, так сказать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 17:21 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Мухи-Котлеты, да я уже и не обижаюсь. Да простят меня модераторы, но поддержу вашу лирическую нотку своим видением. В некотором царстве, в некотором государстве жил-был добрый молодец. И отправился он как-то путешествовать по дальним странам, чтоб, как говориться, дураком не помирать, дивных дивностей посмотреть. Много гулял, много видывал, чудес всяческих, пора и домой собираться. Лег путь его через пустыню. День идет добрый молодец, два, неделю. Еда и вода закончились. Помирать уж собрался добрый молодец, как увидел вдали оазис травою зеленой обрамленный и с колодцем посередине. Собрался добрый молодец с остатками сил и, на последнем издыхании добрался до колодца. Приятной свежестью и предвкушением ордарил его колодец, однако не тут то было: колодец глубокий, вода на дне, ведра нет, лишь какое-то устройство навроде насоса торчит из колодца. И так к нему добрый молодец, и эдак - не понимает, как с этим насосом сладится. Ну, думает, вот и смертушка моя пришла. Обидно вот так вот, около воды от жажды помереть. Вдруг видит добрый молодец - старичок к нему ковыляет. Старенький, сухонький, но в глазах мудрость всего света. Взмолился добрый молодец, помоги, де, мне старик, помираю. "В чем задача твоя?" - медленно спросил старик. "Вот колодец, вот насос" - ответил добрый молодец, "Мне б насос поднажать да и счастлив я был бы". Осмотрел старичок доброго молодца с головы до ног и молвил: "Не под силу тебе, чужеземец, с этим насосом справиться. Руки у тебя слабоваты, да и одежда не подходит. Кроме того, ты слишком молод, насос принимает только руки стариков почтенных". "Что же мне делать, как воды испить?" - измученно прошептал добрый молодец. Сверкнул глазами старик из-под бровей седых и молвил: "Для начала тебе нужно родиться в стране семи холмов, в 7 лет пройти обряд посвящения, убить варана и съесть его его голову, затем на 20 лет уйти в отшельники, питаться только травой и постигать мудрость мира. После этого вернуться в родную страну, взять в жены самую красивую женщину, завести с ней пятерых детей, поставить свой дом, заслужить уважение Семи Старцев и лишь потом ты станешь достойным качать воду из колодца священным насосом." Заплакал добрый молодец: "Мне бы только глоток, чтоб не умереть в краю чужом. Неужели нет никаких других способов?" "Я недостаточно мудр, чтобы помочь тебе в этом" - ответил старик. "Может Один Из Семи тебе поможет?" - и показал рукой в сторону. Обернулся добрый молодец и увидел старичка, еще более сухонького и старенького, чем его собеседник, но с более глубокой мудростью в глазах. В а руке... А в руке старичка увидел добрый молодец ведро к веревке привязанной. Воспрял добрый молодец, бросился к старцу, взмолился что было силы "Помоги, старик, воды из колодца испить. Не справляюсь с насосом древним, не родился я в стране Семи холмов, не прошел обряд посвящения в семь лет, не отшельничал двадцать, не брал в жены самую красивую женщину и не рожала она мне пятерых детей. Не заслужил я уважения Семи и твоего, старик, но, ради всех богов, помоги мне воды из колодца испить!" Остановился старик, покрутил задумчиво ведро в руке и молвил: "Ведро". "Что ведро? Взять ведро? Использовать?" - добрый молодец выхватил ведро из рук старца, бросился к колодцу, забросил ведро внутрь. Струтся веревка меж рук, а ведро все еще дна не достигло. Вот уж она и кончилась. Заглянул добрый молоц в колодец - совсем чуть от ведра до воды. "Что делать, старик?" - отчаялся добрый молодец. "Одежда" - просто ответил старец. Сбросил добрый молодец с себя одежду, связал узлами, привязал к веревке и - о, чудо! - ведро зачерпнуло живительныю влагу. Потащил добрый молодец ведро наверх, предвкушая глотки прохладные, да поторопился, руки соскользнули, веревку потеряли и упала веревка с ведром и одеждой на самое дно колодца. Поднял глаза обиссилевшие добрый молодец, посмотрел на старца и упал замертво. "Я знал" - сказал старец, неторопясь подошел к насосу, снял незаметный замок, работу насоса блокирующий, двумя движениями налил себе воды в стакан, из широкого рукава извлеченный, медленно напился и пошел прочь от колодца. Темнело. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2016, 09:11 |
|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#18+
Frost_ImpМухи-Котлеты, да я уже и не обижаюсь. Да простят меня модераторы, но поддержу вашу лирическую нотку своим видением. В некотором царстве, в некотором государстве жил-был добрый молодец. И отправился он как-то путешествовать по дальним странам, чтоб, как говориться, дураком не помирать, дивных дивностей посмотреть. Много гулял, много видывал, чудес всяческих, пора и домой собираться. Лег путь его через пустыню. День идет добрый молодец, два, неделю. Еда и вода закончились. Помирать уж собрался добрый молодец, как увидел вдали оазис травою зеленой обрамленный и с колодцем посередине. Собрался добрый молодец с остатками сил и, на последнем издыхании добрался до колодца. Приятной свежестью и предвкушением ордарил его колодец, однако не тут то было: колодец глубокий, вода на дне, ведра нет, лишь какое-то устройство навроде насоса торчит из колодца. И так к нему добрый молодец, и эдак - не понимает, как с этим насосом сладится. Ну, думает, вот и смертушка моя пришла. Обидно вот так вот, около воды от жажды помереть. Вдруг видит добрый молодец - старичок к нему ковыляет. Старенький, сухонький, но в глазах мудрость всего света. Взмолился добрый молодец, помоги, де, мне старик, помираю. "В чем задача твоя?" - медленно спросил старик. "Вот колодец, вот насос" - ответил добрый молодец, "Мне б насос поднажать да и счастлив я был бы". Осмотрел старичок доброго молодца с головы до ног и молвил: "Не под силу тебе, чужеземец, с этим насосом справиться. Руки у тебя слабоваты, да и одежда не подходит. Кроме того, ты слишком молод, насос принимает только руки стариков почтенных". "Что же мне делать, как воды испить?" - измученно прошептал добрый молодец. Сверкнул глазами старик из-под бровей седых и молвил: "Для начала тебе нужно родиться в стране семи холмов, в 7 лет пройти обряд посвящения, убить варана и съесть его его голову, затем на 20 лет уйти в отшельники, питаться только травой и постигать мудрость мира. После этого вернуться в родную страну, взять в жены самую красивую женщину, завести с ней пятерых детей, поставить свой дом, заслужить уважение Семи Старцев и лишь потом ты станешь достойным качать воду из колодца священным насосом." Заплакал добрый молодец: "Мне бы только глоток, чтоб не умереть в краю чужом. Неужели нет никаких других способов?" "Я недостаточно мудр, чтобы помочь тебе в этом" - ответил старик. "Может Один Из Семи тебе поможет?" - и показал рукой в сторону. Обернулся добрый молодец и увидел старичка, еще более сухонького и старенького, чем его собеседник, но с более глубокой мудростью в глазах. В а руке... А в руке старичка увидел добрый молодец ведро к веревке привязанной. Воспрял добрый молодец, бросился к старцу, взмолился что было силы "Помоги, старик, воды из колодца испить. Не справляюсь с насосом древним, не родился я в стране Семи холмов, не прошел обряд посвящения в семь лет, не отшельничал двадцать, не брал в жены самую красивую женщину и не рожала она мне пятерых детей. Не заслужил я уважения Семи и твоего, старик, но, ради всех богов, помоги мне воды из колодца испить!" Остановился старик, покрутил задумчиво ведро в руке и молвил: "Ведро". "Что ведро? Взять ведро? Использовать?" - добрый молодец выхватил ведро из рук старца, бросился к колодцу, забросил ведро внутрь. Струтся веревка меж рук, а ведро все еще дна не достигло. Вот уж она и кончилась. Заглянул добрый молоц в колодец - совсем чуть от ведра до воды. "Что делать, старик?" - отчаялся добрый молодец. "Одежда" - просто ответил старец. Сбросил добрый молодец с себя одежду, связал узлами, привязал к веревке и - о, чудо! - ведро зачерпнуло живительныю влагу. Потащил добрый молодец ведро наверх, предвкушая глотки прохладные, да поторопился, руки соскользнули, веревку потеряли и упала веревка с ведром и одеждой на самое дно колодца. Поднял глаза обиссилевшие добрый молодец, посмотрел на старца и упал замертво. "Я знал" - сказал старец, неторопясь подошел к насосу, снял незаметный замок, работу насоса блокирующий, двумя движениями налил себе воды в стакан, из широкого рукава извлеченный, медленно напился и пошел прочь от колодца. Темнело. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2016, 10:43 |
|
|
start [/forum/topic.php?all=1&fid=45&tid=1613818]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
112ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 203ms |
0 / 0 |