powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Трабл, нид хелп :)
5 сообщений из 5, страница 1 из 1
Трабл, нид хелп :)
    #32076847
Wicky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
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
...
Рейтинг: 0 / 0
Трабл, нид хелп :)
    #32076863
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Селект в курсоре всегда гарантированный тормоз.
Как по мне я делал бы две просиды и вызывал одну из другой
...
Рейтинг: 0 / 0
Трабл, нид хелп :)
    #32076866
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде бы все превращается в обычный апдейт:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
UPDATE КН
Set
	СуммаПоНакладнойRUB = КН.СуммаПоНакладнойRUB+
		SUM(СКН.Количество * 
		Case
			when [ЦенаПрРуб] =  0  then [ЦенаПрДол] * КД.КурсДолл
			when [ЦенаПрРуб] <>  0  then [ЦенаПрРуб]
		End
		)
FROM 
	ТоварыДилера ТД
	INNER JOIN СтрокиКороткойНакладной СКН
		ON ТД.КодТовараДилера = СКН.КодТовара 
	INNER JOIN КороткаяНакладная КН
		ON СКН.КодКороткойНакладной = КН.КодКороткойНакладной 
	INNER JOIN КурсДолл КД
		ON КД.Дата = КН.ДатаВыпискиНакладной 



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

С уважением,
Александр Степанов
...
Рейтинг: 0 / 0
Трабл, нид хелп :)
    #32076886
dkstranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку о курсорах - в принципе, курсоры, вообще, можно
не использовать ...
...
Рейтинг: 0 / 0
Трабл, нид хелп :)
    #32076933
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> stranger
... По поводу курсоров - если надо с'concat'еначить много разных фичей в одну строку или еще как - одними запросами - вигвам ).

Странно. имхо. Как это Глори умудряется переваривать кавычки на вставку в базу мессаджборды. Круто!
Я несколько дней бьюсь над тем - чтобы окавыченные мемки падали нормально в базу... - вечный трабл - то двойные кавычки он берет - то еще какие... то две разные кавычки (1 и 2) как-то переиначивает... вобщем странно.
Но мощно задвинул ) (Глори).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Трабл, нид хелп :)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]