|
Обновление модулей для пользователей
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=45&msg=39190152&tid=1613818]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 317ms |
total: | 433ms |
0 / 0 |