powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с рекордсетом
35 сообщений из 35, показаны все 2 страниц
Проблема с рекордсетом
    #32535696
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой обработчик на событие потери фокуса textbox-a, в кот обновляется рекордсет и в случае возникновеня ошибки (почему она может возникнуть не столь важно) нужно отменить обновление.
Проблема в том, что если потом не закрыть рекордсет и не открыть снова, то еще раз обновить его и сохранить изменения, кот могли быть в других полях не получается, так выдается опять эта ошибка, которую я ведь уже обработала ранее. Как избежать закрытия и открытия снова рекордсета?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
On Error GoTo Error_K_name_LostFocus
    MainDataEnvironment.rscmdKlientsNew.Update
Exit_K_name_LostFocus:
Exit Sub

Error_K_name_LostFocus:
    If Err.Number = - 2147217900  Then
        MsgBox "ошибка..."
        MainDataEnvironment.rscmdKlientsNew.CancelUpdate
        MainDataEnvironment.rscmdKlientsNew.Close
        MainDataEnvironment.rscmdKlientsNew.Open
        K_name.Text = MainDataEnvironment.rscmdKlientsNew.Fields("klient_name")
    End If

 Resume Exit_K_name_LostFocus
 
End Sub
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32535710
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочу внести поправку - закрытие рекордсета здесь исключается.
Тогда вопрос непосредственно по поводу того: почему не удается сохранить изменения, сделанные в других полях после этой ошибки. Почему при Update она возникает снова?
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32535719
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текст ошибки можно увидеть?


Magnus
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32535724
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
текст ошибки из моего триггера такой:
Изменение невозможно, так как имя клиента уже используется в других документах.
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32535726
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не от недоверия к вам(с)Какой-то наш фильм.
Но все-таки желательно оригинал.

Magnus
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32536078
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не пойму какой оригинал нужен...
сообщение об ошибки выдается в случае модификации данных в конкретном поле, если код данного клиента есть еще и др таблице.
Текст триггера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TRIGGER tklients_update ON dbo.TKlients 
FOR UPDATE 
AS  begin
if update(klient_name) and exists (select * from TDocuments, Deleted
	where TDocuments.pokupatel_id= deleted.klient_id)
	begin
	raiserror  50002  'Изменение невозможно, так как имя клиента уже используется в других документах.'	
	rollback tran
	end
end
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32536133
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irinkaвыдается опять эта ошибка, которую я ведь уже обработала ранее
Код: plaintext
1.
2.
3.
4.
5.
6.
   End If
 
 Err.Clear  'The Clear method can be used to explicitly reset Err
 
 Resume Exit_K_name_LostFocus
 
End Sub
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32536176
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Processor

Clear я попробывала, но он не помого.
Дело в том, что если я изменяю значение в поле klient_name, а его нельзя изменять (см текст триггера, когда именно нельзя), потом после сообщения и возврата старого значения я могу пересохранить и выйти, закрыв рекордсет. Потом, когда я войду снова и изменю др поля, я смогу сохранить изменения.
А вот если изменение поля klient_name (при срабтывании триггера и возврата старого значения) и изменение затем др полей происходит без закрытия рекодсета, а сразу, то уже почему-то триггер воспринимает как модификацию поля klient_name и сохранить не дает
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32536195
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
текст, кот сейчас:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
On Error GoTo Error_K_name_LostFocus

    MainDataEnvironment.rscmdKlientsNew.Update
 
Exit_K_name_LostFocus:
Exit Sub

Error_K_name_LostFocus:
    If Err.Number = - 2147217900  Then
        MsgBox "ошибка..."
        MainDataEnvironment.rscmdKlientsNew.CancelUpdate
        K_name.Text = MainDataEnvironment.rscmdKlientsNew.Fields("klient_name").Value
                
    End If
Err.Clear
  Resume Exit_K_name_LostFocus
 
End Sub
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32536616
Фотография Alviga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если ошибка будет с другим номером ?
Да и сообщение об ошибке очень информативное :-)
Может лучше вместо Error написать
err.Description + CStr(err.Number)
Да и у DataEnvironment есть тоже коллекция Errors
может стоит там посмотреть.
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32536617
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел ввиду текст ошибки на алглийском.

Magnus
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32536959
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
текст только на русском, так как, этот текст из моего триггера
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32536966
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alviga

данная обработка на клиенте предназначена только для этого номера ошибки, если будут появляться др ошибки, пусть выдаются системные сообщения, я им не запрещаю, поэтому др я способ мне не нужен пока, спасибо.
Мне нужно найти причину почему при одно случае сохраняются изменения, а при др опять эта ошибка. Более подробно см выше
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537051
Фотография Alviga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА вот если изменение поля klient_name (при срабтывании триггера и возврата старого значения) и изменение затем др полей происходит без закрытия рекодсета, а сразу, то уже почему-то триггер воспринимает как модификацию поля klient_name и сохранить не дает

посмотри что в этом случае у тебя содержит рекордсет.
Возможно что это, старое значение, которыое и вызывает ошибку.
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537178
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверила - значение то, кот нужно, т е после ошибки изменения отменились и вернулось старое значение.
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537191
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, на счет триггеров.
В матчасти сказано, что "Триггер воспринимает любой апдейт поля как изменение, даже если новое значение идентично предыдущему."
Поэтому , нижно менять логику. Либо клиента либо триггера.


Magnus
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537201
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это я знаю, только есть одно НО
сообщение уже выдалось и мы сделали CancelUpdate и сохранили.
а теперь уже это поле никак не изменяли, а поменяли др поля и сохранить не удается
а вот если выйти и зайти снова, поменять др поля и сохранить, то все сохраняется
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537206
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и при этом, когда мы меняем др поля, мы же тоже на кнопку ОК вешаем update рекордсета и ничего нормально
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537618
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если убрать эту строку
K_name.Text = MainDataEnvironment.rscmdKlientsNew.Fields("klient_name").Value

то все сохраняется нормально, но проблема в том, что изменения в textbox-e не отменяются и пользователь может подумать, что оно таким и останется, а на самом деле, если он выйдет, а потом зайдет снова, там будет первоначальное значение, кот он пытался изменить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Private Sub K_name_LostFocus()

On Error GoTo Error_K_name_LostFocus
If mybln4 = True Then
    If K_name.Text <> pk_name Then
    MainDataEnvironment.rscmdKlientsNew.Update
    pk_name = K_name.Text
    End If
End If

Exit_K_name_LostFocus:
Exit Sub

Error_K_name_LostFocus:
    If Err.Number = - 2147217900  Then
        MsgBox "..."
        K_name.Text = 
        MainDataEnvironment.rscmdKlientsNew.CancelUpdate
    End If
Err.Clear
Resume Exit_K_name_LostFocus
 
End Sub
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537622
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сори, туда попала лишняя строка, ну и чтобы не отвлекать внимание лишние условия пока тоже уберу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub K_name_LostFocus()
On Error GoTo Error_K_name_LostFocus
    MainDataEnvironment.rscmdKlientsNew.Update
Exit_K_name_LostFocus:
Exit Sub
Error_K_name_LostFocus:
    If Err.Number = - 2147217900  Then
        MsgBox "..."
        MainDataEnvironment.rscmdKlientsNew.CancelUpdate
    End If
Err.Clear
Resume Exit_K_name_LostFocus
 
End Sub
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537634
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чесно, я уже ничего не понимаю. ЗА день сделал 6 попыток вьехать в происходящее и с позором отступил.
Кто нибудь обьясните мне в чем все таки дело, если сами поняли?
Кто после чего выбрасывает или не выбрасывает?

Вот эта строка
Код: plaintext
K_name.Text = MainDataEnvironment.rscmdKlientsNew.Fields("klient_name").Value

вообще ни к чему никагого отношения не имеет.
Главная проблема ведь это ошибка из триггера?
Барышня, вы обьясняете настолько сумбурно что я скоро с катушек сьеду от непонимания устройства вселенной(с)ЛП
Или я к вечеру уже отупел.


Magnus
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537645
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошу прошения
объясняю я неочень...
но на самом деле, очень сложно понять чужую программу и причину, почему не работает если не видеть всех тонкостей, а мне трудно понять что именно нужно показать Вам, что все стало ясно и мне все время кажется что мы ходим вокруг
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537681
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не буду мучить, вопрос снимается
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537744
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спокойствие, только спокойствие.
Без паники, разберемся. По крайней мере постараемся.
Начнем все сначала только медленно и четко.


Magnus
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #32537761
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря, тоже ничего не понял.Так что Магнус, ты не одинок :)
Особенно не понял, для чего откатывать транзакцию дважды. Сначала в тригере, а потом через рекордсет.
Вспоминается старый анекдот про еврея на нудистком пляже."Рабинович или снимите крест, или оденьте трусы"
...
Рейтинг: 0 / 0
Проблема с рекордсетом
    #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
35 сообщений из 35, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с рекордсетом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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