как получить системную дату другого компьютера

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

как получить системную дату другого компьютера

Сообщение АндрейБ » 02.12.2009 (Ср) 13:19

В двух словах, у меня все рабочие таблицы лежат на одном компьютере, назовем его условно сервер. Программа которая работаетс этими таблицами стоит на нескольких машинам, и когда пользователь входит в программу, он себя индентифицирует. И я всегда могу видеть кто работал в системе и какие действия производил и в какое время. Но суть такова что если изменить системную дату на компьютере, с которого идет работа, то дата которая сохраняется в хорологии действий, получается неверной. Такое бывает, т.к. у нас специфика автозапчасти и некоторые программы автопроизводителей работают под старой датой и приходиться на это идти. Как мне определить системную дату другого компьютера через сеть в VB.
Или наверное это проще, когда база .MDB открывается, у нее есть свойства когда файл открыт и скорее всего от будет соотвествовать системной дате того компьютера где он находиться (или я не прав?), если я прав, то как получить эту информацию? Может кто-то предложет что-то еще?
Кто ищет, тот всегда найдет ...

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: как получить системную дату другого компьютера

Сообщение Денис » 02.12.2009 (Ср) 13:35

Ввести в конфигурацию базы новую переменную "Рабочая дата". Каждый день Вы либо вручную либо автоматически прибавляете к этой дате один день. Каждый клиент, подключающийся к базе, берет из конфига системную дату, сверяет со своим системным временем (на компе) и если есть отличия уведомляет/закрывается/работает с датой по версии базы.

Как Вам такой способ?
Где у вас конфигурация хранится (если есть)? В самой базе? В ini? В реестре?

Если конфигурации нет, то самое время ее создать:
Если в базе, то просто делаете таблицу Config в которой куча полей и одна запись. Читать ее легко, записывать тоже.
Если в ini или реестр, то тоже несложно. Функции работы с реесторм и ini известны и более того, объединены в классы, которых тысячи и в кирпичах и по всему форуму и вне его, в инете.
Я от себя рекомендую в ini хранить путь к базе, а настройки хранить в ней (в базе). Таким образом не будет заморочек с различиями в настройках разных клиентов. Все настройки будут глобальные.
Последний раз редактировалось Денис 02.12.2009 (Ср) 13:53, всего редактировалось 1 раз.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Re: как получить системную дату другого компьютера

Сообщение АндрейБ » 02.12.2009 (Ср) 13:49

У меня нет ini.
Вручную не вариант, т.к. я автоматизацию пишу для повышения производительности работы менеджеров и что бы уйти от Емкеля и Акцесса, что бы не было ручной рутины. Кроме того мне нужно не только дата но и время системное, так как дейтсвия идут в четкой хронологии и бывает надо востановить порадок действий, что вяснить какую-то ситуацию.
Я думал что можно как то получить сво-во файла .MDB "время открытия" когда открывается база? Может есть еще предложения по другим способам?
Кто ищет, тот всегда найдет ...

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: как получить системную дату другого компьютера

Сообщение Денис » 02.12.2009 (Ср) 14:03

АндрейБ писал(а):Может есть еще предложения


(в дате хранится дата и время)

На файловом сервере (там где лежит база) время меняют?

В общем должен быть комп, на котором время не меняется. На этом компе устанавливаете программу, которая раз в минуту (или чаще, если нужно), записывает вам в базу, в параметр "рабочая дата" системную дату. Естественно, такую программу напишите сами. Единственный минус, пожалуй, что она будет постоянно подключена к БД и уменьшит вам кольичество максимально подключаемых пользователей на одного.
Со свойствами файла базы только время зря потратите. Это штука ненадежная.
Жаль, что формат базы - настольный. В промышленной СУБД Вы бы просто сделали ХП, возвращающую Вам системное время/дату сервера и не мучались бы.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: как получить системную дату другого компьютера

Сообщение Twister » 02.12.2009 (Ср) 14:16

Я, исходя из двухлетнего опыта работы с mdb в файл-серверной модели, могу с уверенностью сказать: пока еще система не разрослась, переносите ее на другую СУБД и будьте счастливы. Тут вполне подойдет бесплатный огнептиц, тогда вообще не возникнет проблем с датами, так как ее будут контролировать триггеры на стороне сервера(ов). Еще не сталкивались с такой распространенной проблемой, как "падение" mdb-файла до состояния "выкинь меня и не пытайся вылечить"? ;) А такое происходит довольно часто, все зависит от кол-ва одновременных подключений и степени вероятности того, что "сервер" некорректно выключится.

И на будущее: не надо пытаться объять необъятное. Если Access является настольной БД, то и использовать его надо именно в этом русле. Клиент-серверную СУБД из него все равно не слепить, только геморрой раньше времени заработаешь. :)

В промышленной СУБД Вы бы просто сделали ХП, возвращающую Вам системное время/дату сервера и не мучались бы.
В Access'е это тоже можно сделать. Суть в другом: а надо ли?

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

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: как получить системную дату другого компьютера

Сообщение Денис » 02.12.2009 (Ср) 14:40

Twister писал(а):Еще не сталкивались с такой распространенной проблемой, как "падение" mdb-файла до состояния "выкинь меня и не пытайся вылечить"? ;)


О ужас! Я вспомнил этот кошмар! Бррр. Да. АндрейБ, присоединяюсь к рекомендации уходить с акцесса, пока не поздно.
Поддерживаю Firebird. Сам с мая сего года сижу на нём. Зависимости никакой. Всем рекомендую! ©
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: как получить системную дату другого компьютера

Сообщение Twister » 02.12.2009 (Ср) 14:51

Маленькая заметочка по поводу огнептица: если в вашей системе используется разграничение прав доступа на выборку данных (а если не используется, то что это за система? :shock: ), то придется своять еще и третье звено, так называемый Сервер Приложений, так как триггерами в Firebird контролировать выборку не выйдет. Если же третье звено воять влом, то вэлкам в мир Оракла и его DBMS_RLS. :)
А я все практикую лечение травами...

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: как получить системную дату другого компьютера

Сообщение awl100Alex » 02.12.2009 (Ср) 19:14

АндрейБ писал(а):Как мне определить системную дату другого компьютера через сеть в VB.

Можно синхронизировать время и дату таким образом...
Код: Выделить всё
Option Explicit
Private Declare Function NetRemoteTOD Lib "Netapi32.dll" (yServer As Any, pBuffer As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pTo As Any, uFrom As Any, ByVal lSize As Long)
Private Type TIME_OF_DAY_INFO
  tod_elapsedt    As Long
  tod_msecs       As Long
  tod_hours       As Long
  tod_mins        As Long
  tod_secs        As Long
  tod_hunds       As Long
  tod_timezone    As Long
  tod_tinterval   As Long
  tod_day         As Long
  tod_month       As Long
  tod_year        As Long
  tod_weekday     As Long
End Type

Private Sub Form_Load()
Dim tBuffer As Long, GMT As Long
Dim Result, ServerName() As Byte, TOD As TIME_OF_DAY_INFO
ServerName = "\\192.168.6.137" 'Server Name или IP
Result = NetRemoteTOD(ServerName(0), tBuffer)
If Result = 0 Then
  CopyMemory ByVal TOD, ByVal (tBuffer), LenB(TOD)
   AutoRedraw = True
   Print "Системная дата сервера:", ServerName
   With TOD
    Print "Дата: "; .tod_day & "." & .tod_month & "." & .tod_year
    GMT = .tod_timezone / 60 'GMT - часовой пояс
    Print "Время: "; Abs(-.tod_hours + GMT) & ":" & .tod_mins & ":" & .tod_secs
   End With
Else
  MsgBox "Сервер не найден!", vbCritical, "Ошибка"
End If
End Sub

АндрейБ
Бывалый
Бывалый
 
Сообщения: 276
Зарегистрирован: 18.12.2004 (Сб) 17:00
Откуда: Санкт-Петербург

Re: как получить системную дату другого компьютера

Сообщение АндрейБ » 07.12.2010 (Вт) 12:09

Всем спасибо за коментарии. Не послушал вас тогда переходить на Firebird, недавно большой файл в акцессе полетел слегка, чудом смог востановить данные благодаря тому что делал копию всех изменений в базе в паралельной базе. Вобщем без потерь слава богу (но это 1 раз за 5 лет работы и видимо из-за того что у нас в последнее время свет вырубать стали в свзяи с зимой перепады напряжения). А VB работает Firebird? Просто я не профи, сижу на работе ваяю понемного для автоматизации конторы и нет много времени осваивать и переписывать что что уже наработано.
Кто ищет, тот всегда найдет ...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: как получить системную дату другого компьютера

Сообщение Twister » 09.12.2010 (Чт) 9:40

Практически с любой СУБД можно взаимодействовать через ODBC. Это универсальный механизм.
Иногда лучше/выгоднее использовать компоненты, специально заточенные под работу с конкретной базой. К примеру, с Ораклом в Delphi намного удобнее общаться через компоненты ODAC или DOA. Для Firebird ситуация аналогичная. Есть ли специализированные компоненты для VB и Firebird я не знаю, но ODBC можно использовать, это точно.
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: как получить системную дату другого компьютера

Сообщение Twister » 09.12.2010 (Чт) 9:59

По поводу переноса работающей годами системы на новую СУБД. Это, как всем понятно, довольно трудоёмкая и "опасная" операция. Но тут есть несколько хитрых приёмов. Мы, к примеру, пользовались возможностью Access'а работать со связанными таблицами. Т.е. берем Access'овскую A_TABLE_1, создаём её точную копию в Firebird - F_TEBLE_1 и связываем. Таким образом все запросы к mdb фактически передаются в Firebird. Скорость падает, но это же только первый этап. Следующим этапом переписываются запросы с расчётом на синтаксис PSQL, корректируется программный код клиентских приложений и вуаля! Переход осуществлён :)
А я все практикую лечение травами...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList  
cron