Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
3 / 3 / 0
Регистрация: 29.04.2011
Сообщений: 13

Автоматическое обновление интерфейсной части

17.05.2011, 17:24. Показов 1865. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
БД разбита на две части: интерфейсный файл пользователя и файл с таблицами (оба mdb).
На компе пользователя только интерфейсный файл (далее-1), на сетевом диске w: есть файл с таблицами (далее - 2) и контрольный интерфейсный файл (далее - 3).
Автообновление сдалал так:
При запуске 1 подключается только одна таблица из 2 и сравниваются версии между 1 и 2.
Если различнные, то запускается командная стока:
- закрывается файл 1;
- файл 3 копируется из сети на локальный диск;
- удаляется файл 1;
- файл 3 переименовывается в 1 на лок.диске.
- запускаем 1.

Как бы все работает, но есть недостатки:
файл 1 закрывается долго - не знаю как проконтролировать его закрытие - и поэтому возможна ситуация, что его еще невозможно удалить, т.к. еще не закрылся.

Для избежания этого зделал в окне командной строки запрос для пользователя нажать любую кнопку.
Но если пользователь сильно шустрый, а комп не очень - то не помогает.
Как это правильно сделать?

Код реализации вышесказанного:

Visual Basic
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
Private Function test_Exit() As Integer
 
On Error Resume Next
       Dim p As String ' Местонахождение интерфейсного файла пользователя
   p = CurrentProject.Path & "\"
 
' Если пользователь запустил контрольную версию из сети  - то выход
If (p = "W:\ACCESS\") Then 
  DoCmd.Quit
End If
 
Dim Path As String ' Местонахождение файла с таблицами
Path = [Path_to_DB]
  Dim db As DAO.Database
        Set db = CurrentDb()
   
'Подключаем табицу с версией БД 
Dim tdf1 As TableDef
  Set tdf1 = db.CreateTableDef("Free")
  tdf1.Connect = ";DATABASE=" & Path & ";DSN=Free"
 tdf1.SourceTableName = "Free"
 db.TableDefs.Append tdf1
 RefreshDatabaseWindow
 
Dim ver_on_server, ver_loc As Integer
Dim strSQL1, strSQL2 As String
      
strSQL1 = "SELECT Free.ver From Free WHERE (((Free.ID)=1));"
strSQL2 = "SELECT Free0.ver From Free0 WHERE (((Free0.ID_L)=1));"
 
Dim cnn As ADODB.Connection
Set cnn = CurrentProject.Connection
With cnn
    .BeginTrans
       ver_on_server = .Execute(strSQL1).Fields(0) ' получаем версию БД на сервере 
       ver_loc = .Execute(strSQL2).Fields(0)          ' получаем версию БД на лок.компе
    .CommitTrans
End With
      
 If (ver_on_server > ver_loc) Then
 
     Dim st00, st0, st1, st2 As String
     st00 = "echo " & ChrW(34) & "Внимание! Обновление Базы Данных" & ChrW(34)
 
' ПРОБЛЕМНЫЙ МОМЕНТ - рользователь решает когда нажать! - это плохо - как-бы это проконтролировать програмно?
     st01 = "pause"
 
' будем копировать контрольную версию на лок.комп: docs0.mdb ->  docs2.mdb
     st0 = "copy /Y " & ChrW(34) & "W:\ACCESS\docs0.mdb" & ChrW(34) & " " & ChrW(34) & p & "docs2.mdb" & ChrW(34)
 
' удалим старую версию на лок.компе
     st1 = "del /Q " & ChrW(34) & p & "docs.mdb" & ChrW(34)
 
' переименуем файл новой оболочки: docs2.mdb ->  docs.mdb
     st2 = "ren " & ChrW(34) & p & "docs2.mdb" & ChrW(34) & " docs.mdb"
 
 ' запускаем новую оболочку
    st3 = ChrW(34) & p & "docs.mdb" & ChrW(34) 
     
' справку просто копируем
     st4 = "copy /Y " & ChrW(34) & "W:\ACCESS\DB_Docs.hlp" & ChrW(34) & " " & ChrW(34) & p & "DB_Docs.hlp" & ChrW(34) 
     st5 = "copy /Y " & ChrW(34) & "W:\ACCESS\DB_Docs.cnt" & ChrW(34) & " " & ChrW(34) & p & "DB_Docs.cnt" & ChrW(34) 
     
     st = "cmd /C " & st00 & " && " & st01 & " && " & st0 & " && " & st1 & " && " & st2 & " && " & st4 & " && " & st5 & " && " & st3
 
' Запускаем все запланируемое
     Call Shell(st, 1)
 
 
        DoCmd.Quit
   
 End If
 
   db.TableDefs.Delete tdf1.Name
   db.Close
 
test_Exit = 1
 
End Function
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2011, 17:24
Ответы с готовыми решениями:

Автоматическое обновление клиентской части
пожалуйста подскажите как сделать автоматическое обновление клиентской части.... когда стартует клиентская часть есть изменение формах...

Автоматическое обновление
Есть допустим 3 таблицы: Склад, заказ, и продажа Нужно сделать так, чтоб при добавлении заказ количества, на складе количество...

Автоматическое обновление времени
Добрый день , есть форма и вставлены (дата и время) как сделать чтобы время обновлялось автоматически нашел через поиск ответ на...

2
1181 / 632 / 39
Регистрация: 30.05.2010
Сообщений: 715
17.05.2011, 21:07
Здравствуйте BlackWizard0.
Выполнять Автообновление хорошая идея.
"..закрывается долго - .. как проконтролировать его закрытие..": присутствие в каталоге базы данных файла блокировки ИмяБД.ldb "говорит" о том, что БД используется.
Но думаю для обновления стоит посмотреть в сторону создания отдельной/самостоятельной конструкции выполняющей проверку версии, если необходимо обновление и запуск Вашей конструкции.
Для этой цели может использоваться как отдельный MDB файл, VBA конструкция MS Exel так и самостоятельное VB приложение, единственное требование - подключенная к проекту библиотека ADO.
Конструкция может быть подобной:
Visual Basic
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
Sub updateFile()
'AppPath - путь к 1
'RemotePath - путь к 2
'TemplatePath - путь к 3
'способ присвоения звачений переменным зависит от используемого приложения
Const sC0 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
Const sQ0 = "SELECT ver From Free WHERE ID=1"
Const sQ1 = "SELECT ver From Free0 WHERE ID_L=1"
Dim cn  As ADODB.Connection, i%, s$, sT$, d
s = RemotePath + "\docs.mdb"
Set cn = New ADODB.Connection
cn.ConnectionString = sC0 + s
cn.Open
If Not cn.Execute(sQ0).EOF Then i = cn.Execute(sQ0).Fields(0)
cn.Close
s = AppPath + "\docs.mdb"
'Set cn = New ADODB.Connection
cn.ConnectionString = sC0 + s
cn.Open
If cn.Execute(sQ1).EOF Then
ElseIf i > cn.Execute(sQ1).Fields(0) Then
    sT = TemplatePath + "\docs.mdb"
    Name s As AppPath + "\docs2.mdb" 'переименование
    FileCopy sT, s 'копирование
    d = Now
    d = DateAdd("s", 15, d) 'текущее время + 15 секунд смещения
    Do While d < Now 'задержка "если пользователь сильно шустрый"
        DoEvents
    Loop
    Kill AppPath + "\docs2.mdb" 'удаление
End If
If cn.State = 1 Then cn.Close
Set cn = Nothing
'команда запуска 1 ......
End Sub
Успехов Вам.
Евгений.
1
3 / 3 / 0
Регистрация: 29.04.2011
Сообщений: 13
18.05.2011, 14:19  [ТС]
Тогда может легче создать cmd-файл, и им проверить отсутствие файла командой
IF EXIST ИмяБД.ldb ?

Добавлено через 32 минуты
Что-то типа такого:

Bash
1
2
3
4
5
copy …
m1:
     IF EXIST ИмяБД.ldb goto m1
ren ...
del ...
И неплохо что-б этот файл создавался перед неоходимостью запуска с нужнымы путями
Есть в этом направлении опыт?

Добавлено через 4 часа 27 минут
Сделал, кажись работает:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 If (ver_on_server > ver_loc) Then
  Dim fso, txtfile
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set txtfile = fso.CreateTextFile(p & "dbupdate.cmd", True)
  txtfile.WriteLine ("copy /Y " & ChrW(34) & "W:\ACCESS\docs0.mdb" & ChrW(34) & " " & ChrW(34) & p & "docs2.mdb" & ChrW(34))
  txtfile.WriteLine ("copy /Y " & ChrW(34) & "W:\ACCESS\DB_Docs.hlp" & ChrW(34) & " " & ChrW(34) & p & "DB_Docs.hlp" & ChrW(34))
  txtfile.WriteLine ("copy /Y " & ChrW(34) & "W:\ACCESS\DB_Docs.hlp" & ChrW(34) & " " & ChrW(34) & p & "DB_Docs.hlp" & ChrW(34))
  txtfile.WriteLine (Mid(p, 1, 2))
  txtfile.WriteLine ("cd " & p)
  txtfile.WriteLine (":m1")
  txtfile.WriteLine ("IF EXIST docs.ldb goto m1")
  txtfile.WriteLine ("del /Q docs.mdb")
  txtfile.WriteLine ("ren docs2.mdb docs.mdb")
  txtfile.WriteLine ("docs.mdb")
  txtfile.Close
     
  Call Shell(p & "dbupdate.cmd", 0)
  DoCmd.Quit
   
  test_Exit = 0
 End If
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2011, 14:19
Помогаю со студенческими работами здесь

Автоматическое обновление данных
Нужна помощь. Никак не могу решить эту задачу: В форме &quot;ФормаОрганизации&quot; при выборе &quot;населенного пункта&quot; у меня...

Автоматическое обновление поля в форме
Сделать так, чтобы при выборе флажка &quot;Сдан&quot; количество сданных билетов на рейс автоматически увеличивалось.

автоматическое обновление данных Access
.У меня есть запрос &quot;на следующ дату&quot;, он увеличивает введеную дату на 6 месяцев.Нужно чтоб тоже самое происходило в таблице ТО..допустим я...

Автоматическое обновление подчинненой формы
Здравствуйте, подскажите пожалуйста как сделать автоматическое обновление формы при выборе того или иного параметра.

Как отключить автоматическое обновление данных
Добрый день, Есть прайс по которому идет прием заказов. Прайс этот может постоянно меняться, при этом некоторые позиции появляются,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru