Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / сообщения об ошибках в ADP / 17 сообщений из 17, страница 1 из 1
20.12.2004, 13:15:33
    #32834694
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
Как ADP заставить выдавать родные сообщения об ошибках от скл-сервера?

Подробнее: есть adp, который используется как интерфейс для редактирования таблиц. Если пользователь вводит некорректные данные (не заполнил обязательное поле, юник констрэйнт нарушил, вместо числа - буквы и т.д.), то ему выдаётся "тупое" сообщение (у разных пользователей по разному):
1. There was a problem accessing property or method of OLE object
2. Interface is not supported
3. пустой мессадж-бокс с снопкой ОК.

Хотелось бы видеть: can not insert null value, value is not consistent with the data type of column, can not insert duplicate key, etc.

Везде access2k+SR1, sql2k+sp3, win2000+sp4
...
Рейтинг: 0 / 0
20.12.2004, 13:40:12
    #32834774
incold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
Перейти на access2002 (XP) там это устранено.

возможно поможет последний MDAC на каждого клиента
...
Рейтинг: 0 / 0
20.12.2004, 13:43:01
    #32834782
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
ну а если перейти нельзя и mdac везде 2.8
где чего подкрутить?

кстати, причём тут mdac, если сообщение об ошибке "прячет" именно аксес?
если делать то же самое на рекордсетах - текст ошибки "родной" - с сервера
...
Рейтинг: 0 / 0
20.12.2004, 13:45:17
    #32834790
incold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
у меня подкрутилось только переходом на 2002-й

авторкстати, причём тут mdac, если сообщение об ошибке "прячет" именно аксес?

я же говорил возможно
...
Рейтинг: 0 / 0
20.12.2004, 16:42:21
    #32835390
сообщения об ошибках в ADP
Насколько я понял проблему автора вопроса, тут дело в коде самого Access 2000, и обновление MDAC тут не поможет. Это документировано в MSDN. Я впервые столкнулся с этим в 2000-м году, тогда же методом "научного тыка" нашёл удовлетворительное решение, и лишь совсем недавно ясно понял природу проблемы и как её решить практически полностью (на Access 2000, конечно - справедливо было указано, что на Access 2002 вопрос неактуален).

Проблема в том, что "родные" сообщения об ошибках MS SQL Server выводятся только тогда, когда действие инициируется кодом самого Access (в ответ на интерактивные действия пользователя). Если же мы попытаемся, к примеру, сохранить запись, например, так -
Код: plaintext
RunCommand aсCmdSaveRecord
, то при невозможности сохранения записи сервером (constraint violation или ещё что) ВСЕГДА будет генерироваться одна и та же ошибка номер 2757 - "There was a problem accessing property or method of OLE object". Это лишает возможности информировать пользователя о причине ошибке и хоть как-то осмысленно отреагировать на произошедшее.

Два решения:

1) Довольно быстро я догадался, как снять остроту проблемы (простым перебором всех возможных вариантов). Как уже сказано, если запись сохраняется командой из меню, а не пользовательским кодом, то текст сообщения об ошибке, пришедшей с сервера, показывается правильный. Решение очевидно - всякий раз, когда кодом нам нужно сохранить запись, используем имитацию нажатий клавиш, приводящих к сохранению записи самим Access'ом (аргумент True важен, поскольку в большинстве случаев нужна синхронная обработка команды):
Код: plaintext
SendKeys "+{Enter}",True

2) Хотя приведённое выше решение оказалось на практике вполне приемлемым, я долгое время искал способ преодолеть его очевидные ограничения - хотелось бы заменять малопонятные для обычного пользователя сообщения об ошибках сервера на английском языке на свои. Проблема тут в том, что никаким способом (включая перехват события Error формы и исследование свойств коллекции Errors ADO) невозможно получить ни код ошибки сервера, ни её текст - везде всё те же 2757 "There was a problem accessing property or method of OLE object".
И лишь совсем недавно, читая статью в MS KB (написанную совершенно по другому поводу), я понял, что надо сделать: отлавливать события объекта Recordset формы. В тот же вечер я это всё с успехом реализовал, так что задача была почти решена. "Почти" - это, во-первых, потому, что код ошибки MS SQL Server получить, видимо, в Access 2000 принципиально невозможно (так что придётся устраивать разбор строки ошибки), а во-вторых, потому, что не всегда при нарушениях целостности данных ошибка генерируется сервером: в некоторых случаях "умный" Access отображает ошибку, даже не посылая данные на сервер. В последнем случае описанный метод не работает и перехватить такое событие своим кодом, похоже, никак нельзя.

Только после того, как я всё это реализовал самостоятельно, я натолкнулся на статью Сергея Вакшуля, который прошёл тем же путём, что и я, ещё в 2002 году:
http://www.hiprog.com/access/article.asp?id=365
...
Рейтинг: 0 / 0
20.12.2004, 17:31:30
    #32835544
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
У меня ADP в A2000+SP3, MDAC2.8ru, MsSQL2000+SP3

А что таким путем не работает что-ли (у меня вроде работает):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Set Cnn = CurrentProject.Connection
Cnn.BeginTrans

СохранитьПредлКонтакт = False
On Error GoTo Err_
DoCmd.SetWarnings False

On Error Resume Next
strSQL = " INSERT into Контакты (Дата,Idklienta,IdKontLica,IdKontVid)" & _
         " SELECT Дата,Idklienta,IdKontLica,IdKontVid " & _
         " FROM #Q_ПредлКонтакты WHERE Id= " & parId
Cnn.Execute strSQL
If Cnn.Errors.Count >  0  Then   ' -105121349 - для MDB
 If Cnn.Errors( 0 ).NativeError =  2627  Then
  If  2  = MsgBox(" Такой контакт уже есть в списке 'Контакты' " & vbCrLf & _
               " Перезаписать его ? ", vbOKCancel, " Вы уверены ?! ") Then GoTo RollBack_ ' Exit_
  On Error GoTo Err_

.....
.....
...
Рейтинг: 0 / 0
20.12.2004, 17:38:40
    #32835568
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
2 Тимур Рахимов:
у меня сохранение происходит штатными средствами аксеса, а не через код. и ошибка всё равно та же (There was a problem accessing property or method of OLE object).

Попробовал как в статье - работает. Хотя проблема теперь другая - прописать во всех формах этот код.

2 yuniki:
у меня форма вообще без кода! вставкой и обновлением записей занимается сам аксес.
...
Рейтинг: 0 / 0
20.12.2004, 17:56:34
    #32835624
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
2 yuniki:
у меня форма вообще без кода! вставкой и обновлением записей занимается сам аксес.

Мне просто интересно, у меня-то Access2000 и даже, если форма без кода - все-равно о нарушениях целостности выходят адекватые американские сообщения, проблема только в том, чтоб их MsSQL посылал по русски. Мне тут (вернее на MsSQL говорили, что можно это сделать за счет спец. свойств полей в таблицах).
...
Рейтинг: 0 / 0
20.12.2004, 17:58:58
    #32835631
сообщения об ошибках в ADP
yuniki:
В моём случае так не работало - коллекция Errors объекта CurrentProject.Connection была во всех случаях пуста (Access SP3,MS SQL 2000 SP3). Возможно, это поправлено, начиная с MDAC 2.8 (я не проверял - мне пришлось добиваться работоспособности кода на предыдущих версиях). Однако проблему скрытия Access'ом сообщения сервера об ошибке в случае программного сохранения записи (замены его на "There was...") MDAC 2.8, похоже, всё таки не решает.

Но, судя по строкам
Код: plaintext
1.
If Cnn.Errors.Count >  0  Then   ' -105121349 - для MDB
 If Cnn.Errors( 0 ).NativeError =  2627  Then

ваш код написан для MDB? В таком случае это вряд ли может служить аргументом, ведь мы обсуждаем, если не ошибаюсь, ADP?

Dmitry Biryukov:
Если описанное вами поведение происходит не в результате действия вашего кода, а в ответ на выбор команды из встроенного меню, то это глюк. В этом случае, возможно, переустановка компонентов или всей программы в целом должна помочь.

Ещё раз: на вашей конфигурации (Access 2000 SR1, MS SQL 2000 SP3) у меня сообщение об ошибке, пришедшее с сервера, надёжно отображается в виде системного message box'а с единственной кнопкой ОК (но только в случае, если попытка сохранения записи инициировалась самим Access'ом, а не моим кодом).
...
Рейтинг: 0 / 0
20.12.2004, 18:09:20
    #32835654
сообщения об ошибках в ADP
yunikiМне просто интересно, у меня-то Access2000 и даже, если форма без кода - все-равно о нарушениях целостности выходят адекватые американские сообщения, проблема только в том, чтоб их MsSQL посылал по русски.
У меня в точности то же самое, и здесь нет никакой проблемы (к сожалению, как я понял, у автора вопроса уже на этом этапе затруднения). Проблемы начинаются, когда сохранение записи инициируется нашим кодом, а не Access'ом, и продолжаются, когда мы хотим заменить системные сообщения, пришедшие с сервера, на свои.

yunikiМне тут (вернее на MsSQL говорили, что можно это сделать за счет спец. свойств полей в таблицах).
Ссылочку не дадите? Что-то мне кажется, что речь тут идёт о sp_addextendedproperty , но это решение, как я думаю, для другой задачи.
...
Рейтинг: 0 / 0
20.12.2004, 18:16:24
    #32835681
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
Тимур Рахимов
yunikiМне тут (вернее на MsSQL говорили, что можно это сделать за счет спец. свойств полей в таблицах).
Ссылочку не дадите? Что-то мне кажется, что речь тут идёт о sp_addextendedproperty , но это решение, как я думаю, для другой задачи.
я дам :-)
надо для логина установить default language = russian
...
Рейтинг: 0 / 0
20.12.2004, 18:27:51
    #32835712
сообщения об ошибках в ADP
Dmitry Biryukovнадо для логина установить default language = russian
Да, при условии, что таблица sysmessages в master содержит варианты сообщений на русском языке (не у всех это так), это несколько облегчит ситуацию. Но, к сожалению, не решит проблему: в большинстве случаев системные сообщения, даже будучи переведёнными на русский язык, останутся пользователю непонятными. Чтобы сообщение было им понятно, оно должно быть сформулировано в понятиях предметной области, для которой написана ваша программа, так что всё равно есть потребность в замене системных сообщений на свои (уникальные для этой конкретной программы).
...
Рейтинг: 0 / 0
20.12.2004, 18:31:26
    #32835725
сообщения об ошибках в ADP
Что касается вот этого:
Тимур РахимовНо, судя по строкам
yuniki
Код: plaintext
1.
If Cnn.Errors.Count >  0  Then   ' -105121349 - для MDB
 If Cnn.Errors( 0 ).NativeError =  2627  Then

ваш код написан для MDB? В таком случае это вряд ли может служить аргументом, ведь мы обсуждаем, если не ошибаюсь, ADP?
Я проверил, это действительно для ADP. Извиняюсь.

Если бы у меня так работало, не пришлось бы городить такой огород.
...
Рейтинг: 0 / 0
20.12.2004, 19:30:03
    #32835812
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
2 Тимур Рахимов >
1) Ссылочку не дадите? Что-то мне кажется, что речь тут идёт о sp_addextendedproperty, но это решение, как я думаю, для другой задачи. Да , конечно об этом, весь нюанс в том, как назвать это свойство, назвать его надо спец именем :
/topic/139815&pg=-1&hl=sp+addextendedproperty
(Сорри,Поставить нормально ссылку в этом редакторе для меня непосильная задача)

Правда , у меня самого так не получилось.А хотелось... Т.к. довольно красиво получается. Если Вам интересно и у Вас получится , напишите на мыло yuniki@ramler.ru

2)
Насчет "Чтобы сообщение было им понятно, оно должно быть сформулировано в понятиях предметной области, для которой написана ваша программа, так что всё равно есть потребность в замене системных сообщений на свои (уникальные для этой конкретной программы)."

Сам так считаю. Но просто было интересно добиться того же от MsSQL, что мы имеем в Access - MDB (по русски). Т.к. зачастую, Access использую именно для облегченной быстрой разработки, а его сообщения в MDB (пусть абстрактные от Приложения) все-равно пользователя так не бесят, как английские, и даже более того, - можно использовать их во многих случаях, особенно если и таблицы и поля в них на русском, Не зря же для англоязычных они считаются нормальными (хотя, конечно для приложения надо бы поближе к теме, но на среднем уровне и так сойдет)

3) Моя конфигурация описана выше и вроде как сообщения адекватные от MsSQL идут, поэтому еще раз хотелось бы уточнить - ваши ошибки проявляются ВСЕГДА в описанных ситуациях ?

4) проект у меня действительно ADP. Там просто замечание осталось о том, что было бы в MDB.
...
Рейтинг: 0 / 0
20.12.2004, 19:37:21
    #32835826
Shuhard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
автор
(Сорри,Поставить нормально ссылку в этом редакторе для меня непосильная задача)

// - помогают
...
Рейтинг: 0 / 0
20.12.2004, 22:33:15
    #32835947
сообщения об ошибках в ADP
yuniki:

Что касается такого способа подмены системных серверных сообщений о нарушениях целостности -
Код: plaintext
1.
exec sp_addextendedproperty N'MS_ConstraintText', N'текст сообщения', 
    N'user', N'dbo', N'table_name', N'table0', N'constraint', N'constraint_name'

Я проверил, всё прекрасно работает. Но... в Access 2002! И выше (наверное).

Спасибо за подсказку - я не знал, что кроме MS_Description , Access может использовать ещё-какие-то свойства серверных объектов.

А в Access 2000 по прежнему приходится рассчитывать только на свои силы.
...
Рейтинг: 0 / 0
21.12.2004, 09:08:47
    #32836137
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сообщения об ошибках в ADP
Вот черт, надо все-таки переходить на A2002, или может А2003 ...
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / сообщения об ошибках в ADP / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]