![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TIBDataSet - последовательность действий. [D7, IB/FB]
_Ламер_ © (2006-09-13 22:41:00)Привет
Сижу, изучаю сабж. В книжке написано про InsertSQL ....RefreshSQL типа Tstrings. Это понятно. Есть также свойство StatementType. Т.е. мне надо выполнить запрос на выборку каких-то записей. Что я делаю. Применяю метод Close. В SelectSQL пишу свой запрос, в StatementType пишу SQLSelect. Open.
Почему так сложно? В ADO просто, как два байта. Зачем применять метод Edit и запрос писать в ModifySQL? Неужели нельзя было сделать как в TADODataSEt? Может можно лёгким движением руки сделать одновременно вставку, выборку, модификацию, удаление и обновление данных?
Что делает RefreshSQL? Аналог @@identity? В книжке написано мол выполняется запрос сразу после модификации записей и что это очень удобно. А что мне мешает этот запрос написать отдельно? И надо ли мне оно?
Может IBSQL хватит сполна?
Виталий Панасенко (2006-09-14 12:09:00) [41]а по поводу первого поста автора вопроса
> Почему так сложно? В ADO просто, как два байта. Зачем применять
> метод Edit и запрос писать в ModifySQL? Неужели нельзя было
> сделать как в TADODataSEt? Может можно лёгким движением
> руки сделать одновременно вставку, выборку, модификацию,
> удаление и обновление данных?
Используя ModifySQL я могу написать что-то типа: в SelectSQL- "select f1, f2/100 as summa from table", в ModifySQL я пишу "update table set f1=:new_f1, f2=:new_f2*100 where key=:old_key"
на что ADODataSet скажет, что не может найти поле SUMMA
Виталий Панасенко (2006-09-14 12:04:00) [42]Вообще-то, ФИБы "доворотил" Сергей Бузаджи. Из под Одессы..:-). А глюки.. Где их нет ?
MsGuns (2006-09-14 11:39:00) [43]>Виталий Панасенко (14.09.06 11:32) [7]
Вы же сами и подтвержаете [6].
FIBPlus - это тот же IBX, но дополненный и "усовершенствованный" для ленивых и не особо стремящихся вникнуть в суть делаемого батонокидателей.
А глюки там есть, и немало. В чем тот же Ковязин честно признается в своем "Мире интербэйз".
Мне же они не понравились из-за отсутствие нормального хэлпа и существенного затруднения пошаговой отладки.
Sergey13 (2006-09-14 11:37:00) [44]> [6] MsGuns © (14.09.06 11:18)
> Все эти XXXSQL лишь имитируют "живое" редактирование. На
> самом деле TIBDataSet формирует запросы и посылает их на
> сервер, даже не подтвержая каждый раз транзакцию.
Это не совсем так. IBX позволяет это автоматизировать.
> Поэтому надо либо редактировать таблицы БД с помощью ХП,
> либо самостоятельно следить за подтверждением - откатом
> транзакций.
Можно подумать ХП избавляет от работы с транзакциями.
> "Автоматический" (с помощью одиночных запросов) режим правки
> сложных объектов, хранящихся в нескольких таблицах, запросто
> может привести к потере логической целостности данных.
Неграмотная работа с любым "режимом" позволяет достичь такого результата.
> Именно
> поэтому грамотнее организовывать подобное редактирование
> с помощью ХП, в параметры которой записываются данные, собранные
> из интерфейсных контролов, не связанных с каким-либо одним
> датасетом.
Не понимаю, как ХП (в данном контексте) может спасти отца русской демократии.
>
> И еще недостаток "гридного" редактирования таблиц : изменения,
> сделанные и подтвержденные конкурентами не будут Вами видны,
> пока не переоткроется весь датасет (никакой Refresh тут
> не поможет), точно также, как Вами собственные правки не
> увидят другие, пока у них не выполнится перечитка.
Это нормально!!! Мне не надо проверять десяток соседей по офису - я работаю со "своими" данными. Если мои данные вступают в противоречие с другими, то сервер просто не должен пропустить мои изменения.
Виталий Панасенко (2006-09-14 11:32:00) [45]
> И еще недостаток "гридного" редактирования таблиц : изменения,
> сделанные и подтвержденные конкурентами не будут Вами видны,
> пока не переоткроется весь датасет (никакой Refresh тут
> не поможет), точно также, как Вами собственные правки не
> увидят другие, пока у них не выполнится перечитка.
У FIBPlus есть FullRefresh(Хоть это и переоткрытие, но спрятанное + позиционируется на запись, которая была текущей пере обновлением)
MsGuns (2006-09-14 11:18:00) [46]>Виталий Панасенко (14.09.06 10:57) [3]
Все эти XXXSQL лишь имитируют "живое" редактирование. На самом деле TIBDataSet формирует запросы и посылает их на сервер, даже не подтвержая каждый раз транзакцию. В результате можно получить тот эффект, что и на локальных базах, когда после "слета" приложения все или часть изменений как бы теряются.
Поэтому надо либо редактировать таблицы БД с помощью ХП, либо самостоятельно следить за подтверждением - откатом транзакций.
"Автоматический" (с помощью одиночных запросов) режим правки сложных объектов, хранящихся в нескольких таблицах, запросто может привести к потере логической целостности данных. Именно поэтому грамотнее организовывать подобное редактирование с помощью ХП, в параметры которой записываются данные, собранные из интерфейсных контролов, не связанных с каким-либо одним датасетом.
И еще недостаток "гридного" редактирования таблиц: изменения, сделанные и подтвержденные конкурентами не будут Вами видны, пока не переоткроется весь датасет (никакой Refresh тут не поможет), точно также, как Вами собственные правки не увидят другие, пока у них не выполнится перечитка.
Непонимание этого механизма приводит к недоразумениям типа сабжевого и часто к разочарованию. Люди, пересевшие с самоката на автомобиль, с удивлением обнаруживают, что правила езды по трассам резко отличаются от привычных - по дворам и паркам. И часто не в лучшую сторону. В частности исчезает чувство свободы и самодостаточности ;)
Виталий Панасенко (2006-09-14 11:16:00) [47]Это я спросонья:-). IB/FB прочитал как FIBPlus..:-) Потому как с ними работаю. и не жалею ни разу
Sergey13 (2006-09-14 11:10:00) [48]> [3] Виталий Панасенко (14.09.06 10:57)
Тут вроде про IBX пишуть.
Виталий Панасенко (2006-09-14 10:57:00) [49]Вообще-то у ФИБОв можно выставить AutoUpdateOptions-AutoRewriteSqls и CanChangeSQL в True . тогда FIBDataSet будет автоматически формировать InsertSQL/UpdateSQL/RefreshSQL/DeleteSQL. Заполнить нужно только SelectSQL
MsGuns (2006-09-14 09:23:00) [50]>_Ламер_ (13.09.06 22:41)
>Почему так сложно? В ADO просто, как два байта. Зачем применять метод Edit и запрос писать в ModifySQL? Неужели нельзя было сделать как в TADODataSEt? Может можно лёгким движением руки сделать одновременно вставку, выборку, модификацию, удаление и обновление данных?
Не сложно, а непривычно по сравнению с локальными базами, работа с которыми построена по принципу "моя таблица - делаю с ней все, что хочу".
Клиент-сервер требует прежде всего перепрограммирования мозгов.
В ADO тоже далеко не так все просто. А кое-что (управление транзакциями) куда менее прозрачно, чем в том же ИБ.
И еще. Судя по сабжу, опыта написания многопользовательских приложений у Вас явно немного. Тем более полезно поработать с скл-сервером для получения необходимых навыков.
Что делает RefreshSQL?
Все методы Refresh в основном имеют цель визуализирования локальныхизменений в датасете и не имеют ничего общего с синхронизацией отображения БД между разными клиентами. Советую прочитать Вострикова с Ковязиным об основных принципах построения интерфейса клиент-серверных приложений.
kaif (2006-09-13 23:41:00) [51]1. Впиши свойство SelectSQL.
2. Затем вызови контектсное меню, щелкнув на компоненте правой кнопкой мыши. Выбери пункт Dataset Editor.
3. Появится окошко. Надеюсь, у тебя ключевые поля имеются в таблице? Выбери в списке KeyFields эти ключевые поля. А в списке UpdateFields выбери все поля (для начала это будет понятнее). Потом нажми GenerateSQL. Все тексты запросов впишутся автоматом. Можешь посмотреть их там же.
4. Подключи через компонент DataSorce к контролам и наслаждайся редактированием набора. Хочешь - в сетке редактируй.
----------------------
А теперь по уму.
Смысл 4 запросов в том, что у тебя в SelectSQL может быть объединение нескольких таблиц. А редактировать одновременно можно только одну. Вот тогда для нее UPDATE и DELETE впишешь, соотвественно в ModifySQL и DeleteSQL.
Другой случай - допустим ты продвинутый программер, который не признает никаких UPDATE-ов и DELET-ов. А только хранимые процедуры. Тогда впишешь вызов этих хранимых процедур в ModifySQL и DeleteSQL, описав параметры примерно так:
EXECUTE PROCEDURE MY_COOL_UPDATE_PROCEDURE(:ID, :NAME)
И в нужный момент IBDataSet вызовет эту SQL-команду, передав в качестве значений параметров ID и NAME значения из одноименных полейоткрытого с помощью SELECT набора.
Так что наличие 4-х запросов позволяет тебе гибко формировать такое поведение компонента, какое тебе нужно.
А вот что такое StatementType я (если честно) и не знаю. :(
Хотя всю жизнь и юзаю эти IBX-ы вполне успешно.
Все компоненты там полезные.
Лишний, пожалуй только IBTable, хотя на него зра бочку катят - он тоже по сути 4 команды отрабатывает, как и IBDataSet. Просто он избыточный в этой палитре. Вероятно для новичков. Единственный его минус - если новичок без опыта в SQL вздумает открыть в нем таблицу в миллион записей и начать редактировать их в гриде с ползунком.
Хотя такой опыт тоже полезен иногда.
:)))