Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Цена из табл.части. измерения(прих. док) ВТОстатки (число прочтений - 2356 )
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Цена из табл.части. измерения(прих. док) ВТОстатки
22. Апреля 2007 :: 19:24
Печать  
Всем добрый день!
Имеется такая регистр остатков со следующей структурой:
Измерения:
Склад - тип Справочник.Склады;
Номенклатура - тип Справочник.Номенклатура;
ПрихДок - тип Документ;
Ресурсы:
Количество
Сумма

Необходимо запросом по остаткам получить в итоговую таблицу реквизиты из табличной части приходного документа (в частности Цена, НомерГТД)

Я думаю что это можно сделать средствами ВТ:Остатки - через 2-й параметр "Соединение" - но как построить этот подзапрос понять не могу.
Единственное что у меня получилось это сделать inner join по реквизиту справочника номенклатуры - но это фильтр, а мне нужно добавление колонок в результирующую таблицу.
Заранее спасибо.
Если нужен текст запроса - могу привести.
  
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Цена из табл.части. измерения(прих. док) ВТОст
Ответ #1 - 23. Апреля 2007 :: 04:40
Печать  
номенклатура в приходном документе уникальна?
  

1&&2&&3
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Цена из табл.части. измерения(прих. док) ВТОст
Ответ #2 - 23. Апреля 2007 :: 06:33
Печать  
Да, номенклатура уникальна (проверяется на этапе записи документа)
Вот что имею сейчас - после полуночных мучений:
     ТекстЗапроса = "
     |Select
     |      Наименование [Наименование $Справочник.Номенклатура],
     |      Терминал       [ТерминалОтправитель $Справочник.Терминалы],
     |      ПриходныйДокумент             [ПриходныйДокумент $Документ],
     |      КоличествоОстаток as Остаток
     |From
     |      $РегистрОстатки.ТоварныеЗапасы(
     |      ,
     |   ,
     |      Наименование in (Select val from #ВыбТовар) And (Терминал = :ВыбТерминал)
     |      ,
     |      ,(Количество)
     |) as ОстаткиТоваров
     |Where
     |      (КоличествоОстаток>0)
     |";
    Рекорд.УстановитьТекстовыйПараметр("ВыбТерминал",ТерминалОтправитель);
     Рекорд.УложитьСписокОбъектов(СпНаименование,"#ВыбТовар","Номенклатура");
     //Рекорд.Отладка(1);
     ТабЗнач = Рекорд.ВыполнитьИнструкцию(ТекстЗапроса);
    ТабЗнач.НоваяКолонка("ДатаПрихода");
     ТабЗнач.НоваяКолонка("ЦенаЗакупки");
     ТабЗнач.НоваяКолонка("ТипоРазмер");
     ТабЗнач.НоваяКолонка("НомерГТД");
     ТабЗнач.НоваяКолонка("НомерСертификата");
     ТабЗнач.НоваяКолонка("Контрагент");
     ТабЗнач.ВыбратьСтроки();
     
     Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
           ИсхВид = ТабЗнач.ПриходныйДокумент.Вид();
           ТекстЗапроса = "
           |Select
           |$ДокСтр.ДатаПрихода,
           |$ДокСтр.ЦенаЗакупки,
           |$ДокСтр.ТипоРазмер,
           |$ДокСтр.НомерГТД,
           |$ДокСтр.НомерСертификата,
           |$Док.Контрагент [Контрагент $Справочник.Контрагенты]
           //|      $Док.ВидЦены as [ВидЦены $Справочник.ВидыЦен]
           |From $ДокументСтроки."+ИсхВид+" as ДокСтр, $Документ."+ИсхВид+" as Док
           |      Where
           |      $ДокСтр.Наименование = :ВыбТовар
           |and
           |      ДокСтр.IDDOC = :ВыбДок
           |and
           |      Док.IDDOC = :ВыбДок";
           Рекорд.УстановитьТекстовыйПараметр("ВыбТовар",ТабЗнач.Наименование);
           Рекорд.УстановитьТекстовыйПараметр("ВыбДок",ТабЗнач.ПриходныйДокумент);
           ВремТабЗнач = Рекорд.ВыполнитьИнструкцию(ТекстЗапроса);
           Для Сч=1 По 6 Цикл
                 (1,Сч));
           КонецЦикла;
           ТабЗнач.ТерминалОтправитель = ТерминалОтправитель;
     КонецЦикла;

Хочу что-нить красивее (1-м запросом).
Заранее спасибо за помощь!
  
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Цена из табл.части. измерения(прих. док) ВТОст
Ответ #3 - 23. Апреля 2007 :: 08:28
Печать  
Код
Выбрать все
ТекстЗапроса = "
|select
|  ОстаткиТоваров.Наименование [Наименование $Справочник.Номенклатура],
|  ОстаткиТоваров.Терминал [ТерминалОтправитель $Справочник.Терминалы],
|  ОстаткиТоваров.ПриходныйДокумент [ПриходныйДокумент $Документ],
|  ОстаткиТоваров.КоличествоОстаток Остаток,
|  isnull($ДокСтр1.ДатаПрихода, $ДокСтр2.ДатаПрихода) ДатаПрихода,
|  isnull($ДокСтр1.ЦенаЗакупки, $ДокСтр2.ЦенаЗакупки) ЦенаЗакупки,
|  isnull($ДокСтр1.ТипоРазмер, $ДокСтр2.ТипоРазмер) ТипоРазмер,
|  isnull($ДокСтр1.НомерГТД, $ДокСтр2.НомерГТД) НомерГТД,
|  isnull($ДокСтр1.НомерСертификата, $ДокСтр2.НомерСертификата) НомерСертификата,
|  isnull($Док1.Контрагент, $Док2.Контрагент) [Контрагент $Справочник.Контрагенты]
|from $РегистрОстатки.ТоварныеЗапасы(,,
|	 Наименование in (Select val from #ВыбТовар) and (Терминал = :ВыбТерминал),
|	 ,
|	 Количество
|     ) as ОстаткиТоваров
|left join $Документ.Вид1 as Док1 (nolock) on Док1.iddoc = right(ОстаткиТоваров.ПриходныйДокумент,9)
|left join $ДокументСтроки.Вид1 as ДокСтр1 (nolock) on ДокСтр1.iddoc = right(ОстаткиТоваров.ПриходныйДокумент,9)
|								  and ДокСтр1.Наименование = ОстаткиТоваров.Наименование
|left join $Документ.Вид2 as Док2 (nolock) on Док2.iddoc = right(ОстаткиТоваров.ПриходныйДокумент,9)
|left join $ДокументСтроки.Вид2 as ДокСтр2 (nolock) on ДокСтр2.iddoc = right(ОстаткиТоваров.ПриходныйДокумент,9)
|								  and ДокСтр2.Наименование = ОстаткиТоваров.Наименование
|where КоличествоОстаток > 0
|";  

  

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



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Цена из табл.части. измерения(прих. док) ВТОст
Ответ #4 - 23. Апреля 2007 :: 08:32
Печать  
- если "ПриходныйДокумент" бывает только одного вида, тогда можно оставить только одну пару join-ов и убрать isnull
- если более двух видов, то добавить соответств. пары join-ов и isnull заменить на coalesce
  

1&&2&&3
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Цена из табл.части. измерения(прих. док) ВТОст
Ответ #5 - 23. Апреля 2007 :: 08:51
Печать  
Огромное спасибо!!!!!
Напоследок - тут сейчас выяснилось, что оказывается может висеть остаток по документу, в котором нет этого товара...
В этом случае такой запрос нормально отработает?
  
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Цена из табл.части. измерения(прих. док) ВТОст
Ответ #6 - 23. Апреля 2007 :: 09:04
Печать  
отработает, но поля от ДатаПрихода до Контрагент будут пустыми
  

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