powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / Прямой запрос на 1с 7.7 к базе данных mssql 2008r2 с использованием динамического списка.
7 сообщений из 7, страница 1 из 1
Прямой запрос на 1с 7.7 к базе данных mssql 2008r2 с использованием динамического списка.
    #38330021
brain-5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые форумчане! У меня возникла такая ситуация: "Есть прямой запрос на sql к базе, который дважды выбирает один и тот же документ в подзапросе". На дбф формате процедура выглядит так:
Функция ВернутьсуммуОплаты(ДокОсн)
Сум=0;
ДокПодчиненные = СоздатьОБъект("Документ");
Если ПустоеЗначение(ДокОсн)=0 Тогда
Если СписокДок.НайтиЗначение(ДокОсн)=0 Тогда
Если ДокПодчиненные.ВыбратьПодчиненныеДокументы(,,ДокОсн) = 1 Тогда
Пока ДокПодчиненные.ПолучитьДокумент() = 1 Цикл
Если ДокПодчиненные.Проведен() = 0 Тогда
Продолжить;
КонецЕсли;
Если ДокПодчиненные.Вид() = "РКО" Тогда
Сум=ДокПодчиненные.Сумма+Сум;
КонецЕсли;
КонецЦикла;
КонецЕсли;
СписокДок.ДобавитьЗначение(ДокОсн);
КонецЕсли;
КонецЕсли;
Возврат Сум;
КонецФункции

А запрос так:

"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|Обрабатывать НеПомеченныеНаУдаление;
|ТекущийДокумент = Документ.ПоступлениеТМЦ.ТекущийДокумент;
|Фирма = Документ.ПоступлениеТМЦ.Фирма;
|КодОперации = Документ.ПоступлениеТМЦ.КодОперации;
|ДатаДок = Документ.ПоступлениеТМЦ.ДатаДок;
|ДатаВык = Документ.ПоступлениеТМЦ.ДатаВык;
|Номенклатура = Документ.ПоступлениеТМЦ.Номенклатура;
|Цена = Документ.ПоступлениеТМЦ.Цена;
|ЦенаВык = Документ.ПоступлениеТМЦ.ЦенаВыкупа;
|Оценка = Документ.ПоступлениеТМЦ.Номенклатура.Оценка;
|Сумма = Документ.ПоступлениеТМЦ.Сумма;
|ЦенаВДрМаг = Документ.ПоступлениеТМЦ.ЦенаВДругомМагазине;
|Источник = Документ.ПоступлениеТМЦ.ИсточникРознЦеныВДругомМагазине;
|Функция ОбщСумма = Сумма(Сумма);
|Функция СуммаОплаты = Сумма(ВернутьСуммуОплаты(ТекущийДокумент));
|Функция СуммаОплатыВык = Сумма(ВернутьСуммуОплатыВык(ТекущийДокумент));
|Функция ОбщЦенаВык = Сумма(ЦенаВык);
|";

Вот мой текст на скл:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
[color=blue]  	
SELECT  
  	SUM(Док.sp1574) AS ОбщСумма,
 	SUM(Док.sp9176) AS ОбщЦенаВык,  
	COUNT(Док.IDDoc ) as kol,
   (SUM( ДокРКО.СуммаОплаты_ ))  AS СуммаОплаты,
	SUM(ДокВозвратПоставщику.СуммаОплатыВык_) AS СуммаОплатыВык
 ,Док.IDDoc as  [ТекущийДокумент $Документ.ПоступлениеТМЦ], 
 GROUPING(Док.IDDoc) AS _1 ,
Док.sp1569 as [Номенклатура $Справочник.Номенклатура],  
 GROUPING(Док.sp1569) AS _2 FROM
 _1SJourn Жур 
 INNER JOIN
 dt1582 as Док ON Док.IDDoc=Жур.IDDoc   
 INNER JOIN
 dh1582 as ДокТМЦ ON ДокТМЦ.IDDoc=Жур.IDDoc
 INNER JOIN   
 		(SELECT 
		SUBSTRING(Отбор.ParentVal,7,LEN(Отбор.ParentVal)-6) AS Child,
		SUM(Док3.sp2232) AS СуммаОплаты_
		FROM   
 		_1SJourn AS Жур1 
 		INNER JOIN
		_1SCRDOC AS Отбор ON Отбор.ChildID = Жур1.IDDoc AND Отбор.MDID = 0
		INNER JOIN 
		dh2225 AS Док3 ON Отбор.ChildID=Док3.IDDoc
		WHERE      
		Отбор.Child_Date_Time_IDDoc BETWEEN '20130502' AND '20130502Z' AND
 		Жур1.Closed & 1 = 1
		GROUP BY
		SUBSTRING(Отбор.ParentVal,7,LEN(Отбор.ParentVal)-6)) 
		AS ДокРКО ON  REPLACE(ДокРКО.Child,' ','')=REPLACE(Жур.IDDoc,' ','')      
 LEFT OUTER JOIN   
 		(SELECT 
		SUBSTRING(Отбор.ParentVal,7,LEN(Отбор.ParentVal)-6) AS Child,
		SUM(ДокПКО1.СуммаОплатыВык_) AS СуммаОплатыВык_
		FROM   
 		_1SJourn AS Жур1 
 		INNER JOIN
		_1SCRDOC AS Отбор ON Отбор.ChildID = Жур1.IDDoc AND Отбор.MDID = 0
		INNER JOIN 
		dt1684 AS Док1 ON Отбор.ChildID=Док1.IDDoc  
 		INNER JOIN   
 			(SELECT 
			SUBSTRING(Отбор1.ParentVal,7,LEN(Отбор1.ParentVal)-6) AS Child,
			SUM(Док1.sp2203) AS СуммаОплатыВык_
			FROM   
 			_1SJourn AS Жур2 
 			INNER JOIN
			_1SCRDOC AS Отбор1 ON Отбор1.ChildID = Жур2.IDDoc AND Отбор1.MDID = 0
			INNER JOIN 
			dh2196 AS Док1 ON Отбор1.ChildID=Док1.IDDoc
			WHERE      
			Отбор1.Child_Date_Time_IDDoc BETWEEN '20130502' AND '20130502Z' AND
 			Жур2.Closed & 1 = 1
			GROUP BY
			SUBSTRING(Отбор1.ParentVal,7,LEN(Отбор1.ParentVal)-6)) 
			AS ДокПКО1 ON  REPLACE(ДокПКО1.Child,' ','')=REPLACE(Жур1.IDDoc,' ','')
		WHERE      
		Отбор.Child_Date_Time_IDDoc BETWEEN '20130502' AND '20130502Z' AND
 		Жур1.Closed & 1 = 1
		GROUP BY
		SUBSTRING(Отбор.ParentVal,7,LEN(Отбор.ParentVal)-6)) 
		AS ДокВозвратПоставщику ON  REPLACE(ДокВозвратПоставщику.Child,' ','')=REPLACE(Жур.IDDoc,' ','')
 
  WHERE 
 Жур.Date_Time_IDDoc BETWEEN '20130502' AND '20130502Z' AND
 Жур.Closed & 1 = 1  AND Жур.sp4056 IN (SELECT Val FROM #ГруппаФирмы) GROUP BY GROUPING SETS((Док.IDDoc  , Док.sp1569), (Док.IDDoc  ), ()) ORDER BY Док.IDDoc  , Док.sp1569,_1 DESC,_2 DESC[/color]



Вопрос в том, что мне надо в результирующей выборке получить сумму по документу один раз, который потом встречается еще несколько раз, а у меня суммируется по два раза по документу, если в этом документе две номенклатуры (группировка по номенклатуре), как можно это сделать на sql?
...
Рейтинг: 0 / 0
Прямой запрос на 1с 7.7 к базе данных mssql 2008r2 с использованием динамического списка.
    #38330091
сначала приведите Ваш код к виду 1с++ запросов.
почитайте про nolock и индексы.
...
Рейтинг: 0 / 0
Прямой запрос на 1с 7.7 к базе данных mssql 2008r2 с использованием динамического списка.
    #38330094
ON REPLACE(ДокРКО.Child,' ','')=REPLACE(Жур.IDDoc,' ','')

не нужны

SUBSTRING(Отбор1.ParentVal,7,LEN(Отбор1.ParentVal)-6) AS Child

тоже - бред

GROUP BY GROUPING

то же.

спросите на мисте. там есть добрый епрст он Вам подскажет.
...
Рейтинг: 0 / 0
Прямой запрос на 1с 7.7 к базе данных mssql 2008r2 с использованием динамического списка.
    #38330100
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы хотите сумму по документу? А зачем тогда обращаетесь к номенклатуре?...

Пример простенький напишите - что вы хотите.
...
Рейтинг: 0 / 0
Прямой запрос на 1с 7.7 к базе данных mssql 2008r2 с использованием динамического списка.
    #38330607
brain-5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, что не написал в виде 1с++, это я готовый текст скопировал с отладки, а так я строкой строю. Обращаюсь к номенклатуре, потому что нужна группировка по номенклатуре. Можно взять пример не с моего примера, а так, что мне нужно реализовать такую штуку, т.е. есть документы и есть подчиненные документы, мне нужно, чтобы в переборе по подчиненным документам обрабатывать только один документ, без повтора, а на дбф запросе, там используется список, в который добавляются документы, по которым была выборка, и , соответственно, если потом встретится такой документ, он уже не берется и сумма становится нормальной. А у меня берется несколько раз. Просто я хочу реализовать это в одном запросе.
...
Рейтинг: 0 / 0
Прямой запрос на 1с 7.7 к базе данных mssql 2008r2 с использованием динамического списка.
    #38330608
brain-5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Меня волнует значение переменной СуммаОплаты
...
Рейтинг: 0 / 0
Прямой запрос на 1с 7.7 к базе данных mssql 2008r2 с использованием динамического списка.
    #38330681
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понятно, как приведенный код 7.7 соотносится с озвученой задачей.

Вы хотите по группировке позиций приходного/расходного документа получить суммы оплат?

Если бизнес-процессы позволяют утверждать, что всегда подчиненным документом оплачивается 100%, то:
1. Групируете номенклатуру нужных документов и сумму по ним.
2. Подбираете нужные документы оплаты.
3. Через case указываете оплаченную сумму,по условию null, для документа оплаты.

Если нельзя утверждать вышесказанное, то к вышеуказанному:
1. Добавляем нумерацию и джойним полученную группировку поступлений/продаж саму на себя получая еще нарстающуюю сумму по строкам документа.
2. Case применяем относительно нарастающей суммы.

ЗЫ С вашим where работать будет дольше, чем через платформу. При join`нах отбор по таблицам надо делать в условиях соединений. Итоговое условие должно отсекать то лишне, что образовалось в процессе соединения.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / Прямой запрос на 1с 7.7 к базе данных mssql 2008r2 с использованием динамического списка.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]