|
|
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
Долгая предыстория. Делаю я тут "триггер для бедных" - надо отследить удаление записи в форме и сделать еще несколько действий, желательно в транзакции. Просто использовать событие Form_Delete не могу: 1. Во-первых удаление еще не произошло 2. Во-вторых оно может и не произойти - если удаляются несколько записей и пользователь нажмет "Нет" (при включенной опции "Подтверждение удаления записей") 3. В-третьих ни о какой транзакции нельзя и мечтать (патамушта Access 97) Немного извращаюсь (упрощенный код): Код: plaintext 1. 2. 3. 4. Все хорошо, за одним НО: в форме остается запись "#Удалено#" Requery в FormDelete не всунешь ("Операция не поддерживается в транзакции", причем транзакция - на моя, а скрытая аксесовксая). От безысходности всунул Requery в Current, т.е. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Уже лучше, но Requery не срабатывает при удалении последней записи, да еще какое-то странное моргание происходит. И текущая запись слетает (текущей становится первая). Решил, что надо от всего этого избавиться. Конец предыстории. Чесал репу. Долго думал. Сделал совсем извратно. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Работает как часы. Удаленная запись из формы исчезает, текущая запись не портится, в общем все прекрасно. ГДЕ ЗАСАДА??? И почему это только при втором вызове Delete? Если только один Delete - то запись удаляется, "#Удалено#" остается (чего и следовало ожидать). Второй (хоть и заканчивается с ошибкой) - запись исчезает без следа. Сори за длинный пост, но уж больно страшно такие фишки в рабочую програму втыкать не посоветовавшись с мировым сообществом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 16:28 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
У меня, как всегда, нет окончательного ответа, но есть альтернативная идея. Делай так, как написал в предыстории, но только не в Current, а в таймере. И, наверно, запоминать Bookmark тоже понадобится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 16:39 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
2ЛП Акес97 с SP2? Я тут с МСДН нашел хрень (похожую /чуть-чуть/ на твою проблему) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 16:57 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
2 Саныч Про таймер я помню. Но блин реквери по таймеру... ужас... некрасиво. К тому же мигает оно как-то гораздо больше одного раза. Опять некрасиво. Вот так и живу - одно решение кривое, другое - страшное. 2 Виктор Сенин Угу. SP2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:07 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
Чтобы не мигало, сделай Echo Off. :^) Мне тебя учить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:09 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
Ох, ЛП, аж в груди защемило. В onDelete что-то делать - смерти подобно. Вспомни топик Лифчика кажется - он при этом открывал какую-то левую форму - и удаление не происходило. На таймер вешаться - тоже бесполезно, если сетка медленная, то таймер может и не отработаться: пользователь нажал удаление, пока программа обработки делита "чухается", он жмет еще одно удаление, и обработка первой записи по таймеру не происходит. Если только стек организовать какой-нибудь. Причем отмена удаления происходит не только в случае открытия формы. У меня бывает, что лишнюю строчку добавишь в обработку delet'a - запись вроде-бы удаляется, закрываешь/открываешь форму - а она тут как тут. Засада. И это на access XP SP 2 и Jet SP 7. Вообще тоска. Если придумаешь супер-триггеры для DAO на удаление - положи сюда, пожалуйста - я тоже ими пользоваться буду :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:11 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
Есть другое решение. НЕ ДЕЛАТЬ Cancel=True. Стирать все как в первом классе. А все проверки делать ДО стирания. То есть: проверка, и если стирание отменено, то Cancel=True и все, иначе доверяем Аксессу стереть запись самому и "делаем что-то еще". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:15 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
Наверно, я что-то не понимаю :) А зачем вообще в методе 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:17 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
Гео предупреждалВ onDelete что-то делать - смерти подобно Угугу. Только я формочек всяких не открываю, Msgbox'ов не выкидываю, и вообще только с рекордсетами работаю. Должно справиться. Саныч предлагалА все проверки делать ДО стирания. А мне надо после :( И Cancel = True у меня только для того, чтобы удаление самому сделать. И, помимо удаления что-то еще в данных подправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:20 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
2 Erika Выдели 10 записей и удали их таким образом. Мало того что пользователь озвереет на кнопку Ок жать, там он еще в конце Отмену нажмет (когда сам аксес спросит "Не уверены ли вы что вы не хотите не удалять эти записи если да нажмите нет"). А ты все свои дела уже сделал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:22 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
авторА мне надо после :( Не представляю, чтобы нельзя было добавить в алгоритм where id<>current. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:25 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
2 Erika Мне транзакция нужна не сама по себе, а именно чтоб аксесовское удаление записи в нее попало. А оно, к сожалению, в скрытом аксесовском workspace'е происходит. В 2000-м и выше можно с Me.Recordset поиграть, а в 97-м - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:25 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
Вот у меня на столе лежит книжка ACCESS 97, там есть описание как работают в нём транзакции... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:27 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
2 Саныч еще раз Мне не надо отменять удаление. Мне надо обеспечить увязать аксесовскую операцию (удаление записи) со своими. Обеспечить атомарность. Т.к. аксес и я работаем в разных workspace'ах, то приходится херить аксесовское удаление и делать свое (в моем workspace'е). 2 Mihonin Ну вот, щас меня транзакциям будут учить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:28 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
2 Лох Позорный Дык, MsgBox для примера приведен. Вместо него - вставляешь свою проверку, по результатам которой решаешь, Cancel = True или False. И все остальные свои "что-то еще" по результатам проверки. По крайней мере, удалять в этом событии текущую запись ручками - это только если хочется поиметь массу проблем и нестабильность работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:29 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
Лох, а чтО это за такие проверки, которые надо делать обязательно после стирания? И почему так уж принципиально нельзя проделать их до? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:31 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
2 Лох >>3. В-третьих ни о какой транзакции нельзя и мечтать (патамушта Access 97) Не надо мечтать, они там есть по заявлению Корнелюк, Веккер, Зиновьев (авторы той книги которая лежит) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:33 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
2 Erica & Саныч Да не нужны мне проверки. Ненужныыыыыы Мне трииггггееерррр нууужжжееееннннн!!!! 2 Erica еще раз Ну убери Msgbox, и что? Я писалон еще в конце Отмену нажмет (когда сам аксес спросит "Не уверены ли вы что вы не хотите не удалять эти записи если да нажмите нет"). А ты все свои дела уже сделал... С этим как бороться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:36 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
А почему тогда ты не можешь доверить Аксессу стирать обычным образом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:38 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
Патамушта он может и не стеереееееееть.... (постепенно проваливаясь по уши в какое-то г..) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:40 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
не получится триггер на а97 проваливайся потихоньку в г.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:43 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
А если он не сотрет, то поставишь Cancel, и тогда не будет ни стирания, ни обработки. Что еще??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:43 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
Саныч вопрошалА почему тогда ты не можешь доверить Аксессу стирать обычным образом? А еще патамушта на событии Delete запись еще не удалена из базового набора, а после собственно удаления мне остается только таймер ловить. Неужто действительно придется ID-шник удаляемой записи запоминать и самому себе говорить - "ЭТОЙ ЗАПИСИ НЕТ! НЕ ВЕРЬ ГЛАЗАМ СВОИМ!" Так и придется видимо... (выныривая из какого-то г..) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:45 |
|
||
|
Два раза подряд RecordsetClone.Delete - какая-то фича недокументированная
|
|||
|---|---|---|---|
|
#18+
2 Хам Спасибо на добром слове. 2 Саныч А если он не сотрет, то поставишь Cancel Да где ж я его поставлю? Все Form_Delete уже отработали, вся работа сделана, пришло BeforeDelConfirm, AfterDelConfirm не пришло (юзер отмену нажал). Что, опять таймер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 17:48 |
|
||
|
|

start [/forum/topic.php?fid=45&fpage=1710&tid=1677803]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 384ms |

| 0 / 0 |
