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


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Запрос по документам
17. Апреля 2008 :: 13:15
Печать  
Видимо я совсем отупел, что не могу перевести "черный" запрос в прямой

Это "черный"
     Запрос = СоздатьОбъект("Запрос");
     
     ТекстЗапроса =
     "//{{ЗАПРОС(ЗаказНаряд)
     |Период с ДатаНачала по ДатаКонца;
     |ОбрабатыватьДокументы Проведенные;
     |Курс = Документ.ЗаказНаряд.Курс;
     |ЗаказНаряд = Документ.ЗаказНаряд.ТекущийДокумент;
     |Номенклатура = Документ.ЗаказНаряд.Номенклатура;
     |Сумма = Документ.ЗаказНаряд.Сумма;
     |Функция ВсегоСуммаЗЧ = Сумма(Сумма*(?(ПустоеЗначение(Курс)=1,1,Курс))) Когда (Номенклатура.Вид() = ""Номенклатура"");
     |Функция ВсегоСуммаРаб = Сумма(Сумма*(?(ПустоеЗначение(Курс)=1,1,Курс))) Когда (Номенклатура.Вид() = ""ПереченьРабот"");
     |Группировка ЗаказНаряд упорядочить по ЗаказНаряд.ДатаДок;
     |"//}}ЗАПРОС
    ;
     // Если ошибка в запросе, то выход из процедуры
     Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
           Возврат;
     КонецЕсли; 
     ТЗ = СоздатьОбъект("ТаблицаЗначений");
     Запрос.Выгрузить(ТЗ, 1, 0);
     ТЗ.ВыбратьСтроку();

А дальше полный тупняк, дошел только сюда и все:

ТекстЗапроса = "
     |SELECT
     |  Жур.IDDoc as [Док $Документ],
     |  Жур.IDDocDef as Док_вид,
     |  Док.$ОбщийРеквизит.Курс as Курс
     |FROM
     |  1SJourn Жур
     |INNER JOIN
     |  $Документ.ЗаказНаряд as Док ON Док.IDDoc = Жур.IDDoc
     |WHERE
     |  Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
     |  Жур.IDDocDef = $ВидДокумента.ЗаказНаряд AND
     |  Жур.Closed = 1";
     ЗапросДБФ.УстановитьТекстовыйПараметр("НачДата", ДатаНачала);
     ЗапросДБФ.УстановитьТекстовыйПараметр("КонДата", ДатаКонца);
     ТЗ = ЗапросДБФ.ВыполнитьИнструкцию(ТекстЗапроса);
     ТЗ.ВыбратьСтроку();

Может не туда иду? Пните в нужном направлении, пожалуйста...




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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос по документам
Ответ #1 - 17. Апреля 2008 :: 14:21
Печать  
Если только пнуть , то данные нужно брать из табличной части :

Код
Выбрать все
FROM $ДокументСтроки.ЗаказНаряд as ТаблЧастьЗаказ
LEFT JOIN
 1SJourn as Жур ON Жур.IDDoc = ТаблЧастьЗаказ.IDDoc    


Вместо 1С "когда"  используй ICASE для вычисления сумм
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос по документам
Ответ #2 - 18. Апреля 2008 :: 05:33
Печать  
kiruha писал(а) 17. Апреля 2008 :: 14:21:
Если только пнуть , то данные нужно брать из табличной части :

Код
Выбрать все
FROM $ДокументСтроки.ЗаказНаряд as ТаблЧастьЗаказ
LEFT JOIN
 1SJourn as Жур ON Жур.IDDoc = ТаблЧастьЗаказ.IDDoc    


Вместо 1С "когда"  используй ICASE для вычисления сумм


А как в данном случае получить в выходной таблице сам документ?
Понятно, что таб часть должна участвовать в запросе. Однако мне
надо получить на выходе:

Док                                СуммаЗЧ                       СуммаРабот

Заказ-наряд №1             100                                120
Заказ-наряд №2             1000                              1200         и т. д.

По отдельности к документам за период и табличным частям получается выполнить,
а как их связать вместе ума не приложу.




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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос по документам
Ответ #3 - 18. Апреля 2008 :: 06:07
Печать  
Там же специально добавлено left join к журналу.

На выходе то же самое  Жур.IDDoc.
Еще надо присоединить таблицы спр номенклатура и ПереченьРабот.
А вообще для первого - запрос достаточно сложноват, особенно если join вызывает проблемы.
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос по документам
Ответ #4 - 18. Апреля 2008 :: 07:20
Печать  
kiruha писал(а) 18. Апреля 2008 :: 06:07:
Там же специально добавлено left join к журналу.

На выходе то же самое  Жур.IDDoc.
Еще надо присоединить таблицы спр номенклатура и ПереченьРабот.
А вообще для первого - запрос достаточно сложноват, особенно если join вызывает проблемы.


Спасибо, kiruha, что не оставляешь. Наверное, да, сложноват. Но ведь и хочется 
оптимизировать рабочую обработку.

Вот так работает, но выводит документ столько раз, сколько строк в табличной части.
Как свернуть?

Код
Выбрать все
ТекстЗапроса = "
    |SELECT
    |  Жур.IDDoc as [Док $Документ],
    |  Жур.IDDocDef as Док_вид
    |FROM
    |  $ДокументСтроки.ЗаказНаряд as ТаблЧастьЗаказ
    |LEFT JOIN
    |  1SJourn as Жур ON Жур.IDDoc = ТаблЧастьЗаказ.IDDoc
    |WHERE
    |  Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
    |  Жур.IDDocDef = $ВидДокумента.ЗаказНаряд AND
    |  Жур.Closed = 1";

 



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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос по документам
Ответ #5 - 18. Апреля 2008 :: 08:25
Печать  
Этап 2 - группировка Улыбка

Добавить
Код
Выбрать все
GROUP BY Жур.IDDoc 

в конец запроса
Вместо
Код
Выбрать все
Жур.IDDoc as [Док $Документ],
 Жур.IDDocDef as Док_вид  


написать
Код
Выбрать все
Жур.IDDoc as [Док $Документ.ЗаказНаряд ] 


чтобы не делать лишнюю группировку
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос по документам
Ответ #6 - 18. Апреля 2008 :: 08:55
Печать  
kiruha писал(а) 18. Апреля 2008 :: 08:25:
Этап 2 - группировка Улыбка

Добавить
Код
Выбрать все
GROUP BY Жур.IDDoc 

в конец запроса
Вместо
Код
Выбрать все
Жур.IDDoc as [Док $Документ],
 Жур.IDDocDef as Док_вид  


написать
Код
Выбрать все
Жур.IDDoc as [Док $Документ.ЗаказНаряд ] 


чтобы не делать лишнюю группировку



ОК. Этап 2 пройден на мой взгляд успешно. Группировка работает.
В ниже приведенном коде (на мой взгляд) должна быть сумма только
по номенклатуре, исключая работы. Ан нет все равно общая сумма по документу.
Что не так?

Код
Выбрать все
 ТекстЗапроса = "
    |SELECT
    |   Жур.IDDoc as [Док $Документ.ЗаказНаряд],
    |   SUM($ТаблЧастьЗаказ.Сумма) as Сумма
    |FROM
    |   $ДокументСтроки.ЗаказНаряд as ТаблЧастьЗаказ
    |INNER JOIN
    |	$Справочник.Номенклатура AS Номенклатура ON $ТаблЧастьЗаказ.Номенклатура = Номенклатура.ID
    |LEFT JOIN
    |   1SJourn as Жур ON Жур.IDDoc = ТаблЧастьЗаказ.IDDoc
    |WHERE
    |   Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
    |   Жур.IDDocDef = $ВидДокумента.ЗаказНаряд AND
    |   Жур.Closed = 1
    |GROUP BY
    |   Жур.IDDoc ";
 




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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по документам
Ответ #7 - 18. Апреля 2008 :: 09:00
Печать  
А у тебя "Номенклатура" и "Работа" в разных справочниках хранятся или в одном спр-ке "Номенклатура"? Или у тебя в Заказе отдельный столбец на "Работу"?
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос по документам
Ответ #8 - 18. Апреля 2008 :: 09:14
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 09:00:
А у тебя "Номенклатура" и "Работа" в разных справочниках хранятся или в одном спр-ке "Номенклатура"? Или у тебя в Заказе отдельный столбец на "Работу"?


"Номенклатура" - справочник Номенклатура
"Работа"             - справочник ПереченьРабот

В табличной части документа Идентификатор колонки Номенклатура тип Справочник,
т. е. может быть как Номенклатура тик и ПереченьРабот
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос по документам
Ответ #9 - 18. Апреля 2008 :: 10:19
Печать  
3 Этап
Левое соединение с спр Номенклатура.
Некоторые сложности с тем, что справочник в документе неопределенного типа.
Попробуй соединиться правильно

4. Этап
Сумма берется с помощью  ICASE только если ISNULL(СпрНом.id) ложь
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по документам
Ответ #10 - 18. Апреля 2008 :: 10:24
Печать  
По-моему достатосно просто "нормально" соединиться по INNER
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос по документам
Ответ #11 - 18. Апреля 2008 :: 11:09
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 10:24:
По-моему достатосно просто "нормально" соединиться по INNER


Тогда он не сможет соединиться с Спр ПереченьРабот - одно исключает второе
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос по документам
Ответ #12 - 18. Апреля 2008 :: 11:52
Печать  
kiruha писал(а) 18. Апреля 2008 :: 10:19:
3 Этап
Левое соединение с спр Номенклатура.
Некоторые сложности с тем, что справочник в документе неопределенного типа.
Попробуй соединиться правильно

4. Этап
Сумма берется с помощью  ICASE только если ISNULL(СпрНом.id) ложь


Эти два этапа положительного результата не дали.
СуммаЗЧ = 0, Где ошибка;
Код
Выбрать все
 ТекстЗапроса = "
    |SELECT
    |   Жур.IDDoc as [Док $Документ.ЗаказНаряд],
    |   SUM(ICASE(ISNULL(Номенклатура.ID), 0 ,$ТаблЧастьЗаказ.Сумма)) as СуммаЗЧ
    |FROM
    |   $ДокументСтроки.ЗаказНаряд as ТаблЧастьЗаказ
    |LEFT JOIN
    |	$Справочник.Номенклатура AS Номенклатура ON $ТаблЧастьЗаказ.Номенклатура = Номенклатура.ID
    |LEFT JOIN
    |   1SJourn as Жур ON Жур.IDDoc = ТаблЧастьЗаказ.IDDoc
    |WHERE
    |   Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
    |   Жур.IDDocDef = $ВидДокумента.ЗаказНаряд AND
    |   Жур.Closed = 1
    |GROUP BY
    |   Жур.IDDoc";
 


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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос по документам
Ответ #13 - 18. Апреля 2008 :: 12:17
Печать  
Ошибка в
Код
Выбрать все
ON $ТаблЧастьЗаказ.Номенклатура = Номенклатура.ID
 


У тебя слева справочник неопределенного типа (длиннее)
Нужно привести типы
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос по документам
Ответ #14 - 19. Апреля 2008 :: 06:55
Печать  
kiruha писал(а) 18. Апреля 2008 :: 12:17:
Ошибка в
Код
Выбрать все
ON $ТаблЧастьЗаказ.Номенклатура = Номенклатура.ID
 


У тебя слева справочник неопределенного типа (длиннее)
Нужно привести типы


Огроменное спасибо за пинки и подсказки.
Вот так все работает.
Код
Выбрать все
ТекстЗапроса = "
    |SELECT
    |   Жур.IDDoc as [Док $Документ.ЗаказНаряд],
    |   SUM(ICASE(ISNULL(Номенклатура.ID), 0 ,$ТаблЧастьЗаказ.Сумма)) as СуммаЗЧ,
    |   SUM(ICASE(ISNULL(ПереченьРабот.ID), 0 ,$ТаблЧастьЗаказ.Сумма)) as СуммаРаб
    |FROM
    |   $ДокументСтроки.ЗаказНаряд as ТаблЧастьЗаказ
    |LEFT JOIN
    |	$Справочник.Номенклатура AS Номенклатура ON RIGHT($ТаблЧастьЗаказ.Номенклатура,9) = Номенклатура.ID
    |LEFT JOIN
    |	$Справочник.ПереченьРабот AS ПереченьРабот ON RIGHT($ТаблЧастьЗаказ.Номенклатура,9) = ПереченьРабот.ID
    |LEFT JOIN
    |   1SJourn as Жур ON Жур.IDDoc = ТаблЧастьЗаказ.IDDoc
    |WHERE
    |   Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND
    |   Жур.IDDocDef = $ВидДокумента.ЗаказНаряд AND
    |   Жур.Closed = 1
    |GROUP BY
    |   Жур.IDDoc";
 



А можно следующий пинок в сторону "высшей математики" (попадание в индекс)?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать