![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как посдсчитать кол-во записей [D7, MSSQL]
apl © (2006-06-07 08:09:00)В ADOCommand необходимо выполнить несколько последовательных запросов типа
Select id,count(*) from table_a group by ... where id=:AKode
Select id,count(*) from table_b group by ... where id=:AKode
Select id,count(*) from table_c group by ... where id=:AKode
Select id,count(*) from table_d group by ... where id=:AKode
Select id,count(*) from table_e group by ... where id=:AKode
Select id,count(*) from table_f group by ... where id=:AKode
Здесь выражения существенно упрощены, реально они
гораздо сложнее. Как в программе прочитать результат выполения каждого запроса.
По условиям задачи создать процедуру на сервере - не могу.
ЮЮ (2006-06-07 13:39:00) [1]
> Спашивал как (можно-ли) вернуть результат используя последовательные
> запросы в процедуре. Понял - что нет.
Странно, ведь в [2] показали как
sniknik (2006-06-07 13:10:00) [2][0]
> необходимо выполнить несколько последовательных запросов типа
> Select...
[10]
> Удаляй в 18 (на сегодняшний день) таблицах, в чужой базе процедуройна сервере (тоже чужой)
> DELETE...
так типа, селектом, удаление, или всетаки процедурой?
специально путаеш отвечающих?
кстати для справки, процедуры как раз для того и делают чтобы вынести логику на сервер, где ее любой грамотный администратор бд/программист поправить может не перекомпиляя программу при смене логики процесса...
apl (2006-06-07 12:37:00) [3]А как выполнить запрос в отдельном потоке?
isasa (2006-06-07 12:22:00) [4]TADOCommand.ExecuteOptions: TExecuteOptions;
TCustomADODataSet.ExecuteOptions: TExecuteOptions;
TExecuteOption = ( eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking, eoExecuteNoRecords);
Sergey13 (2006-06-07 11:48:00) [5]2[10] apl (07.06.06 11:36)
>DELETE from .... where id=....
>и так 18 раз.
>Что тут на оптимизируешь.
Да хоть 118 раз. Текст просто длинный и некрасиво, но исполняться должен практически мгновенно, если ID - первичный ключ и все (возможные) каскадные удаления используют индексы.
Хотя - чужая база - потемки, но как то подозрительно уж больно.
apl (2006-06-07 11:41:00) [6]
> Либо запросы в отдельном потоке исполняй
Можно поподробнее - как
apl (2006-06-07 11:38:00) [7]id один для всех
а не 18 разных.
Ega23 (2006-06-07 11:37:00) [8]
> DELETE from .... where id=....
DELETE from .... where id in (234,567,578, .... , 9856)
?
apl (2006-06-07 11:36:00) [9]Попробуй, оптимизируй!
Ситуации ведь разные.
Удаляй в 18 (на сегодняшний день) таблицах, в чужой базе процедурой на сервере (тоже чужой)
DELETE from .... where id=....
и так 18 раз.
Что тут на оптимизируешь.
А по поводу подсчитать кол-во.
Нужно подсчитать 7 величин и отобразить их в лейблах на форме.
Подсчитываются вхождения id разных таблицах при различных условиях (т.е. есть от них завизимые записи или нет и еще всяко-разно). Специально не писал текст запросов. Спашивал как (можно-ли) вернуть результат используя последовательные запросы в процедуре. Понял - что нет.
А об оптимизации - к авторам базы. Я двумя руками за, и поддерживаю.
Sergey13 (2006-06-07 11:05:00) [10]2 [7] ЮЮ © (07.06.06 10:59)
> Не хочешь об этом поговорить? :)
Могу еще тему подкинуть - если для подобных запросов надо АВИ-шку включать, то самое время задуматься об оптимизации. 8-)
ИМХО.
Ega23 (2006-06-07 11:00:00) [11]
> При выполненни этого "цикла" прога ждет :((( и хотелось
> бы запустить какую-то "мультяшку" для информации юзера.
> Попробовал куртануть AVI, но почему-то пока выполняются
> запросы отображается только фрейм в котором хочу показать
> картинку, а сама мультяшка не показывается.
А потому, что ты это всё в одном потоке делаешь. Либо запросы в отдельном потоке исполняй, либо мультяшку в отдельном потоке показывай.
Можно, конечно, в цикле Application.ProcessMessages вставить, но тогда возможны жуткие тормоза. Этой штукой аккуратно пользоваться надо...
ЮЮ (2006-06-07 10:59:00) [12]Screen.Cursor := crSQLWait;
try
finally
Screen.Cursor := crDefault;
end;
>Пришлось переписывать запрос несколько раз.
Не хочешь об этом поговорить? :)
apl (2006-06-07 10:54:00) [13]Спасибо! Попробовал через ADOQuery1. В принципе терпимо, только приходится заменять запросы. Я указывал что они существенно упрощены и union - не подходит. Пришлось переписывать запрос несколько раз. При выполненни этого "цикла" прога ждет :((( и хотелось бы запустить какую-то "мультяшку" для информации юзера. Попробовал куртануть AVI, но почему-то пока выполняются запросы отображается только фрейм в котором хочу показать картинку, а сама мультяшка не показывается. Такая же ситуация при выполнении удаления записи на сервере (когда удалять приходится в большом кол-ве таблиц). :((( Висим-не висим, но впечатление не очень приятное. Как проинформировать юзера что программа все-таки занимается какой-то полезной работой? Статичная надпись типа "Ждите" - не очень его убеждает. Попробовал поменять курсор на crWait - почему-то не получилось.
ЮЮ (2006-06-07 10:30:00) [14]GROUP BY ID тут лишнее, ввиду where id=:AKode
SELECT
:AKode,
(count(*) from table_a where id=:AKode) aCnt,
...
(count(*) from table_f where id=:AKode) fFnt
З.Ы. надеюсь помнишь, что в Parameters будет 7 Items и с помошью ParamByName их не определишь.
Лучше тогда
DECLARE @AKode int
SET @AKode = :AKode
SELECT @AKode, ...
Ega23 (2006-06-07 09:19:00) [15]
Select id,count(*) from table_a group by ... where id=:AKode
union all
Select id,count(*) from table_b group by ... where id=:AKode
union all
Select id,count(*) from table_c group by ... where id=:AKode
union all
Select id,count(*) from table_d group by ... where id=:AKode
union all
Select id,count(*) from table_e group by ... where id=:AKode
union all
Select id,count(*) from table_f group by ... where id=:AKode
Sergey13 (2006-06-07 09:17:00) [16]Сдается мне сливать надо таблицы, раз подобные запросы пачками нужны.
sniknik (2006-06-07 08:48:00) [17]> Как в программе прочитать результат выполения каждого запроса.
во первых выполнять в ADODataSet, т.к. запросы результирующие, ну или если выполнить в ADOCommand самоцель то результат происвоить рекордсету каому нибудь.
переходить от одного рекокордсета к следующему - NextRecordSet (метод рекордсета).
Хой (2006-06-07 08:26:00) [18]Используй метод recordcount компонента через который вибираешь данные, например так ADOQuery1.recordcout либо если хочешь узнать коллчивство строк прмо в запросе то используй системную переменную @@rowcount, в которой храниться колличевство строк последнего выполненого запроса.