![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TQuery против TTable
Delphi basic © (2006-06-23 11:42:00)Для клиент-серверного приложения, когда желательно уменьшить объем сетевого трафика, в хелпах советуют использовать TQuery. А есть ли другие причины? Например, пусть имеется 1000 строк в таблице, из них отбирается 10. Что передается клиенту в каждом случае:
IBQuery - только 10 строк, отобраных SQL-запросом,
IBTable - вся 1000, из которой уже на клиенте отфильтровывается 10?
Desdechado (2006-06-27 15:52:00) [1]И это, кстати, никоим образом не касается сервера БД, на котором реализована программа.
Desdechado (2006-06-27 15:51:00) [2]> а почему бы системе в момент открытия уже редактируемого кем-то док-та
Это или неверное проектирование (когда не выяснили бизнес-процессы и возможность одновременной работы над документом для разруливания оного), или неверно розданные полномочия (например, когда пользователи работают на запись только со своими документами и нет "общих").
Игорь Шевченко (2006-06-27 15:47:00) [3]
> > Тогда, получается, если в таблице 1млн. записей, из которых,
>
> > допустим, нужно отобрать только 100, то TTable все их
> сначала
> > затащит на клиента, а потом будет фильровать? жуть...
>
> ага.
О сколько нам открытий чудных готовит просвещенья дух.
Sergey13 (2006-06-27 15:34:00) [4]>Посмотрел я, как в одной довольно серьезной системе реализована параллельная работа пользователей - жуть.
На любой связке БД-компоненты такое можно сделать. А можно не сделать. 8-)
Delphi basic (2006-06-27 15:23:00) [5]
> > Delphi basic © (23.06.06 13:49) [26]
> > Всем спасибо за советы и обоснованную критику.
> > Я понял, что от Query мне никуда не деться :)
> >
>
> Используй IBDataSet, и смотри
> > Desdechado © (23.06.06 12:46) [17]
> > Идея верна, реализация жутковата.
> >
> > > DBEdit не идут, т.к. датасет нередактируемый (IBQuery)
> > Идут-идут. Только потом нужно почитать про значения свойств
>
> > InsertSQL, UpdateSQL, DeleteSQL
В общем, поставил я FIBPlus. Более менее разобрался.
Правда, вот на что внимание обратил. Посмотрел я, как в одной довольно серьезной системе реализована параллельная работа пользователей - жуть.
Ситуация: есть документ.
1) Юзер 1 открывает его для редактирования.
2) Юзер 2 открывает его для редактирования.
3) Юзер 1 сохраняет изменения.
4) Юзер 2 сохраняет изменения.
5) Юзер 1 открывает тот же документ и очень удивляется увиденному
(а почему бы системе в момент открытия уже редактируемого кем-то док-та
не предупредить об этом юзера 2 и не запретить редактирование? Юзер 1, может, ночь не спал, редактируя его?)
Меня возможность такой коллизии в довольно серьезной системе (используется в электроэнергетике и нефтяной отрасли) очень неприятно удивила...
Виталий Панасенко (2006-06-23 16:02:00) [6]
> Delphi basic © (23.06.06 13:49) [26]
> Всем спасибо за советы и обоснованную критику.
> Я понял, что от Query мне никуда не деться :)
>
Используй IBDataSet, и смотри
> Desdechado © (23.06.06 12:46) [17]
> Идея верна, реализация жутковата.
>
> > DBEdit не идут, т.к. датасет нередактируемый (IBQuery)
> Идут-идут. Только потом нужно почитать про значения свойств
> InsertSQL, UpdateSQL, DeleteSQL
evvcom (2006-06-23 14:15:00) [7]
> Просто данные из таблицы отбираются одним квери, а апдейты,
> инсерты и делейты - другим.
А [17] в игнор попал? За что ж?
Delphi basic (2006-06-23 13:49:00) [8]Всем спасибо за советы и обоснованную критику.
Я понял, что от Query мне никуда не деться :)
Sergey13 (2006-06-23 13:48:00) [9]> [24] Delphi basic © (23.06.06 13:46)
Да уж, Чебурашка тут не катит.
Delphi basic (2006-06-23 13:46:00) [10]
> Desdechado © (23.06.06 13:34) [23]
> а, может, почитать книжки?
Я их в свое время жуткое количество перечитал. Жалко, тогда по программированию не попадались :)
Desdechado (2006-06-23 13:34:00) [11]а, может, почитать книжки?
Delphi basic (2006-06-23 13:31:00) [12]А может, все это делать через StoredProc?
Delphi basic (2006-06-23 13:28:00) [13]
> Sergey13 © (23.06.06 12:57) [19]
> 2[18] Delphi basic © (23.06.06 12:51)
> > Да... по сравнению с Table код рааспухает прямо на глазах.
> ..
> Это от незнания и от упертости в своем незнании.
> Напиши у кверика в запросе
> select * from table
> (что собственно и происходит при использовании ТТабл),
> и код обработки вообще не будет отличаться.
Так я у квери так и записал. Просто данные из таблицы отбираются одним квери, а апдейты, инсерты и делейты - другим.
Desdechado (2006-06-23 13:03:00) [14]> код рааспухает прямо на глазах...
За все нужно платить. За гибкость - особенно.
Ttable - для ленивых. Если ты такой, забудь все говоренное тебе, пользуйся своей ленью.
Sergey13 (2006-06-23 12:57:00) [15]2[18] Delphi basic © (23.06.06 12:51)
> Да... по сравнению с Table код рааспухает прямо на глазах...
Это от незнания и от упертости в своем незнании.
Напиши у кверика в запросе
select * from table
(что собственно и происходит при использовании ТТабл),
и код обработки вообще не будет отличаться.
Delphi basic (2006-06-23 12:51:00) [16]
> Идея верна, реализация жутковата.
Можно, конечно, и параметры использовать...
Да... по сравнению с Table код рааспухает прямо на глазах...
Desdechado (2006-06-23 12:46:00) [17]Идея верна, реализация жутковата.
> DBEdit не идут, т.к. датасет нередактируемый (IBQuery)
Идут-идут. Только потом нужно почитать про значения свойств InsertSQL, UpdateSQL, DeleteSQL
Sergey13 (2006-06-23 12:45:00) [18]2 [14] Delphi basic © (23.06.06 12:41)
>Как я понял, при работе с Query последовательность такая:
Это один из вариантов. Не самый плохой. Основной недостаток - необходимо переоткрыть исходный датасет для визуализации изменения на клиенте.
Danilka (2006-06-23 12:45:00) [19][14] Delphi basic © (23.06.06 12:41)
Это один из кучи вариантов, причем, далеко не самый удачный. :)
Я-бы рекомендовал почитать что-нибудь. :)
Delphi basic (2006-06-23 12:41:00) [20]Как я понял, при работе с Query последовательность такая:
Пусть нужно отредактировать запись таблицы. Для редактирования берется текущая запись в DBGrid'е. Открываем окно, в котором поля записи раскидываются, допустим, по Edit'ам (DBEdit не идут, т.к. датасет нередактируемый (IBQuery)). После нажатия какой-нибудь кнопки закидываем их значения (пусть пока без проверки) в SQL.
DataModuleMain.IBSQL_Temp.Close;
DataModuleMain.IBSQL_Temp.SQL.Clear;
DataModuleMain.IBSQL_Temp.SQL.Add('update subdivision set code = ''' +
EditCode.Text + ''', name = ''' + EditName.Text + ''' where UI = ' +
IntToStr(DataModuleMain.IBQuerySubdiv.FieldByname('UI').AsInteger));
DataModuleMain.IBSQL_Temp.ExecQuery;