Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Хочу запрос по двум видам документов. Возможно? (число прочтений - 2323 )
fly7
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 16. Ноября 2009
Хочу запрос по двум видам документов. Возможно?
16. Ноября 2009 :: 13:59
Печать  
база DBF, енджин пропатчен

по одному документу все замечательно работает

   База = СоздатьОбъект("OLEDBData");
   Рез = База.Соединение("Provider = VFPOLEDB.9;Data Source = " + КаталогИБ() + ";Mode = ReadWrite;");
   
   Запрос = База.СоздатьКоманду();  
   ГруппаКт = "";
   Если ПустоеЗначение(ВыбКонтрагент) = 0 Тогда
       Запрос.УложитьСписокОбъектов(ВыбКонтрагент, ГруппаКт, "Контрагенты");
   КонецЕсли;
   
   ТекстЗапроса = "
   |SELECT  
   |    Журнал.date ДатаДок,
   |    $ДокШапка_ФранчРеализация.Контрагент as [Контрагент $Справочник.Контрагенты],
   |    $ДокСтроки_ФранчРеализация.Номенклатура as [Номенклатура $Справочник.Номенклатура],
   |    SUM($ДокСтроки_ФранчРеализация.Сумма) as ФранчРеализация_Сумма,
   |    SUM($ДокСтроки_ФранчРеализация.Количество) as ФранчРеализация_Количество
   |
   |FROM
   |    1SJOURN as Журнал
   |    LEFT JOIN $Документ.ФранчРеализация as ДокШапка_ФранчРеализация on Журнал.iddoc = ДокШапка_ФранчРеализация.iddoc
   |    LEFT JOIN $ДокументСтроки.ФранчРеализация as ДокСтроки_ФранчРеализация on Журнал.iddoc = ДокСтроки_ФранчРеализация.iddoc                        
   |    JOIN $Справочник.ТорговыеТочкиКонтрагента as Спр_ТорговыеТочкиКонтрагента on($ДокШапка_ФранчРеализация.Склад = Спр_ТорговыеТочкиКонтрагента.id)
   |    JOIN $Справочник.Контрагенты as Спр_Контрагенты on($ДокШапка_ФранчРеализация.Контрагент = Спр_Контрагенты.id)
   |
   |WHERE      
   |    Журнал.date BETWEEN :НачДата~~ AND :КонДата~~ ";
   
   Если ПустоеЗначение(ВыбКонтрагент) = 0 Тогда
       ТекстЗапроса = ТекстЗапроса + "
   |    AND $ДокШапка_ФранчРеализация.Контрагент IN (SELECT Val FROM " + ГруппаКт + ") ";
   КонецЕсли;                

   ТекстЗапроса = ТекстЗапроса + "                              
   |    AND $Спр_ТорговыеТочкиКонтрагента.ФирменныйМагазин = 1
   |    AND Журнал.Closed = 1
   |
   |GROUP BY
   |    Журнал.date,
   |    $ДокШапка_ФранчРеализация.Контрагент,
   |    $ДокСтроки_ФранчРеализация.Номенклатура
   |
   |ORDER BY
   |    Журнал.date ASC,
   |    $ДокШапка_ФранчРеализация.Контрагент ASC,
   |    $ДокСтроки_ФранчРеализация.Номенклатура ASC
   |";

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




вот исходный запрос


  Текст = "Период с НачДата1 по КонДата1;
    |
   |Контр = Документ.ФранчРеализация.Контрагент, Документ.Реализация.Контрагент;
   |Тов = Документ.ФранчРеализация.Номенклатура, Документ.Реализация.Номенклатура;
   |Вид = Документ.ФранчРеализация.Номенклатура.ВидОдежды, Документ.Реализация.Номенклатура.ВидОдежды;
   |Кол = Документ.ФранчРеализация.Количество;
   |Сум = Документ.ФранчРеализация.Сумма;
   |Кол1 = Документ.Реализация.Количество;
   |Сум1 = Документ.Реализация.Сумма;
   |
   |Функция КолПродаж = Сумма(Кол);
   |Функция СумПродаж = Сумма(Сум);
   |Функция КолРеал = Сумма(Кол1);
   |Функция СумРеал = Сумма(Сум1);
   |
   |Группировка День;
   |Группировка Контр Без Групп;
   |Группировка Тов Без Групп;
   |
   |Условие(ПустоеЗначение(Тов) = 0);
   |Условие(ПустоеЗначение(Вид) = 0);
   |Условие(Контр в ВыбКонтрагент);";
       
   Запрос = СоздатьОбъект("Запрос");
   Если Запрос.Выполнить(Текст) = 0 Тогда
       Возврат;
   КонецЕсли;
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Хочу запрос по двум видам документов. Возможно?
Ответ #1 - 16. Ноября 2009 :: 19:50
Печать  
я бы два запроса к разным видам доков объединил через union all, а потом select из этого объединения с типизацией и группировками
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Хочу запрос по двум видам документов. Возможно?
Ответ #2 - 18. Ноября 2009 :: 00:28
Печать  
Запрос впечатляет Улыбка
У тебя выбираются ВСЕ записи журнала и левым соединением лепятся 2 документа, т.е. для документа "Выписка", например, прилепится NULL
Наверное проще через union all
А еще лучше не лопатить документы а завести бух. счет или регистр Улыбка
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Хочу запрос по двум видам документов. Возможно?
Ответ #3 - 18. Ноября 2009 :: 06:23
Печать  
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Хочу запрос по двум видам документов. Возможно?
Ответ #4 - 18. Ноября 2009 :: 08:33
Печать  
А почему в запросе отсуствует условие по виду документа. имхо это условие весьма облегчает жизнь. Конечно помнится где то читал  что для DBF (без использования 1sqlite) попадаение в индекс iddocdef проблематичен... не помню.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Хочу запрос по двум видам документов. Возможно?
Ответ #5 - 25. Ноября 2009 :: 15:55
Печать  
Вот так (возможно есть ошибки):
Код
Выбрать все
|SELECT  
   |    T.ДатаДок AS ДатаДок,
   |    T.Контрагент as [Контрагент $Справочник.Контрагенты],
   |    T.Номенклатура as [Номенклатура $Справочник.Номенклатура],
   |    SUM(T.Сумма) as ФранчРеализация_Сумма,
   |    SUM(T.Количество) as ФранчРеализация_Количество
   |FROM(
   |SELECT  
   |    Журнал.date ДатаДок,
   |    $ДокШапка_ФранчРеализация.Контрагент as [Контрагент],
   |    $ДокСтроки_ФранчРеализация.Номенклатура as [Номенклатура],
   |    SUM($ДокСтроки_ФранчРеализация.Сумма) as Сумма,
   |    SUM($ДокСтроки_ФранчРеализация.Количество) as Количество
   |
   |FROM
   |    $Документ.ФранчРеализация as ДокШапка_ФранчРеализация
   |    INNER JOIN 1SJOURN as Журнал on Журнал.iddoc = ДокШапка_ФранчРеализация.iddoc
   |    INNER JOIN $ДокументСтроки.ФранчРеализация as ДокСтроки_ФранчРеализация on Журнал.iddoc = ДокСтроки_ФранчРеализация.iddoc                        
   |    INNER JOIN $Справочник.ТорговыеТочкиКонтрагента as Спр_ТорговыеТочкиКонтрагента on($ДокШапка_ФранчРеализация.Склад = Спр_ТорговыеТочкиКонтрагента.id)
   |
   |WHERE      
   |    Журнал.date BETWEEN :НачДата~~ AND :КонДата~~ ";
  
   Если ПустоеЗначение(ВыбКонтрагент) = 0 Тогда
       ТекстЗапроса = ТекстЗапроса + "
   |    AND $ДокШапка_ФранчРеализация.Контрагент IN (SELECT Val FROM " + ГруппаКт + ") ";
   КонецЕсли;                

   ТекстЗапроса = ТекстЗапроса + "                              
   |    AND $Спр_ТорговыеТочкиКонтрагента.ФирменныйМагазин = 1
   |    AND Журнал.Closed = 1
   |
   |GROUP BY
   |    Журнал.date,
   |    $ДокШапка_ФранчРеализация.Контрагент,
   |    $ДокСтроки_ФранчРеализация.Номенклатура
   |
   |UNION ALL
   |
   |SELECT  
   |    Журнал.date ДатаДок,
   |    $ДокШапка_Реализация.Контрагент as [Контрагент],
   |    $ДокСтроки_Реализация.Номенклатура as [Номенклатура],
   |    SUM($ДокСтроки_Реализация.Сумма) as Сумма,
   |    SUM($ДокСтроки_Реализация.Количество) as Количество
   |
   |FROM
   |    $Документ.Реализация as ДокШапка_Реализация
   |    INNER JOIN 1SJOURN as Журнал on Журнал.iddoc = ДокШапка_Реализация.iddoc
   |    INNER JOIN $ДокументСтроки.Реализация as ДокСтроки_Реализация on Журнал.iddoc = ДокСтроки_Реализация.iddoc                        
   |    INNER JOIN $Справочник.ТорговыеТочкиКонтрагента as Спр_ТорговыеТочкиКонтрагента on($ДокШапка_Реализация.Склад = Спр_ТорговыеТочкиКонтрагента.id)
   |
   |WHERE      
   |    Журнал.date BETWEEN :НачДата~~ AND :КонДата~~ ";
  
   Если ПустоеЗначение(ВыбКонтрагент) = 0 Тогда
       ТекстЗапроса = ТекстЗапроса + "
   |    AND $ДокШапка_Реализация.Контрагент IN (SELECT Val FROM " + ГруппаКт + ") ";
   КонецЕсли;                

   ТекстЗапроса = ТекстЗапроса + "                              
   |    AND $Спр_ТорговыеТочкиКонтрагента.ФирменныйМагазин = 1
   |    AND Журнал.Closed = 1
   |
   |GROUP BY
   |    Журнал.date,
   |    $ДокШапка_Реализация.Контрагент,
   |    $ДокСтроки_Реализация.Номенклатура
   |) AS T
   |    
   |GROUP BY
   |	T.ДатаДок,
   |    T.Контрагент,
   |    T.Номенклатура
   |ORDER BY
   |    T.ДатаДок ASC,
   |    T.Контрагент ASC,
   |    T.Номенклатура ASC
   |"; 

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