powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с рекордсетом
10 сообщений из 35, страница 2 из 2
Проблема с рекордсетом
    #32537781
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит, так. Триггер проверяет не ту таблицу в которую идет вставка а другую, так?
Только немного извращенным способом.
Лучше так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TRIGGER tklients_update ON dbo.TKlients 
FOR UPDATE 
AS  begin
if update(klient_name) and exists (select * from TDocuments t Inner Join Deleted d
	ON t.pokupatel_id= d.klient_id)
	begin
	raiserror  50002  'Изменение невозможно, так как имя клиента уже используется в других документах.'	
	rollback tran
	end
end

Что меня сбивает с толку так это ремарки вроде "вышли" "сохранили". Нифига не понимаю, откуда вышли и чего сохранили?

авторсообщение уже выдалось и мы сделали CancelUpdate и сохранили.
Сообщение выдалось - т.е. транзакцию откатили, зачем то сделали CancelUpdate и "сохранили"... что? Как ? Куда?
Судя по коду, ничего кроме выхода из процедуры не происходит.

Начнем с простого.
Что нужно сделать?

Пытаемся сделать апдейт, триггер проверяет и выдает ошибку.
Кстати, почему проверка делается по ID? Вы же имя меняете?
Не понимаю логику этого триггера. Вы проверяете не изменяется ли имя клиента с id уже существующим в другой таблице.
У меня нездоровое ощущение что там должен быть FK.
В таком случае вы его никогда не измените. Или он будет с другим ID, тогда вообще не вижу никакой логики в этой базе и в этом триггере.


Magnus
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32539372
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Кстати, почему проверка делается по ID? Вы же имя меняете?
есть таблица tklient, в кот klient_id - это PK, klient_name и тп
др таблица tdocument связана с tklient по полю klient_id - FK
Соот-но, если пытаемся изменить значение поля klient_name в таблице tklient, а код для этого klient_name есть в табл tdocuments, тогда триггер откатывает транзакцию
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32539578
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я готова ответить на др вопросы, чтобы прояснить
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32539599
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я о том и говорю! Зачем он откатывает? Если есть FK так добавьте каскадное обновление и выкиньте триггер нафик.


Magnus
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32539702
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нужно каскадного обновления. Нужно наоборот запретить обновление, если такой клиент есть в др таблице.
Триггер верный - Вы не на том акцентируете внимание.
Нужно именно в клиенте обработать это системное так сказать для клиента сообщение, кот исходит от триггера. Если триггер не делать придется всю проверку - есть ли такой клиент в др таблице- делать на VB, я же решила сделать это в SQL Server, а на VB просто перехватить сообщение от триггера и вернуть в TextBox старое значение тут же после того, как клиент нажмет ОК в сообщение от триггера.
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32539710
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фух. Уже что то. Вы хотите запретить обновление.
Наконец-то я что то начинаю понимать.

В рекордсете могут быть обновления разных строк или только одна?
Если одна то делать это нужно через Connection.Execute
Если много, то одна неверная запись всегда будет забивать вам весь батч.

Если триггер откатывает транзакцию то вызывать CancelUpdate не нужно.
Кстати, его тоже подправьте как я показал. В этом случае следует использовать Inner Join.

Далее. Вы хотите сохранить изменения в других полях одновременно отменив изменение на имя клиента если оно указано в апдейте и такой клиент уже существует в другой таблице так?

Теперь с ошибкой.
Как уже сказали, у ДЕь есть своя коллекция ошибок. Я им особо не пользуюсь, поэтому не уверен будет ли ошибка там, если нет, то в коллекции ошибок соеденения. Найдите в какой и очищайте ее.



Magnus
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32539717
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на форме для отображения значений полей использованы TextBox, следовательно обрабатывается на данный момент только одна текущая запись из рекордсета и следовательно обновляется именно она.
теперь...
я не поняла про обновление, как это делается через Connection.Execute, это заместо строки MainDataEnvironment.rscmdKlientsNew.Update?
автор
Если триггер откатывает транзакцию то вызывать CancelUpdate не нужно.
после отката посредством триггера в рекордсете все равно пока старое значение, следовательно надо сделать обновление его через Requery?
Если Вы это имеете ввиду, то тогда там есть другая проблема, кот я опишу, если именно это и имелось ввиду.
автор
Далее. Вы хотите сохранить изменения в других полях одновременно отменив изменение на имя клиента если оно указано в апдейте и такой клиент уже существует в другой таблице так?
я хочу только отменить изменения на имя, сохранять не надо, пока пользователь сам не захочет этого сделать.
автор
Теперь с ошибкой.
Вы имеете в виду какую ошибку?
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32539722
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если рекордсет содержит несколько записей и в них были сделаны изменения то колигество обновляемых записей зависит уже от типа курсора, если он динамический то одна, а если статический или keySet, то все имеющие изменения.

Апдейт одной строки через соеденение

Dim cn as ADODB.COnnection
Set cn= New ADODB.Connection
cn.OPen "Ваша строка подключения"
Cn.Execute "Update MyTable Set Filed1='" & text1.text & "' , field2='" & Text2.Text & "'"
cn.Close
Set cn= Notring

Так же можно использовать и уже открытое соеденение самого DE.


авторследовательно надо сделать обновление его через Requery?
ДА. Или Refresh.

авторВы имеете в виду какую ошибку?
Из триггера.

Magnus
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32539778
Фотография Alviga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в табличке deleted точно одна запись ?
Потому как из приведенного кода это совсем не следует.
Какае данные содержит рекрдсет ?
Может есть другое решение вашей проблемы и на ндо закикливаться на начальном способе.
Можно задачу с самого начала.
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32542225
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на данный момент я пока оставила таким образом:
если пользователь меняет значение в поле klient_name, код которого есть и в другой таблице, выдается предупреждение и форма закрывается.
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с рекордсетом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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