Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > как удалить запись при помощи DeleteSQL?


Автор: ksili 11.7.2006, 05:24
Использую компоненты TFIBPlus. У компонента TFIBDataSet есть свойства SelectSQL, InsertSQL, UpdateSQL, DeleteSQL, RefreshSQL. Как делать выборку используя SelectSQL разобрался (деактивируем датасет, заполняем SelectSQL, активируем датасет). А вот удалить не получается. Ни в одном хелпе или руководстве не сказано как связаны эти свойства. Куча вопросов:
1) должно ли при активации датасета быть заполнено только одно из SQL-свойств?
2) если можно  заполнять одновременно несколько, то в каком порядке они выполняются при открытии датасета?
3) Нужно ли явно запускать транзакцию? И когда это делать - до или после закрытия датасета, до или после заполнения DeleteSQL?

У меня вообще такая задача: на форме DBGrid, в нём отображена таблица (вся кроме одного поля). Соответственно есть FIBDatabase, FIBDataSet, FIBTransaction и DataSource. Всё уже настроено как надо. Рядом с таблицей кнопка, по нажатию на которой из базы должна удалиться выбранная в таблице запись (DBGrid тоже должен обновиться). По-разному пробовал, получается или ошибка (действие над пустым набором), или ничего не удаляется и DBGrid без изменений, или ничего не удаляется и DBGrid в результате пустой. 

Автор: Alex 11.7.2006, 07:45
Цитата(ksili @  11.7.2006,  06:24 Найти цитируемый пост)
Ни в одном хелпе или руководстве не сказано как связаны эти свойства.

Уж сказать, что об FIB+ ничего не написано, это поклеп чистой воды...
Читайте http://www.devrace.com/files/files/fibplus_dg_6_4.zip (FIBPlus 6.4 Developers Guide.pdf 19 страница) 

Автор: ksili 11.7.2006, 08:52
Цитата(Alex @  11.7.2006,  07:45 Найти цитируемый пост)
Читайте http://www.devrace.com/files/files/fibplus_dg_6_4.zip (FIBPlus 6.4 Developers Guide.pdf 19 страница) 

У меня FIBPlus 6.3 Developers Guide.pdf. Но насколько я понял вы имели в виду параграф Автоматическая генерация обновляющих запросов. Так вот во-первых там нет ответа ни на один мой вопрос, во-вторых там рассказано не как использовать свойства InsertSQL, UpdateSQL, DeleteSQL, RefreshSQL, а как наоборот их не использовать.

А в стандартном хелпе к FIBPlus 6 написано следующее:
Код

Sets or gets an SQL operator for deleting current record.

__property Classes::TStrings *DeleteSQL={ read=GetDeleteSQL, write=SetDeleteSQL } 

Description

Use DeleteSQL to set or get a query that will allow deleting current record.


не густо 

Автор: Fazil6 11.7.2006, 09:30
Цитата

1) должно ли при активации датасета быть заполнено только одно из SQL-свойств?

свойства, которые не заполнены естественно работать не будут
Цитата

2) если можно  заполнять одновременно несколько, то в каком порядке они выполняются при открытии датасета?

При открытии выполняется только свойство SelectSQL.

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

3) Нужно ли явно запускать транзакцию? 

в общем случае да.
Цитата

И когда это делать - до или после закрытия датасета, до или после заполнения DeleteSQL?

До открытия. При завершении транзакции датасеты этой транзакции закрываются.


Цитата

Use DeleteSQL to set or get a query that will allow deleting current record.

а что еще нужно? Пиши запрос для удаления записи и При вызове Delete у датасета будет выполняться этот твой запрос  

Автор: Alex 11.7.2006, 09:36
ksili, Если сказать вам честно, то у вас в голове полная каша. Вы выдаете совершенно беспорядочный набор слов не понимая, что и как...

Придется рассказывать идеологию FIB+, DataSet'ов и за одно транзакций.
1. Если брать идеологию транзакций, то вы не можете сделать НИ ОДНОГО действа с базой не в рамках какой либо транзакции, это означает что выборка, вставка, изменение или удаление в любом случаи выполняются в рамках транзакции, которую после выполняемых действий можно либо подтвердить (все изменения будут приняты БД), либо отменить (все, что было сделано в рамках текущей транзакции)
Современные компоненты доступа обычно сами стартуют транзакцию, которая задана в их свойствах, если этого еще не сделано (но это всегда регулируется настройками компонентов)
2. DataSet можно назвать совокупностью 4-х более элементарных и проще для понимания Query. У Query есть только одно свойство SQL и оно выполняется либо при вызове метода Open (Select), либо ExecSql (Insert, Update, Delete). DataSet объединяет 4 Query в один компонент, который может выполнять Select, Insert, Update и Delete. Задание этих свойств в классической реализации DataSet'а возможно только когда Active:= False. Эти свойства должны содержать Sql опператоры выборки, вставки, изменения и удаления. Если к DataSet'у подключить DbGrid, то в самом примитивном случаи этого достаточно, что бы через грид можно было просматривать данные выборки, добавлять, изменять или удалять их.
3. Теперь самое главное идеология FIB+. Авторы этих компонентов после многих лет разработки программ на собственном опыте убедились, что: Хорошо бы иметь не одну транзакцию в рамках которых будут выполняться команды (читай документацию очень все прозрачно написано), в 80% случаях запросы добавления, изменения, удаления можно построить по запросу выборки (об этом тебе и рассказывали с упоением на 19 странице документации). Признаюсь честно за два года использования FIB+ я не помню случая когда бы мне  пришлось изменять сгенерированный им запрос на удаление (хотя DataSet'oв за это время было создано под 1000). Но не устраивает вас по каким-то причинам автоматическая генерация ради бога заполняйте сами свойства Sql запросами и все вам сделают. Но и даже этот процесс заполнения можно упростить: открываете редактор свойств SQL DataSet'а, задаете запрос на выборку, переходите на закладку "Generate Modify Sqls", на которой есть кнопка "Generate SQLs", после нажатия, на которую вам сгенерируют запросы, которые в случаи необходимости вам будет достаточно только подправить.

PS:
Сходите на сайт разработчиков там есть примеры использования, настоятельно советую прочитать всю документацию.  

Автор: ksili 11.7.2006, 11:01
Большое спасибо всем. Теперь я начинаю догонять. Пойду доваривать кашу в голове 

Автор: Alex 11.7.2006, 11:40
 smile  

Автор: Akella 18.7.2006, 16:49
Попробуй использовать
FibDataSet.GeterateSQLs;

Добавлено @ 16:51 
Код

Var
  dstDS:TpFIBDataSet;
  TableName := String;
...

    dstDS:=TpFIBDataSet.Create(fmUpdateInfo);
    dstDS.Name := TableName;
    dstDS.Database := DM.fibDB;
    dstDS.AutoCommit := True;
    dstDS.SelectSQL.Add('SELECT * FROM '+ AnsiUpperCase(TableName));
    dstDS.AutoUpdateOptions.UpdateTableName := AnsiUpperCase(TableName);
    dstDS.AllowedUpdateKinds := dstDS.AllowedUpdateKinds + [ukModify,ukInsert];
    dstDS.GenerateSQLs;
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)