Переключение на Главную Страницу Страницы: 1 ... 3 4 [5]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Запрос к ТЧ разных документов (число прочтений - 12898 )
Ivanych
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 50
Зарегистрирован: 21. Февраля 2012
Re: Запрос к ТЧ разных документов
Ответ #60 - 12. Марта 2012 :: 11:50
Печать  
Eprst писал(а) 12. Марта 2012 :: 11:37:
Ivanych писал(а) 12. Марта 2012 :: 11:19:
Я приводил все ТМЦ в запросе к неопределенному виду и типизировать как Неопределенный


^) В каком месте ?

Нужно достраивать поле до тип+вид+id  - у тебя этого нет нигде.


    RS = СоздатьОбъект("ODBCRecordset");
     RS.УстБД1С();
     ТекстЗапроса = "
     |SELECT
     |       TMP.Склад as [Склад $Справочник.МестаХранения],
     |    TMP.ТМЦ as [ТМЦ $Неопределенный],
     |    SUM(TMP.Количество) as Количество,      
     |    SUM(TMP.Сумма) as Сумма      
     |FROM
     |(
     |SELECT
     |    $Док.Склад as [Склад],
     |    $ДокС.ТМЦ as [ТМЦ],
     |    $ДокС.Количество as Количество,
     |    $ДокС.Сумма as Сумма
     |FROM
     |    $ДокументСтроки.РеализацияТоваров as ДокС
     |INNER JOIN
     |    $Документ.РеализацияТоваров as Док ON Док.IDDoc = ДокС.IDDoc
     |                                  " + ?( ВыбСклад.Выбран()=1, "AND $Док.Склад IN (SELECT Val FROM #ГруппаСклад)", "") + "
     |                                  " + ?( ВыбТМЦ.Выбран()=1, "AND $ДокС.ТМЦ IN (SELECT Val FROM #ГруппаТМЦ)", "") + "
     |INNER JOIN
     |    _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc AND
     |                       Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
     |                       Жур.Closed & 1 = 1
     |UNION ALL
     |SELECT
     |    $Док14.Склад as [Склад],
     |    $ДокС14.ТМЦ as [ТМЦ], 
     |    -($ДокС14.Количество) as Количество,
     |    -($ДокС14.Сумма) as Сумма
     |FROM
     |    $ДокументСтроки.ВозвратОтПокупателя as ДокС14
     |INNER JOIN
     |    $Документ.ВозвратОтПокупателя as Док14 ON Док14.IDDoc = ДокС14.IDDoc
     |                                  " + ?( ВыбСклад.Выбран()=1, "AND $Док14.Склад IN (SELECT Val FROM #ГруппаСклад)", "") + "
     |                                  " + ?( ВыбТМЦ.Выбран()=1, "AND ДокС14.ТМЦ IN (SELECT Val FROM #ГруппаТМЦ)", "") + "
     |INNER JOIN
     |    _1SJourn as Жур ON Жур.IDDoc = ДокС14.IDDoc AND
     |                       Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
     |                       Жур.Closed & 1 = 1
     |) AS TMP
     |
     |GROUP BY
     |    TMP.Склад, TMP.ТМЦ WITH ROLLUP";
     RS.УстановитьТекстовыйПараметр("ВыбСклад1", ВыбСклад);
     RS.УложитьСписокОбъектов(ВыбСклад, "#ГруппаСклад", "МестаХранения");
     RS.УложитьСписокОбъектов(ВыбТМЦ, "#ГруппаТМЦ", "Номенклатура");
     RS.УстановитьТекстовыйПараметр("НачДата", ВыбНачПериода);
     RS.УстановитьТекстовыйПараметр("КонДата", ВыбКонПериода);
     ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);

Где то, чего то не дописал, судя по всему?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос к ТЧ разных документов
Ответ #61 - 12. Марта 2012 :: 12:44
Печать  
Сначала написал функцию для укладки во временную таблицу 23
Код
Выбрать все
Функция СоздатьСписок_23(rc,ПапкаСписок,ОсновноеИмя,Имя_23)
	Если ПустоеЗначение(ПапкаСписок) = 1 Тогда
		Сообщить("Нельзя с пустым элементом");
		return -1;
	КонецЕсли;
	Если ПустоеЗначение(ОсновноеИмя) = 1 Тогда
		Сообщить("Нельзя с пустым именем вспомагат таблицы");
		return -1;
	КонецЕсли;
	Имя_23 = ОсновноеИмя + "_23";
	meta = СоздатьОбъект("MetaDataWork");
	Зн_Стр =  Глоб_meta.ЗначениеВСамуюДлиннуюСтрокуБД(ПапкаСписок) ;
	ЛевСтр_6  = Лев(Зн_Стр,6);
	ПравСтр_8 = Прав(Зн_Стр,8);

	попытка
		ТекстЗапроса = "drop table "+Имя_23;
		rc.ВыполнитьСкалярный(ТекстЗапроса);
	Исключение
	КонецПопытки;
	Список_1 = СоздатьОбъект("СписокЗначений");
	Список_1.ДобавитьЗначение(ПапкаСписок,"");
	rc.УложитьСписокОбъектов(Список_1, ОсновноеИмя, СокрЛП(ПапкаСписок.Вид()) );
	ТЗ101 =  rc.ВыполнитьИнструкцию("select val from " + ОсновноеИмя);
	ТекстЗапроса = "create table " + Имя_23 + " (
	|val char(23),
	|CONSTRAINT PK0_"+ СтрЗаменить(Имя_23,"#","") + "  PRIMARY KEY (val)
	|)";
	попытка
		rc.ВыполнитьСкалярный(ТекстЗапроса);
	Исключение
		Сообщить("Ошибка 1 все остановили");
		return -2 ;
	КонецПопытки;
	ТекстЗАпроса =
	"insert into "+ Имя_23 +"(val) select '"+ ЛевСтр_6 + "' + val + '"+ ПравСтр_8 +"' from " + ОсновноеИмя;
	попытка
		rc.ВыполнитьСкалярный(ТекстЗапроса);
	Исключение
		Сообщить("Ошибка 2 все остановили");
		return -3;
	КонецПопытки;

	return 1;

КонецФункции

Процедура Сформировать()
	rc = СоздатьОбъект("ODBCRecordSet");
	Имя_23 = "";
	рез = СоздатьСписок_23(rc, ВыбТМЦ,"#СписокТМЦ",Имя_23);
	Если рез <= 0 Тогда
		Сообщить("Ошибка выполнения");
		return;
	КонецЕсли;


	ТЗ101 =  rc.ВыполнитьИнструкцию("select val from " + Имя_23);
	ТЗ101.ВыбратьСтроку();

КонецПроцедуры

 



(Ivanych) проверь что код этого поста работает.(у меня работает но у меня нет вообще неопределенных реквизитов)
после этого можно будет и сам запрос написать.
  
Наверх
 
IP записан
 
Ivanych
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 50
Зарегистрирован: 21. Февраля 2012
Re: Запрос к ТЧ разных документов
Ответ #62 - 13. Марта 2012 :: 03:33
Печать  
Z1 писал(а) 12. Марта 2012 :: 12:44:
Сначала написал функцию для укладки во временную таблицу 23
Код
Выбрать все
Функция СоздатьСписок_23(rc,ПапкаСписок,ОсновноеИмя,Имя_23)
	Если ПустоеЗначение(ПапкаСписок) = 1 Тогда
		Сообщить("Нельзя с пустым элементом");
		return -1;
	КонецЕсли;
	Если ПустоеЗначение(ОсновноеИмя) = 1 Тогда
		Сообщить("Нельзя с пустым именем вспомагат таблицы");
		return -1;
	КонецЕсли;
	Имя_23 = ОсновноеИмя + "_23";
	meta = СоздатьОбъект("MetaDataWork");
	Зн_Стр =  Глоб_meta.ЗначениеВСамуюДлиннуюСтрокуБД(ПапкаСписок) ;
	ЛевСтр_6  = Лев(Зн_Стр,6);
	ПравСтр_8 = Прав(Зн_Стр,8);

	попытка
		ТекстЗапроса = "drop table "+Имя_23;
		rc.ВыполнитьСкалярный(ТекстЗапроса);
	Исключение
	КонецПопытки;
	Список_1 = СоздатьОбъект("СписокЗначений");
	Список_1.ДобавитьЗначение(ПапкаСписок,"");
	rc.УложитьСписокОбъектов(Список_1, ОсновноеИмя, СокрЛП(ПапкаСписок.Вид()) );
	ТЗ101 =  rc.ВыполнитьИнструкцию("select val from " + ОсновноеИмя);
	ТекстЗапроса = "create table " + Имя_23 + " (
	|val char(23),
	|CONSTRAINT PK0_"+ СтрЗаменить(Имя_23,"#","") + "  PRIMARY KEY (val)
	|)";
	попытка
		rc.ВыполнитьСкалярный(ТекстЗапроса);
	Исключение
		Сообщить("Ошибка 1 все остановили");
		return -2 ;
	КонецПопытки;
	ТекстЗАпроса =
	"insert into "+ Имя_23 +"(val) select '"+ ЛевСтр_6 + "' + val + '"+ ПравСтр_8 +"' from " + ОсновноеИмя;
	попытка
		rc.ВыполнитьСкалярный(ТекстЗапроса);
	Исключение
		Сообщить("Ошибка 2 все остановили");
		return -3;
	КонецПопытки;

	return 1;

КонецФункции

Процедура Сформировать()
	rc = СоздатьОбъект("ODBCRecordSet");
	Имя_23 = "";
	рез = СоздатьСписок_23(rc, ВыбТМЦ,"#СписокТМЦ",Имя_23);
	Если рез <= 0 Тогда
		Сообщить("Ошибка выполнения");
		return;
	КонецЕсли;


	ТЗ101 =  rc.ВыполнитьИнструкцию("select val from " + Имя_23);
	ТЗ101.ВыбратьСтроку();

КонецПроцедуры

 



(Ivanych) проверь что код этого поста работает.(у меня работает но у меня нет вообще неопределенных реквизитов)
после этого можно будет и сам запрос написать.

Спасибо обязательно попробую, как только разберусь что к чему.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос к ТЧ разных документов
Ответ #63 - 13. Марта 2012 :: 06:05
Печать  
(62) Функция СоздатьСписок_23 укладывает во временную таблицу
папку или элемент конкретного справочника
т.е полная аналогия к rc.УложитьСписокОбъектов
только укладывает в char(23) c типом 1с неопределенный
параметры
rc                    
ПапкаСписок    элемент или папка справочника
ОсновноеИмя   имя временной таблицы ( в нее укладывается стандартным образом)
Имя_23 выход. параметр имя верменной таблицы где будут размещены элементы справочника но с длиной 23

написал еще один тест. функция работает правильно
вот тест

Код
Выбрать все
Процедура Сформировать()
	rc = СоздатьОбъект("ODBCRecordSet");
	Имя_23 = "";
	рез = СоздатьСписок_23(rc, ВыбТовар,"#СписокТМЦ",Имя_23);
	Если рез <= 0 Тогда
		Сообщить("Ошибка выполнения");
		return;
	КонецЕсли;

	ТекстЗапроса =  "select val [Знач $Неопределеный] from " + Имя_23;
	ТЗ102 =  rc.ВыполнитьИнструкцию(ТекстЗапроса);
	ТЗ102.ВыбратьСтроку();
КонецПроцедуры

 


  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 3 4 [5] 
ОтправитьПечать