Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Получить суммы подчиненных документов (число прочтений - 8417 )
Admin_Net_1C
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 8
Зарегистрирован: 09. Июня 2007
Получить суммы подчиненных документов
09. Октября 2007 :: 03:27
Печать  
Подскажите пожалуйста как получить суммы подчиненных документов? Например, есть Расходная накладная, у нее есть подчиненные документы ПКО, Строка выписки банка (приход). Получаю запросом список подчиненные документы:
|SELECT
|      Жур.IDDoc as [Док $Документ],
|      Жур.IDDocDef as Док_вид,
|FROM
|      _1Sjourn Жур (nolock)
|INNER JOIN
|      _1SCRDOC Отбор ON Отбор.ChildID = Жур.IDDoc AND
|                        Отбор.MDID = 0 AND
|                                 Отбор.ParentVal = :ВыбДок*
|WHERE
|      (Жур.IDDocDef = $ВидДокумента.ПКО OR
|       Жур.IDDocDef = $ВидДокумента.СтрокаВыпискиПриход) AND
|      Жур.Closed & 1 = 1";
А как теперь у подчиненных документов получить доступ к рекизиту "Сумма", причем в разных переменных запроса, т.е. СуммаПКО, СуммаВыписка?
  
Наверх
 
IP записан
 
Admin_Net_1C
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 8
Зарегистрирован: 09. Июня 2007
Re: Получить суммы подчиненных документов
Ответ #1 - 09. Октября 2007 :: 04:10
Печать  
Попробовал вариант запроса:
ТекстЗапроса = "
|SELECT
|        ПодчДок.IDdoc [Документ $Документ],
|      ПодчДок.Сумма as Сумма
|FROM
|      (SELECT
|            Жур.IDDoc as [Док $Документ],
|            Жур.IDDocDef as Док_вид,
|       FROM
|            _1Sjourn Жур (nolock)
|       INNER JOIN
|            _1SCRDOC Отбор ON Отбор.ChildID = Жур.IDDoc AND
|                                Отбор.MDID = 0 AND
|                             Отбор.ParentVal = :ВыбДок*
|       WHERE
|            (Жур.IDDocDef = $ВидДокумента.ПКО OR
|             Жур.IDDocDef = $ВидДокумента.СтрокаВыпискиПриход) AND
|             Жур.Closed & 1 = 1
|      ) as ПодчДок";

Выдает ошибку:
State 42000, native 156, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'FROM'

Подскажите в чем проблема плиз, очень надо  Печаль
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #2 - 09. Октября 2007 :: 05:11
Печать  
Код
Выбрать все
select
    Журнал.iddoc as [Док $Документ],
    Журнал.iddocdef as Док_вид,
    case when Журнал.iddocdef = $ВидДокумента.ПКО then $ПКО.Сумма else 0 end as СуммаПКО,
    case when Журнал.iddocdef = $ВидДокумента.СтрокаВыпискиПриход then $СтрокаВыпискиПриход.Сумма else 0 end as СуммаВыписка
from _1scrdoc as Отбор (nolock)
left join _1sjourn as Журнал (nolock) on Журнал.iddoc = Отбор.childid
left join $Документ.ПКО as ПКО (nolock) on Журнал.iddocdef = $ВидДокумента.ПКО and ПКО.iddoc = Журнал.iddoc
left join $Документ.СтрокаВыпискиПриход as СтрокаВыпискиПриход (nolock) on Журнал.iddocdef = $ВидДокумента.СтрокаВыпискиПриход and СтрокаВыпискиПриход.iddoc = Журнал.iddoc
where Отбор.mdid = 0 and Отбор.parentval = :ВыбДок* and Журнал.closed & 1 = 1
order by Отбор.child_date_time_iddoc
 

« Последняя редакция: 09. Октября 2007 :: 06:35 - DmitrO »  
Наверх
ICQ  
IP записан
 
vig
Junior Member
**
Отсутствует


Мой опыт показывает, что
умирают обычно другие.

Сообщений: 34
Местоположение: Киев
Зарегистрирован: 21. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #3 - 10. Октября 2007 :: 14:13
Печать  
Я всегда пишу :
Код
Выбрать все
left join $Документ.ПКО as ПКО (nolock) on ПКО.iddoc = Журнал.iddoc
 


Поскольку DmitrO просто так ничего не делает Улыбка,
задался вопросом : А зачем добавлять Журнал.iddocdef = $ВидДокумента.ПКО ?
Цитата:
left join $Документ.ПКО as ПКО (nolock) on Журнал.iddocdef = $ВидДокумента.ПКО and ПКО.iddoc = Журнал.iddoc

Это либо для повышеня производительности (не подходит, поскольку в _1sjourn  есть индекс по iddoc)
либо поле iddoc в таблице _1sjourn уникально только в пределах вида документа????
Может есть другие соображения, которые я не вижу?
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #4 - 10. Октября 2007 :: 14:46
Печать  
vig писал(а) 10. Октября 2007 :: 14:13:
задался вопросом : А зачем добавлять Журнал.iddocdef = $ВидДокумента.ПКО ?
Это либо для повышеня производительности (не подходит, поскольку в _1sjourn  есть индекс по iddoc)
либо поле iddoc в таблице _1sjourn уникально только в пределах вида документа????
Может есть другие соображения, которые я не вижу?

Чтобы метапарсер правильно все разобрал.
ведь $ПКО.Сумма и $ПКО.Сумма разные поля в sql таблицах.
Чтобы лучше понять попробуй написать этот запрос без мегапарсера
на "чистых" реквизитах sql таблиц.

и второе почему у тебя не может быть два разных документа ( разных видов ) с одним и тем же iddoc ? (ситуация может и редкая но тем не менее
например расходная накладная имеет iddoc 'A12345SQ1'  и
приходная накладная имеет iddoc 'A12345SQ1' .просто в _1sjourn  составной индекс
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #5 - 10. Октября 2007 :: 15:14
Печать  
Если можно помочь оптимизитору, то нужно помочь оптимизатору.
В таблице _1sjourn поле iddoc имеет индекс уникальных значений.
  
Наверх
ICQ  
IP записан
 
vig
Junior Member
**
Отсутствует


Мой опыт показывает, что
умирают обычно другие.

Сообщений: 34
Местоположение: Киев
Зарегистрирован: 21. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #6 - 10. Октября 2007 :: 15:20
Печать  
Z1, я в шоке!
Получается, что запросы типа
Код
Выбрать все
select  
Журнал.Docno
from $Документ.Расход as Doc
left join 1sjourn as Журнал (nolock) on Журнал.iddoc = Doc.iddoc
 


Дадут мне номера документов не только вида Документ.Расход ?????????
Я же пишу связь по iddoc, которое не уникально.  
Цитата:
и второе почему у тебя не может быть два разных документа ( разных видов ) с одним и тем же iddoc

Да ты меня просто очень сильно порадовал. Мне нужно ПРАКТИЧЕСКИ ВСЕ ПЕРЕПИСЫВАТЬ!!!!!!!!!!
И ТЕБЕ ТОЖЕ!!!
  
Наверх
IP записан
 
vig
Junior Member
**
Отсутствует


Мой опыт показывает, что
умирают обычно другие.

Сообщений: 34
Местоположение: Киев
Зарегистрирован: 21. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #7 - 10. Октября 2007 :: 15:27
Печать  
To spok:
Дак и я о том же. Помочь оптимизатору. Дык зачем добавлять связь
Журнал.iddocdef = $ВидДокумента.ПКО
если достаточно
ПКО.iddoc = Журнал.iddoc ??
Повторяю, может я не понимаю, и связи ПКО.iddoc = Журнал.iddoc недостаточно??
и ДЕЙСТВИТЕЛЬНО нужно писать
left join $Документ.ПКО as ПКО (nolock) on Журнал.iddocdef = $ВидДокумента.ПКО and ПКО.iddoc = Журнал.iddoc
добавляя связь по виду документа?????
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #8 - 10. Октября 2007 :: 16:13
Печать  
Может я и ошибаюсь но  для всегда исходил из принципа ( может и ошибочного )
что iddoc может и совтадать для разных типов документов в 1SJOUR
так что вряд ли мне придется что-то переписывать.
  
Наверх
 
IP записан
 
vig
Junior Member
**
Отсутствует


Мой опыт показывает, что
умирают обычно другие.

Сообщений: 34
Местоположение: Киев
Зарегистрирован: 21. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #9 - 10. Октября 2007 :: 16:20
Печать  
Я исходил из принципа, что iddoc уникально, если база нераспределенная. (где-то вычитал).
Если iddoc не уникально, мне нужно все переписывать.
Сейчас база 40 гиг. iddoc пока уникально.
Может кто-то наверняка знает? Буду благодарен.
  
Наверх
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Получить суммы подчиненных документов
Ответ #10 - 10. Октября 2007 :: 16:45
Печать  
В _1sjourn ведь уникальный индекс есть по iddoc, т.е. наверняка уникальноУлыбка
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #11 - 10. Октября 2007 :: 17:25
Печать  
Страсти кипят... сериал прямо
Даже без 1С не получится вставить второй iddoc, не переживайте
Хотя... всяко быват...
  

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


Мой опыт показывает, что
умирают обычно другие.

Сообщений: 34
Местоположение: Киев
Зарегистрирован: 21. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #12 - 11. Октября 2007 :: 13:16
Печать  
"всяко бывает" на ответ поста 3 на тянет.
  
Наверх
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #13 - 12. Октября 2007 :: 06:38
Печать  
ну, ну, ну.. эк вас торкнуло-то  Улыбка

Цитата:
либо поле iddoc в таблице _1sjourn уникально только в пределах вида документа????

Идентификатор документа (значение в поле iddoc) уникально в пределах всей базы данных.

Цитата:
Я исходил из принципа, что iddoc уникально, если база нераспределенная. (где-то вычитал).

Тоже не правда. Идентификатор документа (iddoc char(9)) состоит из 6-ти символов идентификатора объекта и 3-х символов идентификатора базы данных. Идентификатор базы данных в нераспределенной базе 3 пробела. Идентификаторы объектов (обычное 32-разрядное число записанное в 36-ричной системе счисления: 6 символов) в системе распределенной базы данных действительно могут быть не уникальны, т.к. могут быть сформированы условно параллельно. Но в целом, значение идентификатора документа (6+3 = 9 символов) всегда уникальны.

Цитата:
Чтобы метапарсер правильно все разобрал.
ведь $ПКО.Сумма и $ПКО.Сумма разные поля в sql таблицах.

Тоже не правда. Метапарсер учитывает через алиас какой таблицы идет обращение к реквизиту данных и поставит в запрос правильное имя поля таблицы.

Теперь по самому условию связи: это сделано исключительно для оптимизации. Если мы уберем из условий связи условие по виду документа - результат запроса будет такой же.
Характер запроса подразумевает наличие нескольких связей (left join) с таблицами шапок разных видов документов. НО(!) сервер не знает логику заполнения наших таблиц, он понятия не имеет, что для каждой записи исходных данных соединится только одна левая связь, поэтому он для каждой записи исходных данных будет пытаться соединять каждую таблицу шапок. Конечно он найдет соответствующую запись только в одном соединении, но для всех остальных соединений он тоже сделает проход по индексу (iddoc), даже не смотря на то, что этот индекс является кластерным и первичным ключом - это все равно впустую потраченное время и загрузка диска (чтения).
Поэтому, т.к. у нас есть информация о виде документа, мы можем избавить его от этой работы: т.к. условие связи не выполнится в пределах исходных данных (не тот вид документа), он вообще не будет делать проход по индексу. Т.о. при правильной постановке условия связи мы уменьшим количество ридов из БД.
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получить суммы подчиненных документов
Ответ #14 - 12. Октября 2007 :: 08:33
Печать  
[quote author=DmitrO link=1191900469/0#13 date=1192171086]Поэтому, т.к. у нас есть информация о виде документа, мы можем избавить его от этой работы: т.к. условие связи не выполнится в пределах исходных данных (не тот вид документа), он вообще не будет делать проход по индексу. Т.о. при правильной постановке условия связи мы уменьшим количество ридов из БД.[/quote]
А можешь объяснить попроще? Я вижу для этого запроса два плана выполнения:
[list][*]с проверкой условия в итераторе Clustered Index Seek: [quote]Clustered Index Seek(OBJECT:([test].[dbo].[DH6247].[PK_DH6247] AS [РН]), SEEK:([РН].[IDDOC]=[Журнал].[IDDOC]),  WHERE:([Журнал].[IDDOCDEF]=6247) ORDERED FORWARD)[/quote]
[*]и в итераторе Merge: [quote]Merge Join(Left Outer Join, MERGE:([Журнал].[IDDOC])=([ПН].[IDDOC]), RESIDUAL:([Журнал].[IDDOCDEF]=931 AND [ПН].[IDDOC]=[Журнал].[IDDOC]))[/quote]
[/list]
Ни один из них не приводит к уменьшению количества чтений. Второй приводит к увеличению CPU.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать