|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Надоело каждый раз вручную заменять приложение. Надо автоматизировать. Вообщем программа состоит из трех частей: 1) приложение у клиента, 2) база локальная у клиента (находится рядом с приложением), 3) база на сервере MySQL (после каждого рабочего дня клиент отправляет свои свежие данные с локальной базы на сервер). Хочу сделать в локальной базе специальную таблицу, где в одном ее поле будет храниться зипованный файл приложения (около 500 КБ), в другом поле - номер версии (формат integer). Также необходимо сделать форму в этом же файле (в файле локальной базы), чтобы при запуске этой формы выполнялась распаковка зипованного файла из таблицы в ту же папку где и база. Вопрос: 1) Есть ли в аксесе формат поля куда можно будет хранить файл? 2) Возможно ли создать форму в файле базы из файла приложения? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2017, 14:00 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
форму мне приходится создать в файле базы, но с файла приложение. Потому что в файле базы я вообще не должен вручную ничего трогать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2017, 15:31 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Или надо будет сделать готовую форму в файле приложение как обычно через конструктор, и при запуске определенного события программно экспортировать ее в файл базы. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2017, 15:36 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Нужно будет сделать четвертую часть - "Пускач" для приложения, который проверяет версию клиента, сравнивает ее с версией файл в локальной базе, если не совпадают, то распаковывает новый файл поверх старого клиента, после чего запускает клиента и закрывается. Адеке1) Есть ли в аксесе формат поля куда можно будет хранить файл? Если Акс 2007 или старше, то тип данных называется Attachment, очень удобно работать. Там нужно будет открыть два рекордсета типа Recordset2, после чего можно будет выгрузить тело файла по указанному пути Под катом функция, которую я использую для аналогичных целей - файлы темплейтов храню в базе, чтобы не мучаться с версиями. Public Function SaveTemplateFile(lngFileID) As String Dim strTemplatePath As String Dim rstFiles As DAO.Recordset2 Dim rstAttachments As DAO.Recordset2 Dim strTemplateFileName As String On Error GoTo ErrorHandler strTemplatePath = CurrentProject.Path & "\" & gstrTEMPLATE_PATH If Right(strTemplatePath, 1) <> "\" Then strTemplatePath = strTemplatePath & "\" End If If Dir(strTemplatePath) = "" Then MkDir strTemplatePath End If Set rstFiles = dbLocal.OpenRecordset("select * from tbl_Files where FileID=" & lngFileID) If rstFiles.RecordCount = 0 Then Err.Raise gcUSER_DEF_ERROR_BASE + 4, "SaveTemplateFile of bas_Utilites", "Attachent record not found for FileID=" & lngFileID End If Set rstAttachments = rstFiles.Fields("File").Value If Not rstAttachments.EOF Then strTemplateFileName = strTemplatePath & rstAttachments.Fields("FileName").Value If Dir(strTemplateFileName) <> "" Then Kill strTemplateFileName End If rstAttachments.Fields("FileData").SaveToFile strTemplatePath Else Err.Raise gcUSER_DEF_ERROR_BASE + 3, "SaveTemplateFile of bas_Utilites", "Template file attachment not found in database for FileID=" & lngFileID End If SaveTemplateFile = strTemplateFileName ExitHere: On Error Resume Next rstAttachments.Close Set rstAttachments = Nothing rstFiles.Close Set rstFiles = Nothing Exit Function ErrorHandler: Select Case Err Case 0 Resume Next Case Else LogError Err.Number, Err.Description, Erl, "SaveTemplateFile", "bas_Utilites" Resume ExitHere End Select End Function Адеке2) Возможно ли создать форму в файле базы из файла приложения? Не совсем понятен вопрос. Нужно создавать именно форму из текстового файла? Да без проблем - текстовый файл с выгрузкой формы сохраняем в локальной базе, потом выгружаем его на диск и загружаем в клиента. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2017, 16:21 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
АдекеЕсть ли в аксесе формат поля куда можно будет хранить файл? Тип OLE объект (т.е. длинное двоичное). Не знаю, можно ли в нем хранить архив как объект, но загрузить туда тело файла как набор байтов, а затем выгрузить на диск - легко. АдекеВозможно ли создать ( открыть? ) форму в файле базы из файла приложения? Здесь возникает куча вопросов. Что из себя представляет "приложение"? Если не БД Access, то форму оттуда ни открыть, ни импортировать не получится. Как в "база локальная" появится архив со свежей версией и с чем вы будете сравнивать номер версии? И вообще, если для обновления "приложение" нужно запустить "база локальная", которую обычно не запускается, то как вы узнаете, что момент настал? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2017, 16:27 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Вот именно, не хочу 4-ую часть создавать. Должна быть форма в файле "локальной базы", которая при открытии через секунд 3 например вытаскивает архивный файл из таблицы и распаковывает рядом и запустив его сама закрывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2017, 17:20 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Адеке, Вам предлагается простой способ обновления. Пакетный файл LoadMyApp.cmd @echo off echo Инициализация обновления Приложения rem --- секция настроек --- rem подключение сетевого тома W: if exist W: goto set_folders net use W: \\100.0.0.1\MyAppFolder password /USER:MyAppUser :set_folders rem папка "клиентского места" if exist D: goto set_D SET APP_DIR=C:\MyAppFolder :set_D SET APP_DIR=D:\MyAppFolder rem папка обновлений SET APP_UPD=W:\UPDATE\MyAppFolder rem клиентское место SET APP_MDEF=MyApp.accde rem файл контроля версий SET APP_VERF=version.txt SET APP_MDE=%APP_UPD%\%APP_MDEF% SET APP_VERS=%APP_UPD%\%APP_VERF% SET APP_VERC=%APP_DIR%\%APP_VERF% rem --- конец настроек --- if exist %APP_UPD% goto chk_APP_dir echo ОШИБКА: не найдена папка %APP_UPD% echo Обновление прервано. pause goto end :chk_APP_dir if not exist %APP_DIR% goto upd if exist %APP_VERS% goto check_verf echo ОШИБКА: не найден файл %APP_VERC% echo Обновление прервано. pause goto end :check_verf if exist %APP_VERS% goto check_version echo ОШИБКА: не найден файл %APP_VERS% echo Обновление прервано. pause goto end :check_version fc /a %APP_VERC% %APP_VERS%|find "*****" if errorlevel=1 goto startapp :upd echo Обновление if not exist %APP_DIR% md %APP_DIR% copy /Y %APP_UPD%\*.* %APP_DIR%\*.* :updmsg echo Обновление успешно завершено cd %APP_DIR% :startapp SET APP_MDE=%APP_DIR%\%APP_MDEF% echo Поиск MS Access ... SET ACCESS_EXE=\Program Files\Microsoft Office\Office15\MSACCESS.EXE if exist "C:%ACCESS_EXE%" goto acc_c if exist "D:%ACCESS_EXE%" goto acc_d SET ACCESS_EXE=\Program Files (x86)\Microsoft Office\Office15\MSACCESS.EXE if exist "C:%ACCESS_EXE%" goto acc_c if exist "D:%ACCESS_EXE%" goto acc_d SET ACCESS_EXE=\Program Files\Microsoft Office\Office14\MSACCESS.EXE if exist "C:%ACCESS_EXE%" goto acc_c if exist "D:%ACCESS_EXE%" goto acc_d SET ACCESS_EXE=\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE if exist "C:%ACCESS_EXE%" goto acc_c if exist "D:%ACCESS_EXE%" goto acc_d echo Не найден MS ACCESS pause goto end :acc_c SET ACCESS_EXE="C:%ACCESS_EXE%" goto run :acc_d SET ACCESS_EXE="D:%ACCESS_EXE%" goto run :run echo Запуск Приложения... cd %APP_DIR% if %OS%.==Windows_NT. goto run_nt start /max %ACCESS_EXE% %APP_MDE% goto end :run_nt start "" /max %ACCESS_EXE% %APP_MDE% :end SET APP_DIR= SET APP_UPD= SET APP_MDEF= SET APP_VERF= SET APP_MDE= SET APP_VERS= SET APP_VERC= SET ACCESS_EXE= Ярлык запуска приложения настраивается на запуск пакетного файла. Если что не ясно с идентификаторами - пишите. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2017, 20:04 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
version.txt - текстовый файл. содержимое - любое. для неолбходимости обьновления перед запуском приложения сожержимое текущего файла в папке приложения сравнивается с содержимым одноименного файла в папке UPDATE. проверка необходимости обновления выполняется при всяком запуске стартового командного (пакетнрого) файла ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2017, 20:09 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
АдекеВот именно, не хочу 4-ую часть создавать. Должна быть форма в файле "локальной базы", которая при открытии через секунд 3 например вытаскивает архивный файл из таблицы и распаковывает рядом и запустив его сама закрывается. Логически (жирным важное): 1. Есть ярлык на рабочем столе, который запускает файл программы с именем А ( другой файл этот ярлык запустить не может ). 2. Запущенный файл А находит и кладет рядом новую версию - файл Б, запускает его, а сам закрывается. 3. Теперь вторую часть обновления должен завершить файл Б : - при старте обнаружить и убить старый файл А. - исправить или заменить ярлык на рабочем столе на себя. В принципе теоретически это возможно (при условии, что имя приложения и ярлыка связано с версией ПО): Например: имя Программа_2 и имя Программа_1.... - В принципе реально Программе_2 понять при старте, что Программу_1 рядом нужно убить, нужно изменить и ярлык на рабочем столе на саму себя... - В принципе реально и Программе_1 понять при старте, что рядом есть новая Программа_2 и завершиться или запустить новую версию и завершиться (это на случай сбоя при обновлении)... В общем теперь ПО каждый раз при старте должно (чтоб не было путаницы) : - проверять в каталоге наличие новой версии, запускать её, а самой завершаться. - проверять при старте наличие новой версии, сохранять её в каталог, запускать и завершаться. - проверять наличие старых версий в каталоге, удалять их и переделывать если чо - ярлык запуска под себя... В принципе и наглядно... бац на рабочем столе ярлык стал Программа_40 вместо Программа_39, ага - новая версия... На ходу придумал.... может где просчитался... но идея в том, что программа не может быть удалена или переименована, пока она запущена, но эту проблему решает плавающее имя... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2017, 21:55 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Что-то вы усложняете, ребята. Зачем через ярлык запускать, зачем менять имя приложения. Не надо все это. Попробую еще раз объяснить свою версию. Есть файл App.mdb (приложение). Есть файл Base.mdb (база). В файле Base только таблицы, в том числе таблица tblVers, где в поле Vers (integer) - номер версии, в поле File (OLE) - зипованный файл новой версии App. Также в этом же файле Base есть одна единственная форма frmПускач, которая после открытия по таймеру через 3 секунд выполняет функцию "пускача" - извлекает зипованный файл из tblFile.File и распаковывает рядом с собой (с заменой старого приложения естественно), запускает его, и закрывает себя. В файле App на главной форме есть Me.labelVers.Caption, где написано его версия. Также здесь есть линк таблицы (Base)tblVers. Временами проверяет равенство Me.labelVers.Caption=(Base)tblVers.Vers. Если не равны, то запускает форму Base.frmПускач, а себя закрывает. А открывшаяся форма Base.frmПускач через 3 секунд извлекает зипованный файл новой версии приложения App из tblFile.File, распаковывает рядом с собой (с заменой старого приложения), запускает его, а себя закрывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 00:18 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Адеке, Анатолий ( Киев ) тебя спросил: Как в "база локальная" появится архив со свежей версией? ------------------------------------------------------------- Это главное. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 01:21 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Александр МаркинКак в "база локальная" появится архив со свежей версией? Ну, я так понимаю, что под "локальной" базой понимается все-таки файл в локальной сети, которым пользуются все локальные пользователи и админу можно будет обновлять версию простыми действиями. Если это так, то я не понимаю, что мешает автору реализовать свою идею. Я уже и рабочий код дал, нужно только немного модифицировать и добавить запуск основного приложения. Требование же принудительного обновления в ходе работы, причем в автомате не очень хорошее. Обновление версии может застать человека в самый неподходящий момент, работа может потеряться. Нужно просто выдавать напоминания с требованием перезапуска программы, когда человек сможет это сделать, а не насильно перегружать приложение. Если обновление критичное, то нужно блокировать ключевой функционал, оставляя только возможность сохранить работу и корректно выйти. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 07:34 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
АдекеЧто-то вы усложняете, ребята. Это вы всех путаете... Адеке1) приложение у клиента, 2) база локальная у клиента (находится рядом с приложением), 3) база на сервере MySQL (после каждого рабочего дня клиент отправляет свои свежие данные с локальной базы на сервер). Хочу сделать в локальной базе специальную таблицу, где в одном ее поле будет храниться зипованный файл приложения (около 500 КБ), в другом поле - номер версии (формат integer). Также необходимо сделать форму в этом же файле (в файле локальной базы), чтобы при запуске этой формы выполнялась распаковка зипованного файла из таблицы в ту же папку где и база. Вам чуть ли не в первом посте дали адекватный ответ... MrShinНужно будет сделать четвертую часть - "Пускач" На что вы ответили... АдекеВот именно, не хочу 4-ую часть создавать. Должна быть форма в файле "локальной базы" Потом, когда до вас дошло, что в одной папке не может быть файлов с одинаковым именем, а запущенный переименовать нельзя, вы стали пускач выдавать уже за свое.... Адеке. Также в этом же файле Base есть одна единственная форма frmПускач, которая после открытия по таймеру через 3 секунд выполняет функцию "пускача" Вы уж определитесь сами с собой сначала... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 12:04 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Александр МаркинАдеке, Анатолий ( Киев ) тебя спросил: Как в "база локальная" появится архив со свежей версией? ------------------------------------------------------------- Это главное. Если заметили я в начале писал что есть 3-я часть программы - база MySQL на сервере, куда они ежедневно после рабочего времени соединяются для выгрузки своих свежих данных. Воспользуясь этим, сделаю так что одновременно им скачается новый выпуск приложения в ввиде данной таблицы. Наверняка в MySQL есть тоже такой формат таблицы как OLE куда можно будет хранить файл. А в MySQL естественно я буду закачивать свежую версию приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 13:42 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
MrShinАлександр МаркинКак в "база локальная" появится архив со свежей версией? Ну, я так понимаю, что под "локальной" базой понимается все-таки файл в локальной сети, которым пользуются все локальные пользователи и админу можно будет обновлять версию простыми действиями. Что имеете ввиду под "простыми действиями"? Вручную что ли? Когда клиентов не 5 и не 10, а в несколько раз больше, то нет желания лазить в каждые ихние компы руками. Я до сегодняшнего дня когда готовил новую версию, кидал в облако с доступом на скачку и давал пользователям чтобы они скачали, удалили старое приложение, а вместо него поставили новую версию. Но были и такие криворукие пользователи, которые вместе со старым приложение удалили и базу, еще и умудрились удалить из корзины!!! Хорошо что перед этим сделали выгрузку своих свежих данных на сервер, я с сервера восстановил для них локальную базу. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 13:56 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
АдекеЧто имеете ввиду под "простыми действиями"? Вручную что ли? Я вообще-то предположил, что этот файл находится не на локальном компьютере пользователя, а на сервере в локальной сети и им пользуется несколько пользователей, находящихся в этой же локальной сети, иначе ваша идея насчет скачивания свежей версии из локальной базы просто не имеет смысла. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 14:23 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
vmagАдекеЧто-то вы усложняете, ребята. MrShinНужно будет сделать четвертую часть - "Пускач" На что вы ответили... АдекеВот именно, не хочу 4-ую часть создавать. Должна быть форма в файле "локальной базы" Потом, когда до вас дошло, что в одной папке не может быть файлов с одинаковым именем, а запущенный переименовать нельзя, вы стали пускач выдавать уже за свое.... Адеке. Также в этом же файле Base есть одна единственная форма frmПускач, которая после открытия по таймеру через 3 секунд выполняет функцию "пускача" Вы уж определитесь сами с собой сначала... Я "пускач" понял как запуск только процесса обновления, а не само приложение как стартовое. Тогда назову форму не frmПускач , а frmUpdate чтобы вас не путать. Для меня надо чтобы обычная работа начиналась как обычно со старта самого приложение App.mdb, а не через посреднический файл. Открывшись App.mdb проверяет свой Me.labelVers.Caption на равенство со значением в линкованной таблице поля tblVers.Vers. Если они не равны, то запускает форму frmUpdate файла Base.mdb, а себя закрывает. А открывшаяся форма frmUpdate через 3 секунд извлекает зипованный файл новой версии приложения App.mdb из tblFile.File, распаковывает рядом с собой (с заменой старого приложения), запускает его, а себя закрывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 14:25 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
MrShinАдекеЧто имеете ввиду под "простыми действиями"? Вручную что ли? Я вообще-то предположил, что этот файл находится не на локальном компьютере пользователя, а на сервере в локальной сети и им пользуется несколько пользователей, находящихся в этой же локальной сети, иначе ваша идея насчет скачивания свежей версии из локальной базы просто не имеет смысла. Клиенты работают не в сети, а сами по себе, удаленно, в разных городах. Вечером подключаются к интернету для выгрузки свежих данных на удаленный сервер. В этот момент автоматически должно скачиваться с удаленного сервера зипованный файл свежей версии App.mdb.zip к ним в поле Base.mdb->tblVers->[File] ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 14:38 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Когда-то пришлось решать похожую проблему Контроль и автоматическое обновление клиентских приложений Тут собраны мои поиски решения. Возможно пригодится. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 14:50 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
АдекеЕсли они не равны, то запускает форму frmUpdate файла Base.mdb, а себя закрывает. А открывшаяся форма frmUpdate через 3 секунд извлекает зипованный файл новой версии приложения App.mdb из tblFile.File, распаковывает рядом с собой (с заменой старого приложения), запускает его, а себя закрывает. Не будет это надежно работать, поверьте. Не понимаю, что мешает обозвать приложение, которое обновляет клиента App.mdb и заставлять пользователей запускать его? А дальше оно может сохранять запускать, например, файл с названием app.dat - чтобы у пользователя не было соблазна запустить приложение напрямую, без обновления ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 15:11 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
АдекеЕсли они не равны, то запускает форму frmUpdate файла Base.mdb, а себя закрывает. А открывшаяся форма frmUpdate через 3 секунд извлекает зипованный файл новой версии приложения App.mdb из tblFile.File, распаковывает рядом с собой (с заменой старого приложения), запускает его, а себя закрывает. Не будет это надежно работать, поверьте. Не понимаю, что мешает обозвать приложение, которое обновляет клиента App.mdb и заставлять пользователей запускать его? А дальше оно может сохранять запускать, например, файл с названием app.dat - чтобы у пользователя не было соблазна запустить приложение напрямую, без обновления ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 15:11 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
MrShinНе понимаю, что мешает обозвать приложение, которое обновляет клиента App.mdb и заставлять пользователей запускать его? Множество файлов. И при перемещении файла базы надо будет вместе с ним таскать еще и несколько файлов. А в моем случае можно будет начинать работу с любого файла. А при переносе достаточно будет перенести файл базы, так как при запуске его он автоматически распаковывает рядом с собой файл апликейшн. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2017, 15:27 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Как программно извлечь файл из поля OLE в текущую папку? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2017, 09:20 |
|
Автообновление приложения
|
|||
---|---|---|---|
#18+
Вот здесь Хранение изображений в базе данных расположена старая статья о хранении изображений в базе данных. С примерам. Есть и примеры загрузки-выгрузки изображений из базы данных в поле OLE. Удачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2017, 11:27 |
|
|
start [/forum/topic.php?fid=45&msg=39409567&tid=1612670]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 137ms |
0 / 0 |