Трабл, нид хелп :)

Wicky
Дата: 06.12.2002 16:52:42

Create procedure dbo.job_подсчетСтоимостиНакладных

as

declare @CardID int,
@DilerCardID int,
@SalerID int,
@BuyerID int,
@ShortAccountID int,
@AccountID int,
@Quantity int,
@OldQuantity int,
@NewQuantity int,
@DateOfShortAccount datetime,
@DayOfChanges nvarchar(255),
@strSQL nvarchar (1024),
@CurrentValueOfCourseUSD money,
@CurrentCostPriceOfDilerCard_RUB money,
@CurrentOurPriceOfDilerCard_RUB money,
@RetCode int

SET @RetCode=50001
SET NOCOUNT ON

/* Объявляем набор записей для запроса */
declare o_curs cursor for
Select КодКороткойНакладной, КодТовара, Количество From СтрокиКороткойНакладной

begin

/* Открываем набор записей и извлекаем первую запись */
open o_curs
fetch o_curs into @ShortAccountID, @DilerCardID, @Quantity

/* Если набор записей пуст, выходим из процедуры */
if(@@FETCH_STATUS = -2)
begin
close o_curs
return
end

/* Цикл обработки всех строк таблицы СтрокиКороткойНакладной */
while (@@FETCH_STATUS = 0)
begin
/* Получим значение курса доллара на день выписки накладной*/
SELECT @CurrentValueOfCourseUSD = КурсДолл.КурсДолл,
@Quantity = СтрокиКороткойНакладной.Количество,
@CurrentCostPriceOfDilerCard_RUB =
Case
when [ЦенаПрРуб] = 0 then [ЦенаПрДол] * @CurrentValueOfCourseUSD
when [ЦенаПрРуб] <> 0 then [ЦенаПрРуб]
End
FROM ТоварыДилера
INNER JOIN (КурсДолл
INNER JOIN (СтрокиКороткойНакладной
INNER JOIN КороткаяНакладная
ON СтрокиКороткойНакладной.КодКороткойНакладной = КороткаяНакладная.КодКороткойНакладной)
ON КурсДолл.Дата = КороткаяНакладная.ДатаВыпискиНакладной)
ON ТоварыДилера.КодТовараДилера = СтрокиКороткойНакладной.КодТовара
WHERE
(((СтрокиКороткойНакладной.КодКороткойНакладной)=@ShortAccountID) AND ((СтрокиКороткойНакладной.КодТовара)=@DilerCardID))

/*
If(@CurrentCostPriceOfDilerCard_RUB = 0)
begin
Rollback Tran
Raiserror @RetCode 'ВНИМАНИЕ!!! Продажная цена карты составляет 0, необходимо изменить продажную цену.'
end

/* Посчитаем продажную стоимость данного количества карт данного номинала на день выписки накладной*/

*/

UPDATE КороткаяНакладная
Set СуммаПоНакладнойRUB = СуммаПоНакладнойRUB + (@Quantity * @CurrentCostPriceOfDilerCard_RUB) /*,
ЗакСтПоНакладнойRUB = ЗакСтПоНакладнойRUB + (@Quantity * @CurrentOurPriceOfDilerCard_RUB)*/

WHERE (((КодКороткойНакладной)=@ShortAccountID))
end

end

работает меее-еедленно, подскажите как бы оптимизить
иногда пишет timeout expired
Maxx
Дата: 06.12.2002 17:14:39
Селект в курсоре всегда гарантированный тормоз.
Как по мне я делал бы две просиды и вызывал одну из другой
Александр Степанов
Дата: 06.12.2002 17:18:33
Вроде бы все превращается в обычный апдейт:

UPDATE КН

Set
СуммаПоНакладнойRUB = КН.СуммаПоНакладнойRUB+
SUM(СКН.Количество *
Case
when [ЦенаПрРуб] = 0 then [ЦенаПрДол] * КД.КурсДолл
when [ЦенаПрРуб] <> 0 then [ЦенаПрРуб]
End
)
FROM
ТоварыДилера ТД
INNER JOIN СтрокиКороткойНакладной СКН
ON ТД.КодТовараДилера = СКН.КодТовара
INNER JOIN КороткаяНакладная КН
ON СКН.КодКороткойНакладной = КН.КодКороткойНакладной
INNER JOIN КурсДолл КД
ON КД.Дата = КН.ДатаВыпискиНакладной



Постарайтесь избавьться от привычки использовать курсоры там, где они вовсе не нужны.

С уважением,
Александр Степанов
dkstranger
Дата: 06.12.2002 18:20:30
В догонку о курсорах - в принципе, курсоры, вообще, можно
не использовать ...
KirillovA
Дата: 07.12.2002 00:43:59
> stranger
... По поводу курсоров - если надо с'concat'еначить много разных фичей в одну строку или еще как - одними запросами - вигвам ).

Странно. имхо. Как это Глори умудряется переваривать кавычки на вставку в базу мессаджборды. Круто!
Я несколько дней бьюсь над тем - чтобы окавыченные мемки падали нормально в базу... - вечный трабл - то двойные кавычки он берет - то еще какие... то две разные кавычки (1 и 2) как-то переиначивает... вобщем странно.
Но мощно задвинул ) (Глори).