Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Рассчет остатков напрямую в подборе Номенклатуры (число прочтений - 9472 )
Eugene1980
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Апреля 2014
Пол: Мужской
Рассчет остатков напрямую в подборе Номенклатуры
02. Апреля 2014 :: 08:16
Печать  
Для оптимизации расчета остатков в форме Подбор справочника Номенклатура переопределил стандартную функцию получения остатков  на функцию прямого параметрического запроса, вот текст функции:

Функция ЗапросСКЛ(Товар)
             
     ТекстЗапроса = "
           |SELECT
           |      $Рег.Количество as Количество
           |FROM
           |      $РегистрИтоги.ОстаткиТМЦ as Рег
           |WHERE
           |      Рег.Period = {d'2014-04-01'} AND
           //|      $Рег.Фирма = ? AND
           |      $Рег.Склад = ? AND
           |      $Рег.Номенклатура = ?
             |";  
           
               RS.УстПараметр(1, Склад);
               RS.УстПараметр(2, Товар);

     Возврат RS.ВыполнитьСкалярный();            
     
КонецФункции

Все бы хорошо, но вот после первой итерации вылетает ошибка MS SQL: connection is busy with results for another hstmt.
Что не так, можно ли это обойти?!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #1 - 02. Апреля 2014 :: 08:48
Печать  
(nolock)
воткни в текст запроса + это, остатки всегда на ТА нужны вам разве ?
Улыбка

+ не ясно, что есть Склад у вас
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #2 - 02. Апреля 2014 :: 09:28
Печать  
sum($Рег.Количество) as Количество
  

1&&2&&3
Наверх
 
IP записан
 
Eugene1980
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Апреля 2014
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #3 - 02. Апреля 2014 :: 10:21
Печать  
Так что "воткнуть"?! Склад это параметр формы, он определяется при ее открытии, а номенклатура - это текущий элемент для которого рассчитывается остаток?!
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #4 - 02. Апреля 2014 :: 10:38
Печать  
Для сочетания: Параметрических запрос + ВыполнитьСкалярный - нужно писать запрос, гарантированно возвращающий одну строку в выборке.
Твой запрос возвращает более одной. Вероятно из-за наличия итогов по разным фирмам.
Один из вариантов решения показан в #2
  

1&&2&&3
Наверх
 
IP записан
 
Eugene1980
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Апреля 2014
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #5 - 02. Апреля 2014 :: 12:00
Печать  
Как он может вернуть более одного значения, если в него передается 2 параметра Склад и Номенклатура, это конечные элементы и остаток только один. Запрос построен на основе методических рекомендаций к компоненте 1C++?! Вы предлагаете убрать один параметр из запроса?!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #6 - 02. Апреля 2014 :: 12:08
Печать  
Улыбка
у вас же в регистре не 2 измерения, склад и товар , не так ли ?
Вот ваш запрос может возвратить не одну, а две или больше строк..
Чтоб этого избежать - вам предлагается проссумировать количество.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #7 - 02. Апреля 2014 :: 12:26
Печать  
Eugene1980 писал(а) 02. Апреля 2014 :: 12:00:
Вы предлагаете убрать один параметр из запроса?!
нет, не предлагал я такого.
Я предлагаю гарантировать одну строку в выборке. Это достигается либо путем агрегирования, как я показал, либо указанием отбора по значениям всех измерений регистра.
  

1&&2&&3
Наверх
 
IP записан
 
Eugene1980
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Апреля 2014
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #8 - 02. Апреля 2014 :: 12:35
Печать  
С агрегированием измерения понятно, сегодня попробуем, спасибо.
Тогда не подскажите как в параметр прямого запроса список значений передать, например по всем фирмам, возможно это?!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #9 - 02. Апреля 2014 :: 12:44
Печать  
Через УстановитьТекстовыйПараметр..
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #10 - 02. Апреля 2014 :: 16:50
Печать  
Eugene1980 писал(а) 02. Апреля 2014 :: 12:35:
С агрегированием измерения понятно, сегодня попробуем, спасибо.
Тогда не подскажите как в параметр прямого запроса список значений передать, например по всем фирмам, возможно это?!  


Передать то можно, но зачем???

И не проще ли воспользоваться Виртуальной таблицей?
типа:

Код
Выбрать все
Функция ЗапросСКЛ(Товар)

     ТекстЗапроса = "
	     |SELECT
	     |	Рег.КоличествоОстаток as Количество
	     |FROM
	     |	$РегистрОстатки.ОстаткиТМЦ(,,Склад = ? AND Номенклатура = ?,(Склад,Номенклатура), Количество) as Рег
	     |";

		   RS.УстПараметр(1, Склад);
		   RS.УстПараметр(2, Товар);

     Возврат RS.ВыполнитьСкалярный();

КонецФункции 

  
Наверх
ICQ  
IP записан
 
Eugene1980
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Апреля 2014
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #11 - 02. Апреля 2014 :: 17:16
Печать  
Попробовал, но теперь другая ошибка - message [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index, что то с индексом?!
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #12 - 03. Апреля 2014 :: 05:18
Печать  
Salimbek писал(а) 02. Апреля 2014 :: 16:50:
И не проще ли воспользоваться Виртуальной таблицей?
типа:

Параметрический запрос и использование ВТ в таком виде несовместимо.
ВТ развернется в два подзапроса и знаков "?" вместо двух станет четыре, что приведет к ошибке при выполнении.

Если все же хочется использовать ВТ, то нужно либо, считая остатки на ТА, перед подготовкой вызвать метод ОбратныйРасчетОтТА(1)
Либо писать запрос так:
declare @nomen char(9)
set @nomen = ?
select
...
from $РегистрОстатки.ОстаткиТМЦ(... Номенклатура = @nomen...)

, при этом можно будет считать на ТА и не на ТА
  

1&&2&&3
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #13 - 03. Апреля 2014 :: 05:19
Печать  
Eugene1980 писал(а) 02. Апреля 2014 :: 17:16:
Попробовал, но теперь другая ошибка - message [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index, что то с индексом?!

Не с индексом, с построением параметров, у тебя в (0) никак не указано, как подготавливается запрос и как создаются параметры.
Например, была такая ветка с аналогичной проблемой: http://www.1cpp.ru/forum/YaBB.pl?num=1288688923/0
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Рассчет остатков напрямую в подборе Номенклатуры
Ответ #14 - 03. Апреля 2014 :: 05:23
Печать  
Eugene1980 писал(а) 02. Апреля 2014 :: 12:35:
Тогда не подскажите как в параметр прямого запроса список значений передать, например по всем фирмам, возможно это?!  

Так если нужно по всем фирмам, то зачем какой то список передавать?
sum() как раз просуммирует остатки по всем фирмам.
  

1&&2&&3
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать