Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Запрос по документам (число прочтений - 4865 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос по документам
Ответ #15 - 21. Июля 2009 :: 12:58
Печать  
так работает ???
Код
Выбрать все
|SELECT top 100
|	Жур.IDDoc as [Док $Документ],
|	Жур.IDDocDef as Док_вид,
|	Жур.$ОбщийРеквизит.Фирма as [Фирма $Справочник.Фирмы]
|FROM
|	_1SJourn AS Жур
|INNER JOIN
|	_1SCRDOC AS Отбор ON Отбор.ChildID = Жур.IDDoc
|WHERE
|	Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
|	Жур.Closed & 1 = 1
|";
 

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



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Запрос по документам
Ответ #16 - 21. Июля 2009 :: 13:28
Печать  
Судя по тому, какой запрос ты переписываешь, потом начнешь документы джойнить... может проще сначала
Код
Выбрать все
SELECT Sum(РВ.Сумма) FROM
  (SELECT Д.Сумма FROM $ДокументСтроки.Реализация Д
     JOIN Журнал
	   WHERE $Д.Контаргент in (SELECT Val FROM #Контрагенты) (плюс условия на Журнал по дате, неудаленности и проч)
UNION ALL
 SELECT Д.Сумма FROM ...то же самое по Возврату...) 

  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос по документам
Ответ #17 - 21. Июля 2009 :: 14:08
Печать  
могу предложить такой вариант:
Код
Выбрать все
	ТекстЗапроса="
	|select
	|  max(j.iddoc) [Док $Документ],
	|  max(j.iddocdef) Док_вид,
	|  max(isnull($Док1.Контрагент, $Док2.Контрагент)) [Контрагент $Справочник.Контрагенты],
	|  /*Сумма*/ Сумма
	|from _1sjourn j (nolock)
	|/*ОтборПоКонтрагенту*/
	|left join $Документ.Реализация Док1 (nolock) on Док1.iddoc = j.iddoc
	|left join $Документ.ВозвратОтПокупателя Док2 (nolock) on Док2.iddoc = j.iddoc
	|left join $ДокументСтроки.Реализация СтрокиДок1 (nolock) on СтрокиДок1.iddoc = j.iddoc
	|left join $ДокументСтроки.ВозвратОтПокупателя СтрокиДок2 (nolock) on СтрокиДок2.iddoc = j.iddoc
	|where j.date_time_iddoc between :НачДата and :КонДата~
	|  and j.iddocdef in ($ВидДокумента.Реализация, $ВидДокумента.ВозвратОтПокупателя)
	|  and j.ismark = 0
	|  /*ОтборПоНоменклатуре*/
	|group by j.date_time_iddoc
	|order by j.date_time_iddoc
	|";
	рс=СоздатьОбъект("ODBCRecordset");
	//рс.Отладка(1);

	Если ВыбНоменклатура.Выбран() = 1 Тогда
		 $СтрокиДок2.Сумма))");
		Если ВыбНоменклатура.ЭтоГруппа() = 1 Тогда
			рс.УложитьСписокОбъектов(ВыбНоменклатура,"#tmp1","Номенклатура");
			ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*ОтборПоНоменклатуре*/","and isnull($СтрокиДок1.Номенклатура, $СтрокиДок2.Номенклатура) in (select #tmp1.val from #tmp1)");
		Иначе
			рс.УстановитьТекстовыйПараметр("ВыбНоменклатура",ВыбНоменклатура);
			ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*ОтборПоНоменклатуре*/","and isnull($СтрокиДок1.Номенклатура, $СтрокиДок2.Номенклатура) = :ВыбНоменклатура");
		КонецЕсли;
	Иначе
		ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*Сумма*/","max(isnull($Док1.Сумма, $Док2.Сумма))");
	КонецЕсли;

	Если ВыбКонтрагент.Выбран() = 1 Тогда
		Если ВыбКонтрагент.ЭтоГруппа() = 1 Тогда
			рс.УложитьСписокОбъектов(ВыбКонтрагент,"#tmp2","Контрагенты");
			ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*ОтборПоКонтрагенту*/","
			|join _1scrdoc cr (nolock) on cr.mdid = $ГрафаОтбора.Контрагент
			|				 and cr.child_date_time_iddoc between :НачДата and :КонДата~
			|				 and cr.child_date_time_iddoc = j.date_time_iddoc
			|join #tmp2 on 'B1'+$ВидСправочника36.Контрагенты+#tmp2.val = cr.parentval
			|");
		Иначе
			рс.УстановитьТекстовыйПараметр("ВыбКонтрагент",ВыбКонтрагент);
			ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*ОтборПоКонтрагенту*/","
			|join _1scrdoc cr (nolock) on cr.mdid = $ГрафаОтбора.Контрагент
			|				 and cr.parentval = :ВыбКонтрагент*
			|				 and cr.child_date_time_iddoc between :НачДата and :КонДата~
			|				 and cr.child_date_time_iddoc = j.date_time_iddoc
			|");
		КонецЕсли;
	КонецЕсли;

	рс.УстановитьТекстовыйПараметр("НачДата",НачДата);
	рс.УстановитьТекстовыйПараметр("КонДата",КонДата);
	Рез=рс.ВыполнитьИнструкцию(ТекстЗапроса);
 


Проверено на рабочей базе на правильность данных и на эффективность построения планов запросов.
ВАЖНО: статистика таблиц _1sjourn и _1scrdoc должна быть свежей!
  

1&&2&&3
Наверх
 
IP записан
 
jeniazzz
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 21. Июля 2009
Re: Запрос по документам
Ответ #18 - 22. Июля 2009 :: 07:04
Печать  
trad писал(а) 21. Июля 2009 :: 14:08:
могу предложить такой вариант:
Код
Выбрать все
	ТекстЗапроса="
	|select
	|  max(j.iddoc) [Док $Документ],
	|  max(j.iddocdef) Док_вид,
	|  max(isnull($Док1.Контрагент, $Док2.Контрагент)) [Контрагент $Справочник.Контрагенты],
	|  /*Сумма*/ Сумма
	|from _1sjourn j (nolock)
	|/*ОтборПоКонтрагенту*/
	|left join $Документ.Реализация Док1 (nolock) on Док1.iddoc = j.iddoc
	|left join $Документ.ВозвратОтПокупателя Док2 (nolock) on Док2.iddoc = j.iddoc
	|left join $ДокументСтроки.Реализация СтрокиДок1 (nolock) on СтрокиДок1.iddoc = j.iddoc
	|left join $ДокументСтроки.ВозвратОтПокупателя СтрокиДок2 (nolock) on СтрокиДок2.iddoc = j.iddoc
	|where j.date_time_iddoc between :НачДата and :КонДата~
	|  and j.iddocdef in ($ВидДокумента.Реализация, $ВидДокумента.ВозвратОтПокупателя)
	|  and j.ismark = 0
	|  /*ОтборПоНоменклатуре*/
	|group by j.date_time_iddoc
	|order by j.date_time_iddoc
	|";
	рс=СоздатьОбъект("ODBCRecordset");
	//рс.Отладка(1);

	Если ВыбНоменклатура.Выбран() = 1 Тогда
		 $СтрокиДок2.Сумма))");
		Если ВыбНоменклатура.ЭтоГруппа() = 1 Тогда
			рс.УложитьСписокОбъектов(ВыбНоменклатура,"#tmp1","Номенклатура");
			ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*ОтборПоНоменклатуре*/","and isnull($СтрокиДок1.Номенклатура, $СтрокиДок2.Номенклатура) in (select #tmp1.val from #tmp1)");
		Иначе
			рс.УстановитьТекстовыйПараметр("ВыбНоменклатура",ВыбНоменклатура);
			ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*ОтборПоНоменклатуре*/","and isnull($СтрокиДок1.Номенклатура, $СтрокиДок2.Номенклатура) = :ВыбНоменклатура");
		КонецЕсли;
	Иначе
		ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*Сумма*/","max(isnull($Док1.Сумма, $Док2.Сумма))");
	КонецЕсли;

	Если ВыбКонтрагент.Выбран() = 1 Тогда
		Если ВыбКонтрагент.ЭтоГруппа() = 1 Тогда
			рс.УложитьСписокОбъектов(ВыбКонтрагент,"#tmp2","Контрагенты");
			ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*ОтборПоКонтрагенту*/","
			|join _1scrdoc cr (nolock) on cr.mdid = $ГрафаОтбора.Контрагент
			|				 and cr.child_date_time_iddoc between :НачДата and :КонДата~
			|				 and cr.child_date_time_iddoc = j.date_time_iddoc
			|join #tmp2 on 'B1'+$ВидСправочника36.Контрагенты+#tmp2.val = cr.parentval
			|");
		Иначе
			рс.УстановитьТекстовыйПараметр("ВыбКонтрагент",ВыбКонтрагент);
			ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"/*ОтборПоКонтрагенту*/","
			|join _1scrdoc cr (nolock) on cr.mdid = $ГрафаОтбора.Контрагент
			|				 and cr.parentval = :ВыбКонтрагент*
			|				 and cr.child_date_time_iddoc between :НачДата and :КонДата~
			|				 and cr.child_date_time_iddoc = j.date_time_iddoc
			|");
		КонецЕсли;
	КонецЕсли;

	рс.УстановитьТекстовыйПараметр("НачДата",НачДата);
	рс.УстановитьТекстовыйПараметр("КонДата",КонДата);
	Рез=рс.ВыполнитьИнструкцию(ТекстЗапроса);
 


Проверено на рабочей базе на правильность данных и на эффективность построения планов запросов.
ВАЖНО: статистика таблиц _1sjourn и _1scrdoc должна быть свежей!


Огромное Спасибо! Работает! Теперь бы разобраться как это все работает.....
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать