Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Помогите с параметризованным запросом (число прочтений - 3613 )
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Помогите с параметризованным запросом
02. Сентября 2011 :: 08:07
Печать  
Собственно подготавливаю запрос при открытии формы.
     РС = СоздатьОбъект("ODBCRecordset");
     КолПараметровКоличества = 1;
     ТекстЗапроса = "
     |SELECT
     |  $Рег.Количество as Количество
     |FROM
     |  $РегистрИтоги.ОстаткиТМЦ as Рег
     |WHERE
     |  Рег.Period = ?";
     Если ПустоеЗначение(ФирмаДляОстатковТМЦ) = 0 Тогда
           ТекстЗапроса = ТекстЗапроса + "
           | AND $Рег.Фирма = ?";
     КонецЕсли;
     Если ПустоеЗначение(Склад) = 0 Тогда
           ТекстЗапроса = ТекстЗапроса + "
           | AND $Рег.Склад = ?";
     КонецЕсли;
     ТекстЗапроса = ТекстЗапроса + "
     | AND $Рег.Номенклатура = ?";
     РС.Подготовить(ТекстЗапроса);
     рс.ПостроитьПараметры();
     РС.УстПараметр(КолПараметровКоличества,НачМесяца(ТекущаяДата()));

далее в функции выполняю запрос

Если ПустоеЗначение(ФирмаДляОстатковТМЦ) = 0 Тогда
           КолПараметровКоличества = КолПараметровКоличества + 1;
           РС.УстПараметр(КолПараметровКоличества,ФирмаДляОстатковТМЦ);
     КонецЕсли;
     Если ПустоеЗначение(Склад) = 0 Тогда
           КолПараметровКоличества = КолПараметровКоличества + 1;
           РС.УстПараметр(КолПараметровКоличества,Склад);
     КонецЕсли;
     КолПараметровКоличества = КолПараметровКоличества + 1;
     РС.УстПараметр(КолПараметровКоличества,ТекущийЭлемент());
     КолПараметровКоличества = 1;
     Возврат СокрЛП(Формат(РС.ВыполнитьСкалярный(),"Ч014.3"));

Вопрос в следующем не могу понять как мне поступить перед изменением фильтра. Например склад пустой соответствено необходимо остаток по все складам получить. только когда меняешь запрос ошибка. типа нельзя так как соединение используется КАК ПОСТУПИТЬ?? Ужас
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #1 - 02. Сентября 2011 :: 08:58
Печать  
Никто не знает ???
Наверняка есть способ изменить фильтр выборки!
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #2 - 02. Сентября 2011 :: 09:14
Печать  
Вот еще проблема хочу получить последнюю цену позиции в подпоре создаю запрос

РС2 = СоздатьОбъект("ODBCRecordset");
     ТекстЗапроса = "
     |Select
     |      $ПоследнееЗначение.Цены.Цена(СпрЦены.ID,:ДатаЦены~);
     |FROM
     |      $Справочник.Цены СпрЦены
     |WHERE
     |      $СпрЦ.Владелец = ? AND
     |   $СпрЦ.ТипЦен = ?
     |";
     РС2.УстановитьТекстовыйПараметр("ДатаЦены",ТекущаяДата());
     РС2.Подготовить(ТекстЗапроса);
     РС2.ПостроитьПараметры();

Выполняю

Функция ПолучитьЦену()
     РС2.УстПараметр(2,ТекущийЭлемент());
     РС2.УстПараметр(3,ТипЦен);
     Возврат СокрЛП(Формат(РС2.ВыполнитьСкалярный(),"Ч015.2"));
     //ЦенаТекНоменклатуры
КонецФункции

И пишет, что индекс параметра указан не верно !?
С 1 тоже пробовал в чем загвоздка?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #3 - 02. Сентября 2011 :: 09:29
Печать  
mozer писал(а) 02. Сентября 2011 :: 08:58:
Никто не знает ???
Наверняка есть способ изменить фильтр выборки!

так пиши свой запрос к таблице итого этого регистра.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #4 - 02. Сентября 2011 :: 09:33
Печать  
Z1 писал(а) 02. Сентября 2011 :: 09:29:
mozer писал(а) 02. Сентября 2011 :: 08:58:
Никто не знает ???
Наверняка есть способ изменить фильтр выборки!

так пиши свой запрос к таблице итого этого регистра.

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #5 - 02. Сентября 2011 :: 09:36
Печать  
(2) Да не нужен тебе параметризированный запрос.
Делай все параметры через УстановитьТекстовыйПараметр
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #6 - 02. Сентября 2011 :: 09:37
Печать  
mozer писал(а) 02. Сентября 2011 :: 09:33:
Z1 писал(а) 02. Сентября 2011 :: 09:29:
mozer писал(а) 02. Сентября 2011 :: 08:58:
Никто не знает ???
Наверняка есть способ изменить фильтр выборки!

так пиши свой запрос к таблице итого этого регистра.

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

свое сумирование без виртуальной таблицы.

  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #7 - 02. Сентября 2011 :: 09:41
Печать  
Z1 писал(а) 02. Сентября 2011 :: 09:37:
mozer писал(а) 02. Сентября 2011 :: 09:33:
Z1 писал(а) 02. Сентября 2011 :: 09:29:
mozer писал(а) 02. Сентября 2011 :: 08:58:
Никто не знает ???
Наверняка есть способ изменить фильтр выборки!

так пиши свой запрос к таблице итого этого регистра.

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

свое сумирование без виртуальной таблицы.


А другого способа нет? Идея у меня была следующая. если допустим склад пустой, тогда переписать текст запроса без параметра склад... и будет тебе счастье, ан нет выборка открыта и она не дает менять текст запроса. Как то можно это обойти ? для примера 1 пост
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #8 - 02. Сентября 2011 :: 09:59
Печать  
Z1 писал(а) 02. Сентября 2011 :: 09:36:
(2) Да не нужен тебе параметризированный запрос.
Делай все параметры через УстановитьТекстовыйПараметр

невозможно если писать простой запрос, то тормоза дикие.
Поясню этот запрос используется для вывода остатка в форме подбора! Тоже хочу написать для получения цены пока засада
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #9 - 02. Сентября 2011 :: 10:04
Печать  
если тормоза дикие,
то это скорее всего не из-за текстовый-параметр vs sql-параметр
а из-за не попадания условия в индекс
  

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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #10 - 02. Сентября 2011 :: 10:09
Печать  
trad писал(а) 02. Сентября 2011 :: 10:04:
если тормоза дикие,
то это скорее всего не из-за текстовый-параметр vs sql-параметр
а из-за не попадания условия в индекс

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #11 - 02. Сентября 2011 :: 10:10
Печать  
mozer писал(а) 02. Сентября 2011 :: 09:59:
Z1 писал(а) 02. Сентября 2011 :: 09:36:
(2) Да не нужен тебе параметризированный запрос.
Делай все параметры через УстановитьТекстовыйПараметр

невозможно если писать простой запрос, то тормоза дикие.
Поясню этот запрос используется для вывода остатка в форме подбора! Тоже хочу написать для получения цены пока засада

Ну мы наверное не поняли друг друга.
покажи запрос на котором "тормоза дикие"
ошибка в #2 в  том что нумерацию параметров ты почему то начал с 2 а не с 1
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #12 - 02. Сентября 2011 :: 10:25
Печать  
Процедура ПодготовитьЗапрос();
     //ХВС_Начало Создадим параметризованый запрос для получения остатка
     ТекстЗапроса = "
     |SELECT
     |  $Рег.Количество as Количество
     |FROM
     |  $РегистрИтоги.ОстаткиТМЦ as Рег
     |WHERE
     |  Рег.Period = :ВыбДата~";
     Если ПустоеЗначение(ФирмаДляОстатковТМЦ) = 0 Тогда
           ТекстЗапроса = ТекстЗапроса + "
           | AND $Рег.Фирма = :ВыбФирма";
     КонецЕсли;
     Если ПустоеЗначение(Склад) = 0 Тогда
           ТекстЗапроса = ТекстЗапроса + "
           | AND $Рег.Склад = :ВыбСклад";
     КонецЕсли;
     ТекстЗапроса = ТекстЗапроса + "
     | AND $Рег.Номенклатура = :ВыбНом";
КонецПроцедуры

Функция ПолучитьОстаток()
     РС.УстановитьТекстовыйПараметр("ВыбДата",НачМесяца(ТекущаяДата()));
     Если ПустоеЗначение(ФирмаДляОстатковТМЦ) = 0 Тогда
           РС.УстановитьТекстовыйПараметр("ВыбФирма",ФирмаДляОстатковТМЦ);
     КонецЕсли;
     Если ПустоеЗначение(Склад) = 0 Тогда
           РС.УстановитьТекстовыйПараметр("ВыбСклад",Склад);
     КонецЕсли;
     РС.УстановитьТекстовыйПараметр("ВыбНом",ТекущийЭлемент());
     Возврат СокрЛП(Формат(РС.ВыполнитьСкалярный(ТекстЗапроса),"Ч014.3"));
     //ПолучитьОстатокЗаполнитьЦену()
КонецФункции

в таком варианте вообще не работает
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #13 - 02. Сентября 2011 :: 10:29
Печать  
потому что в Рег.Period  должна быть datetime а у тебя передается строка.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Помогите с параметризованным запросом
Ответ #14 - 02. Сентября 2011 :: 10:29
Печать  
старыйзапрос с тормозами я пох#рил. Щас вспомню что там было ?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать