Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) ТП: вывод конкретных видов документов (число прочтений - 2674 )
chelentano
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 25
Зарегистрирован: 28. Ноября 2007
ТП: вывод конкретных видов документов
29. Мая 2009 :: 11:07
Печать  
день добрый, никак не могу добиться, чтобы в ТП выводились только определенные виды документов. т.е. условие типа:
iddocdef in (select val from ВидыДоков)

как это можно сделать? мне тут уже подсказывали вариант типа:
запрос.Выполнить("create temp table ВидыДоков(val char(4) primary key not null)");
Пока Цикл
   запрос.Выполнить("insert into ВидыДоков values($ВидДокумента." + ВидДок + ")");
КонецЦикла

выдает invalid object name 'ВидыДоков'.

как можно сделать подобное?
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: ТП: вывод конкретных видов документов
Ответ #1 - 29. Мая 2009 :: 11:20
Печать  
можно попробовать не select val
а просто iddocdef in ('ВидДок1','ВидДок2','ВидДок3')

если конечно видов для проверки не слишком много
  
Наверх
ICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: ТП: вывод конкретных видов документов
Ответ #2 - 29. Мая 2009 :: 11:33
Печать  
chelentano писал(а) 29. Мая 2009 :: 11:07:
вариант типа:
запрос.Выполнить("create temp table ВидыДоков(val char(4) primary key not null)");
Пока Цикл
  запрос.Выполнить("insert into ВидыДоков values($ВидДокумента." + ВидДок + ")");
КонецЦикла

выдает invalid object name 'ВидыДоков'.

как можно сделать подобное?


дык неправильно потому что,
во-первых неправильный синтаксис, во-вторых iddocdef это int
create table #temp (val int not null primary key)
$ВидДокумента." + ВидДок - это тоже int
или это для dbf?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: ТП: вывод конкретных видов документов
Ответ #3 - 02. Июня 2009 :: 07:18
Печать  
Если совсем заклинит напиши
iddocdef in (1234, 4544)
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
chelentano
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 25
Зарегистрирован: 28. Ноября 2007
Re: ТП: вывод конкретных видов документов
Ответ #4 - 03. Июня 2009 :: 07:02
Печать  
alexdd спасибо большое, кажись помогло, не обратил внимания на типы Улыбка
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: ТП: вывод конкретных видов документов
Ответ #5 - 04. Июня 2009 :: 04:41
Печать  
Код
Выбрать все
Процедура Сформировать()
	МД = СоздатьОбъект("MetaDataWork");
	зпт = ""; СписокДоков = "";
	Для сс=1 По Метаданные.Документ() Цикл
		СписокДоков = СписокДоков+зпт+СокрЛП(МД.ИДДокумента(сс));
		зпт = ", ";
	КонецЦикла;
	Сообщить(СписокДоков);
КонецПроцедуры

 


Так еще можно получить список доков.
  
Наверх
 
IP записан
 
Meeshka
YaBB Newbies
*
Отсутствует


1C++ newbie

Сообщений: 4
Местоположение: Н.Новгород
Зарегистрирован: 29. Июня 2009
Пол: Мужской
Re: ТП: вывод конкретных видов документов
Ответ #6 - 29. Июня 2009 :: 12:30
Печать  
Увидел упрощенный вариант своей проблемы, решил не плодить тем лишний раз. Вопрос решил, но столкнулся вот с некоторыми трудностями. Для начала сам запрос:
ТекстЗапроса = "
|SELECT
|    Жур.IDDoc as [Док $Документ],
|    Жур.DocNo as НомерДок,
|    Жур.IDDocDef as Док_вид,
|";
НомерПеременной = 0;
Для
Номер=1 По спсВидыДокументов.РазмерСписка() Цикл
     Если спсВидыДокументов.Пометка(Номер)=0 Тогда
           Продолжить;
     КонецЕсли;

     ВидДока = спсВидыДокументов.ПолучитьЗначение(Номер);
     Если
глЕстьРеквизитШапки("Контрагент",ВидДока) = 0 Тогда
           Продолжить;
     КонецЕсли;

     НомерПеременной = НомерПеременной + 1;
     ТекстЗапроса = ТекстЗапроса + "
     |  $Док"+НомерПеременной+".Контрагент as [Контрагент $Справочник.Контрагенты],
     |";
КонецЦикла;

ТекстЗапроса = ТекстЗапроса + "
|    CAST(LEFT(Жур.Date_Time_IDDoc, 8) as DateTime) as ДатаДок
|FROM
|    _1SJourn Жур
|";
НомерПеременной = 0;
Для
Номер=1 По спсВидыДокументов.РазмерСписка() Цикл
     Если
спсВидыДокументов.Пометка(Номер) = 0 Тогда
           Продолжить;
     КонецЕсли;

     ВидДока = спсВидыДокументов.ПолучитьЗначение(Номер);
     Если
глЕстьРеквизитШапки("Контрагент",ВидДока) = 0 Тогда
           Продолжить;
     КонецЕсли;

     НомерПеременной = НомерПеременной + 1;
     ТекстЗапроса = ТекстЗапроса + "
     |LEFT JOIN
     |      $Документ."+ВидДока+" as Док"+НомерПеременной+" ON Док"+НомерПеременной+".IDDoc = Жур.IDDoc
     |";
КонецЦикла;

ТекстЗапроса = ТекстЗапроса + "
|WHERE
|    Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
|    Жур.IDDocDef IN("+СтрокаВидов+")
|";
Суть запроса в том, что для нескольких видов документов выводим таблицу с колонкой Контрагент.
Текст в плане циклов еще не оптимизирован, но не в этом суть. Запрос отлично работает, но на выходе дает таблицу с такими полями:
Док|НомерДок|Док_вид|Контрагент|Контрагент| (выбрано 2 вида документов)
То есть для алиаса Контрагент создается новая колонка для каждого вида документов. Соответственно и значение контрагента для каждого вида документов присутствует в соответствующей колонке.
Есть ли способ кроме перебора конечной таблицы свернуть ТЗ по колонкам Контрагент в одну колонку? А то перебор убивает нафих скорость выполнения запроса.
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: ТП: вывод конкретных видов документов
Ответ #7 - 29. Июня 2009 :: 12:57
Печать  
Тут, скорее всего, UNION ALL надо использовать, а не плодить колонки
  
Наверх
ICQ  
IP записан
 
aou1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 183
Местоположение: Екатеринбург
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Re: ТП: вывод конкретных видов документов
Ответ #8 - 29. Июня 2009 :: 13:23
Печать  
я делаю так:
case iddocdef
.......
end  as Контрагент
  
Наверх
ICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: ТП: вывод конкретных видов документов
Ответ #9 - 29. Июня 2009 :: 14:17
Печать  
coalesce($Док1.Контрагент,$Док2.Контрагент...,$ПустойИд/*или $ПустойИд13*/)
  
Наверх
 
IP записан
 
Meeshka
YaBB Newbies
*
Отсутствует


1C++ newbie

Сообщений: 4
Местоположение: Н.Новгород
Зарегистрирован: 29. Июня 2009
Пол: Мужской
Re: ТП: вывод конкретных видов документов
Ответ #10 - 30. Июня 2009 :: 05:59
Печать  
Salimbek писал(а) 29. Июня 2009 :: 12:57:
Тут, скорее всего, UNION ALL надо использовать...

Согласен. Только этот вариант будет работать ТОЛЬКО когда у каждого вида документа есть поле Контрагент, так как для UNION ALL обязательное условие - одинаковое количество полей в каждом запросе SELECT. В примере же, если документ не содержит поля, колонка не добавится. В остальном же всё отлично сработало. Спасибо.
Остальные варианты еще не изучил в плане скорости. Позже отпишусь. Запрос-то сам 1 сек выполняется, а вот платформа 1С обрабатывает сами ТЗ долго и по-разному :с)

Edit1: С CASE сработало на ура. Но субъективно ТЗ выводилась дольше. Хотя вроде как умом понимаю, что они д.б. одинаковые. Спасибо!
Edit2: C COALESCE как с частным случаем CASE так же всё отлично :с) Спасибо!
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать