Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Остатки в форме списка справочника (число прочтений - 7472 )
Plumbum
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 26. Октября 2007
Остатки в форме списка справочника
29. Ноября 2007 :: 08:29
Печать  
Вводные
Регистр остатки товаров
Измерения
Фирма
Склад
Товар
Ресурсы
Количество
Сумма

Форма списка справочника товаров
Фирма  - Элемент диалога
Склад   - Элемент диалога
Товар   - ТекущийЭлемент()

Код
Выбрать все
Процедура ПриОткрытии() формы списка
	Если Константа.ФлагSQL=1 Тогда
		ДатаОстатков=РабочаяДата();
		RS = СоздатьОбъект("ODBCRecordset");
		ТекстЗапроса = "
		|SELECT
		|  $Рег.Количество as Количество
		|FROM
		|  $РегистрИтоги.ОстаткиТоваров as Рег
		|WHERE
		|  Рег.Period = {d’2006-01-01’} AND
		|  $Рег.Фирма = ? AND
		|  $Рег.Склад = ? AND
		|  $Рег.Товар = ?";
		Сообщить(ТекстЗапроса);
		RS.Подготовить(ТекстЗапроса);
		RS.ПостроитьПараметры();
	КонецЕсли;
КонецПроцедуры 



Код
Выбрать все
Функция Остаток(Спр)
   Если Константа.ФлагSQL=1 Тогда
	RS.УстПараметр(1,Фирма);
	RS.УстПараметр(2,Склад);
	RS.УстПараметр(3,ТекущийЭлемент());
	Количество=RS.ВыполнитьСкалярный();
  КонецЕсли
КонецФункции 



Функция выдаёт ошибку при вызове
Цитата:
Количество=RS.ВыполнитьСкалярный();
{Справочник.Товары.ФормаСписка.ФормаСписка.Модуль(311)}: State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 7: Incorrect syntax near '’'.


помогите разобраться с граблями, и как грамотно прописать получение остатков на дату актуальности? либо на любую выбранную дату
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #1 - 29. Ноября 2007 :: 08:45
Печать  
а что это у тебя за символ? откуда вял Улыбка нужен '
  
Наверх
ICQ  
IP записан
 
Plumbum
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 26. Октября 2007
Re: Остатки в форме списка справочника
Ответ #2 - 29. Ноября 2007 :: 08:55
Печать  
Nick писал(а) 29. Ноября 2007 :: 08:45:
а что это у тебя за символ? откуда вял Улыбка нужен '

Из документации по 1сpp )))

с этим разобрались, вот только ускорения работы я чтото не заметил.
как грамотно организовать получение остатков на ТА с наложением условий на выбранные фирму и склад, а так же в случае если фирма,склад не выбраны (по одиночке либо вместе)?
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #3 - 29. Ноября 2007 :: 09:03
Печать  
Plumbum писал(а) 29. Ноября 2007 :: 08:55:
Nick писал(а) 29. Ноября 2007 :: 08:45:
а что это у тебя за символ? откуда вял Улыбка нужен '

Из документации по 1сpp )))

с этим разобрались, вот только ускорения работы я чтото не заметил.
как грамотно организовать получение остатков на ТА с наложением условий на выбранные фирму и склад, а так же в случае если фирма,склад не выбраны (по одиночке либо вместе)?


Фильтр нужно делать в самой ВТ, читай учебник дальше
  
Наверх
ICQ  
IP записан
 
Plumbum
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 26. Октября 2007
Re: Остатки в форме списка справочника
Ответ #4 - 29. Ноября 2007 :: 09:28
Печать  
Nick писал(а) 29. Ноября 2007 :: 09:03:
Фильтр нужно делать в самой ВТ, читай учебник дальше


Код
Выбрать все
ДатаОстатков=РабочаяДата();
Запрос = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
|@Товар = ?
|SELECT
|  Рег.КоличествоОстаток as Количество
|FROM
|  $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
|                               Фирма = :ВыбФирма AND Склад = :ВыбСклад AND Товар = @Товар,
|                               (Товар), (Количество)) as Рег";
Запрос.УстановитьТекстовыйПараметр("ВыбДата",ПолучитьДатуТА());
Запрос.УстановитьТекстовыйПараметр("Фирма",Фирма);
Запрос.УстановитьТекстовыйПараметр("Склад",Склад);
Запрос.Подготовить(ТекстЗапроса);  
Запрос.ПостроитьПараметры();
Запрос.УстПараметр(1,ТекущийЭлемент());
Количество=Запрос.ВыполнитьСкалярный();
 



Цитата:
Запрос.УстПараметр(1,ТекущийЭлемент());
{Справочник.Товары.ФормаСписка.ФормаСписка.Модуль(310)}: Недопустимое значение индекса параметра


За пример работающего куска кода был бы очень благодарен.
P.S. Функция Остаток вызывается в текстовой колонке на форме списка справочника
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #5 - 29. Ноября 2007 :: 09:35
Печать  
Код
Выбрать все
ДатаОстатков=РабочаяДата();
Запрос = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
|SELECT
|  Рег.КоличествоОстаток as Количество
|FROM
|  $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
|				     Фирма = :ВыбФирма AND Склад = :ВыбСклад AND Товар = :ВыбТовар,
|					(Товар), (Количество)) as Рег";
Запрос.УстановитьТекстовыйПараметр("ВыбДата",ПолучитьДатуТА());
Запрос.УстановитьТекстовыйПараметр("Фирма",Фирма);
Запрос.УстановитьТекстовыйПараметр("ВыбТовар",ТекущийЭлемент() );
Запрос.УстановитьТекстовыйПараметр("Склад",Склад);
Количество=Запрос.ВыполнитьСкалярный(ТекстЗапроса);
 


Я бы вместо ВыполнитьСкалярный(ТекстЗапроса) писал бы
ТЗ = ВыполнитьИнструкцию(ТекстЗапроса)
  
Наверх
 
IP записан
 
Plumbum
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 26. Октября 2007
Re: Остатки в форме списка справочника
Ответ #6 - 29. Ноября 2007 :: 09:55
Печать  
Z1 писал(а) 29. Ноября 2007 :: 09:35:
[code]
Я бы вместо ВыполнитьСкалярный(ТекстЗапроса) писал бы
ТЗ = ВыполнитьИнструкцию(ТекстЗапроса)

попробовал, получается для каждого элемента выполнять запрос, ускорения работы не наблюдается.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #7 - 29. Ноября 2007 :: 10:03
Печать  
Plumbum писал(а) 29. Ноября 2007 :: 09:55:
Z1 писал(а) 29. Ноября 2007 :: 09:35:
[code]
Я бы вместо ВыполнитьСкалярный(ТекстЗапроса) писал бы
ТЗ = ВыполнитьИнструкцию(ТекстЗапроса)

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

Выполняй тогда его для всего справочника по таймеру раз в секунду результат в ТЗ а в форму справочника бери
из этой ТЗ Улыбка
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #8 - 29. Ноября 2007 :: 10:04
Печать  
В общем для таких задач правда смыслу большого нет в использовании прямых запросов
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #9 - 29. Ноября 2007 :: 10:13
Печать  
Plumbum писал(а) 29. Ноября 2007 :: 09:55:
Z1 писал(а) 29. Ноября 2007 :: 09:35:
[code]
Я бы вместо ВыполнитьСкалярный(ТекстЗапроса) писал бы
ТЗ = ВыполнитьИнструкцию(ТекстЗапроса)

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

Ну во первых в  subj у тебя точно также

Во вторых список товаров можно уложить в список
УложитьСписокОбъектов(Список1, "#Времтовары", "Товары");
а в самом запросе
Товар IN ( select Val from #Времтовары)
  
Наверх
 
IP записан
 
Plumbum
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 26. Октября 2007
Re: Остатки в форме списка справочника
Ответ #10 - 29. Ноября 2007 :: 10:29
Печать  
Получается дурная идея оптимизации данного куска кода, ибо кроме как визуально проверить ускорение работы невозможно, а оно визуально не даёт прироста в скорости. всем спасибо.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #11 - 29. Ноября 2007 :: 10:44
Печать  
Ну во-первых - зачем ты вот здесь:
Код
Выбрать все
Функция Остаток(Спр)
   Если Константа.ФлагSQL=1 Тогда
	RS.УстПараметр(1,Фирма);
	RS.УстПараметр(2,Склад);
	RS.УстПараметр(3,ТекущийЭлемент());
	Количество=RS.ВыполнитьСкалярный();
  КонецЕсли
КонецФункции  


каждый раз устанавливаешь Фирму и Склад?
меняй параметры при изменении их на форме;
Во вторых:
Замечание: при использовании ВТ в параметризированных запросах нужно поступать немного не так. Ведь не известно, во что он развернется. Поэтому делаем следующим образом:
Код
Выбрать все
ТекстЗапроса = "
|@Товар = ?
|SELECT
|    Рег.КоличествоОстаток as Количество
|FROM
|    $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
|					   Склад = :ВыбСклад AND Товар = @Товар,
|					   (Товар), (Количество)) as Рег"; 


это выдержка из статьи о прямых запросах.
В третьих:
Прочитай про оптимальность построения регистра:
http://www.softpoint.ru/article_id45.htm
И отписаться сюда - какие выводы ты сделал - будет очень приятно.
  
Наверх
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Остатки в форме списка справочника
Ответ #12 - 29. Ноября 2007 :: 11:28
Печать  
Plumbum писал(а) 29. Ноября 2007 :: 10:29:
Получается дурная идея оптимизации данного куска кода, ибо кроме как визуально проверить ускорение работы невозможно, а оно визуально не даёт прироста в скорости. всем спасибо.


Запрос нужно выполнять не для каждого элемента, а для группы(по текущему родителю, если выводится иерархический список). Запоминать остатки в ТЗ, в формуле на форме списка получать остаток из этой ТЗ. ТЗ обновлять при смене родителя, смене фильтров и тп.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #13 - 29. Ноября 2007 :: 11:41
Печать  
alexdd писал(а) 29. Ноября 2007 :: 11:28:
Plumbum писал(а) 29. Ноября 2007 :: 10:29:
Получается дурная идея оптимизации данного куска кода, ибо кроме как визуально проверить ускорение работы невозможно, а оно визуально не даёт прироста в скорости. всем спасибо.


Запрос нужно выполнять не для каждого элемента, а для группы(по текущему родителю, если выводится иерархический список). Запоминать остатки в ТЗ, в формуле на форме списка получать остаток из этой ТЗ. ТЗ обновлять при смене родителя, смене фильтров и тп.

Ну вот чего ты человека в ступор вгоняешь?
Запрос выполняется не для всего справочника, а только для той части, которая отображена на экране и столько раз сколько строк отображено на экране....
  
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Остатки в форме списка справочника
Ответ #14 - 29. Ноября 2007 :: 12:20
Печать  
Nick писал(а) 29. Ноября 2007 :: 10:04:
В общем для таких задач правда смыслу большого нет в использовании прямых запросов

Есть
Юзаю обычный запрос в режиме RPC с двумя ВТ и своей табличкой для вывода свободного остатка - ускорение очевидно
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать