|
|
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
есть табл.форма для добавления, изменеия и удаления записи на основе ХП вот кусок триггера, который срабатывает в табл, на основе которой создана ХП if @SumSchet>@SumNakl raiserror('Сумма документа меньше суммы прихода.',16,1) if @SumScheta<@SumNakl begin raiserror('Сумма документа не может быть больше суммы прихода.',16,1) rollback end во втором условии выдается сообщение с откатом (оно работает нормально: выдает сообщение и не дает сохранить строку в форме в первом условии должно выскакивать просто сообщение (оно действительно выскакивает) но! после этого выдается стандартное сообщение о том, что кто-то уже другой поправил ту же запись и предлагается 3 варианта: либо сохранить запись, либо сохранить в буфер, либо отменить изменения. мне не надобно вот этого стандартного сообщения от аксесса. мне надо, чтобы было просто мое сообщение: 'Сумма документа меньше суммы прихода.' никакого отката тут уже не нужно как этого добиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 12:58 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
Предложу проверить след.: - в начале триггера Set Nocount on - строку синхронизации и уникальную таблицу на форме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 13:15 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
Может это? "Severity level 10 messages are informational and indicate problems caused by mistakes in the information you have entered. Severity levels from 11 through 16 are generated by the user, and can be corrected by the user. Severity levels from 17 through 25 indicate software or hardware errors. You should inform the system administrator whenever problems that generate errors with severity levels 17 and higher occur. The system administrator must resolve these errors and track their frequency. When a level 17, 18, or 19 error occurs, you can continue working, although you might not be able to execute a particular statement. " И еще оттуда же Severity Level 10: Status Information This is an informational message that indicates a problem caused by mistakes in the information the user has entered. Severity level 0 is not visible in SQL Server. Severity Levels 11 through 16 These messages indicate errors that can be corrected by the user ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 13:21 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
начале триггера Set Nocount on строку синхронизации и уникальную таблицу на форме. усе это есть Severity Level 10: Status Information если ставить 10, то сообщения вообще никакого не выдается если 11, то ситуация, что я написал выше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 13:29 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
В adp ХР + SQL 2000 если без всяких формочек править таблицу, то вываливает сообщение, запись сохранить не дает , при попытке закрытия выдает "Сохранение невозможно продолжить да нет", после отмены изменений открываем снова таблицу - изменения там есть (можно не закрывать/открывать, сделать реквери) Как что raiseerror некошерный метод для пользовательский сообщений. Кажись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 13:42 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
а перехватить ошибку в форме не бывает через Form_Error(DataErr As Integer, Response As Integer)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 13:44 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
если итить по пути отлавнивания ошибки в форме, то там тянется ошибка дальше Private Sub Form_Error(DataErr As Integer, Response As Integer) Select Case DataErr Case 7787 ' та самая ошибка, которая выдает сообщение о правке записи кем-то другим Response = acDataErrContinue Case Else Response = 1 End Select 7787 я проигнорирую, но запись все равно не сохраняется, пока я еще раз не щелкну на этой же строке. если же сделать попытку закрыть форму после игнорирования ошибки то выдается еще одно системное сообщение от аксесса: В данное время сохранение объекта невозможно. Закрыть объект БД? Да или Нет? тоже не выход. осталось воспользоваться событием формы "До обновления" и запустить там проверку выдать сообщение. было бы красивее и чище это сделать на триггере, но деваться некуда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 14:06 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
А в общих чертах что триггер-то делает? Может он правит таблицы, которые участвуют в запросе для формы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 14:09 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
Да он может ничего не делать, кроме raiserror Код: plaintext 1. 2. 3. 4. 5. 6. Точно так же себя ведет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 14:16 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
пардон за ложный путь >но запись все равно >не сохраняется, пока >я еще раз не щелкну >на этой же строке. а программно реализовать это (или что за этим стоит - SaveRecord, например) не бывает? Гемор еще тот но в качестве варианта... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 14:18 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
2 Лох Позорный Я почему спрашиваю, у меня достаточно много есть триггеров с raiserror и таких проблем пока что не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 14:25 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
2 Кабысдох Да ну нафик такие варианты. А если действительно кто-то запись изменил? А ты эти изменения не глядя програмно затрешь? Не дело SQL Server'а пользовательскими окошками заниматься. Не дело. На BeforUpdate вызов проверки и нормально 2 incold Странно, а у меня первый же (приведенный) триггер такую фигню выдал. На новой таблице, без каких либо извратов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 14:32 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
я же сказал, что триггер сверяет 2 суммы. никаких добавлений и исправлений в другие таблицы не происходит. надо: в одном случае просто надо выдать сообщение не отменяя исправлений, а в другом выдать сообщение и отменить исправление ALTER TRIGGER [Накладные расхода товара_ INSERT_update] ON dbo.[Накладные расхода товара] FOR INSERT,update AS set nocount on declare @Cod bigint declare @Docum bigint, @S tinyint select @Cod=Код, @Docum=[Код Документ],@S=Состояние from inserted if @S=2 declare @SumS money, @SumN money set @SumS=isnull((SELECT SUM([Документы состав].[Количество заявки] * [Документы состав].Цена) FROM [Документы состав] INNER JOIN Документы ON [Документы состав].[Код документа] = Документы.Код WHERE ([Документы состав].[Код документа] = @Docum) AND (Документы.[Код Тип документа] = 2)),0) set @SumN=isnull((SELECT sum(Количество* Цена) FROM [Расход товара] WHERE ([Код накладной] = @Cod)),0) if @SumS>@SumN begin raiserror('Сумма документа меньше суммы прихода.',16,1) end if @SumS<@SumN begin raiserror('Сумма документа не может быть больше суммы прихода.',16,1) rollback end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 14:35 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
И програмно не дает изменить таблицу с таким триггером. Вываливает ошибку на rst.Update. Но в таблице данные таки меняются. Плохой метод однозначно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 14:41 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
И еще. Хам, ты представь, что тебе понадобится сделать 'Сумма документа меньше суммы прихода. Продолжать да/нет?' и тебе сразу расхочется это в триггер пихать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 15:04 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
Пусть ХП возвращает код, а по этому коду в Аксессе выводи msgbox. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 15:11 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
с ХП я уже давно бы все сообщения получил. я вот хотел триггер помучить. а по поводу Да/Нет я уже думал. думал-думал думал-думал а потом надоело думать и написал сюда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 15:21 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
Была у меня такая штука. Триггер навроде ничего не делает с таблицей , а долбаный Акес ругается "отменить и тд." Оказалось , что таким образом он реагирует на использование inserted и deleted в запросах. Обошел так : SELECT ЧтоНужно INTO #TmpTbl FROM inserted(deleted) ... потом в запросах использовал временную таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 15:49 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
И забудь про это, это же кривость такая, что мало не покажется. Проще/лучше начал транзакцию, слил данные, проверил процедурой, если что-то не понравилось, спросил что делать и подтвердил,/отменил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 15:54 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
2 Latuk Нигде ничего не используется. Весь триггер - из одной строчки raiserror ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 15:55 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
>select @Cod=Код, @Docum=[Код Документ],@S=Состояние from inserted Почему ты уверен , что inserted содержит только одну строку? Этот код зарубит тебе пакетные обновления , что бывает очень неудобно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 15:58 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
"Почему ты уверен , что inserted содержит только одну строку?" я на форме правлю одну строку. и вставляю тоже одну строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 16:01 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
А что, вставку из буфера обмена в адп отменили что-ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 16:12 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
Я тоже сначала только через форму правил. А потом вдруг понадобилось 100... накладных ошибочно забитых на одного клиента перекинуть на другого. Ну говорю без проблем Пару запросов делов то ... Не тут то было С тех пор в триггерах пишу код способный работать с многострочными транзакциями, или по крайней мере пишу проверку "Если многострочная то не выполнять" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 16:17 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
А у меня, как и у incold'a, никаких лишних сообщений... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 16:47 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
2 IgorM & ALL Сделал ситуацию с таким сообщением...хреново однако. У меня не было никаких сообщений по той причине, что в ленточных и табличных формах данные на основе сложных запросов (или с обработкой в триггерах) не редактируются. Для таких данных всегда две формы: Ленточная с параметрами поиска - для просмотр с кнопкой по кнопке открывается простая форма редактирования текущей записи, в которой сохранение записи по кнопке, вызовом функции. При такой организации raiserror обрабатывается нормально без сообщений о конфликте записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 16:56 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
Не знаю. У меня MS SQL Server 2000 (сервис паки сейчас не скажу), аксес ХР, mdac 2.7 У кого-нибудь (кроме incold и IgorM) на такой конфигурации редактирование таблицы проходит успешно - в случае простешего триггера, который единственное что делает - raiserror? У меня редактировать не получается ни через форму, ни напрямую открыв таблицу (через аксес adp), ни программно через ADODB.Recordset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 17:05 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
апаздал Incold вычеркивается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 17:06 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
Сорри еще раз за дезинформацию. Глянул более внимательно на свои триггера - везде, где есть raiseerror, рядышком стоит Rollback. Просто raiseerror не использую, но после тестирования в любых случаях идет на конфликт записи. Вывод: если нужно просто сообщить без отката - вешаем процедурку на BeforeUpdate. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 17:18 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
подвожу итог: от чего ушел к тому и пришел подтвердили мои искания и другого решения не оказалось спасибо, родненькие спасибки УСЕМ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 18:30 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
Может я что-то не так делаю? Есть таблица, на нее вешается триггер: Код: plaintext 1. 2. 3. 4. 5. 6. Всё, больше ничего не делаю (cкажу сразу rollback нужен только для insert'а, на чистом update работает и без него). Ни в форме на основе таблицы, ни при ее (таблицы) прямом редактировании, ничего кроме MessageBox'а с текстом "ааа" не выскакивает. Или я неправильно понял и воспроизвел ситуацию? AccXP SP2 - 10.4302.4219 MSDE 2000 SP3 - 8.00.760 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 19:27 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
2 IgorM Для неместных повторяю - rollback убери. И скажи что получится. Хотя можешь и не говорить. И так ясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 22:57 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
Raiserror устанавливает глобальную переменную @@Error. А коль есть ошибка, то Акес (и в том числе другие клиенты - QA, EM) считают что произошла ошибка, о чем честно и сообщают, хотя сама вставка была выполнена и на верное ничего с этим не поделаешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 23:08 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
2ЛП: Ты постинги целиком читаешь или нет? Специально ведь оговорил "rollback нужен только для insert'а, на чистом update работает и без него" ... Что еще я делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2003, 06:37 |
|
||
|
adp 2002. сообщение от триггера
|
|||
|---|---|---|---|
|
#18+
2IgorM ЛП имел ввиду (наверное) просто выдачу сообщения из триггера (без rollback'ов). Т.е. когда нужно сообщить юзеру о чем-то без отката. Тогда твой способ некатит. Интересная проблема, которая меня еще не затронула - но думаю все еще в переди. Хотя я пошел бы путем предложенным самим Хамом - отлавливание ошибок на форме, возможно можно попробовать отслеживать Connection.Errors ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2003, 09:53 |
|
||
|
|

start [/forum/topic.php?all=1&fid=45&tid=1679661]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
94ms |
get tp. blocked users: |
2ms |
| others: | 200ms |
| total: | 401ms |

| 0 / 0 |
