|
v7: Оптимизация запроса | ☑ | ||
---|---|---|---|---|
0
bananan
25.12.12
✎
11:35
|
Когда я задал обрботку 10 дней он работал 00:05:59, когда я ему задал тужу обработку но в функции ПересчетВЯщики(ТМЦ, Количество) в первой же строке вызвал Возврат - он работал 00:03:34 (на 2 минуты и 25 секунд меньше). Т.е. именно функция ПересчетВЯщики() сильно тормозит. К подчиненному справочнику Справочник.ЕдИз надо как-то иначе обращаться (не в функции, в функции опять же циклы). Т.е. е справочнику Справочник.ЕдИз надообращатьс через Запрос строго через запрос, может выполнять для этого второй Запрос. Подскажите как это сделать?
|
|||
351
bananan
27.12.12
✎
15:18
|
Все-таки еще один вопрос (на этот раз думаю, что последний)
Если в данном запросе не показывать каждвй товар иего количество , то ону бдет работать быстрее? Сейчас я сделал тупо когда установлен флажок Подробно - строка Строка (ТМЦ, количество) - показывается, когда флаг не установлен, то эта строка не показывается. А может еще и запрос поменять? Если да, то как? |
|||
352
Ёпрст
27.12.12
✎
15:19
|
(351) свёрнуто чтоб по документам было ?
|
|||
353
Ёпрст
27.12.12
✎
15:20
|
выкидываешь из селекта
,$ДокС.ТМЦ as [Товар $Справочник.ТМЦ] и из гроуп бай тоже и привет |
|||
354
bananan
27.12.12
✎
15:45
|
(353) Спасибо. сейчас попробую. А так запрос будет быстрее работать или это там какая милисекунда?
Например подробно за прошлый месяц он у меня работет 2.5 минуты |
|||
355
Ёпрст
27.12.12
✎
16:14
|
(354) можно еще улучшить, если присоединение журнала делать на каждый документ отдельно в подзапросе с юнионами.
|
|||
356
bananan
27.12.12
✎
16:44
|
(355) Ну, пока и так работает моего опыта и знаний на это пока не хватает. А (355) это для подробнорго отчета или нет или для обоих?
|
|||
357
Ёпрст
27.12.12
✎
16:47
|
для обоих
|
|||
358
Ёпрст
27.12.12
✎
16:50
|
2.5 минуты.. это слишком долго.
Где-то еще есть обращение к серваку, надеюсь, в результате запроса дату свою и другие атрибуты документа не получаешь как ТЗ.Док.ДатаДок ? |
|||
359
bananan
27.12.12
✎
16:51
|
(357) Так и думал. попробую сам, а не получитьсчя - обращусь к тебе
|
|||
360
bananan
27.12.12
✎
16:52
|
(359) ТЗ.Док обращаюсь просто так
|
|||
361
Ёпрст
27.12.12
✎
16:52
|
меня до 7-го не будет ужо.. через 8 минут
|
|||
362
bananan
27.12.12
✎
16:53
|
(361) Тми за 8 минут сможешь такой запрос написать?
|
|||
363
Ёпрст
27.12.12
✎
16:58
|
ТекстЗапроса="
|select | Таб.Документ as [Док $Документ] | ,Таб.iddocdef as [Док_вид $ВидДокумента] | ,Таб.Товар as [Товар $Справочник.ТМЦ] | ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения | ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках |from | ( | select | $ДокС.ТМЦ as Товар | ,Жур.iddocdef | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) | inner join _1sjourn as Жур (nolock) on Жур.IDDoc = ДокС.iddoc | and Жур.iddocdef = $ВидДокумента.РасходнаяНакладная | and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ | and Жур.Closed&1 = 1 | | union all | | select | $ДокН.ТМЦ | ,Жур2.iddocdef | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock) | inner join _1sjourn as Жур2 (nolock) on Жур2.IDDoc = ДокН.iddoc | and Жур2.iddocdef = $ВидДокумента.РасходнаяНакладнаяН | and Жур2.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ | and Жур2.Closed&1 = 1 | )as Таб | |left join ( | select | max($Спр.Коэффициент) as Коэффициент | ,Спр.parentext as Владелец | from $Справочник.Единицы as Спр (nolock) | where $Спр.Ед =:ВыбЕдиница | and $Спр.Коэффициент>0 | and Спр.ismark=0 | group by Спр.parentext | ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар | |group by | Таб.Документ,Таб.iddocdef,Таб.Товар |"; Запрос.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик); .................. |
|||
364
bananan
27.12.12
✎
17:01
|
(363) ОГромное спасибо!
|
|||
365
bananan
27.12.12
✎
17:38
|
(363) Прочитаешь уже в следующем году. Но второй вариант, который по твоим словам должен был бы работать быстрее работал на 24 секунды дольше, чем прыдидущий
|
|||
366
Botanik8888
27.12.12
✎
17:42
|
А ты его несколько раз запусти
|
|||
367
bananan
27.12.12
✎
18:09
|
(366) А что єто даст?
|
|||
368
bananan
27.12.12
✎
18:11
|
ПОнятно, что львиную долю времени занимает вывод рещультатов запроса, а не сам запрос. Т.е. если улучшений вариант и давал какую-то экономию то это милисекунды или того меньше
|
|||
369
Botanik8888
27.12.12
✎
19:27
|
1. Вы замер сделайте именно на выполнение запроса.
2. Если правильно составлен запрос то вывод данных на печать не будет занимать "львиной доли" (если не тысячи строк выводятся на печать) 3. К (366) - Понятие план запроса вам знакомо? |
|||
370
ADirks
27.12.12
✎
19:33
|
(369) это как интересно запрос влияет на время формирования печатной формы? вроде, не связанные процессы
|
|||
371
bananan
27.12.12
✎
20:01
|
(370) Резк\ультаты работы запроса выводяться на экран или как?
|
|||
372
Botanik8888
27.12.12
✎
20:26
|
(370) - может я неверно выразился, имелось ввиду что
если запросом получает все необходимые данные и нет необходимости их дальше преобразовывать, то на печать должно вывестись очень быстро. Именно потому что они ну совсем не связанные процессы... |
|||
373
Botanik8888
27.12.12
✎
20:27
|
" то на печать должно вывестись очень быстро. " - читать как формирование печатной формы не должно занять много времени.
|
|||
374
bananan
28.12.12
✎
11:39
|
Сейчас внес дополнения в код и буду знать: общее время работы скрипта, время выполнения запроса, время вывода на экран - Вот и увидем реальные цифры.
+ О выводе на экран, толи у меня видеокарта медленная, то ли ввобще комп, но именно вывод на экран занимает очень много времени. P.S. Когда я "приукрасил" немного таблицу (разные цвета для шапки, ну шапка - фыгня, а вот для ТМЦ и совсем другой цвет для суммыящиков по документу (а документов скрипт обрабатывает ну очень много) - время работы скрипта увеличилось вдове! |
|||
375
ADirks
28.12.12
✎
11:41
|
(374) Ты случайно объединений ячеек не добавил при приукрашательстве? Вдвое - подозрительно много.
|
|||
376
bananan
28.12.12
✎
11:42
|
Результаты работы улучшенной версий скрипт работал 13мин 49сек
Запрос работал: 7 секунд |
|||
377
bananan
28.12.12
✎
11:43
|
(375) Добавлял
|
|||
378
ADirks
28.12.12
✎
11:45
|
ну так убери нафиг
это тормоза, потери памяти, и потециально глюки при отображении |
|||
379
bananan
28.12.12
✎
11:46
|
(378) Не знал. Спасибо. Уберу
|
|||
380
ADirks
28.12.12
✎
11:48
|
по поводу скорости формирования mxl: http://www.rikcenter.ru/download/TestVivoda.zip
кратко: не выводить агрегатных данных, особенно в расшифровки - это основные тормоза. Ещё прикольно использовать подготовленные секции, но это уже следующим шагом. |
|||
381
bananan
28.12.12
✎
12:07
|
Простой (первый неоптимизированний вариант скртипта): Общее время работы 13 минут 47 секунд (на 2 секунды меньше от оптимизированного).
Запрос в этой первой версии работал 3секунды - против 7 секунд в оптимизированной версии! |
|||
382
bananan
28.12.12
✎
12:31
|
(380) Что за линк там в архиве файлы дбф, один вв файл и один мд файл к 1С. Что с ними делать и что они дают?
|
|||
383
ADirks
28.12.12
✎
12:33
|
(382) это тестовая конфа, в которой сравниваются разные методы вывода в mxl
|
|||
384
bananan
28.12.12
✎
12:46
|
(383) Понял, а, не в курсе где обо всем этом можно почитать (скорость формирования)?
|
|||
385
ADirks
28.12.12
✎
12:50
|
Ну ты посмотри там в код - всё примитивно. Это проще, чем русским языком объяснять. Помнится, этот тест мы сделали в ходе обсуждения на 1С++ форуме - можешь там поискать.
|
|||
386
bananan
28.12.12
✎
13:40
|
(385) Спасибо
|
|||
387
bananan
28.12.12
✎
14:19
|
Ребята! еще подскажите как мне из 1С в T-SQL "перевести"
Условие (ТМЦ в выбТМЦ) ? WHERE ТМЦ in выбТМЦ полный текст запроса : |select | Жур.iddoc as [Док $Документ] | ,Жур.iddocdef as [Док_вид $ВидДокумента] | ,Таб.Товар as [Товар $Справочник.ТМЦ] | ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения | ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках |from | ( | select | $ДокС.ТМЦ as Товар | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) | | union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock) | )as Таб | |inner join | _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ | and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН) | and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ | and Жур.Closed&1 = 1 |left join ( | select | max($Спр.Коэффициент) as Коэффициент | ,Спр.parentext as Владелец | from $Справочник.ЕдИзм as Спр (nolock) | where $Спр.Ед =:ВыбЕдиница | and $Спр.Коэффициент>0 | and Спр.ismark=0 | group by Спр.parentext | ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар | |group by | Жур.iddoc,Жур.iddocdef,Таб.Товар"; |
|||
388
bananan
28.12.12
✎
14:21
|
+(387) И где это поставить в тексте запроса?
|
|||
389
bananan
28.12.12
✎
14:25
|
(387, 388) выбТМЦ у меня на форме отчета окно для выбора тмц
|
|||
390
Mikeware
28.12.12
✎
14:26
|
(388) а документацию будет читать пушкин? или тарас шевченко?
|
|||
391
bananan
28.12.12
✎
14:28
|
(389) Т.е. как этот параметр передать в запрос?
(390) Да я буду читать, но сейчас когда запрос уже готов и рабоатет надо доставить только этот выбор ТМЦ |
|||
392
bananan
28.12.12
✎
14:30
|
Конечно у меня еще совсем нет опыта, сделал так:
ТекстЗапроса = " |select | Жур.iddoc as [Док $Документ] | ,Жур.iddocdef as [Док_вид $ВидДокумента] | ,Таб.Товар as [Товар $Справочник.ТМЦ] | ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения | ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках |from | ( | select | $ДокС.ТМЦ as Товар | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) | | union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock) | )as Таб | |inner join | _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ | and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН) | and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ | and Жур.Closed&1 = 1 |left join ( | select | max($Спр.Коэффициент) as Коэффициент | ,Спр.parentext as Владелец | from $Справочник.ЕдИзм as Спр (nolock) | where $Спр.Ед =:ВыбЕдиница | and $Спр.Коэффициент>0 | and Спр.ismark=0 | group by Спр.parentext | ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар | |group by | Жур.iddoc,Жур.iddocdef,Таб.Товар | HAVING Товар in :выбТМЦ" Дак ругается: State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 43: Incorrect syntax near ''. |
|||
393
bananan
28.12.12
✎
14:35
|
+(391) Параметр в запрос передаю так:
Запр.УстановитьТекстовыйПараметр("выбТМЦ", выбТМЦ);Запр.УстановитьТекстовыйПараметр("выбТМЦ", выбТМЦ); |
|||
394
bananan
28.12.12
✎
14:37
|
Кто-нибудь ПОМОГИТЕ пожалуйста!!!!!!!!!!!!!!!!!!11
|
|||
395
monsterZE
28.12.12
✎
14:44
|
Отбор по списку или группе
Для таких случаев у объекта ODBCRecordset есть метод УложитьСписокОбъектов(Список, Таблица, ВидСправочника) и УложитьСписокОбъектов13(Список, Таблица) Список – это список или группа. После выполнения этого метода появляется таблица с именем Таблица и колонками Val, IsFolder Однако не стоит злоупотреблять этим методом. Анализируя производительность можно увидеть, что этот метод на группах работает медленно и это совершенно очевидно, т.к. группа может содержать огромное число элементов, которые надо переписать во временную таблицу. ГОРАЗДО эффективней получить список подгрупп входящих в выбранную группу и делать условие по принадлежности к родителю, а не по ID Пример: Выберем все документы реализации, у которых склад входит в выбранную группу ТекстЗапроса = " |SELECT | Док.IDDoc as [Док $Документ.Реализация] |FROM | $Документ.Реализация as Док |WHERE | $Док.Склад IN (SELECT Val FROM #Группа)"; RS.УложитьСписокОбъектов(ВыбГруппа, "#Группа", "Склады"); Замечание: Рекомендуется использовать локальные временные таблицы – префикс #. В этом случае не нужно заботиться об уникальности имени таблицы для разных пользователей, а также об их последующем удалении. В ДБФ версии драйвер сам создает такие таблицы и сам же генерирует им имя. Можно сделать универсальный способ получения имени таблицы, работающий как в ДБФ, так и в СКЛ: ИмяТаблицы="#Группа "; Запрос.УложитьСписокОбъектов(СписокРодителей,ИмяТаблицы); ТекстЗапроса=" (SELECT Val FROM "+ИмяТаблицы+")"; В случае СКЛ запрос выполнится из таблицы "#Группа", а в случае ДБФ система сгенерит имя и вернет ее в переменную ИмяТаблицы. В случае ДБФ имя временной таблицы выглядит так ‘f6d3b234a56c765f52da’ что, конечно не очень красиво для текста запроса(особенно если его еще и разбирать на ошибки нужно или на дополнения). Можно сделать запрос более красивым и универсальным: для этого воспользуемся методом УстановитьТекстовыйПараметр() |
|||
396
bananan
28.12.12
✎
14:46
|
(395) Спасибо, попробую разобраться
|
|||
397
monsterZE
28.12.12
✎
14:46
|
скачай уже мануал к 1с++ там все, что надо хорошо расписано и с примерами - "MSSQL при помощи ВК 1С.doc"
или кинь мыло в асю или личку - отправлю |
|||
398
bananan
28.12.12
✎
14:47
|
(397) Сча кину мыло
|
|||
399
bananan
28.12.12
✎
14:48
|
А как кинуть в личку?
|
|||
400
bananan
28.12.12
✎
14:49
|
+399 Аська у меня здесь пока не установлена :(
|
|||
401
monsterZE
28.12.12
✎
14:52
|
вот порвая ссылка в яндексе =)
Книга знаний: Эффективное использование MSSQL с помощью ВК 1C++ -- или адрес своего мыла тут напиши |
|||
402
bananan
28.12.12
✎
14:54
|
||||
403
bananan
28.12.12
✎
15:33
|
Помогите совсем неопытному...
|WHERE | $Док.Склад IN (SELECT Val FROM #Группа)"; RS.УложитьСписокОбъектов(ВыбГруппа, "#Группа", "Склады"); но у меня в запросе по поводу ТМЦ нет WHERE |
|||
404
bananan
28.12.12
✎
15:34
|
+(403) Полный текст запроса см. в (387)
|
|||
405
monsterZE
28.12.12
✎
15:42
|
(403) так добавь..? =)
а лучше, наврное, добавить в твои подзапросы.. |
|||
406
bananan
28.12.12
✎
15:45
|
Написал так:
ТекстЗапроса = " |select | Жур.iddoc as [Док $Документ] | ,Жур.iddocdef as [Док_вид $ВидДокумента] | ,Таб.Товар as [Товар $Справочник.ТМЦ] | ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения | ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках |from | ( | select | $ДокС.ТМЦ as Товар | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) | | union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock) | )as Таб | |inner join | _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ | and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН) | and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ | and Жур.Closed&1 = 1 |left join ( | select | max($Спр.Коэффициент) as Коэффициент | ,Спр.parentext as Владелец | from $Справочник.ЕдИзм as Спр (nolock) | where $Спр.Ед =:ВыбЕдиница | and $Спр.Коэффициент>0 | and Спр.ismark=0 | group by Спр.parentext | ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар | |group by | Жур.iddoc,Жур.iddocdef,Таб.Товар | HAVING Таб.Товар IN (SELECT Val From #Группа)"; . . . Запр=СоздатьОбъект("ODBCRecordset"); Запр.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик); Запр.УстановитьТекстовыйПараметр("НачДата", НачДата); Запр.УстановитьТекстовыйПараметр("КонДата", КонДата); Запр.УложитьСписокОбъектов13(выбТМЦ, "#Группа"); Нач3=ТекущееВремя(); ТЗ = Запр.ВыполнитьИнструкцию(ТекстЗапроса); Так он, запрос, ничего не находит. Понимаю ошибка в SQL (HAVING Таб.Товар IN (SELECT Val From #Группа)";) А как иначе мне указать SQL что интересуют ТМЦ или Группы ТМЦ выбранная пользователем в окне выбора? |
|||
407
bananan
28.12.12
✎
15:47
|
(405) Так WHERE Таб.Товар = #Группа И где именно в тексте запроса это добавить?
|
|||
408
monsterZE
28.12.12
✎
15:53
|
|from
| ( | select | $ДокС.ТМЦ as Товар | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) where Таб.Товар IN (SELECT Val From #Группа) | | union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock) where Таб.Товар IN (SELECT Val From #Группа) | )as Таб |
|||
409
monsterZE
28.12.12
✎
15:58
|
тока ессно никаких таб.товар, а $ДокС.ТМЦ IN (SELECT Val From #Группа)
|
|||
410
bananan
28.12.12
✎
15:59
|
Зделал так:
|select | Жур.iddoc as [Док $Документ] | ,Жур.iddocdef as [Док_вид $ВидДокумента] | ,Таб.Товар as [Товар $Справочник.ТМЦ] | ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения | ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках |from | ( | select | $ДокС.ТМЦ as Товар | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) | WHERE Таб.Товар IN (SELECT VAL FROM #Группа) | union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock) | )as Таб | |inner join | _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ | and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН) | and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ | and Жур.Closed&1 = 1 |left join ( | select | max($Спр.Коэффициент) as Коэффициент | ,Спр.parentext as Владелец | from $Справочник.ЕдИзм as Спр (nolock) | where $Спр.Ед =:ВыбЕдиница | and $Спр.Коэффициент>0 | and Спр.ismark=0 | group by Спр.parentext | ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар | |group by | Жур.iddoc,Жур.iddocdef,Таб.Товар"; Выдает: The column prefix 'Таб' does not match with a table name or alias name used in the query :( |
|||
411
monsterZE
28.12.12
✎
16:00
|
(409) =) жош
|
|||
412
bananan
28.12.12
✎
16:01
|
(411) Написал так:
| WHERE $ДокН.Товар IN (SELECT VAL FROM #Группа) Выдает: {\\SERVER12\VPKTEST$\EXTFORMS\ПРОДАЖА В ЯЩИКАХ 2.ERT(110)}: Meta name parser error: поле таблицы не найдено "$ДокС.Товар" |
|||
413
monsterZE
28.12.12
✎
16:02
|
(412) =) ты издеваешься?
|
|||
414
monsterZE
28.12.12
✎
16:03
|
у тебя в документе в табличной части какое поле? вот его и подставляй.
|
|||
415
bananan
28.12.12
✎
16:03
|
+(412) когда написал так:
| WHERE $ДокС.ТМЦ IN (SELECT VAL FROM #Группа) То запрос ничего не находит! :(:( |
|||
416
bananan
28.12.12
✎
16:07
|
Можете вере не там надо ставить?
Подный текст запроса: ТекстЗапроса = " |select | Жур.iddoc as [Док $Документ] | ,Жур.iddocdef as [Док_вид $ВидДокумента] | ,Таб.Товар as [Товар $Справочник.ТМЦ] | ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения | ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках |from | ( | select | $ДокС.ТМЦ as Товар | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) | WHERE $ДокС.ТМЦ IN (SELECT VAL FROM #Группа) | union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock) | WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа) | )as Таб | |inner join | _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ | and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН) | and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ | and Жур.Closed&1 = 1 |left join ( | select | max($Спр.Коэффициент) as Коэффициент | ,Спр.parentext as Владелец | from $Справочник.ЕдИзм as Спр (nolock) | where $Спр.Ед =:ВыбЕдиница | and $Спр.Коэффициент>0 | and Спр.ismark=0 | group by Спр.parentext | ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар | |group by | Жур.iddoc,Жур.iddocdef,Таб.Товар"; |
|||
417
monsterZE
28.12.12
✎
16:08
|
Запрос.УложитьСписокОбъектов(ВыбТовар, "#Группа","Товары");
|
|||
418
monsterZE
28.12.12
✎
16:13
|
ВыбТовар элемент формы справочник.товары
|
|||
419
bananan
28.12.12
✎
16:13
|
Выдает: Запр.УложитьСписокОбъектов(ВыбТМЦ, "#Группа","Товары");
{\\SERVER12\VPKTEST$\EXTFORMS\ПРОДАЖА В ЯЩИКАХ 2.ERT(108)}: Недопустимое значение третьего аргумента метода! |
|||
420
monsterZE
28.12.12
✎
16:14
|
и ты из своего суперзапроса, сделай сначала чтобы маленькие запросы работали.. просто отбери товар по группе с реквизита формы
|
|||
421
bananan
28.12.12
✎
16:15
|
Все написал так - работает
а написал так:Запр.УложитьСписокОбъектов(ВыбТМЦ, "#Группа","ТМЦ"); |
|||
422
monsterZE
28.12.12
✎
16:16
|
@#$ я х^ею =) у тебя справочник не Товары видимо называется...
я же кусок даже из мануала запостил. |
|||
423
monsterZE
28.12.12
✎
16:16
|
(421) неможетбыть =)
|
|||
424
bananan
28.12.12
✎
16:28
|
(423) Сам не верю :
|
|||
425
bananan
28.12.12
✎
16:28
|
(423) Спасибо!
|
|||
426
bananan
03.01.13
✎
15:55
|
Всем огромное спасибо за помощь и подсказки! Запрос таки работает, но возникла такая проблема. Если в списке ТМЦ не ничего не выбрать - то и запрос ничего не вернет, хотя за данный период продажи и были... :(
чтобы освежить тему показываю весь текст запроса: |select | Жур.iddoc as [Док $Документ] | ,Жур.iddocdef as [Док_вид $ВидДокумента] | ,Таб.Товар as [Товар $Справочник.ТМЦ] | ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения | ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках |from | ( | select | $ДокС.ТМЦ as Товар | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) | WHERE $ДокС.ТМЦ IN (SELECT VAL FROM #Группа) | union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock) | WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа) | )as Таб | |inner join | _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ | and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН) | and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ | and Жур.Closed&1 = 1 |left join ( | select | max($Спр.Коэффициент) as Коэффициент | ,Спр.parentext as Владелец | from $Справочник.ЕдИзм as Спр (nolock) | where $Спр.Ед =:ВыбЕдиница | and $Спр.Коэффициент>0 | and Спр.ismark=0 | group by Спр.parentext | ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар | |group by | Жур.iddoc,Жур.iddocdef,Таб.Товар" |
|||
427
bananan
03.01.13
✎
15:58
|
+(426) Насколько я понимаю вся "загвоздака" здесь:
WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа) т.е. если ТМЦ из текущего документа не выбрано в списке - то оно и пропускается... Но как здесь быть НЕ ЗНАЮ. подскажите |
|||
428
bananan
03.01.13
✎
16:03
|
+(426, 427) Но. если убрать WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа), то, естественно не будут выбираться товары выбранные пользовтелем в списке...
|
|||
429
Mikeware
03.01.13
✎
16:05
|
(428) тебя еще не убили?
|
|||
430
bananan
03.01.13
✎
16:06
|
+ Если не с помощью запроса, то текст запроса надо формировать в зависимости от отого есть ли выбранные ТМЦ, а через SQL это никак нельзя сделать?
|
|||
431
bananan
03.01.13
✎
16:06
|
(429) Как видиш
|
|||
432
bananan
03.01.13
✎
16:08
|
(429) Может ты чего подскажешь?
|
|||
433
bananan
03.01.13
✎
16:17
|
+ К тому же, если не делать WHERE по выбраным ТМЦ, то по чему их делать?
|
|||
434
bananan
03.01.13
✎
16:24
|
+(433) Тоесть если нет выбраных ТМЦ в списке выбора - WHERE совсем опустить?
|
|||
435
bananan
03.01.13
✎
16:38
|
что-то все сегодня спят?
Предыдущие вопросы - решены мною, но как програмно определить выбрал ли что0либо пользователь в окне выбора? |
|||
436
Mikeware
03.01.13
✎
16:43
|
(431) а жаль.... пора бы... за нечитание документации
|
|||
437
Mikeware
03.01.13
✎
16:45
|
(434) формируй текст запроса динамически.
|
|||
438
bananan
03.01.13
✎
16:47
|
(437) Тоесть если
Если ВыбТМЦ.РазмерСписка()<0 Тогда //запрос без ВЕРЫ ИНАЧЕ // Запрос с WHERE КонецЕсли; ТАк? |
|||
439
bananan
03.01.13
✎
16:47
|
(438) меньше 1
|
|||
440
Mikeware
03.01.13
✎
16:53
|
(438)
Если ... тогда ТекстЗапроса+="where всякая_херня"; конецЕсли |
|||
441
bananan
03.01.13
✎
16:59
|
(440)З Не понял что ты имел в виду, но сделал как в (438) - работает и работает так как надо
|
|||
442
monsterZE
03.01.13
✎
17:50
|
(441) он имел ввиду, что текст запроса можно собирать по условиям, динамически. подозреваю, что ты скопировал весь текст запроса два раза =) с верой и без..
а можно обойтись одной строчкой |
|||
443
Mikeware
03.01.13
✎
17:51
|
(442) "не поможет..."©
|
|||
444
bananan
03.01.13
✎
19:06
|
(442)-(443) Теперь скрипт у меня такой (код полностью даю):
//******************************************* Процедура ПриОткрытии() НачДата = НачМесяца(ПолучитьДатуТА())+19; КонДата = ПолучитьДатуТА(); Подробно=1; КонецПроцедуры Процедура Подч() Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("НоваяТаблица"); ТекстЗапроса = " |select | Жур.iddoc as [Док $Документ] | ,Жур.iddocdef as [Док_вид $ВидДокумента]"; Если Подробно=1 тогда ТекстЗапроса = ТекстЗапроса + " ,Таб.Товар as [Товар $Справочник.ТМЦ]"; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " | ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения | ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках |from | ( | select | $ДокС.ТМЦ as Товар | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)"; Если ВыбТМЦ.РазмерСписка()>0 ТОГДА ТекстЗапроса = ТекстЗапроса + "| WHERE $ДокС.ТМЦ IN (SELECT VAL FROM #Группа)"; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " | union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)"; Если ВыбТМЦ.РазмерСписка()>0 ТОГДА ТекстЗапроса = ТекстЗапроса + "| WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа)"; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " | )as Таб |inner join | _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ | and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН) | and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ | and Жур.Closed&1 = 1 |left join ( | select | max($Спр.Коэффициент) as Коэффициент | ,Спр.parentext as Владелец | from $Справочник.ЕдИзм as Спр (nolock) | where $Спр.Ед =:ВыбЕдиница | and $Спр.Коэффициент>0 | and Спр.ismark=0 | group by Спр.parentext | ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар | |group by "; Если Подробно=1 тогда ТекстЗапроса = ТекстЗапроса + " Жур.iddoc,Жур.iddocdef,Таб.Товар"; ИНАЧЕ ТекстЗапроса = ТекстЗапроса + " Жур.iddoc,Жур.iddocdef"; КонецЕсли; Запр=СоздатьОбъект("ODBCRecordset"); Запр.Отладка(); Запр.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик); Запр.УстановитьТекстовыйПараметр("НачДата", НачДата); Запр.УстановитьТекстовыйПараметр("КонДата", КонДата); Запр.УложитьСписокОбъектов(ВыбТМЦ, "#Группа","ТМЦ");; ТЗ = Запр.ВыполнитьИнструкцию(ТекстЗапроса); Кон2=ТекущееВремя(); Таб.ВывестиСекцию("Шапка"); ТЗ.ВыбратьСтроки(); ПечДок=""; ТЗ.ВыбратьСтроки(); ДокЯщ = 0; Итог=0; ВыведеноСтрокВДокументе=0; Пока ТЗ.ПолучитьСтроку()=1 Цикл Если ПечДок<>ТЗ.Док Тогда Если 0<ВыведеноСтрокВДокументе Тогда Таб.ВывестиСекцию("ПодвалДок"); КонецЕсли; ПечДок = ТЗ.Док; Таб.ВывестиСекцию("Документ"); ДокЯщ = 0; ВыведеноСтрокВДокументе=0; КонецЕсли; ВыведеноСтрокВДокументе=ВыведеноСтрокВДокументе+1; ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках; Итог= Итог + ДокЯщ; Если Подробно=1 тогда Таб.ВывестиСекцию("Строка"); КонецЕсли КонецЦикла; Если 0<ВыведеноСтрокВДокументе Тогда Таб.ВывестиСекцию("ПодвалДок"); КонецЕсли; Таб.ВывестиСекцию("Итог"); Кон=ТекущееВремя(); Таб.Опции(0,0,Таб.ВысотаСекции("Шапка"),0); Таб.ТолькоПросмотр(1); Таб.Защита(0); Таб.Показать("Расход",""); КонецПроцедуры // =============================== Процедура ВыбратьТМЦ(Реж) Перем Фрм; Перем Тек; Если ВыбТМЦ.РазмерСписка()>0 Тогда Тек=ВыбТМЦ.ПолучитьЗначение(ВыбТМЦ.ТекущаяСтрока()); КонецЕсли; ОткрытьПодбор("Справочник.ТМЦ",,Фрм,Реж,Тек); Фрм.ВыборГруппы(1); КонецПроцедуры // =============================== Процедура ОбработкаПодбора(Выб) ВыбТМЦ.ДобавитьЗначение(Выб); ВыбТМЦ.ТекущаяСтрока(ВыбТМЦ.РазмерСписка()); КонецПроцедуры |
|||
445
Mikeware
03.01.13
✎
19:55
|
(444) подробно не смотрел, но на первый взгляд потянет...
хотя в школу бы, в 10 класс не помешало бы вернуться... |
|||
446
wsxedc83
03.01.13
✎
21:43
|
Прочитал тему - жесть.
|
|||
447
chelentano
04.01.13
✎
09:51
|
(435) "Предыдущие вопросы - решены мною" - ага, тобою, точно
|
|||
448
Mikeware
04.01.13
✎
10:06
|
(447)
В село по разбитой дороге вьезжает телега, загруженная углем, в которую запряжена старая тощая кляча... в телеге на горе угля сидит мужичок... и радостно кричит: - Люди!!! Я вам уголь привез!!! Кляча устало оборачивается: - Ага, бл.., ТЫ привез... © |
|||
449
trad
04.01.13
✎
11:11
|
(444)такое динамическое построение текста выглядит понятнее. Не так ли?
ТекстЗапроса = " |select | Жур.iddoc as [Док $Документ] | ,Жур.iddocdef as [Док_вид $ВидДокумента] | /*ПолеТовар*/ | ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения | ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках |from | ( | select | $ДокС.ТМЦ as Товар | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) | /*Условие1*/ | union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock) | /*Условие2*/ | )as Таб | |inner join | _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ | and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН) | and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~ | and Жур.Closed&1 = 1 |left join ( | select | max($Спр.Коэффициент) as Коэффициент | ,Спр.parentext as Владелец | from $Справочник.ЕдИзм as Спр (nolock) | where $Спр.Ед =:ВыбЕдиница | and $Спр.Коэффициент>0 | and Спр.ismark=0 | group by Спр.parentext | ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар |group by Жур.iddoc, Жур.iddocdef /*ГруппТовар*/ |"; Если Подробно=1 Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "/*ПолеТовар*/", ",Таб.Товар as [Товар $Справочник.ТМЦ]"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "/*ГруппТовар*/", ",Таб.Товар"); КонецЕсли; Если ВыбТМЦ.РазмерСписка()>0 Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "/*Условие1*/", "WHERE $ДокС.ТМЦ IN (SELECT VAL FROM #Группа)"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "/*Условие2*/", "WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа)"); КонецЕсли; |
|||
450
bananan
04.01.13
✎
16:34
|
(449) Спасибо за совет/подсказку - я просто не знал что так можно...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |