|
|
|
SQL-запрос. Как получить рекв-ты "Договор"и "Контрагент" из рег-а "КнигаПро | ☑ | ||
|---|---|---|---|---|
|
0
МастерВопросов
25.05.11
✎
10:13
|
Ессно, не измерений, ни ресурсов таких в регистре нет.
Есть измерение "КредДокумент" и эти данные можно получать из этого документа. Но проблема в том, что это измерение неопредленного вида "Документ". И к какой конретно таблице джониться не понятно. ТекстЗапроса=" |SELECT | $ЗаявкаПокупателя.Контрагент [Контрагент $Справочник.Контрагенты] | , ПокупателиОстатки.Фирма [Фирма $Справочник.Фирмы] | , ПокупателиОстатки.Договор [Договор $Справочник.Договоры] | , ПокупателиОстатки.СтавкаНП [СтавкаНП $Справочник.СтавкиНП] | , ПокупателиОстатки.ВидДолга [ВидДолга $Перечисление.ВидыДолга] | , ПокупателиОстатки.КредДокумент [КредДокумент $Документ] | , Журнал.IDDOCDEF Документ_вид | , Sum(ПокупателиОстатки.СуммаРубОстаток) СуммаСуммаРубОстаток | , Sum(ПокупателиОстатки.СуммаНПОстаток) СуммаСуммаНПОстаток | , Sum(ПокупателиОстатки.СебестоимостьОстаток) СуммаСебестоимостьОстаток |FROM $РегистрОстатки.Покупатели(, | INNER JOIN _1SJOURN AS Журнал ON КредДокумент = Журнал.IDDOC,,,) AS ПокупателиОстатки | INNER JOIN _1SJOURN AS Журнал ON ПокупателиОстатки.КредДокумент = Журнал.IDDOC | LEFT OUTER JOIN $Документ.ЗаявкаПокупателя AS ЗаявкаПокупателя ON ЗаявкаПокупателя.IDDOC = Журнал.IDDOC |GROUP BY ПокупателиОстатки.Фирма |, ПокупателиОстатки.Договор |, ПокупателиОстатки.СтавкаНП |, ПокупателиОстатки.ВидДолга |, ПокупателиОстатки.КредДокумент |, Журнал.IDDOCDEF |"; |
|||
|
1
МастерВопросов
25.05.11
✎
10:17
|
пример для регистра "Покупатели", но не в этом суть...
|
|||
|
2
Ёпрст
гуру
25.05.11
✎
10:18
|
Нелепый запрос какой- то.
|
|||
|
3
Ёпрст
гуру
25.05.11
✎
10:19
|
особенно соедиение унутри ВТ.
|
|||
|
4
МастерВопросов
25.05.11
✎
10:20
|
(2) да да.
Он приджонивает только $Документ.ЗаявкаПокупателя, а надо все виды документов. Ну я его по быстрому конструктором накидал. |
|||
|
5
viktor_vv
25.05.11
✎
10:21
|
Джойнь все которые могут там быть, их наверное не так много. Ну и журнал туда приплетать необязательно, если кредДокумент общего вида, он и так типизируется по $Документ. И вот тут тоже непонятно как оно отрабатывает у тебя, если крдеДокумент общего вида.
|
|||
|
6
viktor_vv
25.05.11
✎
10:22
|
ПокупателиОстатки.КредДокумент = Журнал.IDDOC
|
|||
|
7
МастерВопросов
25.05.11
✎
10:22
|
+(3) и группировки по "$ЗаявкаПокупателя.Контрагент" нет
|
|||
|
8
Ёпрст
гуру
25.05.11
✎
10:24
|
INNER JOIN _1SJOURN AS Журнал ON ПокупателиОстатки.КредДокумент = Журнал.IDDOC
это не верно, КредДокумент - 13 символов, нужно кастрировать до 9 через substr |
|||
|
9
МастерВопросов
25.05.11
✎
10:25
|
(5) а потом в селекте писать что то типа CAST When($ЗаявкаПокупателя.Контрагент is not null then $ЗаявкаПокупателя.Контрагент Else ... and) as НашКонтрагент
|
|||
|
10
viktor_vv
25.05.11
✎
10:27
|
Coalesce($ЗаявкаПокупателя.Контрагент,$ДругойДокумент.Контаргент,$ОпятьДругойКонтаргент.Контаргент) as Контрагент
|
|||
|
11
Ёпрст
гуру
25.05.11
✎
10:27
|
(9) можно через coalesce
|
|||
|
12
МастерВопросов
25.05.11
✎
10:30
|
(10)(11) Спасибо
|
|||
|
13
МастерВопросов
25.05.11
✎
10:30
|
а по (0) я думал есть типовое решение.
Всё таки нередко приходится дергать инфу из регистров. |
|||
|
14
Ёпрст
гуру
25.05.11
✎
10:33
|
Короче, выкидывай везде упоминание о 1SJOURN - это тебе не нужно там, далее тупо кредДокумент соединяй с нужными видами документов сразу через
on substring(ПокупателиОстатки.КредДокумент,5,9) = ЗаявкаПокупателя.IDDOC ну и дальше имей |
|||
|
15
Ёпрст
гуру
25.05.11
✎
10:33
|
клиентосов через (10)
|
|||
|
16
viktor_vv
25.05.11
✎
10:34
|
(13) В каком смысле типовое ? Можешь динамически формировать текст запроса, только придумать принцип по которому определять какие виды документов двигали или могут двигать регистр.
|
|||
|
17
Ёпрст
гуру
25.05.11
✎
10:36
|
Мля.. посмотрел на регистр и сам окуел - у тебя и так всё есть в нём.
Всё что написано выше - в топку, далее тупо вытаскиваешь измерение Договор из регистра Покупатели (это же измерение!) Ну и джойнишь справочник Договоры, и типизируешь его владельца - имеешь клиентоса. |
|||
|
18
viktor_vv
25.05.11
✎
10:36
|
(16)+ Вернее какие виды есть в КредДокумент. Можно запросом по всему периоду, но не уверен насчет скорости, хотя по идее не сильно долго.
|
|||
|
19
Ёпрст
гуру
25.05.11
✎
10:36
|
Про всё остальное можешь забыть.
Меня тут не было.. :) |
|||
|
20
viktor_vv
25.05.11
✎
10:37
|
(17) Ему из КнигиПродаж. Покупатели он как пример привел. Хотя я не знаю что там в КнигеПродаж есть.
|
|||
|
21
МастерВопросов
25.05.11
✎
10:38
|
(14)(15) спасибо
(17) речь идет о "Книге продаж" :-) |
|||
|
22
Ёпрст
гуру
25.05.11
✎
10:39
|
(20)$РегистрОстатки.Покупатели ???
|
|||
|
23
Ёпрст
гуру
25.05.11
✎
10:39
|
(21) почему тогда в (0) $РегистрОстатки.Покупатели ?
|
|||
|
24
МастерВопросов
25.05.11
✎
10:40
|
(20) Измерения: КредДокумент, СтавкаНДС, ВидДолга.
Ресурсы: СуммаНДС, СуммаРуб, СуммаНП/ Реквизиты: КодОперации, ДокументОплаты, СтавкаНП, ЗаписьДополнительногоЛиста, КорректируемыйПериод |
|||
|
25
МастерВопросов
25.05.11
✎
10:41
|
(22)(23) ну я ж грю, для примера накидал, конструктором. "Покупатели" стоит на строчку выше чем "КнигаПродаж"
|
|||
|
26
viktor_vv
25.05.11
✎
10:41
|
Я не очень в Российских типовых, страна немного другая :).
|
|||
|
27
Ёпрст
гуру
25.05.11
✎
10:42
|
(25) аа...
ну тогда читай (14) :) |
|||
|
28
МастерВопросов
25.05.11
✎
10:43
|
+(25) плюс "Покупатели" содержит гораздо меньше остатков, по нему запрос быстрее делается. А по "КнигаПродаж" на 15 мин задумывается. Я отрабатываю текст запроса пока на "Покупателях".
|
|||
|
29
МастерВопросов
25.05.11
✎
10:59
|
Заработало!
ТекстЗапроса=" |SELECT | Coalesce($ПКО.Контрагент,$РКО.Контрагент,$Реализация.Контрагент,$СтрокаВыпискиРасход.Контрагент,$СтрокаВыпискиПриход.Контрагент) [Контрагент $Справочник.Контрагенты] | , ПокупателиОстатки.Фирма [Фирма $Справочник.Фирмы] | , ПокупателиОстатки.Договор [Договор $Справочник.Договоры] | , ПокупателиОстатки.СтавкаНП [СтавкаНП $Справочник.СтавкиНП] | , ПокупателиОстатки.ВидДолга [ВидДолга $Перечисление.ВидыДолга] | , ПокупателиОстатки.КредДокумент [КредДокумент $Документ] | , Sum(ПокупателиОстатки.СуммаРубОстаток) СуммаРуб | , Sum(ПокупателиОстатки.СуммаНПОстаток) СуммаНП | , Sum(ПокупателиОстатки.СебестоимостьОстаток) Себестоимость | FROM $РегистрОстатки.Покупатели(:ВыбДата,,,,) AS ПокупателиОстатки | LEFT OUTER JOIN $Документ.ПКО AS ПКО on substring(ПокупателиОстатки.КредДокумент,5,9) = ПКО.IDDOC | LEFT OUTER JOIN $Документ.РКО AS РКО on substring(ПокупателиОстатки.КредДокумент,5,9) = РКО.IDDOC | LEFT OUTER JOIN $Документ.Реализация AS Реализация on substring(ПокупателиОстатки.КредДокумент,5,9) = Реализация.IDDOC | LEFT OUTER JOIN $Документ.СтрокаВыпискиРасход AS СтрокаВыпискиРасход on substring(ПокупателиОстатки.КредДокумент,5,9) = СтрокаВыпискиРасход.IDDOC | LEFT OUTER JOIN $Документ.СтрокаВыпискиПриход AS СтрокаВыпискиПриход on substring(ПокупателиОстатки.КредДокумент,5,9) = СтрокаВыпискиПриход.IDDOC |GROUP BY ПокупателиОстатки.Фирма |, ПокупателиОстатки.Договор |, ПокупателиОстатки.СтавкаНП |, ПокупателиОстатки.ВидДолга |, ПокупателиОстатки.КредДокумент |, Coalesce($ПКО.Контрагент,$РКО.Контрагент,$Реализация.Контрагент,$СтрокаВыпискиРасход.Контрагент,$СтрокаВыпискиПриход.Контрагент) |"; Правда кое-где пустые поля "Контрагент" возращаются, но это, видимо, еще не все виды документов учел |
|||
|
30
МастерВопросов
25.05.11
✎
11:06
|
+(29) добавил еще КорректировкаДолга, ВводОстатковПокупателя, ВозвратОтПокупателя
пустых строк больше нет |
|||
|
31
Ёпрст
гуру
25.05.11
✎
11:08
|
(29) Это, раз ты делаешь запрос к Покупатели, тогда нахрена всё ЭТО ????
Делай тогда (17) - это быстрее в РАЗЫ. |
|||
|
32
МастерВопросов
25.05.11
✎
11:20
|
(31) сечас переделаю на книгу продаж.
Читай (28) |
|||
|
33
МастерВопросов
25.05.11
✎
11:22
|
(31) кстати, по Покупателям, рабочий запрос такой:
ТекстЗапроса=" |SELECT | Договоры.PARENTEXT [Контрагент $Справочник.Контрагенты] | , ПокупателиОстатки.Фирма [Фирма $Справочник.Фирмы] | , ПокупателиОстатки.Договор [Договор $Справочник.Договоры] | , ПокупателиОстатки.СтавкаНП [СтавкаНП $Справочник.СтавкиНП] | , ПокупателиОстатки.ВидДолга [ВидДолга $Перечисление.ВидыДолга] | , ПокупателиОстатки.КредДокумент [КредДокумент $Документ] | , Sum(ПокупателиОстатки.СуммаРубОстаток) СуммаРуб | , Sum(ПокупателиОстатки.СуммаНПОстаток) СуммаНП | , Sum(ПокупателиОстатки.СебестоимостьОстаток) Себестоимость | FROM $РегистрОстатки.Покупатели(:ВыбДата,,,,) AS ПокупателиОстатки | LEFT OUTER JOIN $Справочник.Договоры AS Договоры on ПокупателиОстатки.Договор = Договоры.ID |GROUP BY ПокупателиОстатки.Фирма |, ПокупателиОстатки.Договор |, ПокупателиОстатки.СтавкаНП |, ПокупателиОстатки.ВидДолга |, ПокупателиОстатки.КредДокумент |, Договоры.PARENTEXT |"; может лучше Inner Join? Или без разницы? |
|||
|
34
МастерВопросов
25.05.11
✎
11:32
|
+(32) переделал:
ТекстЗапроса=" |SELECT | Coalesce($ПКО.Контрагент,$РКО.Контрагент,$Реализация.Контрагент,$СтрокаВыпискиРасход.Контрагент,$СтрокаВыпискиПриход.Контрагент,$ВозвратОтПокупателя.Контрагент,$ВводОстатковПокупателя.Контрагент,$КорректировкаДолга.Контрагент) [Контрагент $Справочник.Контрагенты] | , КнигаПродаж.СтавкаНДС [СтавкаНДС $Перечисление.СтавкиНДС] | , КнигаПродаж.ВидДолга [ВидДолга $Перечисление.ВидыДолга] | , КнигаПродаж.КредДокумент [КредДокумент $Документ] | , Sum(КнигаПродаж.СуммаНДСОстаток) СуммаНДС | , Sum(КнигаПродаж.СуммаРубОстаток) СуммаРуб | , Sum(КнигаПродаж.СуммаНПОстаток) СуммаНП | FROM $РегистрОстатки.КнигаПродаж(:ВыбДата,,,,) AS КнигаПродаж | LEFT OUTER JOIN $Документ.ПКО AS ПКО on substring(КнигаПродаж.КредДокумент,5,9) = ПКО.IDDOC | LEFT OUTER JOIN $Документ.РКО AS РКО on substring(КнигаПродаж.КредДокумент,5,9) = РКО.IDDOC | LEFT OUTER JOIN $Документ.Реализация AS Реализация on substring(КнигаПродаж.КредДокумент,5,9) = Реализация.IDDOC | LEFT OUTER JOIN $Документ.СтрокаВыпискиРасход AS СтрокаВыпискиРасход on substring(КнигаПродаж.КредДокумент,5,9) = СтрокаВыпискиРасход.IDDOC | LEFT OUTER JOIN $Документ.СтрокаВыпискиПриход AS СтрокаВыпискиПриход on substring(КнигаПродаж.КредДокумент,5,9) = СтрокаВыпискиПриход.IDDOC | LEFT OUTER JOIN $Документ.ВозвратОтПокупателя AS ВозвратОтПокупателя on substring(КнигаПродаж.КредДокумент,5,9) = ВозвратОтПокупателя.IDDOC | LEFT OUTER JOIN $Документ.ВводОстатковПокупателя AS ВводОстатковПокупателя on substring(КнигаПродаж.КредДокумент,5,9) = ВводОстатковПокупателя.IDDOC | LEFT OUTER JOIN $Документ.КорректировкаДолга AS КорректировкаДолга on substring(КнигаПродаж.КредДокумент,5,9) = КорректировкаДолга.IDDOC |GROUP BY | КнигаПродаж.СтавкаНДС |, КнигаПродаж.ВидДолга |, КнигаПродаж.КредДокумент |, Coalesce($ПКО.Контрагент,$РКО.Контрагент,$Реализация.Контрагент,$СтрокаВыпискиРасход.Контрагент,$СтрокаВыпискиПриход.Контрагент,$ВозвратОтПокупателя.Контрагент,$ВводОстатковПокупателя.Контрагент,$КорректировкаДолга.Контрагент) |"; Жду результата запроса.... Чот крепко 1С-ина зудмалась. |
|||
|
35
МастерВопросов
25.05.11
✎
11:34
|
+(34) а блин, про договор то забыл.
Как тормознуть SQL запрос?! |
|||
|
36
viktor_vv
25.05.11
✎
11:34
|
(33) Через Inner у тебя с пустым договором в измерении не попадут в выборку.
|
|||
|
37
МастерВопросов
25.05.11
✎
11:38
|
(36) ОК. Спасибо.
|
|||
|
38
Ёпрст
гуру
25.05.11
✎
11:38
|
попробуй наеборот, заместо субстринга, вид документа прибавлять (я не помню, как там надо написать, чтоб в индекс попасть)
substring(КнигаПродаж.КредДокумент,5,9) = СтрокаВыпискиРасход.IDDOC замени на КнигаПродаж.КредДокумент = $ВидДокумента36.СтрокаВыпискиРасход + СтрокаВыпискиРасход.IDDOC |
|||
|
39
МастерВопросов
25.05.11
✎
11:42
|
+(38) так разве быстрее?
При "substring(КнигаПродаж.КредДокумент,5,9) = СтрокаВыпискиРасход.IDDOC" вроде меньшее количество символов сравнивается. И нет преобразования $ВидДокумента36. |
|||
|
40
viktor_vv
25.05.11
✎
11:46
|
$ВидДокумента преобразовывается в момент трансляции текста запроса, не в момент выполнения. Я правда так пробовал, но особого выигрыша не увидел.
|
|||
|
41
МастерВопросов
25.05.11
✎
12:05
|
ТабОстатков = рс.ВыполнитьИнструкцию(ТекстЗапроса); 1 157.487874 42.96
это на substring сейчас попробую на ВидДокумента36 |
|||
|
42
Дык ё
25.05.11
✎
12:12
|
(34) если есть графа отбора по контрагентам, все эти left outer можно выбросить нафиг
|
|||
|
43
МастерВопросов
25.05.11
✎
12:13
|
(42) но договор то всё равно нужен.
А как писать через графу отбора? |
|||
|
44
Ёпрст
гуру
25.05.11
✎
12:14
|
(43) через _1crdoc
|
|||
|
45
Ёпрст
гуру
25.05.11
✎
12:15
|
(42)Дык сразу про неё и не вспомнишь.
|
|||
|
46
МастерВопросов
25.05.11
✎
12:40
|
(40) на скольлко я понимаю, $ВидДокумента36 транслирует первые пять цифр (вид документа), в какую то другую систему счисления. Поэтому он работает именно в момент запроса, а не трансляции текста. Или я заблуждаюсь?
Кстати мой запрос с вариантом на $ВидДокумента36 до сих пор еще не завершился. ИМХО работает значительно дольше чем на "substring". Устал ждать :-( |
|||
|
47
Ёпрст
гуру
25.05.11
✎
12:44
|
(46) заблуждаешься, $ВидДокумента36 преобразуется ДО исполнения запроса на sql сервере, это делает метапарсер 1cpp
ЗЫ: я не помню уже, $ВидДокумента36 нужно втыкать или $ВидДокумента |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |