Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Запрос по Регистрам Остатов (число прочтений - 3039 )
Oleg
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 2
Зарегистрирован: 25. Ноября 2008
Запрос по Регистрам Остатов
13. Августа 2009 :: 08:10
Печать  
Делаю запрос по остаткамТМЦ и резервомТМЦ, вывожу три колонки (Остаток-Резерв),Остаток,Резерв.Но он мне выдает в первой 0 во второй 6441 в третьей 0, но там где есть резерв вычитает как надо.

     Перем тз; //:ТаблицаЗначений
     
     рс = СоздатьОбъект("ODBCRecordset");
     //Данный фрагмент построен конструктором.
     //При повторном использовании конструктора внесенные вручную изменения будут потеряны!!!
     ТекстЗапроса = "-- qryMaker:Отчет1.2009.07.31.12.02.54
         |SELECT
           |Номенклатура.ID [Номенклатур $Справочник.Номенклатура]
         |, (ОстаткиТМЦОстатки.КоличествоОстаток - РезервыТМЦОстатки.КоличествоОстаток) Остаток
         |, ОстаткиТМЦОстатки.КоличествоОстаток Остаток
           |,РезервыТМЦОстатки.КоличествоОстаток Резервы
       |FROM $Справочник.Номенклатура AS Номенклатура
       |    LEFT JOIN $РегистрОстатки.ОстаткиТМЦ(:КонДата ~,
       |        INNER JOIN $Справочник.Номенклатура AS Номенклатура1 ON Номенклатура1.ID = Номенклатура,
       |        (Склад = :ВыбСклад)
           |            AND (Фирма = :Фирма)
       |        AND ($Номенклатура1.ИспользуетсяКПК = 1),
       |        Номенклатура,) AS ОстаткиТМЦОстатки ON Номенклатура.ID = ОстаткиТМЦОстатки.Номенклатура
       |    LEFT JOIN $РегистрОстатки.РезервыТМЦ(,
       |        INNER JOIN $Справочник.Номенклатура AS Номенклатура2 ON Номенклатура2.ID = Номенклатура,
       |        (Склад = :ВыбСклад)
           |            AND (Фирма = :Фирма)
       |        AND ($Номенклатура2.ИспользуетсяКПК = 1),
       |        Номенклатура,) AS РезервыТМЦОстатки ON Номенклатура.ID = РезервыТМЦОстатки.Номенклатура
       |WHERE ($Номенклатура.ИспользуетсяКПК = 1)
           |     AND (ОстаткиТМЦОстатки.КоличествоОстаток >=0) OR (РезервыТМЦОстатки.КоличествоОстаток >=0)
             |";
     рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
     рс.УстановитьТекстовыйПараметр("ВыбСклад", ВыбСклад);
     рс.УстановитьТекстовыйПараметр("Фирма", Фирма);
     тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
     тз.ВыбратьСтроку();
     Табл=СоздатьОбъект("Таблица");
     Табл.ИсходнаяТаблица("Таблица");
     Табл.ВывестиСекцию("Шапка");
     тз.ВыбратьСтроки();
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Запрос по Регистрам Остатов
Ответ #1 - 13. Августа 2009 :: 08:54
Печать  
Для таких вещей используй агрегирование.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по Регистрам Остатов
Ответ #2 - 13. Августа 2009 :: 09:02
Печать  
Наверное надо делать так:
Код
Выбрать все
(isnull(ОстаткиТМЦОстатки.КоличествоОстаток,0) - isnull(РезервыТМЦОстатки.КоличествоОстаток,0)) Остаток 


т.к. {NULL} минус/плюс/умножить... {Любое число} = NULL
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос по Регистрам Остатов
Ответ #3 - 13. Августа 2009 :: 11:00
Печать  
Теоретически вообще лучше использовать union all имхо... а не left join
Удобнее + достовернее (всяко в жизни бывает), а если структура регистров отличается то совсем удобно
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Oleg
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 2
Зарегистрирован: 25. Ноября 2008
Re: Запрос по Регистрам Остатов
Ответ #4 - 13. Августа 2009 :: 11:25
Печать  
JohnyDeath писал(а) 13. Августа 2009 :: 09:02:
Наверное надо делать так:
Код
Выбрать все
(isnull(ОстаткиТМЦОстатки.КоличествоОстаток,0) - isnull(РезервыТМЦОстатки.КоличествоОстаток,0)) Остаток 


т.к. {NULL} минус/плюс/умножить... {Любое число} = NULL

Спасибо, помоглоПодмигивание
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по Регистрам Остатов
Ответ #5 - 13. Августа 2009 :: 11:45
Печать  
Вадимко писал(а) 13. Августа 2009 :: 11:00:
Теоретически вообще лучше использовать union all имхо... а не left join
Удобнее + достовернее (всяко в жизни бывает), а если структура регистров отличается то совсем удобно

Нифига не удобнее. Это надо в каждый из юнионов вставлять все поля из других.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос по Регистрам Остатов
Ответ #6 - 13. Августа 2009 :: 12:16
Печать  
Теоретически может оказаться резерв без остатка Улыбка
Про различия в структуре уже и не говорю - может выйти задвоение строк
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос по Регистрам Остатов
Ответ #7 - 13. Августа 2009 :: 12:19
Печать  
Вадимко писал(а) 13. Августа 2009 :: 11:00:
Теоретически вообще лучше использовать union all имхо... а не left join
Удобнее + достовернее (всяко в жизни бывает), а если структура регистров отличается то совсем удобно

Соглашусь с Вадимко
ИХМО union all меньше нагружает sql server чем left
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по Регистрам Остатов
Ответ #8 - 13. Августа 2009 :: 13:28
Печать  
Вадимко писал(а) 13. Августа 2009 :: 12:16:
Теоретически может оказаться резерв без остатка Улыбка

И что? Соединение-то идет к номенклатуре.
Вадимко писал(а) 13. Августа 2009 :: 12:16:
Про различия в структуре уже и не говорю - может выйти задвоение строк

Это да, надо в каждом джойне делать GROUP BY по номенклатуре.

Просто буквально вчера писал большой запрос с 15-ю показателями и практически все из разных табличек. Начинал делать с юнион, но уже после 7-го юниона переписал всё под левое соединение чему очень даже рад. Про скорость ничего сказать не могу, но особого падения я не заметил. А вот добавлять каждый раз по строчке в каждый из подзапросов + в нужном порядке = напряжно. А если же надо было отладить запрос без, например, третьего подзапроса - вообще жесть начинается (может, конечно, я что-то не так делал).
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос по Регистрам Остатов
Ответ #9 - 13. Августа 2009 :: 13:42
Печать  
JohnyDeath писал(а) 13. Августа 2009 :: 13:28:
Вадимко писал(а) 13. Августа 2009 :: 12:16:
Теоретически может оказаться резерв без остатка Улыбка

И что? Соединение-то идет к номенклатуре.
Вадимко писал(а) 13. Августа 2009 :: 12:16:
Про различия в структуре уже и не говорю - может выйти задвоение строк

Это да, надо в каждом джойне делать GROUP BY по номенклатуре.

Просто буквально вчера писал большой запрос с 15-ю показателями и практически все из разных табличек. Начинал делать с юнион, но уже после 7-го юниона переписал всё под левое соединение чему очень даже рад. Про скорость ничего сказать не могу, но особого падения я не заметил. А вот добавлять каждый раз по строчке в каждый из подзапросов + в нужном порядке = напряжно. А если же надо было отладить запрос без, например, третьего подзапроса - вообще жесть начинается (может, конечно, я что-то не так делал).

ну на то он и sql что в каждом конкретном случае нужен
свой подход ( меня всегда удивляет как всего в нескольких
определениях sql вместили такой емкий язык )
Мой ответ больше относился с учетом 0 subj.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос по Регистрам Остатов
Ответ #10 - 17. Августа 2009 :: 10:37
Печать  
JohnyDeath писал(а) 13. Августа 2009 :: 13:28:
И что? Соединение-то идет к номенклатуре.


Не увидел что запрос выбирает из номенклатуры
Не знаю толком про распараллеливание, но думаю что union all не так уж и плох
  

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