Имя: Пароль:
1C
1C 7.7
v7: параметризированные запросы
,
0 monsterZE
 
16.11.12
16:35
хотел попробывать сабж.. чет не взлетает =(
может период не правильно указываю?
без него, по товар склад отбирает правильно..
тема - получить остаток на ТА в списке

   ТекстЗапроса = "
   |SELECT                      
   |    $Рег.ОстатокТовара as ОстатокТовара
   |FROM
   |    $РегистрИтоги.ОстаткиТоваров as Рег
   |WHERE
   |    Рег.Period = CAST('2012-10-01' AS datetime)
   |    AND $Рег.Склад = ?
   |    AND $Рег.Товар = ?";
1 GLazNik
 
16.11.12
16:36
(0) а остальное где?
2 monsterZE
 
16.11.12
16:37
RS.Подготовить(ТекстЗапроса);
   RS.ПостроитьПараметры();                                                  
   
   RS.УстПараметр(1, Склад);
Функция
       RS.УстПараметр(2, ТекущийЭлемент());
       Возврат RS.ВыполнитьСкалярный();
3 monsterZE
 
16.11.12
16:37
возвращает 0
4 Попытка1С
 
16.11.12
16:38
5 GLazNik
 
16.11.12
16:41
ВыполнитьСкалярный должен возвращать одно значение
6 monsterZE
 
16.11.12
16:42
(5) это понятно, в табличке на дату оно одно и есть
7 mvk
 
16.11.12
16:51
CAST('20121001' AS datetime)
RS.УстПараметр(1, Склад.ТекущийЭлемент()); //Проверь, что Склад - это ссылка на элемент, а не сам объект
8 mvk
 
16.11.12
16:58
И еще
SUM($Рег.ОстатокТовара) as ОстатокТовара
на всякий случай, чтобы при добавлении измерений в регистр не посыпалось.
9 monsterZE
 
16.11.12
17:01
(7) попробывал - результат тот-же
вот так работает..
   //    тз = СоздатьОбъект("ТаблицаЗначений");
       
   //ТекстЗапроса = "
   //|SELECT                      
   //|    $Рег.ОстатокТовара as ОстатокТовара
   //|FROM
   //|    $РегистрИтоги.ОстаткиТоваров as Рег
   //|WHERE
   //|    Рег.Period = :ВыбПериод
   //|    AND $Рег.Склад = :ВыбСклад
   //|    AND $Рег.Товар = :ВыбТовар";
   //    
   //    RS.УстановитьТекстовыйПараметр("ВыбПериод", НачМесяца(ПолучитьДатуТА()));
   //    RS.УстановитьТекстовыйПараметр("ВыбСклад", Склад);
   //    RS.УстановитьТекстовыйПараметр("ВыбТовар", ТекущийЭлемент());
   //        
   //    тз = RS.ВыполнитьИнструкцию(ТекстЗапроса);    
   //    тз.ВыбратьСтроку();
10 mvk
 
16.11.12
17:04
А вот так работает?
   //ТекстЗапроса = "
   //|SELECT                      
   //|    $Рег.ОстатокТовара as ОстатокТовара
   //|FROM
   //|    $РегистрИтоги.ОстаткиТоваров as Рег
   //|WHERE
   //|    Рег.Period = :ВыбПериод
   //|    AND $Рег.Склад = :ВыбСклад
   //|    AND $Рег.Товар = :ВыбТовар";
   //    
   //    RS.УстановитьТекстовыйПараметр("ВыбПериод", НачМесяца(ПолучитьДатуТА()));
   //    RS.УстановитьТекстовыйПараметр("ВыбСклад", Склад);
   //    RS.УстановитьТекстовыйПараметр("ВыбТовар", ТекущийЭлемент());
   //        
   //    Остаток = RS.ВыполнитьСкалярный(ТекстЗапроса);
11 monsterZE
 
16.11.12
17:13
(10) да
12 monsterZE
 
16.11.12
17:14
и если
Рег.Period = :ВыбПериод
заменить
Рег.Period = CAST('20121001' AS DateTime)
тоже работает
13 mvk
 
16.11.12
17:17
Тогда вместо RS.ПостроитьПараметры(); используй методы с явным указанием типа параметра. Сейчас не помню, как звучит. Покури хелп по 1С++.
14 Попытка1С
 
16.11.12
17:19
ДобПараметр()
15 monsterZE
 
16.11.12
17:49
в текущем варианте на локале особого выйгрыша не вижу.. (перед .Остаток)
завтра попробую к основной базе прикрутить.. попробывать, когда много юзверей..
(14) про ДобПараметр чет пока тоже не особо.. =)
16 Попытка1С
 
16.11.12
17:50
(15) Я тебе ссылку кинул в (4).
17 monsterZE
 
16.11.12
17:51
(16) угу, завтра буду курить =) ща уже не воспринимается
18 Mikeware
 
16.11.12
17:52
(15) а перед чем должен быть выйгрыш?
Если перед Регистр.СводныйОстаток - то вдвое быстрее. если перед виртуальной таблицей - примерно вчетверо...
19 monsterZE
 
16.11.12
17:55
(18) перед регистр.остаток
..ну пока запрос то не сабжевый получается
20 Mikeware
 
16.11.12
17:57
(19) параметризованные имеют смысл только при "массовом исполнении"
21 monsterZE
 
16.11.12
18:02
(20) ну подбор товара в док из справочника, где оч. много позиций и некоторые любят отключать иерархию..
22 Mikeware
 
16.11.12
18:03
(21) это да
23 Mikeware
 
16.11.12
18:06
(21) попробуй заменить на ТабличноеПоле , кстати.
гораздо эффективнее будет
Сразу джойнищь с Таблицей остатков регистра. Заодно такие фишки, как фильтрация удаленных, "запрещеных к продаже товаров". Даже поиск по вхождению прикручивается
24 monsterZE
 
17.11.12
12:29
Цук.. возвращает нули и усе тут..
Процедура ПриОткрытии()
   RS = СоздатьОбъект("ODBCRecordset");
   RS.Отладка(1);
                   
   ТекстЗапроса = "    
   |Declare @Склад Char(9)
   |Declare @Товар Char(9)
   |Set @Склад = ?
   |Set @Товар = ?
   |SELECT                      
   |    $Рег.ОстатокТовара as ОстатокТовара
   |FROM
   |    $РегистрИтоги.ОстаткиТоваров as Рег
   |WHERE
   |    Рег.Period = CAST('20121001' AS DateTime)
   |    AND $Рег.Склад = @Склад
   |    AND $Рег.Товар = @Товар";
                     
   // "+НачМесяца(ПолучитьДатуТА())+"
   
   Подготовлен = RS.Подготовить(ТекстЗапроса);
   Сообщить(Подготовлен);
   RS.ДобПараметр(1,14,9,0);
   RS.ДобПараметр(1,14,9,0);
   //RS.ПостроитьПараметры();                                                  
   
   RS.УстПараметр(1, Склад);
КонецПроцедуры

       RS.УстПараметр(2, ТекущийЭлемент());
       Остаток = RS.ВыполнитьСкалярный();
       Возврат (Остаток)
25 monsterZE
 
17.11.12
12:30
подготовлен показывает 1
26 monsterZE
 
17.11.12
12:41
(25) факардо! закаментил склад - и оно взлетело... ковыряю почему
27 monsterZE
 
17.11.12
13:06
мухаха! вот эт я ишачелло =)
на складе "автовыбор" стоял
и в запрос просто пустой склад уходил.. мдя... =)
ласт ворк вешен:
при_открытии
   RS = СоздатьОбъект("ODBCRecordset");
                   
   ТекстЗапроса = "        
   |Declare @ДатаОст Char(8)  
   |Declare @Склад Char(9)
   |Declare @Товар Char(9)  
   |Set @ДатаОст = ?
   |Set @Склад = ?
   |Set @Товар = ?
   |SELECT                      
   |    SUM($Рег.ОстатокТовара) as ОстатокТовара
   |FROM
   |    $РегистрИтоги.ОстаткиТоваров as Рег
   |WHERE
   |    Рег.Period = CAST(@ДатаОст AS DateTime)
   |    AND $Рег.Склад = @Склад
   |    AND $Рег.Товар = @Товар";
                     
   RS.Подготовить(ТекстЗапроса);
   RS.ДобПараметр(1,14,8,0);
   RS.ДобПараметр(1,14,9,0);
   RS.ДобПараметр(1,14,9,0);
   //RS.ПостроитьПараметры();                                                  
   
   Д = Формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД");
   RS.УстПараметр(1, Д);
   RS.УстПараметр(2, Склад);
функция
       RS.УстПараметр(3, ТекущийЭлемент());
       Остаток = RS.ВыполнитьСкалярный();
       Возврат (Остаток)
28 monsterZE
 
17.11.12
13:08
вероятно с ПостроитьПараметры() тоже бы все работало..
надо чаще проверять входящие параметры 8-)
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.