-
Доброго времени суток!
Подскажите, плиз, как отловить изменения таблицы в Акцесе (изменение, добавление, удаление записи), которые делает другое приложение, без переоткрывания таблицы?
Сейчас я тупо закрываю и открываю таблицу по таймеру.
Спасибо!
-
вообще, если это понадобилось то значит чтото неправильно в логике приложения... ну так говорят. но один раз таки мне это понадобилось, ненадолго, потом ТЗ изменили но решение уже было. база аксесс это файл, у файла есть время изменения можешь смотреть на него, у системы (винды) есть события на изменение файлов, сделаешь мониторинг (есть статья на этом же сайте от Панова) не понадобится таймер... т.е. ловишь сообщение, в нем проверяешь изменилось ли время редактирования файла базы, а уже таблицу (та или не та) проверяешь запросом с count (этим отследишь удаление/добавление если сравнишь с сохраненным, а вот с изменениями облом, запросом этого не сделать... но можно если есть желание через ADOX открыть объект - таблица и посмотреть ее свойство "модифаед", т.е. то же самое что время изменения файла базы) по ADOX и его объекты есть инфа в справке access.
-
С логикой все в порядке. Стороннее приложение кидает инфу в базу, я ее оттуда беру.
Спасибо за подсказку с "модифайд". Я для текстового файла такое делал, попробую для базы посмотреть.
На каком то форуме читал для SQL баз для подобной задачи используют тригеры и хранимые процедуры. Кто-нибудь может пояснить, что это за звери и как для акцеса их можно (или нет) использовать?
С уважением.
-
> С логикой все в порядке
Не то что "все в порядке", а катастрофа с ней.
-
Сергей, Вы хотите сказать, что задачи, когда два приложения используют одну БД, не логичные???
В моей предметной области это очень распространенная ситуация, когда одна прога выдает данные во внешнюю БД, а мне надо их анализировать.
-
> задачи, когда два приложения используют одну БД, не логичные?
Это-то как раз логично. А катастрофа - с логикой "ловли".
> В моей предметной области
Ты о ней НИЧЕГО не сказал. Потому дальнейшие рассуждения на эту тему бессмысленны.
-
> одна прога выдает данные во внешнюю БД, а мне надо их анализировать
Для этого существует технологии "трехзвенки".
-
> Вы хотите сказать, что задачи, когда два приложения используют одну БД, не логичные??? нет. он хочет сказать, что база это не событийная/"уведомительная" система, а "хранительная" и "запросная". т.е. логика баз - запрашивать по клиентскому запросу сохраненные данные и работать с ними (1 раз, и скопом над всеми необходимыми), а не ловить приход по одной превращая запись в событие для "других" программ (это хотя и возможно, в некоторых субд, но это против логики, на случай "а есть и такие задачи", хотя как говорил "такая" мне попалась всего раз, да и то по ошибочному ТЗ, глупость которого, и без этой части, просто выпирала из него. и которое я не хотел делать едва на него взглянув... из-за этого в итоге и изменили, начал указывать на очевидные ляпы, и будущие глюки от его "дословной" реализации. кстати, не помню, но по моему именно в нем был "шедевр" манагерской мысли - "отчет должен выдаваться в различной форме по желанию пользователя"(пояснение, форма по умолчанию меняется в настройках, а для разового переключения, ее можно выбрать при вводе параметров, дат там и остального. и вот эту то настройку и предлагалось убрать как лишнюю и загромождающую интерфейс, а форму выбирать в зависимости от "желания"... %), на вопрос каким образом узнавать желания - "хорошая программа должна это знать!" :о))))
> для SQL баз для подобной задачи используют тригеры и хранимые процедуры. с тригерами облом, нет их в access (в базе а не программе, т.к. программа может пользоваться и базой mssql, а там они уже есть), а процедуры ничем тут не помогут, и даже неважно, что в access они очень ограничены, фактически одно название а не процедуры. в общем только так как я сказал, "вешаться" на событие от системы, средства самой базы не помогут (ну или постоянные пере-запросы "наобум" как у тебя). и кстати, если база чужая, то лезть в нее со своими дополнениями нехорошая идея... ну, вот я бы был против если бы в "мою базу"(моей программы) понаставили "левых тригеров", а потом начали предъявлять претензии к скорости работы уже моей программы (/а то и глюкам в ней) .
> Кто-нибудь может пояснить, что это за звери конечно. любая книжка по sql. welcome.
-
Спасибо, sniknik, за развернутый ответ!!
Лезть в чужую БД никто и не собирается. В этой проге придется использовать время изменений и переоткрытия.
ЗЫ Столкнулся с таким глюком драйвера JET:
Вот так выдает ошибку о доступе: qQuikData.SQL.Add('SELECT Count(id_quik) '); qQuikData.SQL.Add(FROM tQuik');
а так работает qQuikData.SQL.Add('SELECT Count(id_quik '); qQuikData.SQL.Add(') FROM tQuik');
8-)
-
> Столкнулся с таким глюком драйвера JET: это не jet, это реализация борланда ADOQuery без учета особенностей ADO. есть патч вроде, но не советую его искать и ставить, советую выкинуть ADOQuery, ADOStopedProc, ADOTable с палитры компонент, и никогда к ним не притрагиваться... при вносе запроса он по возможности проверяется ядром, определяются типы параметров, а ты со "своим" SQL.Add туда пихаешь "глючный" сточки зрения jet запрос, чего в оригинале (CommandText) не предусмотрено и не возможно (если конечно не написать - CommandText:= 'SELECT Count(id_quik) '
CommandText:= CommandText + 'FROM tQuik'; что сразу даже выглядит глупо. если уж нужно форматирование то очевидно -> CommandText:= 'SELECT Count(id_quik)'#13#10+
'FROM tQuik'; ) > это не jet, это реализация борланда или это твой глюк (если отсутствие скобки в первом варианте не описка, но даже если твой, то описанный глюк к "разорванным" запросом, и определением параметров имеет место быть)
|