|
|
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Добрый день. Подскажите пожалуйста, это действительно так и есть, либо у меня представление не правильно построено, либо я чего-то не понимаю. Есть таблица и на ее базе - обновляемое представление. 1. Устанавливаю 5-ю буферизацию и на таблицу и на представление. 2. Добаляю запись в представление. 3. Tableupdate представления. 4. Удаляю добавленную запись. 5. Tableupdate представления. 6. Tableupdate таблицы. После всех этих действий добавленная (и затем удаленная запись) остается в таблице. Если же делать между (3) и (4) Tableupdate таблицы, то все нормально. Но это меня никак не устраивает. Заранее спасибо за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2005, 13:19:02 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Ну, давай по шагам k_sv Есть таблица и на ее базе - обновляемое представление. 1. Устанавливаю 5-ю буферизацию и на таблицу и на представление. 2. Добаляю запись в представление. 3. Tableupdate представления. Вот в этот момент в буфере представления ничего нет . Новая запись была успешно сброшена из буфера. Другой вопрос, куда она попала? А попала она в другой буфер. Исходной таблицы. Хотя в саму таблицу пока не попала. k_sv4. Удаляю добавленную запись. Я так понимаю, что удаляешь из представления. Тогда важное уточнение. Ты удалешь уже не новую запись, а реально существующую запись с точки зрения представления. Ведь до команды удаления произошел сброс буфера. Т.е. представление уже не знает, что эта запись "новая". Оно вполне справеливо считает, что это некая существующая запись. k_sv5. Tableupdate представления. Т.е. происходит обычная модификация ранее существовавшей записи. На всякий случай напоминаю, что "удаление" в данном случае, это всего-лишь установка метки, т.е. некая модификация записи. В результате, метка об удалении попадает в буфер исходной таблицы. k_sv6. Tableupdate таблицы. Перед этой командой имеем в буфере исходной таблицы новую запись, помеченную как удаленная. k_svПосле всех этих действий добавленная (и затем удаленная запись) остается в таблице. Правильно. Из буфера исходной таблицы ВСЕ модификации попадают в саму исходную таблицу. Даже такие "фиктивные" как удаление только что созданной записи. k_svЕсли же делать между (3) и (4) Tableupdate таблицы, то все нормально. Не понял, что именно "нормально"? В описанном сценарии ничего не изменится. В итоговую таблицу все-равно попадет новая удаленная запись. Если необходимо, чтобы новая запись, которая тут же была удалена не попала в исходную таблицу, то удаление надо делать непосредственно в представлении ДО сброса буфера. Т.е. исключить пункт (3). Поскольку представление - это не сама исходная таблица, а отдельная, независимая копия, то подобные записи просто не сбрасываются в исходную таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2005, 16:45:13 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо, ВладимирМ, за разъяснения! Убрала пункт 3 и все работает нормально. Почему-то раньше мне казалось, что без него не обойтись. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2005, 20:50:24 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Hi k_sv! Дополнительно буферизовать саму таблицу ОБЫЧНО не нужно - это лишний шаг и пользы он не приносит, хотя есть конечно исключения... А вот затрудняет программирование он существенно. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2005, 23:54:27 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Короче, приехали. Но начнем с начала. Буферизацию таблицы и представления я делаю для того, чтобы получить 2 соответствующих селекта (на начальные данные и измененные). И в зависимости от этих результатов и данных другой таблицы разрешаю или запрещаю сохранение. Но насколько я понимаю, селект отбирает данные из таблицы (или представления), а не из буфера. Получается такая картина: 1. либо мне надо вытаскивать данные из буфера представления во временную таблицу (сомневаюсь, что это возможно); 2. либо опять же обновлять представление (выполять свой 3-ий пункт!!!), делать селект. И если сохранение невозможно с такими данными, возвращаю назад в форму. Пользователь удаляет добавленную в этом сеансе буферизации таблицы запись... И возвращаемся к тому, с чего начали - удаленная запись попадает в таблицу. И что же мне делать? Использовать 2-ой выриант и руками убивать в таблице запись, помеченную на удаление в представлении? Может, еще что-нибудь посоветуете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2005, 01:48:17 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
k_svНо начнем с начала. Штирлиц: Вот с этого и надо было начинать! Мюллер: Мне лучше знать, с чего начинать! k_svБуферизацию таблицы и представления я делаю для того, чтобы получить 2 соответствующих селекта (на начальные данные и измененные). И в зависимости от этих результатов и данных другой таблицы разрешаю или запрещаю сохранение. Не совсем ясно, почему нужны именно запросы и почему именно в буфере, а не в триггере. Может, опишещь задачу более подробно? k_svНо насколько я понимаю, селект отбирает данные из таблицы (или представления), а не из буфера. Да. Хотя в VFP9 появилась возможность делать запрос с учетом буфера. k_svПолучается такая картина: 1. либо мне надо вытаскивать данные из буфера представления во временную таблицу (сомневаюсь, что это возможно); Можно. Только не запросом, а в цикле (прямой перебор записей), используя функции GetNextModified() GetFldState() k_sv2. либо опять же обновлять представление (выполять свой 3-ий пункт!!!), делать селект. А как это поможет? Ведь сброс произойдет не в исходную таблицу, а в ее буфер. Т.е. Select-SQL опять ничего не увидит. В исходную таблицу ведь ничего еще не попало. k_svИ что же мне делать? Возможно я не понимаю задачу. Слишком мало информации. Но почему нельзя перенести всю эту проверку в триггер на INSERT и UPDATE таблицы? Триггер срабатывает в момент попытки сброса изменений в исходную таблицу. Если вернул .F., то будет TableUpdate()=.F. Никакого дополнительного буфера на исходную таблицу вообще не нужно. Просто не сброситься ничего. Только следует иметь в виду, что триггер срабатывает для каждой обновляемой записи отдельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2005, 22:36:42 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Hi k_sv! Присоединяюсь к Владимиру - опиши подробно ЗАДАЧУ - т.е. ЧТО нужно получить в итоге, а не те ухищрения, которые как ты думаешь тебе помогут. Вообще никакой проблемы с "добавленными а потом удалёнными" записями НЕТУ - просто их не нужно сохранять из буфера представления и всё! Это если конечно проблема именно в этом была... Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2005, 22:16:12 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Уважаемые ВладимирМ и Igor Korolyov, огромное спасибо вам за поддержку и желание помочь. Просто сейчас навалились другие проблемы. Не до работы пока. Я уже поняла, что со своим путанным мышлением и нехваткой знаний перемудрила слегка. ;) Когда попаду на работу, уточню некоторые моменты в постановке, а потом вам выложу. Чего же лишний раз занятых людей отвлекать? Еще раз спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2005, 01:44:18 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Пока Игорь Королев не делал вечерний обход форума, спешу задать вопрос. Подскажите пожалуйста, что лучше использовать (триггер или правило) в ситуации, когда поле не должно быть меньше 0? Как-то не дородилось пользвоваться ни первым, ни вторым. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2005, 22:45:50 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
k_svПока Игорь Королев не делал вечерний обход форума, спешу задать вопрос. Опоздала, обход уже был совершен k_svПодскажите пожалуйста, что лучше использовать (триггер или правило) в ситуации, когда поле не должно быть меньше 0? На такой вопрос трудно дать однозначный ответ. Нужно знать при каких условиях осуществляется ввод значения. В общем случае. Если ввод осуществляется интерактивно (самим пользователем), то RULE использовать нельзя. Эффект его использования сопоставим с запретом выхода из TextBox.Valid(). Слишком жесткое ограничение. Триггер в этом случае - более разумное решение. Если ввод осуществялется программно (речь идет о служебном поле, недоступном для прямого редактирования пользователем), то тут возможны варианты. Лично мне представляется, что RULE - это перестраховка. Т.е. это контроль исключительной (чрезвычайно редкой) ситуации. При этом неявно предполагается, что пользователь знает какое значение является корректным и может легко исправить ошибочное значение на правильное. Если же определение корректного значения - это достаточно сложная задача, то вешать контроль на RULE - неразумно. Чтобы определить, какое же значение корректное, надо выйти из поля, а выйти из поля не дает RULE. Замкнутый круг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 09:43:11 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Небольшое добавление, правило поля, как и правило записи - имеет возможность возвращать сообщение об ошибке, и в принципе при интерактивном вводе есть возможность указать на ошибку оператора. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. в остальном согласен с ВладимирМ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 10:27:19 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо за разъяснения. Убедили. Предыдущий вопрос теперь значительно упрощается и временно откладывается. Ухожу в отпуск. Но думаю, после отпуска он будет звучать совсем по-другому. :) Просто это в заказе вводились материалы (и пользовали требовали разрешить ввод одного материала несколько раз для одного заказа). Хотелось сделать запрет ввода материала, если его недостаточное количество на складе. У меня еще такой вопрос. Если вам не очень обременительно, то подскажите, как правильно должен быть написан такой код удаления в сетевой версии? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Заранее благодарна. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 18:59:21 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Hi k_sv! > BEGIN TRANSACTION > ThisForm.GrdLook_zak.SetFocus Не нужно, даже скорее вредно в этом месте - лучше увести фокус на контрол НЕ привязанный к данным над которыми идёт работа... > delete from mater where mater.id_zak=look_zak.id_zak > delete from job_zak where job_zak.id_zak=look_zak.id_zak > Delete > if !(tableupdate(.f.,.t.,'look_zak') and tableupdate(.t.,.t.,'mater') ; > and tableupdate(.t.,.t.,'job_zak')) > ROLLBACK > endif > ENDTRANSACTION Неправильно - при ТАКОМ размещении команд, если произойдёт ошибка сохранения, то будет попытка выполнить И ROLLBACK И ENDTRANSACTION - это недопустимо, должна даваться только ОДНА из этих команд - либо откат, либо подтверждение. Так что в ELSE ветку его! Кроме того обычно тут стоят всякие проверки - ЧТО несохранилось, ПОЧЕМУ и т.п. т.е. таким "скопом" и без анализа AERROR() лучше не делать... В общем случае есть смысл сохранять данные ВСЕХ таблиц построчно (чтобы чётко видеть какая запись и почему дала ошибку сохранения) - подробнее эта тема обсуждается на forum.foxclub.ru > Таблицы в БД не связаны, поэтому делаю все руками. IMHO это как раз тот случай, когда стоит подумать о триггерах обеспечения ссылочной целостности... В принципе их можно написать руками и тогда наличие "связей" между таблицами в DBC не потребуется. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2005, 23:18:38 |
|
||
|
удаление при буферизации
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ, Igor Korolyov. Насчет ROLLBACK ( в else) это все-таки моя опечатка (так сказать). Обычно я так и делаю. Меня интересовали проверки выполнения команд delete из других таблиц. Если не сложно, приведите пример такого триггера, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2005, 11:55:29 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33239916&tid=1593581]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
190ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 201ms |
| total: | 491ms |

| 0 / 0 |
