Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Запрос Остатки-Резервы (число прочтений - 3553 )
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Запрос Остатки-Резервы
13. Декабря 2011 :: 17:01
Печать  
Видимо я чего-то недопонимаю, но
такие запросы работают корректно и их разница соответствует правде в БД

стрдатыТА = Строка(Формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД"));
               
                 ТекстЗапроса = "
                 |SELECT
                 |      SUM($Рег.Количество) Количество
                 |FROM
                 |      $РегистрИтоги.ОстаткиТМЦ Рег With (NOLOCK)
                 |INNER JOIN
                 |      $Справочник.Фирмы СпрФ With (NOLOCK) ON СпрФ.ID = $Рег.Фирма AND
                 |                                            $СпрФ.УпрАналитика = :УпрАналитика
                 |WHERE
                 |      Рег.PERIOD= cast ('"+стрдатыТА+"'as datetime) AND
                 |      $Рег.Номенклатура = :Номенклатура AND
                 |      $Рег.Склад = :Склад";
                 
                 RS.УстановитьТекстовыйПараметр("УпрАналитика",      лКонстантаУпрАналитика);
                 RS.УстановитьТекстовыйПараметр("Номенклатура",      ТекНоменклатура);
                 RS.УстановитьТекстовыйПараметр("Склад",                  ТекСклад);
                 
                 ОстатокНаСкладе = RS.ВыполнитьСкалярный(ТекстЗапроса);
                 
                 ТекстЗапроса = "
                 |SELECT
                 |      SUM($Рег.Количество) Количество
                 |FROM
                 |      $РегистрИтоги.РезервыТМЦ Рег With (NOLOCK)
                 |INNER JOIN
                 |      $Справочник.Фирмы СпрФ With (NOLOCK) ON СпрФ.ID = $Рег.Фирма AND
                 |                                            $СпрФ.УпрАналитика = :УпрАналитика
                 |WHERE
                 |      Рег.PERIOD= cast ('"+стрдатыТА+"'as datetime) AND
                 |      $Рег.Номенклатура = :Номенклатура AND
                 |      $Рег.Склад = :Склад";
                 
                 RS.УстановитьТекстовыйПараметр("УпрАналитика",      лКонстантаУпрАналитика);
                 RS.УстановитьТекстовыйПараметр("Номенклатура",      ТекНоменклатура);
                 RS.УстановитьТекстовыйПараметр("Склад",                  ТекСклад);
                 
                 РезервНаСкладе = RS.ВыполнитьСкалярный(ТекстЗапроса);

ОстатокБезРезерва = ОстатокНаСкладе-РезервНаСкладе;

В вот такой запрос выдает фигню:

ТекстЗапроса = "
                 |SELECT
                 |      SUM($РегОст.Количество)-SUM($РегРез.Количество) Количество
                 |FROM
                 |      $РегистрИтоги.ОстаткиТМЦ РегОст With (NOLOCK)
                 |LEFT JOIN
                 |      $РегистрИтоги.РезервыТМЦ РегРез With (NOLOCK) ON $РегРез.Фирма=$РегОст.Фирма
                 |                                                                         AND $РегРез.Номенклатура=$РегОст.Номенклатура
                 |                                                                         AND $РегРез.Склад=$РегОст.Склад
                 |                                                                         AND РегРез.PERIOD= cast ('"+стрдатыТА+"'as datetime)
                 |INNER JOIN
                 |      $Справочник.Фирмы СпрФ With (NOLOCK) ON СпрФ.ID = $РегОст.Фирма AND
                 |                                            $СпрФ.УпрАналитика = :УпрАналитика
                 |WHERE
                 |      РегОст.PERIOD= cast ('"+стрдатыТА+"'as datetime) AND
                 |      $РегОст.Номенклатура = :Номенклатура AND
                 |      $РегОст.Склад = :Склад";
                 
                 RS.УстановитьТекстовыйПараметр("УпрАналитика",      лКонстантаУпрАналитика);
                 RS.УстановитьТекстовыйПараметр("Номенклатура",      ТекНоменклатура);
                 RS.УстановитьТекстовыйПараметр("Склад",                  ТекСклад);
                 
                 ОстатокБезРезерва2 = RS.ВыполнитьСкалярный(ТекстЗапроса);

Видимо где-то я недопонимаю.

Помогите разобраться, пожалуйста
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос Остатки-Резервы
Ответ #1 - 13. Декабря 2011 :: 17:20
Печать  
первый  вариант пиши через union all
получишь тз из двух строк
сложи(отними)  их в 1с или можно пойти дальше и сложить в sql
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Запрос Остатки-Резервы
Ответ #2 - 13. Декабря 2011 :: 17:24
Печать  
А соединением никак не получится?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос Остатки-Резервы
Ответ #3 - 13. Декабря 2011 :: 17:31
Печать  
Foma писал(а) 13. Декабря 2011 :: 17:24:
А соединением никак не получится?

в этом нет никакого смысла ( по крайней мере для того как написано в 0)
У самого написано как в 1. По каждой таблице работает свой индекс
если соеденение то многовариантность где есть а где нет данного товара в конкретном периоде для каждой таблицы
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Запрос Остатки-Резервы
Ответ #4 - 13. Декабря 2011 :: 17:39
Печать  
Еще вопрос.
Я так понимаю, что запросы будут выполняться быстрее, если у измерений регистров "Фирма", "Склад", "Номенклатура" будут установлены галочки "Отбор итогов"?
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Запрос Остатки-Резервы
Ответ #5 - 13. Декабря 2011 :: 17:44
Печать  
Переписал запрос:

ТекстЗапроса = "
                 |SELECT
                 |      SUM(РегИтоги.КоличествоОст)-SUM(РегИтоги.КоличествоРез) as Количество
                 |FROM(
                 |      SELECT
                 |            $Рег.Количество КоличествоОст
                 |            ,0 КоличествоРез
                 |      FROM
                 |            $РегистрИтоги.ОстаткиТМЦ Рег With (NOLOCK)
                 |      INNER JOIN
                 |            $Справочник.Фирмы СпрФ With (NOLOCK) ON СпрФ.ID = $Рег.Фирма AND
                 |                                                  $СпрФ.УпрАналитика = :УпрАналитика
                 |      WHERE
                 |            Рег.PERIOD= cast ('"+стрдатыТА+"'as datetime) AND
                 |            $Рег.Номенклатура = :Номенклатура AND
                 |            $Рег.Склад = :Склад
                 |
                 |UNION ALL
                 |
                 |      SELECT
                 |            0 КоличествоОст
                 |            ,$Рег.Количество КоличествоРез
                 |      FROM
                 |            $РегистрИтоги.РезервыТМЦ Рег With (NOLOCK)
                 |      INNER JOIN
                 |            $Справочник.Фирмы СпрФ With (NOLOCK) ON СпрФ.ID = $Рег.Фирма AND
                 |                                                  $СпрФ.УпрАналитика = :УпрАналитика
                 |      WHERE
                 |            Рег.PERIOD= cast ('"+стрдатыТА+"'as datetime) AND
                 |            $Рег.Номенклатура = :Номенклатура AND
                 |            $Рег.Склад = :Склад
                 |      ) РегИтоги
                 |";
                 
                 RS.УстановитьТекстовыйПараметр("УпрАналитика",      лКонстантаУпрАналитика);
                 RS.УстановитьТекстовыйПараметр("Номенклатура",      ТекНоменклатура);
                 RS.УстановитьТекстовыйПараметр("Склад",                  ТекСклад);
                 
                 ОстатокБезРезерва2 = RS.ВыполнитьСкалярный(ТекстЗапроса);

Но выдает ошибку
State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Недопустимое имя столбца "sp4475"

Этот столбец - реквизит "Фирма" в Регистре.РезервыТМЦ

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


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Запрос Остатки-Резервы
Ответ #6 - 13. Декабря 2011 :: 17:56
Печать  
Странно, переписал вот так - заработало:

ТекстЗапроса = "
                 |SELECT
                 |      SUM(РегИтоги.КоличествоОст)-SUM(РегИтоги.КоличествоРез) as Количество
                 |FROM(
                 |      SELECT
                 |            $РегОст.Количество КоличествоОст
                 |            ,0 КоличествоРез
                 |      FROM
                 |            $РегистрИтоги.ОстаткиТМЦ РегОст With (NOLOCK)
                 |      INNER JOIN
                 |            $Справочник.Фирмы СпрФ With (NOLOCK) ON СпрФ.ID = $РегОст.Фирма AND
                 |                                                  $СпрФ.УпрАналитика = :УпрАналитика
                 |      WHERE
                 |            РегОст.PERIOD= cast ('"+стрдатыТА+"'as datetime) AND
                 |            $РегОст.Номенклатура = :Номенклатура AND
                 |            $РегОст.Склад = :Склад
                 |
                 |UNION ALL
                 |
                 |      SELECT
                 |            0 КоличествоОст
                 |            ,$РегРез.Количество КоличествоРез
                 |      FROM
                 |            $РегистрИтоги.РезервыТМЦ РегРез With (NOLOCK)
                 |      INNER JOIN
                 |            $Справочник.Фирмы СпрФ With (NOLOCK) ON СпрФ.ID = $РегРез.Фирма AND
                 |                                                  $СпрФ.УпрАналитика = :УпрАналитика
                 |      WHERE
                 |            РегРез.PERIOD= cast ('"+стрдатыТА+"'as datetime) AND
                 |            $РегРез.Номенклатура = :Номенклатура AND
                 |            $РегРез.Склад = :Склад
                 |      ) РегИтоги
                 |";
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Запрос Остатки-Резервы
Ответ #7 - 13. Декабря 2011 :: 17:59
Печать  
Вопрос #4 остается открытым, подскажите
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Запрос Остатки-Резервы
Ответ #8 - 13. Декабря 2011 :: 18:20
Печать  
Будут, если потом попадешь в индекс по новому индексному полю.

Только лучше ставить индекс на быструю обработку движений регистра
  
Наверх
 
IP записан
 
Foma
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 61
Зарегистрирован: 16. Сентября 2010
Re: Запрос Остатки-Резервы
Ответ #9 - 13. Декабря 2011 :: 18:47
Печать  
#8 а как это делается, можете объяснить или отослать к какому-нибудь мануалу?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Запрос Остатки-Резервы
Ответ #10 - 14. Декабря 2011 :: 03:41
Печать  
Цитата:
Но выдает ошибку
State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Недопустимое имя столбца "sp4475"

К сожалению, это у метапарсера такая фишка. Если в двух подзапросах одинаковые алиасы, то в качестве реальной таблицы (и типа) берётся первая.
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Запрос Остатки-Резервы
Ответ #11 - 14. Декабря 2011 :: 08:37
Печать  
Foma писал(а) 13. Декабря 2011 :: 18:47:
#8 а как это делается, можете объяснить или отослать к какому-нибудь мануалу?


Редактирование регистра.
Галочка "Быстрая обработка движений".
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать