|
v7: Прямой запрос по дате и документам | ☑ | ||
---|---|---|---|---|
0
Rurouny
07.09.20
✎
15:52
|
Как построить запрос по дате
Запрос в 1С Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с НачДата по КонДата; |Склад = Регистр.ОперСклады.Склад; |Товар = Регистр.ОперСклады.Товар; |Кол = Регистр.ОперСклады.КолЕдИзм1; |Док = Регистр.ОперСклады.ТекущийДокумент; |Функция КолНачОст = НачОст(Кол); |Функция КолПриход = Приход(Кол); |Функция КолРасход = Расход(Кол); |Функция КолРасходГП = Расход(Кол) когда(Найти(Док.Вид(),""ВыпускБР"")<>0); |Функция КолРасходГП1 = Расход(Кол) когда(Найти(Док.Вид(),""ВыпускБР"")=0); |Функция КолКонОст = КонОст(Кол); |Группировка День; |Группировка Товар без групп; |Условие((Склад В Склад1) или (Склад В Склад2)); |"//}}ЗАПРОС ; ТекстЗапросаГП1 = "-- Это запрос по ГП |SELECT | '' [Документ_вид $ВидДокумента] | , ОперСкладыОстаткиОбороты.Склад [Склад $Справочник.МестаХранения] | , ОперСкладыОстаткиОбороты.Товар [Товар $Справочник.ТМЦ] | , ОперСкладыОстаткиОбороты.Документ [Документ $Документ] | , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход AS КолРасходГП1 | , ОперСкладыОстаткиОбороты.КолЕдИзм1НачальныйОстаток | , ОперСкладыОстаткиОбороты.КолЕдИзм1Приход | , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход | , ОперСкладыОстаткиОбороты.КолЕдИзм1КонечныйОстаток | , ОперСкладыОстаткиОбороты.Период Период //тут трямая зависимомть если стоит 3-м условием *Документ* тогда отбор по Виду документа возможен !!! |FROM $РегистрОстаткиОбороты.ОперСклады(:НачДата,:КонДата,День,ДвиженияИГраницыПериода,,,(Склад, Товар, Документ),КолЕдИзм1) AS ОперСкладыОстаткиОбороты | WHERE " + РегМест + РегТовар + " | | UNION all | |SELECT | ОперСкладыОстаткиОбороты.ВидДокумента [Документ_вид $ВидДокумента] | , ОперСкладыОстаткиОбороты.Склад [Склад $Справочник.МестаХранения] | , ОперСкладыОстаткиОбороты.Товар [Товар $Справочник.ТМЦ] | , ОперСкладыОстаткиОбороты.Документ [Документ $Документ] | , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход AS КолРасходГП1 | , ОперСкладыОстаткиОбороты.КолЕдИзм1НачальныйОстаток | , ОперСкладыОстаткиОбороты.КолЕдИзм1Приход | , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход | , ОперСкладыОстаткиОбороты.КолЕдИзм1КонечныйОстаток | , 0 AS Период |FROM $РегистрОстаткиОбороты.ОперСклады(:НачДата,:КонДата,Документ,ДвиженияИГраницыПериода,,,(Склад, Товар, Документ),КолЕдИзм1) AS ОперСкладыОстаткиОбороты | WHERE | ((ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок+") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок1 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок2 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок3 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок4 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок5 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок6 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок7 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок8 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок9 +") |" + ") and" + РегМест + РегТовар + " //|GROUP BY Товар |"; Хотелось бы отобрать по виду документа и по дням их формирования $РегистрОстаткиОбороты.<?>(<?>, <?>, <?>, <?>, <?>, <?>, <?>, <?>) Виртуальная таблица остатков и оборотов Синтаксис: $РегистрОстаткиОбороты.<ИмяРегистра>([<НачалоПериода>][, <КонецПериода>][, <Периодичность>][,<МетодДополнения>][, <Соединение>][,<Условие>] [,<Измерение>][,<Ресурс>]) [as <Алиас>] <Периодичность> - можно задать или по Дню или по документу. Как отобрать и по тому и по другому. |
|||
1
Ёпрст
07.09.20
✎
15:55
|
не использовать вт останки и обороты. взять отдельно вт остатки и присоединить обороты с фильтрами на виддокумента
|
|||
2
Ёпрст
07.09.20
✎
15:57
|
ну и соединять с журналом для даты. Если есть галка быстрой обработки движения, то журнал не нужен, всё и так есть в ra
|
|||
3
Mikeware
07.09.20
✎
16:11
|
(1) в какой-то из ВТ (вроде, в классе ПоставщикДанных была ВТ, в которой можно было задать дополнение "на каждый день")
Ну а так да, задача классическая - "остатки на каждый день" |
|||
4
Rurouny
07.09.20
✎
16:41
|
(2) галка есть )
|
|||
5
Rurouny
07.09.20
✎
17:30
|
А есть пример у кого такого запроса
|
|||
6
Ёпрст
07.09.20
✎
17:38
|
(5) ну, для КонОст бери запрос к ВТ Останки, а для своего
|Функция КолРасходГП = Расход(Кол) когда(Найти(Док.Вид(),""ВыпускБР"")<>0); можешь тупо обращаться к табличке движения регистра, с фильтром на iddocdef (вид документа) и фильтр по дате ставить (date_time_iddoc) эти поля уже будут в ra, коли галка стоит. оба запроса в union all и в подзапрос, на выходе всё группируешь и привет |
|||
7
Ёпрст
07.09.20
✎
17:41
|
||||
8
tgu82
07.09.20
✎
21:16
|
(7) Забираю к себе. То что надо. Спасибо
|
|||
9
Mikeware
08.09.20
✎
07:52
|
(8) анахрена? Чтоб жизнь медом не казалась?
|
|||
10
tgu82
08.09.20
✎
08:11
|
(9) Ага. А то уж больно слащавая какай-то )
|
|||
11
Mikeware
08.09.20
✎
08:15
|
(10) лучше возьми класс ПоставщикДанных, пиши запросы с его помощью, заодно привыкнешь к восьмерочным запросам.
ИМХО, сочетать надо полезное с приятным, а не бесполезное с отвратительным... |
|||
12
Rurouny
08.09.20
✎
13:41
|
SELECT
Журнал.IDDOCDEF Док_вид, Журнал.IDDOC [Док $Документ], Док.sp13482 as [БР $Справочник.ТМЦ], БР.sp16474 as [Модель $Справочник.Модель], БР.sp16475 as [Рецептура $Справочник.Рецептура], Док.sp18247 as [ДокНорма $Документ.НормыРасхода], ДокС.sp13035 as [Материал $Справочник.ТМЦ], Sum(ДокС.sp13037) ПоФакту, Sum(ДокС.sp13039) КромПоФакту, Sum(ДокС.sp13041) ПромПоФакту, Sum(ДокС.sp13043) СлиткиПоФакту, Sum(ДокС.sp13774) as УгарПоФакту FROM _1SJOURN AS Журнал With (NOLOCK) INNER JOIN dh13034 AS Док on Журнал.IDDOC = Док.IDDOC INNER JOIN sc44 AS БР on БР.ID = Док.sp13482 INNER JOIN dt13034 AS ДокС on Док.IDDOC = ДокС.IDDOC WHERE Журнал.DATE_TIME_IDDOC BETWEEN '20200401' AND '20200430Z' and Журнал.IDDOCDEF = 13034 and Журнал.Closed & 1 = 1 UNION all SELECT Журнал.IDDOCDEF Док_вид, Журнал.IDDOC [Док $Документ], Док.sp13482 as [БР $Справочник.ТМЦ], БР.sp16474 as [Модель $Справочник.Модель], БР.sp16475 as [Рецептура $Справочник.Рецептура], Док.sp18247 as [ДокНорма $Документ.НормыРасхода], ДокСЗ.sp13492 as [Материал $Справочник.ТМЦ], Sum(ДокСЗ.sp13495) ПоФакту, Sum(ДокСЗ.sp13497) КромПоФакту, Sum(ДокСЗ.sp13499) ПромПоФакту, Sum(ДокСЗ.sp13501) СлиткиПоФакту, 0 as УгарПоФакту FROM _1SJOURN AS Журнал With (NOLOCK) INNER JOIN dh13479 AS Док on Журнал.IDDOC = Док.IDDOC INNER JOIN sc44 AS БР on БР.ID = Док.sp13482 INNER JOIN dt13479 AS ДокСЗ on Док.IDDOC = ДокСЗ.IDDOC WHERE Журнал.DATE_TIME_IDDOC BETWEEN '20200401' AND '20200430Z' and Журнал.IDDOCDEF = 13479 and Журнал.Closed & 1 = 1 GROUP BY Журнал.IDDOCDEF, Журнал.IDDOC, Док.sp13482, БР.sp16474, БР.sp16475, Док.sp18247, ДокС.sp13035, ДокСЗ.sp13492 тз = рс.ВыполнитьИнструкцию(ТекстЗапроса); {W:\ОАИП\ОБЩАЯ\ВЫПУСК БР.ERT(110)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Недопустимое имя столбца "sp13482". По отдельности работает, а вместе нет В чем проблема ??? |
|||
13
Salimbek
08.09.20
✎
13:52
|
(12) Док.sp13482 - это у тебя поле в документе. Только документы у тебя получаются разные, а поле ты берешь одно и то же.
Посему выкинь обращение к полям через sp13482 а пиши $Док.Товар - или как там у тебя оно называется. Ну либо тщательнее смотри названия полей в зависимости от Вида Документа. |
|||
14
Mikeware
08.09.20
✎
13:53
|
(12) какая религия заставляет писать без использования метапарсера?
|
|||
15
trad
08.09.20
✎
13:57
|
(14) например дергание из снеговика
|
|||
16
trad
08.09.20
✎
13:58
|
(15) + но тут, да, не этот случай
|
|||
17
Sserj
08.09.20
✎
14:00
|
(12) Без метапарсера это конечно круто, но таки:
в первой части: select .. Док.sp13482 .. from INNER JOIN dh13479 AS Док ... и во второй части: select .. Док.sp13482 .. from ... INNER JOIN dh13479 AS Док ... Тобишь Док однозначно на разные таблицы документов ссылается, а поле sp13482 у них одинаковое пишешь. Так не может быть все реквизитов уникальные. |
|||
18
Sserj
08.09.20
✎
14:01
|
+(17) В первой части: "..INNER JOIN dh13034 AS Док.."
|
|||
19
trad
08.09.20
✎
14:03
|
если "По отдельности работает"
то скорее всего ТС пишет с метапарсером, просто сюда вывалил уже отпарсеный |
|||
20
trad
08.09.20
✎
14:05
|
(19) +
в таком случае, проблема в том, что в одном запросе нельзя применять одинаковые алиас для разных таблиц метапарсер - он простой, семантику не умеет |
|||
21
Sserj
08.09.20
✎
14:05
|
(19) Что-то он не договаривает или не так проверяет по отдельности. Не может оно все работать. Один из двух запросов должне на sp13482 ругаться.
|
|||
22
trad
08.09.20
✎
14:07
|
т.е.
select .. Док1.БР .. from INNER JOIN $Документ.ВидА AS Док1 ... и во второй части: select .. Док2.БР .. from ... INNER JOIN $Документ.ВидБ AS Док2 |
|||
23
trad
08.09.20
✎
14:07
|
$Док1.БР и $Док2.БР конечно
|
|||
24
trad
08.09.20
✎
14:08
|
(21) если первый запрос выполняет отдельно и через метапарсер, то вычисляется не sp13482
|
|||
25
trad
08.09.20
✎
14:11
|
(24) + а когда выполняет вместе, в мозгах метапарсера за алиасом Док закреплен только $Документ.ВидБ, и на втором проходе поле (вверху и внизу) вычисляется по этому виду документа
|
|||
26
Rurouny
08.09.20
✎
14:34
|
В 1С запрос написан так
ТекстЗапроса = " |SELECT | Журнал.IDDOCDEF Док_вид, | Журнал.IDDOC [Док $Документ], | $Док.БР as [БР_0 $Справочник.ТМЦ], | $БР_.Модель as [Модель $Справочник.Модель], | $БР_.Рецептура1 as [Рецептура $Справочник.Рецептура], | $Док.ДокНорма as [ДокНорма $Документ.НормыРасхода], //| Sum($Док.Выпуск) Выпуск, //| Sum($Док.КолОтхКром) КолКром, //| Sum($Док.КолОтхПром) КолПром, //| Sum($Док.КолОтхСлитки) + Sum($Док.КолОтхСлитки1) as КолСлитки, //| Sum($Док.Угар) Угар, | $ДокС.Материал as [Материал $Справочник.ТМЦ], | Sum($ДокС.ПоФакту) ПоФакту, | Sum($ДокС.ОтхКромПоФакту) КромПоФакту, | Sum($ДокС.ОтхПромПоФакту) ПромПоФакту, | Sum($ДокС.СлиткиПоФакту) СлиткиПоФакту, | Sum($ДокС.УгарПоФакту) as УгарПоФакту |FROM | _1SJOURN AS Журнал With (NOLOCK) | INNER JOIN $Документ.ВыпускБР AS Док on Журнал.IDDOC = Док.IDDOC | INNER JOIN $Справочник.ТМЦ AS БР_ on БР_.ID = $Док.БР | INNER JOIN $ДокументСтроки.ВыпускБР AS ДокС on Док.IDDOC = ДокС.IDDOC |WHERE | Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~ and | Журнал.IDDOCDEF = $ВидДокумента.ВыпускБР and | Журнал.Closed & 1 = 1 | |UNION all | |SELECT | Журнал.IDDOCDEF Док_вид, | Журнал.IDDOC [Док $Документ], | $Док.БР as [БР_0 $Справочник.ТМЦ], | $БРЗ.Модель as [Модель $Справочник.Модель], | $БРЗ.Рецептура1 as [Рецептура $Справочник.Рецептура], | $Док.ДокНорма as [ДокНорма $Документ.НормыРасхода], //| Sum($Док.Выпуск) Выпуск, //| Sum($Док.КолОтхКром) КолКром, //| Sum($Док.КолОтхПром) КолПром, //| Sum($Док.КолОтхСлитки) as КолСлитки, //| Sum(0) Угар, | $ДокСЗ.Материал as [Материал $Справочник.ТМЦ], | Sum($ДокСЗ.ПоФакту) ПоФакту, | Sum($ДокСЗ.ОтхКромПоФакту) КромПоФакту, | Sum($ДокСЗ.ОтхПромПоФакту) ПромПоФакту, | Sum($ДокСЗ.СлиткиПоФакту) СлиткиПоФакту, | 0 as УгарПоФакту |FROM | _1SJOURN AS Журнал With (NOLOCK) | INNER JOIN $Документ.ВыпускБРзапуска AS Док on Журнал.IDDOC = Док.IDDOC | INNER JOIN $Справочник.ТМЦ AS БРЗ on БРЗ.ID = $Док.БР | INNER JOIN $ДокументСтроки.ВыпускБРЗапуска AS ДокСЗ on Док.IDDOC = ДокСЗ.IDDOC |WHERE | Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~ and | Журнал.IDDOCDEF = $ВидДокумента.ВыпускБРЗапуска and | Журнал.Closed & 1 = 1 |"; Если ПустоеЗначение(ВыбБР) = 0 Тогда Если ВыбБР.ЭтоГруппа() = 1 Тогда ТекстЗапроса = ТекстЗапроса + " | and $Док.БР in (SELECT Val FROM #ВыбБР) |"; рс.УложитьСписокОбъектов(ВыбБР, "#ВыбБР", "ТМЦ"); Иначе ТекстЗапроса = ТекстЗапроса + " | and $Док.БР = :ВыбБР |"; рс.УстановитьТекстовыйПараметр("ВыбБР", ВыбБР); КонецЕсли; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " |GROUP BY | Журнал.IDDOCDEF, | Журнал.IDDOC, | $Док.БР, | $БР_.Модель, | $БР_.Рецептура1, | $БРЗ.Модель, | $БРЗ.Рецептура1, | $Док.ДокНорма, | $ДокСЗ.Материал, | $ДокС.Материал |"; Сообщить(ТекстЗапроса); рс.УстановитьТекстовыйПараметр("НачДата", НачДата); рс.УстановитьТекстовыйПараметр("КонДата", КонДата); рс.Отладка(1); |
|||
27
Ёпрст
08.09.20
✎
14:39
|
(26) из второго запроса выкини всю типизацию к едрени фени
|
|||
28
Ёпрст
08.09.20
✎
14:39
|
всё что после юниона не должно иметь этого
[Док $Документ],...и остальные поля |
|||
29
trad
08.09.20
✎
14:52
|
(26) ответ дан в (20)
|
|||
30
trad
08.09.20
✎
14:52
|
а в (22) написано как надо
|
|||
31
trad
08.09.20
✎
14:56
|
это чтоб запрос заработал
Но по сути запрос не верный, с отбором и групбаем туфта полная |
|||
32
Sserj
08.09.20
✎
15:47
|
А почему тема начиналась с запроса по регистрам, а теперь стала по журналу. Не осилил регистры? Может вернуться к первоначальному, так как по регистрам однозначно быстрее будет.
|
|||
33
Rurouny
09.09.20
✎
08:27
|
(32) вернусь к регистру )) так как многие отчеты на регистрах. но это не надолго скоро переход на ERP
|
|||
34
Mikeware
09.09.20
✎
08:46
|
(33) чот вангуется мне, что если вы тут запрос написать не можете, то и в erp будет примерно так же...
|
|||
35
Ёпрст
09.09.20
✎
09:15
|
(34) там же всё из коробки !
) |
|||
36
Mikeware
09.09.20
✎
09:16
|
(35) дык галочки не там расставят!
|
|||
37
Rurouny
14.09.20
✎
08:58
|
С запросом разобрался, сделал через конструктор и без проблем, и то что с коробки ERP и галочки уже расставили, так же уже допилили половину документов под себя, пишем арм для линий, а это, что в 1С7.7 прямые запросы просто через ж.. все сделано (тупо нужно было время переключиться на ПрямЗапр 1С), пишу запросы на MSSQL, MySQL, Firebird и все без проблем. (36) так, что не сцы, сертификаты по ерп имеем и знаем, что и где расставлять. И из коробки там ни хрена нет, все в ручном режиме делается (нужно допиливать многое), всем МИРА.
|
|||
38
ДенисЧ
14.09.20
✎
09:02
|
ИНтересно, в каком больном мозгу могла возникнуть связь между ЕРП и прямыми запросами в 77...
|
|||
39
Mikeware
14.09.20
✎
09:13
|
(38) оно обиделось.
|
|||
40
МихаилМ
28.09.20
✎
17:19
|
как то не стыкуется "пишу запросы на MSSQL, MySQL, Firebird "
и WHERE | ((ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок+") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок1 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок2 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок3 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок4 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок5 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок6 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок7 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок8 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок9 +") к тому же Журнал.Closed & 1 = 1 убивает обращение к индексу |
|||
41
trdm
28.09.20
✎
17:32
|
(14) > какая религия заставляет писать без использования метапарсера?
Да у него просто нет скрипта SQLIntellisence.vbs %) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |