Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2013, 12:06   #1
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
Вопрос Как в Dataset сделать внутренний Delete без запуска SQL ?

Здравствуйте,
есть некий Dataset FIBplus, в нём указан код DeleteSQL который нормально работает. Но в ряде случаев нужно удалить строки только внутри Dataset НЕ запуская DeleteSQL код (не обращаясь к БД)! Можно ли как-то это сделать?
DeveloPerchik вне форума Ответить с цитированием
Старый 20.03.2013, 16:28   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

Попробую уточнить (прояснить) задачу.
Цитата:
есть некий Dataset FIBplus, в нём указан код DeleteSQL который нормально работает
Есть DataSet (FibPlus) и связаная с ним таблица (DBgrid).
Записи из таблицы и набора можно удалять (кодом deleteSQL) здесь проблем нет.
Цитата:
Но в ряде случаев нужно удалить строки только внутри Dataset
Но хотелось бы чтобы некоторые записи можно было бы скрывать (не показывать в таблице DBgrid) не удаляя при этом их из БД.

Так?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 20.03.2013, 20:38   #3
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Но хотелось бы чтобы некоторые записи можно было бы скрывать (не показывать в таблице DBgrid) не удаляя при этом их из БД. Так?
...чтобы некоторые записи можно было бы УДАЛЯТЬ из Dataset (в том числе не показывать в таблице DBgrid) не удаляя при этом их из БД.

Возможно, подошло бы и "скрывать", но я использую cxGrid где свой DataController, в итоге "скрытие записей в Dataset" может повлечь какие-то "скрытые" баги...
DeveloPerchik вне форума Ответить с цитированием
Старый 21.03.2013, 09:35   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

вариант выбирать с БД только нужные (select ... where ...)?

любой контроллер работает с тем что ему предоставили,если запись скрыли (т.е. не проинформировали о ее наличии) то как он ее увидит. Тем более если он ничего не знает о FIB, и пользуется исключительно интерфейсом TDataSet.
Надеюсь теперь мы узнаем каким именно компонентом FIB вы пользуетесь для получения данных. Узнали же мы о cxGrid.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 21.03.2013, 13:12   #5
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

Кстати... Здравствуйте, давно не виделись, как поживаете?

Цитата:
вариант выбирать с БД только нужные (select ... where ...)?
Это очевидно, но смысл задачи как раз в том, чтобы не делать лишних запросов в БД.

Раз уж Вы обратили внимание на мой вопрос, опишу задачу подробнее... Интерфейс: окно с огромной таблицей, внизу кнопка "Удалить". Код: Таблица cxGrid получает данные из FIBplus Dataset который получает данные из сложной ХП из БД связывающей порядка 10таблиц в результате чего KeyField=xID. Когда юзер нажимает кнопку "Удалить" ему задаётся вопрос: вы хотите удалить по методу "а" или методу "б"? Удаление возможно двух типов: а) удаление строки по xID из основной для отображаемой таблицы xTable - это удаление делает Dataset.DeleteSQL; б) возможно удаление по другому yID (есть в полученных данных) которое требует сложного кросс-удаления из множества всех 10таблиц для чего используется отдельная ХП в БД.

То есть в случае удаления типа "б" удаление происходит скрыто от Dataset из-за чего строка(и) которые уже удалены из БД всё ещё присутствуют в Dataset и отображаются в связанной таблице cxGrid. Так вот вопрос в том - как удалить из Dataset уже неактуальные-несуществующие строки данных? Можно сделать тупо FullRefresh, но хотелось бы обойтись без дополнительных запросов к БД (без повторных сложных выборок)!

Последний раз редактировалось DeveloPerchik; 21.03.2013 в 13:38.
DeveloPerchik вне форума Ответить с цитированием
Старый 21.03.2013, 13:43   #6
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
удалить строки только внутри Dataset НЕ запуская DeleteSQL код (не обращаясь к БД)!
дальше первого поста не читал, как вариант - делать DataSet.Delete; НО не делать Commit\CommitRetaining для транзакции ...
в итоге ДатаСет изменится, но до БД это так и не дойдет
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 21.03.2013, 14:05   #7
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

Не катит, тк юзер может захотеть удалить часть данных по методу удаления "б", а часть по методу "а" - когда нужно сделать Commit.
Можно по варианту Yurk@ сделать два отдельных удаления для методов А и Б, а удаление Dataset.DeleteSQL использовать всегда без Commit... но как-то это не очень красиво.
Вообще я крайне удивлён, что в Dataset нет простой очевидной функции "удаления внутри Dataset" типа DeleteInternal или DeleteRecord... странно даже как-то... может всё же есть?
DeveloPerchik вне форума Ответить с цитированием
Старый 21.03.2013, 14:29   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вообще я крайне удивлён, что в Dataset нет простой очевидной функции "удаления внутри Dataset" типа DeleteInternal или DeleteRecord... странно даже как-то... может всё же есть?
Есть. Вам же про неё постом выше сказали!

НО! Если Вы хотите что-то удалять из базы, что-то из датасета, коммитить изменения датасета НЕЛЬЗЯ.
да и не нужно!

Хотя, как я могу говорить о том, что нужно, а что не нужно, если я вообще не понимаю суть Вашей гениальной задумки...
я знаю только два варианта подхода.
1-й. Удаляем запись средствами DataSet. изменения в базу подтверждаем (синхронизируем).
2-й. Удаление производится ручками (навесным кодом, через запрос Delete .. where . Чтобы в датасете это отразилось, нужно или после удаления записи переоткрыть датасет (обычно это долго), либо, удалить запись в датасете.)
я всегда пользовался вторым способом (ну, так исторически сложилось)...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2013, 14:47   #9
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
2-й. ... через запрос Delete .. where . Чтобы в датасете это отразилось, нужно или после удаления записи переоткрыть датасет (обычно это долго) ...
немножко поправлю. для случая с FIB+ есть еще DataSet.RefreshSQL; так вот если в этот самый рефреш забить код вида
Код:
SELECT * FROM tabl WHERE id = :id
при, например,
Код:
DataSet.SelectSQL.Text = 'SELECT * FROM tabl <тра-ля-ля> ORDER BY 1';
и после удаления записи вместо
Код:
DataSet.Close; 
DataSet.Open;
делать
Код:
DataSet.Refresh;
будет намноооооого быстрее и красивее
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 21.03.2013, 14:57   #10
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

Цитата:
2-й. Удаление производится ручками (навесным кодом, через запрос Delete .. where . Чтобы в датасете это отразилось, нужно ... удалить запись в датасете.)
я всегда пользовался вторым способом (ну, так исторически сложилось)...
Будьте любезны описать какие компоненты Вы для этого предпочитаете? Чем выполняете "Delete where" и конкретный код как удаляете строки в Dataset без синхронизации...
Цитата:
для случая с FIB+ есть еще DataSet.RefreshSQL;
...который если я правильно понимаю обновляет только одну текущую запись...
Цитата:
и после удаления записи вместо DataSet.Close; DataSet.Open;
делать DataSet.Refresh;
будет намноооооого быстрее и красивее
...при условии, что в SelectSQL выборка происходит из таблицы, а если из сложной ХП... мне кажется, что быстрее не будет, тк Dataset всё равно придётся эту ХП перезапускать...
DeveloPerchik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос: как сделать, чтобы приложение разработанное в Delphi, которое использует бд sql, без проблем работало на другом компьютере Gleg Общие вопросы Delphi 2 15.12.2012 16:57
Как сделать чтобы Dataset без SQL считал себя не read-only ? delphicoding БД в Delphi 12 23.03.2012 22:22
Как скомпилить exe для запуска без прописи alias mrrcat Помощь студентам 3 28.06.2010 05:25
Удаление строки с помощью SQL запроса (Query1.SQL.ADD('Delete....')) Schutze Помощь студентам 6 29.11.2009 22:15