Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) громоздкий запрос (число прочтений - 7839 )
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
громоздкий запрос
16. Июня 2009 :: 06:56
Печать  
Имеется достаточно громоздкий запрос.

ТекстЗапроса=ТекстЗапроса+"  
//Товар    
|Товар=Справочник.Товары.ТекущийЭлемент,
|Регистр.ОстаткиТоваров.Товар,
|Регистр.Закупки.Товар,
|Регистр.ВозвратыПоставщику.Товар,
|Регистр.Продажа.Товар,
|Регистр.ВозвратПокупателя.Товар,                    
|Регистр.Списания.Товар,
|Регистр.Комиссия.Товар,
|Регистр.Заказы.Товар,        
|Регистр.Clients_Account.Goods,
|Регистр.Расчет.Goods,      
|Регистр.ВозвратДенег.Goods;  
//Поставщик  
|Поставщик=Справочник.Товары.ТекущийЭлемент.Поставщик,
|Регистр.ОстаткиТоваров.Товар.Поставщик,
|Регистр.Закупки.Товар.Поставщик,
|Регистр.ВозвратыПоставщику.Товар.Поставщик,
|Регистр.Продажа.Товар.Поставщик,
|Регистр.ВозвратПокупателя.Товар.Поставщик,                    
|Регистр.Списания.Товар.Поставщик,
|Регистр.Комиссия.Товар.Поставщик,
|Регистр.Заказы.Товар.Поставщик,
|Регистр.Clients_Account.Goods.Поставщик,
|Регистр.Расчет.Goods.Поставщик,
|Регистр.ВозвратДенег.Goods.Поставщик;
//Склад
|Склад=Регистр.ОстаткиТоваров.Склад,
|Регистр.Закупки.Склад,
|Регистр.ВозвратыПоставщику.Склад,
|Регистр.Продажа.Склад,
|Регистр.ВозвратПокупателя.Склад,                    
|Регистр.Списания.Склад;
//Количество
|ОстКол=     Регистр.ОстаткиТоваров.ОстатокТовара;
|ОстЗак=     Регистр.Закупки.ОстатокТовара;
|ОстВозПост= Регистр.ВозвратыПоставщику.ОстатокТовара;
|ОстПрод=    Регистр.Продажа.ОстатокТовара;
|ОстВозПокуп=Регистр.ВозвратПокупателя.ОстатокТовара;
|ОстСпис=    Регистр.Списания.ОстатокТовара;
|КомисСбор=    Регистр.Комиссия.Комиссия;
|Зак=        Регистр.Заказы.Количество;
|Ф_Ост_Кол=  Регистр.Clients_Account.quantity;
|ФО_Ост_Кол=  Регистр.Расчет.quantity;
|ФВ_Ост_Кол=  Регистр.ВозвратДенег.quantity;
//Сумма
|ОстКолС=     Регистр.ОстаткиТоваров.БазоваяСтоимость;
|ОстЗакС=     Регистр.Закупки.БазоваяСтоимость;
|ОстВозПостС= Регистр.ВозвратыПоставщику.ВалютнаяСтоимость;
|ОстПродС=    Регистр.Продажа.ВалютнаяСтоимость;
|ОстВозПокупС=Регистр.ВозвратПокупателя.ВалютнаяСтоимость;
|ОстСписС=    Регистр.Списания.ВалютнаяСтоимость;
|Cl_am = Регистр.Clients_Account.Client_Amount;
|Cl_am_O = Регистр.Расчет.Client_Amount;
|Cl_am_В = Регистр.ВозвратДенег.Client_Amount;
//Баланс по продажам
|ОстПродСБ=    Регистр.Продажа.БалСтоимость;
|ОстВозПокупСБ=Регистр.ВозвратПокупателя.БалСтоимость;
|Cst = Регистр.Clients_Account.Cost;
|Cst_O = Регистр.Расчет.Cost;
|Cst_В = Регистр.ВозвратДенег.Cost;
|";          
ТекстЗапроса=ТекстЗапроса+"
|Функция КОстКол=  КонОст(ОстКол);
|Функция НОстКол=  НачОст(ОстКол);
|Функция КОстКолС= КонОст(ОстКолС);
|Функция НОстКолС= НачОст(ОстКолС);
|Функция КЗак=     КонОст(Зак);
|Функция КОст_Ф =  КонОст(Ф_Ост_Кол);
|Функция НОст_Ф =  НачОст(Ф_Ост_Кол);
|Функция КОст_ФС = КонОст(Cl_am);
|Функция НОст_ФС = НачОст(Cl_am);
|Функция КОст_ФБ = КонОст(Cst);
|Функция НОст_ФБ = НачОст(Cst);
// Деньги приход
|Функция КОБ_Ф =   КонОст(ФО_Ост_Кол);
|Функция КОБ_ФС =  КонОст(Cl_am_O);
|Функция КОБ_ФБ =  КонОст(Cst_O);
|Функция НОБ_Ф =   НачОст(ФО_Ост_Кол);
|Функция НОБ_ФС =  НачОст(Cl_am_O);
|Функция НОБ_ФБ =  НачОст(Cst_O);
// Деньги возврат
|Функция КВБ_Ф =   КонОст(ФВ_Ост_Кол);
|Функция КВБ_ФС =  КонОст(Cl_am_В);
|Функция КВБ_ФБ =  КонОст(Cst_В);
|Функция НВБ_Ф =   НачОст(ФВ_Ост_Кол);
|Функция НВБ_ФС =  НачОст(Cl_am_В);
|Функция НВБ_ФБ =  НачОст(Cst_В);
// Закупки
|Функция ООстЗак=  Сумма(ОстЗак);
//|Функция НОстЗак=  НачОст(ОстЗак);
|Функция ООстЗакС= Сумма(ОстЗакС);
//|Функция НОстЗакС= НачОст(ОстЗакС);
// Возвраты Поставщику
|Функция КОстВозПост=  КонОст(ОстВозПост);
|Функция НОстВозПост=  НачОст(ОстВозПост);
|Функция КОстВозПостС= КонОст(ОстВозПостС);
|Функция НОстВозПостС= НачОст(ОстВозПостС);
//Продажи                                
|Функция КОстПрод=   КонОст(ОстПрод);
|Функция НОстПрод=   НачОст(ОстПрод);
|Функция КОстПродС=  КонОст(ОстПродС);
|Функция НОстПродС=  НачОст(ОстПродС);
|Функция КОстПродСБ= КонОст(ОстПродСБ);
|Функция НОстПродСБ= НачОст(ОстПродСБ);
// Возвраты покупателей
|Функция КОстВозПокуп=   КонОст(ОстВозПокуп);
|Функция НОстВозПокуп=   НачОст(ОстВозПокуп);
|Функция КОстВозПокупС=  КонОст(ОстВозПокупС);
|Функция НОстВозПокупС=  НачОст(ОстВозПокупС);
|Функция КОстВозПокупСБ= КонОст(ОстВозПокупСБ);
|Функция НОстВозПокупСБ= НачОст(ОстВозПокупСБ);
// Комиссия
|Функция НКом=     НачОст(КомисСбор);
|Функция ККом=     КонОст(КомисСбор);
// Списания
|Функция КОстСпис=  КонОст(ОстСпис);
|Функция НОстСпис=  НачОст(ОстСпис);
|Функция КОстСписС= КонОст(ОстСписС);
|Функция НОстСписС= НачОст(ОстСписС);
|";    
плюс всякие условия и группировки.

Вопрос. Как его наименнее геморойно перевести в прямой запрос?

Видится через Union по каждому отдельному регистру. Но возможно есть метод оптимальней?
Можно ли это сделать автоматически Плагином для OpenConf, аналог конструктора запросов 1Cv8?
(вот этим http://www.1cpp.ru/forum/YaBB.pl?num=1148127139/0)
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: громоздкий запрос
Ответ #1 - 16. Июня 2009 :: 07:10
Печать  
Bibr писал(а) 16. Июня 2009 :: 06:56:
Имеется достаточно громоздкий запрос.
...
плюс всякие условия и группировки.

Вопрос. Как его наименнее геморойно перевести в прямой запрос?

Видится через Union по каждому отдельному регистру. Но возможно есть метод оптимальней?
Можно ли это сделать автоматически Плагином для OpenConf, аналог конструктора запросов 1Cv8?
(вот этим http://www.1cpp.ru/forum/YaBB.pl?num=1148127139/0)


Руками.
Смотря какой объем и что в результате нужно получить. Возможно придется выполнять отдельными запросами закидывая во временную таблицу, а может и сразу все. Смотреть нужно...
Попробуй. Я поначалу также плагином пользовался - сейчас проще самому писать.
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #2 - 16. Июня 2009 :: 07:58
Печать  
Дык вот интересно, как руками.

Можно попробовать через COALESCE, можно через Union.
Может еще варианты есть, но пока не вижу.
установил конструктор, ковыряюсь. но пока переводчика из 1С  в прямые запросы не увидел. Видимо его и нет.
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: громоздкий запрос
Ответ #3 - 16. Июня 2009 :: 08:07
Печать  
Ну дык если тяжко понимается то делай сначала отдельные селекты по каждому регистру. Дальше пробуй объединить.
Могу сразу сказать что //Поставщик у тебя явно лишняя секция, т.к. ты берешь его из справочника Товары и соответственно можешь приджойнить в конце запроса. Ну и т.д.
В общем - пробуй. Мы все когда-то начинали...
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #4 - 16. Июня 2009 :: 08:30
Печать  
Я-то думал мне тут щас готовенький запрос сразу...  Смех
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: громоздкий запрос
Ответ #5 - 16. Июня 2009 :: 08:33
Печать  
Форумы для того что-бы помочь а не сделать за тебя работу. Так что ты слегка промахнулся.  Улыбка
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: громоздкий запрос
Ответ #6 - 16. Июня 2009 :: 11:08
Печать  
Bibr писал(а) 16. Июня 2009 :: 07:58:
Дык вот интересно, как руками.

Можно попробовать через COALESCE, можно через Union.
Может еще варианты есть, но пока не вижу.
установил конструктор, ковыряюсь. но пока переводчика из 1С  в прямые запросы не увидел. Видимо его и нет.

только не union а  union all.
Если начало периода это начало месяца а конец периода то написать не очень сложно на основе только rg таблиц
(иначе объеденять с ra несколько муторно но тоже вполне возможно ).
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #7 - 17. Июня 2009 :: 08:32
Печать  
Есть у меня 2 запроса по разным регистрам:
Код
Выбрать все
	ТекстЗ = "
	|SELECT                    
	|	Рег.Товар as [Товар $Справочник.Товары],
	|	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
	|	Рег.БазоваяСтоимостьКонечныйОстаток as КОстКолС,  
	|	Рег.ОстатокТовараНачальныйОстаток as НОстКол,  
	|	Рег.ОстатокТовараКонечныйОстаток as КОстКол    
	|FROM
	|	Склад,"Склад","ВыбСклад")+") AND ("+ОтборПоСпр(рс,ВыбТовар,"Товар","ВыбТовар")+"),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег
	|ORDER BY
	|	Рег.Товар
	|";       



и

Код
Выбрать все
	ТекстЗ = "
	|SELECT                    
	|	Рег.Товар as [Товар $Справочник.Товары],
	|	Рег.ВалютнаяСтоимостьНачальныйОстаток as НОстВозПостС,  
	|	Рег.ВалютнаяСтоимостьКонечныйОстаток as КОстВозПостС,
	|	Рег.ОстатокТовараНачальныйОстаток as НОстВозПост,  
	|	Рег.ОстатокТовараКонечныйОстаток as КОстВозПост
	|FROM
	|	,ВыбСклад,"Склад","ВыбСклад")+") AND ("+ОтборПоСпр(рс,ВыбТовар,"Товар","ВыбТовар")+"),(Товар), (ВалютнаяСтоимость,ОстатокТовара)) as Рег
	|ORDER BY
	|	Рег.Товар
	|";      
 



Они работают.
как теперь объединить их в один?
Union не подходит, т.к. набор полей разный.

т.к. по одному товару могут быть движения по одному регистру, а по другому - по другом, И нужны все данные, то предполагаю что поможет мне FULL JOIN.
Тогда:
Код
Выбрать все
SELECT                    
	Рег.Товар as [Товар $Справочник.Товары],
	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
	Рег.БазоваяСтоимостьКонечныйОстаток as КОстКолС,  
	Рег.ОстатокТовараНачальныйОстаток as НОстКол,  
	Рег.ОстатокТовараКонечныйОстаток as КОстКол    
FROM
	$РегистрОстаткиОбороты.ОстаткиТоваров(:НачДата,:КонДата~,,,,(1=1) AND (Товар IN (SELECT Val FROM #ВыбТовар)),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег

FULL JOIN
(	SELECT                    
	Рег1.Товар as [Товар $Справочник.Товары],    
	Рег1.БазоваяСтоимостьОборот as ООстЗакС,  
	Рег1.ОстатокТовараОборот as ООстЗак      
FROM
	$РегистрОбороты.Закупки(:НачДата,:КонДата~,,,(1=1) AND (Товар IN (SELECT Val FROM #ВыбТовар)),(Товар), (БазоваяСтоимость,ОстатокТовара)) ) as Рег1 ON (Рег.Товар = Рег1.Товар) 



но выдает ошибку:
The column prefix 'Рег1' does not match with a table name or alias name used in the query.

Подскажите в чем ошибка
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: громоздкий запрос
Ответ #8 - 17. Июня 2009 :: 09:08
Печать  
Код
Выбрать все
SELECT
|   Подзапрос.Товар as [Товар $Справочник.Товары],
|   SUM(Подзапрос.НОстКолС) as НОстКолС,
|   SUM(Подзапрос.НОстВозПостС) as НОстВозПостС
| FROM
|(
|SELECT			  
|	Рег.Товар as Товар ,
|	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
|	 0 as  НОстВозПостС
|FROM
|	Склад,"Склад","ВыбСклад")+") AND ("+ОтборПоСпр(рс,ВыбТовар,"Товар","ВыбТовар")+"),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег
|UNION ALL
|SELECT			  
|	Рег2.Товар ,
|	 0 ,	  
|	Рег2.ВалютнаяСтоимостьНачальныйОстаток  
|
|FROM
|	,ВыбСклад,"Склад","ВыбСклад")+") AND ("+ОтборПоСпр(рс,ВыбТовар,"Товар","ВыбТовар")+"),(Товар), (ВалютнаяСтоимость,ОстатокТовара)) as Рег2
|) as Подзапрос
|GROUP BY Подзапрос.Товар 



для простоты 2 остатка.
аналогично много функций и много таблиц
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: громоздкий запрос
Ответ #9 - 17. Июня 2009 :: 09:14
Печать  
Код
Выбрать все
 ON (Рег1.Товар = Рег.Товар)
 

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


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #10 - 17. Июня 2009 :: 09:24
Печать  
kiruha писал(а) 17. Июня 2009 :: 09:08:
для простоты 2 остатка.
аналогично много функций и много таблиц


да, похожий вариант на форуме находил. еще не пробовал его реализовывать, т.к. у меня 11 регистров и итого 47 полей остатков.
11*47 = 517 строк, из которых 450 будет типа "0 as ..."
Некрасиво получится.
Хочу все-таки сначала так попробовать. не получится - сделаю через Union.

leov-001 писал(а) 17. Июня 2009 :: 09:14:
Код
Выбрать все
 ON (Рег1.Товар = Рег.Товар)
 



так в чем ошибка? две таблицы, два поля. что не так?
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #11 - 17. Июня 2009 :: 10:14
Печать  
Не вижу разницы например с этим:
Способ 2: Если флаг не стоит
Код
Выбрать все
ТекстЗапроса = "
|SELECT
|    Рег.IDDoc as [Док $Документ],
|    Жур.IDDocDef as Док_вид,
|    $Рег.Склад as [Склад $Справочник.Склады],
|    $Рег.Товар as [Товар $Справочник.Номенклатура],
|    $Рег.Количество as Количество
|FROM
|    $Регистр.ОстаткиТоваров as Рег
|INNER JOIN
|    _1Sjourn as Жур ON Жур.IDDoc = Рег.IDDoc
|WHERE
|    Рег.IDDoc = :ВыбДок"; 



вроде бы точно такой же join.
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: громоздкий запрос
Ответ #12 - 17. Июня 2009 :: 11:20
Печать  
Bibr писал(а) 17. Июня 2009 :: 09:24:
leov-001 писал(а) 17. Июня 2009 :: 09:14:
Код
Выбрать все
 ON (Рег1.Товар = Рег.Товар)
 



так в чем ошибка? две таблицы, два поля. что не так?


Джойниш Рег1 так ипиши его первым.

Код
Выбрать все
_1Sjourn as Жур ON Жур.IDDoc = Рег.IDDoc

 



Здесь ведь правильно приДжойнил
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: громоздкий запрос
Ответ #13 - 17. Июня 2009 :: 14:20
Печать  
Увы, проблему не решило.

Правда ошибка изменилась:
The column prefix 'Рег1' does not match with a table name or alias name used in the query.

запрос такой:
Код
Выбрать все
SELECT                    
	Рег.Товар as [Товар $Справочник.Товары],
	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
	Рег.БазоваяСтоимостьКонечныйОстаток as КОстКолС,  
	Рег.ОстатокТовараНачальныйОстаток as НОстКол,  
	Рег.ОстатокТовараКонечныйОстаток as КОстКол    
FROM
	$РегистрОстаткиОбороты.ОстаткиТоваров(:НачДата,:КонДата~,,,,(1=1) AND (Товар = :ВыбТовар),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег

FULL JOIN
(	SELECT                    
	Рег1.Товар as [Товар $Справочник.Товары],    
	Рег1.БазоваяСтоимостьОборот as ООстЗакС,  
	Рег1.ОстатокТовараОборот as ООстЗак      
FROM
	$РегистрОбороты.Закупки(:НачДата,:КонДата~,,,(1=1) AND (Товар = :ВыбТовар),(Товар), (БазоваяСтоимость,ОстатокТовара)) ) as Рег1 ON (Рег1.Товар = Рег.Товар) 

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


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: громоздкий запрос
Ответ #14 - 17. Июня 2009 :: 15:18
Печать  
Код
Выбрать все
SELECT                    
	Рег.Товар as [Товар $Справочник.Товары],
	Рег.БазоваяСтоимостьНачальныйОстаток as НОстКолС,
	Рег.БазоваяСтоимостьКонечныйОстаток as КОстКолС,  
	Рег.ОстатокТовараНачальныйОстаток as НОстКол,  
	Рег.ОстатокТовараКонечныйОстаток as КОстКол    
FROM
	$РегистрОстаткиОбороты.ОстаткиТоваров(:НачДата,:КонДата~,,,,(1=1) AND (Товар = :ВыбТовар),(Товар), (БазоваяСтоимость,ОстатокТовара)) as Рег

FULL JOIN
(	SELECT                    
	Рег1.Товар as [Товар $Справочник.Товары],    
	Рег1.БазоваяСтоимостьОборот as ООстЗакС,  
	Рег1.ОстатокТовараОборот as ООстЗак      
FROM
	$РегистрОбороты.Закупки(:НачДата,:КонДата~,,,(1=1) AND (Товар = :ВыбТовар),(Товар), (БазоваяСтоимость,ОстатокТовара)) Рег1) as Рег1 ON (Рег1.Товар = Рег.Товар)

 


зы: я б делал через union all. И там же у вас еще группировки по Складу и поставщику. Почему джойн только по Товару тогда? А склад не во всех регистрах есть. гм Озадачен
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать