Конференция "Базы" » Изменение записи из другого приложения [D7, Access]
 
  • Yurikon (22.08.09 18:05) [0]
    Доброго времени суток!

    Подскажите, плиз, как отловить изменения таблицы в Акцесе (изменение, добавление, удаление записи), которые делает другое приложение, без переоткрывания таблицы?

    Сейчас я тупо закрываю и открываю таблицу по таймеру.

    Спасибо!
  • sniknik © (22.08.09 18:25) [1]
    вообще, если это понадобилось то значит чтото неправильно в логике приложения... ну так говорят.
    но один раз таки мне это понадобилось, ненадолго, потом ТЗ изменили но решение уже было. база аксесс это файл, у файла есть время изменения можешь смотреть на него, у системы (винды) есть события на изменение файлов, сделаешь мониторинг (есть статья на этом же сайте от Панова) не понадобится таймер... т.е. ловишь сообщение, в нем проверяешь изменилось ли время редактирования файла базы, а уже таблицу (та или не та) проверяешь запросом с count (этим отследишь удаление/добавление если сравнишь с сохраненным, а вот с изменениями облом, запросом этого не сделать... но можно если есть желание через ADOX открыть объект - таблица и посмотреть ее свойство "модифаед", т.е. то же самое что время изменения файла базы)
    по ADOX и его объекты есть инфа в справке access.
  • Yurikon (22.08.09 21:11) [2]
    С логикой все в порядке. Стороннее приложение кидает инфу в базу, я ее оттуда беру.

    Спасибо за подсказку с "модифайд". Я для текстового файла такое делал, попробую для базы посмотреть.

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

    С уважением.
  • Сергей М. © (22.08.09 21:37) [3]

    > С логикой все в порядке


    Не то что "все в порядке", а катастрофа с ней.
  • Yurikon (22.08.09 21:55) [4]
    Сергей, Вы хотите сказать, что задачи, когда два приложения используют одну БД, не логичные???

    В моей предметной области это очень распространенная ситуация, когда одна прога выдает данные во внешнюю БД, а мне надо их анализировать.
  • Сергей М. © (22.08.09 22:10) [5]

    > задачи, когда два приложения используют одну БД, не логичные?


    Это-то как раз логично.
    А катастрофа - с логикой "ловли".


    > В моей предметной области


    Ты о ней НИЧЕГО не сказал.
    Потому дальнейшие рассуждения на эту тему бессмысленны.
  • Сергей М. © (22.08.09 22:14) [6]

    > одна прога выдает данные во внешнюю БД, а мне надо их анализировать


    Для этого существует технологии "трехзвенки".
  • sniknik © (23.08.09 10:46) [7]
    > Вы хотите сказать, что задачи, когда два приложения используют одну БД, не логичные???
    нет. он хочет сказать, что база это не событийная/"уведомительная" система, а "хранительная" и "запросная". т.е. логика баз - запрашивать по клиентскому запросу сохраненные данные и работать с ними (1 раз, и скопом над всеми необходимыми), а не ловить приход по одной превращая запись в событие для "других" программ (это хотя и возможно, в некоторых субд, но это против логики, на случай "а есть и такие задачи", хотя как говорил "такая" мне попалась всего раз, да и то по ошибочному ТЗ, глупость которого, и без этой части, просто выпирала из него. и которое я не хотел делать едва на него взглянув... из-за этого в итоге и изменили, начал указывать на очевидные ляпы, и будущие глюки от его "дословной" реализации. кстати, не помню, но по моему именно в нем был "шедевр" манагерской мысли - "отчет должен выдаваться в различной форме по желанию пользователя"(пояснение, форма по умолчанию меняется в настройках, а для разового переключения, ее можно выбрать при вводе параметров, дат там и остального. и вот эту то настройку и предлагалось убрать как лишнюю и загромождающую интерфейс, а форму выбирать в зависимости от "желания"... %), на вопрос каким образом узнавать желания - "хорошая программа должна это знать!" :о))))

    > для SQL баз для подобной задачи используют тригеры и хранимые процедуры.
    с тригерами облом, нет их в access (в базе а не программе, т.к. программа может пользоваться и базой mssql, а там они уже есть), а процедуры ничем тут не помогут, и даже неважно, что в access они очень ограничены, фактически одно название а не процедуры.
    в общем только так как я сказал, "вешаться" на событие от системы, средства самой базы не помогут (ну или постоянные пере-запросы "наобум" как у тебя).
    и кстати, если база чужая, то лезть в нее со своими дополнениями нехорошая идея... ну, вот я бы был против если бы в "мою базу"(моей программы) понаставили "левых тригеров", а потом начали предъявлять претензии к скорости работы уже моей программы (/а то и глюкам в ней) .

    > Кто-нибудь может пояснить, что это за звери
    конечно. любая книжка по sql. welcome.
  • Yurikon (23.08.09 11:28) [8]
    Спасибо, 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-)
  • sniknik © (23.08.09 13:31) [9]
    > Столкнулся с таким глюком драйвера 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, это реализация борланда
    или это твой глюк (если отсутствие скобки в первом варианте не описка, но даже если твой, то описанный глюк к "разорванным" запросом, и определением параметров имеет место быть)
 
Конференция "Базы" » Изменение записи из другого приложения [D7, Access]
Есть новые Нет новых   [134473   +31][b:0][p:0.001]