Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / удаление при буферизации / 14 сообщений из 14, страница 1 из 1
27.08.2005, 13:19:02
    #33237308
k_sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Добрый день.
Подскажите пожалуйста, это действительно так и есть, либо у меня представление не правильно построено, либо я чего-то не понимаю.
Есть таблица и на ее базе - обновляемое представление.
1. Устанавливаю 5-ю буферизацию и на таблицу и на представление.
2. Добаляю запись в представление.
3. Tableupdate представления.
4. Удаляю добавленную запись.
5. Tableupdate представления.
6. Tableupdate таблицы.
После всех этих действий добавленная (и затем удаленная запись) остается в таблице.
Если же делать между (3) и (4) Tableupdate таблицы, то все нормально. Но это меня никак не устраивает.
Заранее спасибо за ответы.
...
Рейтинг: 0 / 0
27.08.2005, 16:45:13
    #33237400
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Ну, давай по шагам
k_sv
Есть таблица и на ее базе - обновляемое представление.
1. Устанавливаю 5-ю буферизацию и на таблицу и на представление.
2. Добаляю запись в представление.
3. Tableupdate представления.
Вот в этот момент в буфере представления ничего нет . Новая запись была успешно сброшена из буфера. Другой вопрос, куда она попала? А попала она в другой буфер. Исходной таблицы. Хотя в саму таблицу пока не попала.

k_sv4. Удаляю добавленную запись.
Я так понимаю, что удаляешь из представления. Тогда важное уточнение. Ты удалешь уже не новую запись, а реально существующую запись с точки зрения представления. Ведь до команды удаления произошел сброс буфера. Т.е. представление уже не знает, что эта запись "новая". Оно вполне справеливо считает, что это некая существующая запись.

k_sv5. Tableupdate представления.
Т.е. происходит обычная модификация ранее существовавшей записи. На всякий случай напоминаю, что "удаление" в данном случае, это всего-лишь установка метки, т.е. некая модификация записи.

В результате, метка об удалении попадает в буфер исходной таблицы.

k_sv6. Tableupdate таблицы.
Перед этой командой имеем в буфере исходной таблицы новую запись, помеченную как удаленная.

k_svПосле всех этих действий добавленная (и затем удаленная запись) остается в таблице.
Правильно. Из буфера исходной таблицы ВСЕ модификации попадают в саму исходную таблицу. Даже такие "фиктивные" как удаление только что созданной записи.

k_svЕсли же делать между (3) и (4) Tableupdate таблицы, то все нормально.
Не понял, что именно "нормально"? В описанном сценарии ничего не изменится. В итоговую таблицу все-равно попадет новая удаленная запись.

Если необходимо, чтобы новая запись, которая тут же была удалена не попала в исходную таблицу, то удаление надо делать непосредственно в представлении ДО сброса буфера. Т.е. исключить пункт (3).

Поскольку представление - это не сама исходная таблица, а отдельная, независимая копия, то подобные записи просто не сбрасываются в исходную таблицу.
...
Рейтинг: 0 / 0
27.08.2005, 20:50:24
    #33237489
k_sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Огромное спасибо, ВладимирМ, за разъяснения!
Убрала пункт 3 и все работает нормально. Почему-то раньше мне казалось, что без него не обойтись. :)
...
Рейтинг: 0 / 0
27.08.2005, 23:54:27
    #33237546
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Hi k_sv!

Дополнительно буферизовать саму таблицу ОБЫЧНО не нужно - это лишний шаг и
пользы он не приносит, хотя есть конечно исключения... А вот затрудняет
программирование он существенно.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
28.08.2005, 01:48:17
    #33237573
k_sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Короче, приехали.

Но начнем с начала. Буферизацию таблицы и представления я делаю для того, чтобы получить 2 соответствующих селекта (на начальные данные и измененные). И в зависимости от этих результатов и данных другой таблицы разрешаю или запрещаю сохранение. Но насколько я понимаю, селект отбирает данные из таблицы (или представления), а не из буфера.
Получается такая картина:
1. либо мне надо вытаскивать данные из буфера представления во временную таблицу (сомневаюсь, что это возможно);
2. либо опять же обновлять представление (выполять свой 3-ий пункт!!!), делать селект. И если сохранение невозможно с такими данными, возвращаю назад в форму. Пользователь удаляет добавленную в этом сеансе буферизации таблицы запись... И возвращаемся к тому, с чего начали - удаленная запись попадает в таблицу.
И что же мне делать? Использовать 2-ой выриант и руками убивать в таблице запись, помеченную на удаление в представлении?
Может, еще что-нибудь посоветуете?
...
Рейтинг: 0 / 0
28.08.2005, 22:36:42
    #33237882
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
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. Никакого дополнительного буфера на исходную таблицу вообще не нужно. Просто не сброситься ничего. Только следует иметь в виду, что триггер срабатывает для каждой обновляемой записи отдельно.
...
Рейтинг: 0 / 0
29.08.2005, 22:16:12
    #33239916
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Hi k_sv!

Присоединяюсь к Владимиру - опиши подробно ЗАДАЧУ - т.е. ЧТО нужно получить
в итоге, а не те ухищрения, которые как ты думаешь тебе помогут.
Вообще никакой проблемы с "добавленными а потом удалёнными" записями НЕТУ -
просто их не нужно сохранять из буфера представления и всё! Это если конечно
проблема именно в этом была...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
30.08.2005, 01:44:18
    #33240000
k_sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Уважаемые ВладимирМ и Igor Korolyov, огромное спасибо вам за поддержку и желание помочь. Просто сейчас навалились другие проблемы. Не до работы пока.

Я уже поняла, что со своим путанным мышлением и нехваткой знаний перемудрила слегка. ;)

Когда попаду на работу, уточню некоторые моменты в постановке, а потом вам выложу. Чего же лишний раз занятых людей отвлекать?
Еще раз спасибо.
...
Рейтинг: 0 / 0
30.08.2005, 22:45:50
    #33242257
k_sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Пока Игорь Королев не делал вечерний обход форума, спешу задать вопрос.
Подскажите пожалуйста, что лучше использовать (триггер или правило) в ситуации, когда поле не должно быть меньше 0?
Как-то не дородилось пользвоваться ни первым, ни вторым. :(
...
Рейтинг: 0 / 0
31.08.2005, 09:43:11
    #33242547
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
k_svПока Игорь Королев не делал вечерний обход форума, спешу задать вопрос.
Опоздала, обход уже был совершен

k_svПодскажите пожалуйста, что лучше использовать (триггер или правило) в ситуации, когда поле не должно быть меньше 0?
На такой вопрос трудно дать однозначный ответ. Нужно знать при каких условиях осуществляется ввод значения.

В общем случае.

Если ввод осуществляется интерактивно (самим пользователем), то RULE использовать нельзя. Эффект его использования сопоставим с запретом выхода из TextBox.Valid(). Слишком жесткое ограничение. Триггер в этом случае - более разумное решение.

Если ввод осуществялется программно (речь идет о служебном поле, недоступном для прямого редактирования пользователем), то тут возможны варианты.

Лично мне представляется, что RULE - это перестраховка. Т.е. это контроль исключительной (чрезвычайно редкой) ситуации. При этом неявно предполагается, что пользователь знает какое значение является корректным и может легко исправить ошибочное значение на правильное.

Если же определение корректного значения - это достаточно сложная задача, то вешать контроль на RULE - неразумно. Чтобы определить, какое же значение корректное, надо выйти из поля, а выйти из поля не дает RULE. Замкнутый круг.
...
Рейтинг: 0 / 0
31.08.2005, 10:27:19
    #33242676
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Небольшое добавление, правило поля, как и правило записи - имеет возможность возвращать сообщение об ошибке, и в принципе при интерактивном вводе есть возможность указать на ошибку оператора.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE CURSOR test (id i CHECK id >  0  ERROR ('Field value incorrect id = ' + TRANSFORM(ID)), name c( 20 ))

INSERT INTO test (id, name) VALUES ( 1 , 'First')

INSERT INTO test (id, name) VALUES ( 2 , 'Second')

BROWSE 

* изменим руками значение поля ID на  0 

в остальном согласен с ВладимирМ
...
Рейтинг: 0 / 0
31.08.2005, 18:59:21
    #33244424
k_sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Огромное спасибо за разъяснения.
Убедили.

Предыдущий вопрос теперь значительно упрощается и временно откладывается. Ухожу в отпуск. Но думаю, после отпуска он будет звучать совсем по-другому. :) Просто это в заказе вводились материалы (и пользовали требовали разрешить ввод одного материала несколько раз для одного заказа). Хотелось сделать запрет ввода материала, если его недостаточное количество на складе.

У меня еще такой вопрос. Если вам не очень обременительно, то подскажите, как правильно должен быть написан такой код удаления в сетевой версии?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Local m.Ret
 m.Ret = MessageBox('Хотите удалить данные о текущем заказе?', 36 ,'Предупреждение')
 If m.Ret =  6 
 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  
 requery('look_zak')
  ThisForm.GrdLook_zak.Refresh
  ThisForm.GrdLook_zak.SetFocus
 EndIf
Return
Таблицы в БД не связаны, поэтому делаю все руками.
Заранее благодарна. :)
...
Рейтинг: 0 / 0
31.08.2005, 23:18:38
    #33244625
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
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
...
Рейтинг: 0 / 0
01.09.2005, 11:55:29
    #33245498
k_sv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление при буферизации
Спасибо за ответ, Igor Korolyov. Насчет ROLLBACK ( в else) это все-таки моя опечатка (так сказать). Обычно я так и делаю. Меня интересовали проверки выполнения команд delete из других таблиц. Если не сложно, приведите пример такого триггера, пожалуйста.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / удаление при буферизации / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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