![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли обойтись без курсора?
Павел Калугин © (2007-05-18 11:20:00)СУБД MSSQL
на входе
таблицы вида
Остатки
счет | субсчет | дата откр | сумма
Списания
Счет | Дата | Сумма
порядок списания сумм
с самого старого субсчета, если там недостаточно то списать под ноль и остаток со следующего
Очевидный способ в лоб - крутим цикл по субсчетам и списываем последовательно
Возможно ли вместо цикла завернуть операцию в update?
Если да, то как это сделать это эффективнее?
Val (2007-05-18 12:27:00) [21]>[10] Павел Калугин © (18.05.07 12:17)
<offtop>
черт, ты меня просто попалил. :))
</offtop>
попробуй все-таки осилить написанное мной в посте по теме ветки.
и не говори больше никому, что в майкрософт придумали свой язык запросов на сервере, т.к. SQL, видимо, они не поняли..а то новые в этом люди поверят и будут нести дальше идею о сервере с двумя языками запросов.
P.S.наискось читаешь, что ли... :(
Павел Калугин (2007-05-18 12:17:00) [22]> [8] Val © (18.05.07 12:03)
<offtop>
это поможет ответить на твой вопрос из соседней ветки
</offtop>
Павел Калугин (2007-05-18 12:16:00) [23]
> [7] ЮЮ © (18.05.07 11:54)
> Откуда они берутся?
С соседнего сервера Данные по операциям
Прредполагается что в одну дату двух одинаковых операций по одному счету нет
> А если ктр-то запусти процедуру списания повторно?
получит бейсбольной битой по голове.
Val (2007-05-18 12:03:00) [24]>[6] Павел Калугин © (18.05.07 11:52)
скажи, как поможет мне order by постичь тайны "TSql, языка запросов работающего непосредственно на сервере MSSql"? 80
ЮЮ (2007-05-18 11:54:00) [25]> а хочется обойтись без цикла...
Без неявного цикла или рекурсии всё равно не обойтись, т.к. заранее неясно, сколько записей приднтся проадейтить
>порядок списания сумм
Каких?
Тех что в таблице списания? Или туда записываются списанные суммы? Откуда они берутся?
З.Ы. Всё это как то чревато. Или данных недостаточно. А если ктр-то запусти процедуру списания повторно?
Павел Калугин (2007-05-18 11:52:00) [26]> [5] Val © (18.05.07 11:49)
Спасибо большое за подсказку.
Видимо Вы не знаете, что TSql является языком запросов, работающем непосрелдственно на сервере MSSql
Уще раз, большое спасибо за попытку помочь.
PS
И прочитайте что нибудь про order by
Val (2007-05-18 11:49:00) [27]если
> Это импорт операций из соседней СУБД
, тем более, я бы писал на процедурном языке сервера, хотя бы для того, чтобы нормально отладить можно было, а также проще расширить функционал, при возможном усложнении алгоритма.
Павел Калугин (2007-05-18 11:47:00) [28]то есть мотается цикл по каждой операции.
а хочется обойтись без цикла...
Павел Калугин (2007-05-18 11:46:00) [29]> [2] ЮЮ © (18.05.07 11:30)
клиента нет. Это импорт операций из соседней СУБД
> [1] Jan1 (18.05.07 11:30)
примерно так
declare oper cursor for select acc, opsumma
from oper
where
order by op_data asc
open oper
-- проверки что на всех счетах суммарно есть средства на операции
fetch oper into @acc, @opsumma
while @@fetch_status=0
begin
while abs(@opsumma)>0
begin
select top1 @suma = suma, @subacc = subacc
from acc
where acc=@acc
and suma>0
if @suma+@opsumma>0
begin
update @suma = @suma+@opsumma
set @opsumma = 0
end
else begin
set @opsuma = @suma+@opsumma
update @suma = 0
end
end
fetch oper into @acc, @opsumma
end
Jan1 (2007-05-18 11:30:00) [30]а как это выглядит в курсоре?
ЮЮ (2007-05-18 11:30:00) [31]В triggere INSTEAD OF INSERT таблицы Списания ревлизовать всю описанную логику. Толко всё равно без циклов никак
на клиенте останется только вставлять записи
INSET INTO Списания(Счет, Дата, Сумма) VALUES (:Account, :Date, :Amount)