Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли обойтись без курсора?


Страницы:   1 2

Павел Калугин ©   (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)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо