powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
25 сообщений из 52, страница 1 из 3
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343845
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долгая предыстория.

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

Просто использовать событие Form_Delete не могу:
1. Во-первых удаление еще не произошло
2. Во-вторых оно может и не произойти - если удаляются несколько записей и пользователь нажмет "Нет" (при включенной опции "Подтверждение удаления записей")
3. В-третьих ни о какой транзакции нельзя и мечтать (патамушта Access 97)

Немного извращаюсь (упрощенный код):
Код: plaintext
1.
2.
3.
4.
Private Sub Form_Delete(Cancel As Integer)
    Cancel = True
    CurrentDb.Execute  "Delete * From [БазоваяТаблица] Where ID="  & Me!ID, dbFailOnError
    ' делаю что-то еще
End Sub

Все хорошо, за одним НО: в форме остается запись "#Удалено#"
Requery в FormDelete не всунешь ("Операция не поддерживается в транзакции", причем транзакция - на моя, а скрытая аксесовксая). От безысходности всунул Requery в Current, т.е.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Form_Delete(Cancel As Integer)
    Cancel = True
    CurrentDb.Execute  "Delete * From [БазоваяТаблица] Where ID="  & Me!ID, dbFailOnError
    ' делаю что-то еще
    mblnDeleting = True
End Sub

Private Sub Form_Current()
    If mblnDeleting Then Me.Requery
    mblnDeleting = False
End Sub

Уже лучше, но Requery не срабатывает при удалении последней записи, да еще какое-то странное моргание происходит. И текущая запись слетает (текущей становится первая).
Решил, что надо от всего этого избавиться.
Конец предыстории.

Чесал репу. Долго думал. Сделал совсем извратно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub Form_Delete(Cancel As Integer)
    Cancel = True
    Dim rstClone As Recordset
    Set rstClone = Me.RecordsetClone
    rstClone.Bookmark = Me.Bookmark
    rstClone.Delete
    ' !!!!!!!!!!!!!!!!!!!!'
    On Error Resume Next
    rstClone.Delete
    On Error GoTo  0 
    ' !!!!!!!!!!!!!!!!!!!!'
    
    ' делаю что-то еще '
End Sub

Работает как часы. Удаленная запись из формы исчезает, текущая запись не портится, в общем все прекрасно. ГДЕ ЗАСАДА???
И почему это только при втором вызове Delete? Если только один Delete - то запись удаляется, "#Удалено#" остается (чего и следовало ожидать). Второй (хоть и заканчивается с ошибкой) - запись исчезает без следа.

Сори за длинный пост, но уж больно страшно такие фишки в рабочую програму втыкать не посоветовавшись с мировым сообществом.
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343866
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
У меня, как всегда, нет окончательного ответа, но есть альтернативная идея. Делай так, как написал в предыстории, но только не в Current, а в таймере. И, наверно, запоминать Bookmark тоже понадобится.
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343901
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ЛП

Акес97 с SP2?
Я тут с МСДН нашел хрень (похожую /чуть-чуть/ на твою проблему)
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343921
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Саныч
Про таймер я помню. Но блин реквери по таймеру... ужас... некрасиво.
К тому же мигает оно как-то гораздо больше одного раза. Опять некрасиво.
Вот так и живу - одно решение кривое, другое - страшное.

2 Виктор Сенин
Угу. SP2
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343924
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Чтобы не мигало, сделай Echo Off. :^) Мне тебя учить?
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343928
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох, ЛП, аж в груди защемило.

В onDelete что-то делать - смерти подобно. Вспомни топик Лифчика кажется - он при этом открывал какую-то левую форму - и удаление не происходило. На таймер вешаться - тоже бесполезно, если сетка медленная, то таймер может и не отработаться: пользователь нажал удаление, пока программа обработки делита "чухается", он жмет еще одно удаление, и обработка первой записи по таймеру не происходит. Если только стек организовать какой-нибудь. Причем отмена удаления происходит не только в случае открытия формы. У меня бывает, что лишнюю строчку добавишь в обработку delet'a - запись вроде-бы удаляется, закрываешь/открываешь форму - а она тут как тут. Засада. И это на access XP SP 2 и Jet SP 7. Вообще тоска.

Если придумаешь супер-триггеры для DAO на удаление - положи сюда, пожалуйста - я тоже ими пользоваться буду :)
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343935
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Есть другое решение. НЕ ДЕЛАТЬ Cancel=True. Стирать все как в первом классе. А все проверки делать ДО стирания.

То есть: проверка, и если стирание отменено, то Cancel=True и все, иначе доверяем Аксессу стереть запись самому и "делаем что-то еще".
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343941
Erika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверно, я что-то не понимаю :)
А зачем вообще в методе Form_Delete использовать насильственное удаление??

Подтверждение удаления пакета записей происходит в событии Form_BeforeDelConfirm ( перед Form_Delete ).
А в Form_Delete можно по каждой записи запросить подтверждение, если надо. Удалять запись - Cancel = True, не удалять - Cancel = False.

А потом, как это автор3. В-третьих ни о какой транзакции нельзя и мечтать (патамушта Access 97)
Зачем же так асс97 обижать? См.:
BeginTrans
CommitTrans
Rollback


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Form_Delete(Cancel As Integer)
   If MsgBox( "Удалить конкретную запись?" , vbOKCancel) = vbOK Then
	Cancel = False                  'Удаляем '
             BeginTrans 
                    ' делаю что-то еще '
             CommitTrans
   Else
           Cancel = True
   End If
End Sub
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343946
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гео предупреждалВ onDelete что-то делать - смерти подобно
Угугу. Только я формочек всяких не открываю, Msgbox'ов не выкидываю, и вообще только с рекордсетами работаю. Должно справиться.

Саныч предлагалА все проверки делать ДО стирания.
А мне надо после :(
И Cancel = True у меня только для того, чтобы удаление самому сделать. И, помимо удаления что-то еще в данных подправить.
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343948
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Erika
Выдели 10 записей и удали их таким образом.
Мало того что пользователь озвереет на кнопку Ок жать, там он еще в конце Отмену нажмет (когда сам аксес спросит "Не уверены ли вы что вы не хотите не удалять эти записи если да нажмите нет"). А ты все свои дела уже сделал...
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343951
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
авторА мне надо после :(
Не представляю, чтобы нельзя было добавить в алгоритм where id<>current.
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343952
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Erika
Мне транзакция нужна не сама по себе, а именно чтоб аксесовское удаление записи в нее попало. А оно, к сожалению, в скрытом аксесовском workspace'е происходит.
В 2000-м и выше можно с Me.Recordset поиграть, а в 97-м - нет.
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343953
Mihonin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот у меня на столе лежит книжка ACCESS 97, там есть описание как работают в нём транзакции...
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343955
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Саныч еще раз
Мне не надо отменять удаление.
Мне надо обеспечить увязать аксесовскую операцию (удаление записи) со своими. Обеспечить атомарность. Т.к. аксес и я работаем в разных workspace'ах, то приходится херить аксесовское удаление и делать свое (в моем workspace'е).

2 Mihonin
Ну вот, щас меня транзакциям будут учить
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343957
Erika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лох Позорный
Дык, MsgBox для примера приведен. Вместо него - вставляешь свою проверку, по результатам которой решаешь, Cancel = True или False. И все остальные свои "что-то еще" по результатам проверки.

По крайней мере, удалять в этом событии текущую запись ручками - это только если хочется поиметь массу проблем и нестабильность работы.
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343960
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Лох, а чтО это за такие проверки, которые надо делать обязательно после стирания? И почему так уж принципиально нельзя проделать их до?
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343962
Mihonin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Лох

>>3. В-третьих ни о какой транзакции нельзя и мечтать (патамушта Access 97)
Не надо мечтать, они там есть по заявлению Корнелюк, Веккер, Зиновьев (авторы той книги которая лежит)
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343964
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Erica & Саныч
Да не нужны мне проверки. Ненужныыыыыы
Мне трииггггееерррр нууужжжееееннннн!!!!

2 Erica еще раз
Ну убери Msgbox, и что?
Я писалон еще в конце Отмену нажмет (когда сам аксес спросит "Не уверены ли вы что вы не хотите не удалять эти записи если да нажмите нет"). А ты все свои дела уже сделал...
С этим как бороться?
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343968
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А почему тогда ты не можешь доверить Аксессу стирать обычным образом?
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343972
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Патамушта он может и не стеереееееееть.... (постепенно проваливаясь по уши в какое-то г..)
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343982
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не получится триггер
на а97
проваливайся потихоньку в г....
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343983
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А если он не сотрет, то поставишь Cancel, и тогда не будет ни стирания, ни обработки. Что еще???
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343988
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч вопрошалА почему тогда ты не можешь доверить Аксессу стирать обычным образом?
А еще патамушта на событии Delete запись еще не удалена из базового набора, а после собственно удаления мне остается только таймер ловить.
Неужто действительно придется ID-шник удаляемой записи запоминать и самому себе говорить - "ЭТОЙ ЗАПИСИ НЕТ! НЕ ВЕРЬ ГЛАЗАМ СВОИМ!"
Так и придется видимо... (выныривая из какого-то г..)
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343993
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Хам
Спасибо на добром слове.

2 Саныч
А если он не сотрет, то поставишь Cancel
Да где ж я его поставлю?
Все Form_Delete уже отработали, вся работа сделана, пришло BeforeDelConfirm, AfterDelConfirm не пришло (юзер отмену нажал). Что, опять таймер?
...
Рейтинг: 0 / 0
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
    #32343997
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
авторА еще патамушта на событии Delete запись еще не удалена из базового набора
Ну так и хорошо. Самое время проделать всю обработку.
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 1 из 3
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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