|
v7: Оптимизация запроса | ☑ | ||
---|---|---|---|---|
0
bananan
25.12.12
✎
11:35
|
Когда я задал обрботку 10 дней он работал 00:05:59, когда я ему задал тужу обработку но в функции ПересчетВЯщики(ТМЦ, Количество) в первой же строке вызвал Возврат - он работал 00:03:34 (на 2 минуты и 25 секунд меньше). Т.е. именно функция ПересчетВЯщики() сильно тормозит. К подчиненному справочнику Справочник.ЕдИз надо как-то иначе обращаться (не в функции, в функции опять же циклы). Т.е. е справочнику Справочник.ЕдИз надообращатьс через Запрос строго через запрос, может выполнять для этого второй Запрос. Подскажите как это сделать?
|
|||
1
1Сергей
25.12.12
✎
11:36
|
Сам понял что спросил?
|
|||
2
Жан Пердежон
25.12.12
✎
11:36
|
тс долго терпел
|
|||
3
Ёпрст
25.12.12
✎
11:37
|
воткнуть галку сортировка на реквизит Ед в справочнике ЕдИзм
искать потом через ВыбратьЭлементыПоРеквизиту |
|||
4
cw014
25.12.12
✎
11:37
|
Какой фееричный бред
|
|||
5
Sh1ko
25.12.12
✎
11:38
|
Вы просто не знаете содержание предыдущих серий.
|
|||
6
bananan
25.12.12
✎
11:39
|
(3) Сейчас так попробую
|
|||
7
Ёпрст
25.12.12
✎
11:39
|
а так, как у тебя скуль, то любое обращение к внешней функции в тексте запроса будет всегда медленно, це не дбф.
|
|||
8
bananan
25.12.12
✎
11:44
|
(3) В функции наисал так:
Функция ПересчетВЯщики(ТМЦ, Количество) Спр.ИспользоватьВладельца(ТМЦ); Спр.ВыбратьЭлементыПоРеквезиту("Ед"); Пока Спр.ПолучитьЭлемент() = 1 Цикл Если (Спр.ПометкаУдаления()=0)И(Спр.Ед = Перечисление.Единицы.ящик) Тогда Возврат Количество/?(Спр.Коэффициент=0,1,Спр.Коэффициент); КонецЕсли; КонецЦикла; Возврат Количество; КонецФункции Выскакивает модальное диалоговое окно с надписью: Поле агрегатного объекта не обнаружено (ВыбратьЭлеменыПоРеквезиту): 36 |
|||
9
miki
25.12.12
✎
11:46
|
(8)в русском реквизИт через И.
Базван v.2? |
|||
10
Ёпрст
25.12.12
✎
11:49
|
Одно непонятно, конфа автора вовсю использует 1cpp для расчета останков прямым запросом, в том числе, в модулях проведения, + класс на перехватчике для собственного логгирования..
Откуда там автор взялся с незнанием элементарщины ?! |
|||
11
bananan
25.12.12
✎
11:50
|
(10) Так уж получилось. но, поверьте - неделя-две и от этого незнания и следа не будет
|
|||
12
Андрей_Андреич
naïve
25.12.12
✎
11:50
|
(10) Кстати, пока все дома - для DBF ф-я "ЗначениеВСтрокуБД()" работает?
|
|||
13
bananan
25.12.12
✎
11:52
|
(3) При попытке сохранить метаданные выдает модальное диалогово окно Ошибка последовательности функций (это сервер ругается)
|
|||
14
bananan
25.12.12
✎
11:52
|
(12) Как проверить (пример кода плиз)
|
|||
15
Ёпрст
25.12.12
✎
11:53
|
(11) :))))))))))))))
(12) работает |
|||
16
bananan
25.12.12
✎
11:53
|
+(13) Причем данная БД - тестовая и с ней работаю только я
|
|||
17
bananan
25.12.12
✎
11:56
|
+(13) с даной проблемой обратился к нашему сисадмину - сейчас он посмотрит
|
|||
18
Mikeware
25.12.12
✎
12:04
|
(11) не верю. ты уже доказал, что тебе 5 лет мало...
|
|||
19
bananan
25.12.12
✎
12:11
|
(18) Эти пять лет были совсем другие задачи
|
|||
20
Ёпрст
25.12.12
✎
12:11
|
(18) может, автор в другом измерении живет, для него 5-лет..это по нашенски - 5 минут
:) |
|||
21
Ёпрст
25.12.12
✎
12:12
|
(19) ну, по твоим темам этого не скажешь.
|
|||
22
bananan
25.12.12
✎
12:12
|
(17) Сисадмин в данном случае ничего сделать не может.
А иначе этот запрос никак нельзя сделать? |
|||
23
Ёпрст
25.12.12
✎
12:13
|
(22) можно
|
|||
24
Ёпрст
25.12.12
✎
12:13
|
начнеи его с select
|
|||
25
bananan
25.12.12
✎
12:14
|
(24) Т.е? Синтаксис SQL м как дальше?
|
|||
26
Ёпрст
25.12.12
✎
12:16
|
||||
27
bananan
25.12.12
✎
12:23
|
(26) Его можно запустить в QA
Что такое QA? |
|||
28
Ёпрст
25.12.12
✎
12:26
|
||||
29
bananan
25.12.12
✎
12:37
|
(28) Софт я закачал, но... достукатьсяиз него к серверу не получиться без шефа..
А запрос это попробывал через 1С (код иакой: Процедура Сформировать() Запрос=СоздатьОбъект("Запрос"); ТекстЗапроса = " |SELECT | Спр.Code as Код, | Спр.Descr as Наименование |FROM | sc433 as Спр"; ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.ВыбратьСтроку(); КонецПроцедуры так выдает ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); {\\SERVER12\VPKTEST$\EXTFORMS\ЗАПРОС.ERT(10)}: Поле агрегатного объекта не обнаружено (ВыполнитьИнструкцию) |
|||
30
bananan
25.12.12
✎
12:37
|
+(29) и чето делать7
|
|||
31
Mikeware
25.12.12
✎
12:39
|
(30) вариант 1.: почитать документацию
вариант 2.: спросить у шефа |
|||
32
Ёпрст
25.12.12
✎
12:41
|
(31) к чтению ТС не приучен
|
|||
33
bananan
25.12.12
✎
12:44
|
Просто Выполнить а не ВыполнитьИнструукцию - это уже поменял, но:
ТЗ = Запрос.Выполнить(ТекстЗапроса); {\\SERVER12\VPKTEST$\EXTFORMS\ЗАПРОС.ERT(10)}: <<?>> Спр.Code as Код, Запрос[3] : Ожидается '=' перед 'Спр' ТЗ.ВыбратьСтроку(); {\\SERVER12\VPKTEST$\EXTFORMS\ЗАПРОС.ERT(11)}: Значение не представляет агрегатный объект (ВыбратьСтроку) т.е. насколько я понимаю Спр.Code as Код, надо писать иначе. Как? |
|||
34
bananan
25.12.12
✎
12:45
|
+(33) написал так: Код=Спр.Code as Код,
- он и на такой синтаксис ругается... |
|||
35
Ёпрст
25.12.12
✎
12:46
|
(33) чего, не в состоянии ужо прочесть одну страничку в ворде из (26) ?
|
|||
36
varelchik
25.12.12
✎
12:47
|
С каких это пор у объекта Запрос появился метод ВыполнитьИнструкцию()?
Наверное все таки на использовать OdbcRecordSet? |
|||
37
bananan
25.12.12
✎
12:48
|
(35) В состоянии, но там такого нет!
|
|||
38
varelchik
25.12.12
✎
12:49
|
(37) мда тогда я пошел.
|
|||
39
Ёпрст
25.12.12
✎
12:49
|
(37) не пиз..ди!
2-ая страничка сверху. |
|||
40
bananan
25.12.12
✎
12:50
|
(39) Вторая страница с ферху:
Для DBF версии рекомендуется использовать объект “ OLEDBData”(для версии 1С++ 2.0.0.0 и выше) следующим образом: База = СоздатьОбъект("OLEDBData"); Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN="""; Рез = База.Соединение(Соединение); Запрос = База.СоздатьКоманду(); А что делать, если на компьютере не установлен драйвер фокса? Дык, качать! Запрос = СоздатьОбъект("ODBCRecordset"); Внимание! SQL версия не требует дополнительной инструкции подключения к базе, метод "УстБД1С()" нужен для подключения к другой(не текущей) базе. ТекстЗапроса = " |SELECT | Спр.Code as Код, | Спр.Descr as Наименование |FROM | sc433 as Спр"; ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.ВыбратьСтроку(); Вот и выполнился наш первый запрос. Это конечно хорошо, но справочников в конфигурации много, смотреть каждый раз в DDS ой как не хочется, да и читать такие запросы совсем не удобно. Если использовать ADO, а не 1С++, то так и придется делать. Но скажем спасибо разработчикам 1С++, что в ней есть метапарсер имен, который сам переведет все идентификаторы объектов в их реальные имена. А делается это так: ТекстЗапроса = " |SELECT | Спр.Code as Код, | Спр.Descr as Наименование |FROM | $Справочник.Номенклатура as Спр"; Заменяются следующие имена: $Справочник.ХХХ – справочник $Документ.ХХХ – документ $ДокументСтроки.ХХХ – табличная часть документа А также регистры, журналы расчетов (об этом поговорим позднее) Немножко усложним пример. Выберем дополнительно реквизит “ТипНоменклатуры” ТекстЗапроса = " |SELECT | Спр.Code as Код, | Спр.Descr as Наименование, | $Спр.ТипНоменклатуры as ТипНоменклатуры |FROM | $Справочник.Номенклатура as Спр"; Замечание: Чтобы избежать коллизий, всегда пользуйтесь алиасами. Как вы уже заметили, мы не стали искать соответствий имен в DDS, а переложили эту задачу на метапарсер. Для того чтобы парсер понял, что это реквизит нужно перевести на язык SQL ставим знак $ перед именем таблицы: $Спр.ТипНоменклатуры Правда, не все имена метапарсер преобразовывает в поля таблиц. Есть исключения – это предопределенные имена: Для справочников ИД (Ссылка) ID Код Code Наименование Descr Родитель ParentID Владелец ParentExt ЭтоГруппа IsFolder И где здась обТЗ = Запрос.Выполнить(ТекстЗапроса); {\\SERVER12\VPKTEST$\EXTFORMS\ЗАПРОС.ERT(10)}: <<?>> Спр.Code as Код, Запрос[3] : Ожидается '=' перед 'Спр' ну и т.д. |
|||
41
bananan
25.12.12
✎
12:51
|
+(40) у нас SQL
|
|||
42
Ёпрст
25.12.12
✎
12:51
|
(40) может стоить сходить к окулисту, или черничьки поесть ?
|
|||
43
Ёпрст
25.12.12
✎
12:52
|
Запрос = СоздатьОбъект("ODBCRecordset");
|
|||
44
КонецЦикла
25.12.12
✎
12:57
|
(10) O_o
|
|||
45
bananan
25.12.12
✎
12:59
|
Ёпрст4 большое спасибо, в этом форуме ты мне уже не первый раз помагаешь, остальные в основном ругаються.
ТС запросом:Запрос = СоздатьОбъект("ODBCRecordset"); поменял а вот здесь ругается: ТЗ.ВыбратьСтроку(); {\\SERVER12\VPKTEST$\EXTFORMS\ЗАПРОС.ERT(11)}: Значение не представляет агрегатный объект (ВыбратьСтроку) ТЗ у нас вроде как и не определена, здесь ндо ТЗ создать как таблицу значений? |
|||
46
bananan
25.12.12
✎
13:02
|
+(45) Объявил ТЗ как таблицаЗначений - все-равно ругается:
ТЗ.ВыбратьСтроку(); {\\SERVER12\VPKTEST$\EXTFORMS\ЗАПРОС.ERT(12)}: Значение не представляет агрегатный объект (ВыбратьСтроку) |
|||
47
Ёпрст
25.12.12
✎
13:02
|
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса)
|
|||
48
Mikeware
25.12.12
✎
13:04
|
(47) не в коня корм...
|
|||
49
bananan
25.12.12
✎
13:04
|
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
{\\SERVER12\VPKTEST$\EXTFORMS\ЗАПРОС.ERT(11)}: State 42S02, native 208, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'sc433'. А какой прграммой лучше смотреть 1Cv7.DDS? |
|||
50
Ёпрст
25.12.12
✎
13:06
|
программа notepad.exe
|
|||
51
Mikeware
25.12.12
✎
13:06
|
(47) нахрен тебе ДДС сдался?
ну, блокнотом посмотри... фаром. вордом. тотал командером. райтом... |
|||
52
Ёпрст
25.12.12
✎
13:08
|
и если че, в твоей конфе нет справочника Номенклатура, у тя есть ТМЦ
|
|||
53
bananan
25.12.12
✎
13:10
|
(51) Проверить правильность имен полей
|
|||
54
Ёпрст
25.12.12
✎
13:11
|
(53) ран тебе еще, метапарсер обманывать
|
|||
55
bananan
25.12.12
✎
13:18
|
(54) Да никого я не хочу обманывать; просто ейчас выдает:
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); {\\SERVER12\VPKTEST$\EXTFORMS\ЗАПРОС.ERT(11)}: State 42S02, native 208, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'sc433'. |
|||
56
Ёпрст
25.12.12
✎
13:20
|
(55) см (52)
|
|||
57
bananan
25.12.12
✎
13:24
|
(56) Да я и сгначала задал ТМЦ - ошибка посмотерл в файл там:
#==TABLE no 25 : Справочник ТМЦ # Name |Descr |SQLTableNam|RecordLock T=SC92 |Справочник ТМЦ |SC92 |R #-----Fields------- Задал Descr - ошибка оказыввается Справочник ТМЦ - SC92 |
|||
58
bananan
25.12.12
✎
13:24
|
=(57) Ращбираюсь дальше
|
|||
59
Mikeware
25.12.12
✎
13:25
|
(57) пляттттть...
$Справочник.ТМЦ as Спр"; |
|||
60
Ёпрст
25.12.12
✎
13:26
|
(59) тупость затягивает, не так ли ?
:)) |
|||
61
Mikeware
25.12.12
✎
13:27
|
(60) главное - не заразиться...
|
|||
62
Mikeware
25.12.12
✎
13:29
|
вообще, настроение хреновое. товарищ умер.работать обломно. Домой ехать лень. к нему - на его жену смотреть тяжело...
вот и флужу... |
|||
63
bananan
25.12.12
✎
13:30
|
(59) До этого уже дошел - работает, а вот
$Спр.ТипТМЦ as ТипТМЦ - не хочет: Meta name parser error: поле таблицы не найдено "$Спр.ТипТМЦ" |
|||
64
Ёпрст
25.12.12
✎
13:34
|
(63)Открой наконец пофигуратор, протри очки и посмотри - у справочника ТМЦ нет реквизита ТипТМЦ .
и не было. |
|||
65
bananan
25.12.12
✎
13:38
|
(64) Спасибо
|
|||
66
bananan
25.12.12
✎
14:09
|
Разбираюсь с документом http://www.1cpp.ru/forumfiles/Attachments/mod_002.zip так вот незнаю как мне определить НачДата и КонДата для запроса:
ТекстЗапроса = " |SELECT | Жур.IDDoc as [Док $Документ], | Жур.IDDocDef as Док_вид |FROM | _1SJourn as Жур |WHERE | Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.IDDocDef = $ВидДокумента.РасходнаяНкладная"; Поставил на форму два поля ввода выбора даты: НачДата и КонДата - не проходит: 44)}: Meta name parser error: не указан параметр ":НачДата" Что здесь не так? |
|||
67
Ёпрст
25.12.12
✎
14:10
|
(66) УстановитьТекстовыйПараметр
|
|||
68
Ёпрст
25.12.12
✎
14:10
|
читай статью, там всё есть
|
|||
69
bananan
25.12.12
✎
14:18
|
(68) Читаю, сделал так:
Запрос=СоздатьОбъект("ODBCRecordset"); ТекстЗапроса = " |SELECT | Жур.IDDoc as [Док $Документ], | Жур.IDDocDef as Док_вид |FROM | _1SJourn as Жур |WHERE | Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.IDDocDef = $ВидДокумента.РасходнаяНкладная"; ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.УстановитьТекстовыйПараметр("НачДата", НачДата); ТЗ.УстановитьТекстовыйПараметр("КонДата", КонДата); ТЗ.ВыбратьСтроку(); Дак ругается все равно: : Meta name parser error: не указан параметр ":НачДата" ТЗ.УстановитьТекстовыйПараметр("НачДата", НачДата); я как-то не так вызываю? |
|||
70
Mikeware
25.12.12
✎
14:20
|
плять. ТЗ -то тут причем?
|
|||
71
Ёпрст
25.12.12
✎
14:20
|
(69) думать то когда будешь ?
Устанавливать параметры запроса надо ДО его выполнения. |
|||
72
Ёпрст
25.12.12
✎
14:21
|
ну и (70).. это я даже не увидел :))))))))))))))
|
|||
73
Mikeware
25.12.12
✎
14:21
|
писец какой-то... сначала выполняет запрос, потом параметры ему пытается передать....
причем параметры пытается передать результатам запроса |
|||
74
bananan
25.12.12
✎
14:28
|
(70) ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
(73) Значит надо так: ТЗ=СоздатьОбъект("Запрос"); ТЗ.УстановитьТекстовыйПараметр("НачДата", НачДата); ТЗ.УстановитьТекстовыйПараметр("КонДата", КонДата) |
|||
75
Mikeware
25.12.12
✎
14:29
|
без слов...
|
|||
76
bananan
25.12.12
✎
14:30
|
+(74) Дык и так не работает:
Meta name parser error: не указан параметр ":НачДата" |
|||
77
Mikeware
25.12.12
✎
14:30
|
был бы ты 86 нола 0 посоветовал бы позвать взрослых...
на по факту - либо у тебя маразм, либо дебильность в средней стадии |
|||
78
bananan
25.12.12
✎
14:30
|
(75) А если со словами? Как это сдалать???
|
|||
79
bananan
25.12.12
✎
14:31
|
(77) Вот здесь как раз без слов.
Ты знаещь в какой обстановке я работаю? |
|||
80
bananan
25.12.12
✎
14:32
|
Ёпрст4 как установить текстовый параметр?
|
|||
81
bananan
25.12.12
✎
14:34
|
+(80) Написал так:
Запрос=СоздатьОбъект("ODBCRecordset"); ТЗ = СоздатьОбъект("Запрос"); ТЗ.УстановитьТекстовыйПараметр("НачДата", НачДата); ТЗ.УстановитьТекстовыйПараметр("КонДата", КонДата); ТекстЗапроса = " |SELECT | Жур.IDDoc as [Док $Документ], | Жур.IDDocDef as Док_вид |FROM | _1SJourn as Жур |WHERE | Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.IDDocDef = $ВидДокумента.РасходнаяНкладная"; ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.ВыбратьСтроку(); Все-равно ругается: Поле агрегатного объекта не обнаружено (УстановитьТекстовыйПараметр |
|||
82
Ёпрст
25.12.12
✎
14:34
|
АААААААААААААААААААААААААААААААААААААААААААААААААААААААААА!
|
|||
83
Ёпрст
25.12.12
✎
14:35
|
ладно, на вот:
екстЗапроса = " |SELECT ......... Запрос=СоздатьОбъект("ODBCRecordset"); Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата); Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата); ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
84
bananan
25.12.12
✎
14:36
|
(82) Да нчего страшного, просто скажи как...
|
|||
85
bananan
25.12.12
✎
14:36
|
(83) Спасибо
|
|||
86
palpetrovich
25.12.12
✎
14:36
|
(79) неужели в окопе под бомбами?
|
|||
87
bananan
25.12.12
✎
14:38
|
(86) поверь, хуже
|
|||
88
Ёпрст
25.12.12
✎
14:40
|
(87) вмазанный шоле?
|
|||
89
bananan
25.12.12
✎
14:41
|
(88) Вмазаная у меня жена (уже не первый месяц)... :(
|
|||
90
Ёпрст
25.12.12
✎
14:42
|
(89) дык брось её нахрен
|
|||
91
Ёпрст
25.12.12
✎
14:42
|
это не лечится
|
|||
92
bananan
25.12.12
✎
14:44
|
(83) Ну тут тип документа видимо я неправильно задаю ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
{\\SERVER12\VPKTEST$\EXTFORMS\ЗАПРОС.ERT(44)}: Meta name parser error: объект не найден "$ВидДокумента.РасходнаяНакладная" пробывал так: | Жур.IDDocDef = $ВидДокумента.Реализацция"; тоже ругается как в украинской конфе обозвали $ВидДокумента? |
|||
93
Ёпрст
25.12.12
✎
14:51
|
РасходнаяНакладная
|
|||
94
bananan
25.12.12
✎
14:51
|
(89) а двое детей?
|
|||
95
Ёпрст
25.12.12
✎
14:52
|
если что, она <> РасходнаяНкладная как у тебя в (81)
|
|||
96
bananan
25.12.12
✎
14:53
|
(95) Да так работает просто я в первы раз допустил опечатку РасходнаяНкладная
|
|||
97
Ёпрст
25.12.12
✎
14:53
|
(94) оставь себе, жену лишить родительских прав через суд, предоставив справки с наркушки
|
|||
98
Ёпрст
25.12.12
✎
14:54
|
Хотя, похрен, дал ей денех на дозняк - сама всё подпишет и отдаст
|
|||
99
Ёпрст
25.12.12
✎
14:55
|
ну а дальше - пинка под зад и давай - до свиданья!
|
|||
100
bananan
25.12.12
✎
14:56
|
(96) Дак дело в том, что такая фигнгя продолэаетс уже лет 5-6, и я с детьми разговаривал, Они говорят: №Если выбирать - то мы будем жить с мамой"
|
|||
101
Ёпрст
25.12.12
✎
14:59
|
(100) им лет то сколько ?
Да и.. привыкнут без мамы. |
|||
102
Ёпрст
25.12.12
✎
14:59
|
Новую им найдешь, здоровую.
|
|||
103
bananan
25.12.12
✎
15:00
|
(101) Дочери 18,5 - студентка, сыну - 15,5 (школьник)
|
|||
104
Ёпрст
25.12.12
✎
15:02
|
(103) :)))))
да уж.. Тут даже думать не надо - дети сами по себе в таком возрасте, разводись не думая, жене пинка под зад. |
|||
105
bananan
25.12.12
✎
15:03
|
(104) Да мне ее жалко и детей. Что их ждет если они будут с мамой - алкоголичкой?
|
|||
106
Ёпрст
25.12.12
✎
15:05
|
(105) она еще и бухает ? :))
наркоша -алкоголик.. зачет |
|||
107
bananan
25.12.12
✎
15:08
|
(106) насчет наркоты - мы с тобой тут не поняли друг-друга; нарктой она не балуется
|
|||
108
Ёпрст
25.12.12
✎
15:09
|
(107) пилять.. всё у тебя через одно место, даже с терминами.
|
|||
109
bananan
25.12.12
✎
15:09
|
по поводу запроса сделал так:
ТекстЗапроса = " |SELECT | $ДокС.ТМЦ as [Товар $Справочник.ТМЦ], | SUM($ДокС.Кво) as Количество |FROM | $ДокументСтроки.РасходнаяНакладная as ДокС |INNER JOIN | $Документ.РасходнаяНакладная as Док ON Док.IDDoc = ДокС.IDDoc |INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.Closed & 1 = 1 |GROUP BY | $ДокС.ТМЦ"; ; Запрос=СоздатьОбъект("ODBCRecordset"); Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата); Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата); ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.ВыбратьСтроку(); Дык ругается: State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 11: Incorrect syntax near 'Жур' Чем ему Жур не нравится? |
|||
110
Ёпрст
25.12.12
✎
15:09
|
А жену тогда кодируй, раз в месяц, пока не поумнееет
|
|||
111
Ёпрст
25.12.12
✎
15:10
|
(109) and Жур.Date_Time....
|
|||
112
bananan
25.12.12
✎
15:11
|
(108) может здесь разлчия в украинском и руссокм языках. У нас (87) вмазанный шоле? - это пьяния чи що :)
|
|||
113
Ёпрст
25.12.12
✎
15:11
|
и вот это
INNER JOIN | $Документ.РасходнаяНакладна тут как бэ не нужно |
|||
114
Ёпрст
25.12.12
✎
15:12
|
(112) вмазанный - находящийся в наркотическом опьянении
|
|||
115
bananan
25.12.12
✎
15:13
|
(111) Написал так:
|SELECT | $ДокС.ТМЦ as [Товар $Справочник.ТМЦ], | SUM($ДокС.Кво) as Количество |FROM | $ДокументСтроки.РасходнаяНакладная as ДокС |INNER JOIN | $Документ.РасходнаяНакладная as Док ON Док.IDDoc = ДокС.IDDoc |INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | AND Жур.Closed & 1 = 1 |GROUP BY | $ДокС.ТМЦ"; выдает: State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 11: Incorrect syntax near 'Жур'. |
|||
116
Ёпрст
25.12.12
✎
15:14
|
(115) см (111)
|
|||
117
Ёпрст
25.12.12
✎
15:14
|
and пропущен в условии
|
|||
118
bananan
25.12.12
✎
15:15
|
(116) блин смотрб в книгу вижу фигу
|
|||
119
bananan
25.12.12
✎
15:16
|
Написал так:
|INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | AND Жур.Closed & 1 = 1 Ругается: State 42000, native 156, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'AND'. |
|||
120
varelchik
25.12.12
✎
15:18
|
(115)
Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | AND Жур.Closed & 1 = 1 смотрим внематочно Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND AND Жур.Closed & 1 = 1 |
|||
121
varelchik
25.12.12
✎
15:18
|
нафига 2 and подряд?
|
|||
122
bananan
25.12.12
✎
15:20
|
(121) Уже исправил, спасибо. Изучаю дадьше
|
|||
123
bananan
25.12.12
✎
15:40
|
Ёпрст4 по поводу запроа к подчиненному справочнику что-то типа так (понятно что здесь совсем не то, но...):
ТекстЗапроса = " |SELECT | Жур.IDDoc [Док $Документ], | Жур.IDDocDef Док_вид |FROM | _1Sjourn Жур |INNER JOIN | _1SCRDOC Отбор ON Отбор.ChildID = Жур.IDDoc AND | Отбор. MDID = 0 AND | Отбор.ParentVal = :ВыбДок* AND | Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~"; ? Но как мне дотучаться до справочника по конкретному ТМЦ? |
|||
124
Ёпрст
25.12.12
✎
15:44
|
(123) не угадал.
|
|||
125
Ёпрст
25.12.12
✎
15:48
|
можно либо коррелированный подзапрос в селекте, для получения коэффициента, либо соединение с подзапросом, в котором будут выбраны вся номенклатура и коэффициенты для нужной единицы измерения)
|
|||
126
bananan
25.12.12
✎
15:51
|
(125) УхЮ как сложно... Голова совсем не варит
|
|||
127
bananan
25.12.12
✎
15:52
|
+(125) С подзапросами никогда не работал, а об соединении с подзапросмо молчу
|
|||
128
bananan
25.12.12
✎
16:12
|
чего-то я не понимаю написал так:
ТекстЗапроса = " |SELECT | $ДокС.ТМЦ as [Товар $Справочник.ТМЦ], | $ДокС.Ед as [Товар $Справочник.ЕдИзм], | SUM($ДокС.Кво) as Количество |FROM | $ДокументСтроки.РасходнаяНакладная as ДокС |INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.Closed & 1 = 1 |GROUP BY | $ДокС.ТМЦ"; ругается: State 42000, native 8120, message [Microsoft][ODBC SQL Server Driver][SQL Server]Column 'ДокС.SP1175' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. |
|||
129
bananan
25.12.12
✎
16:21
|
+(128) т.е. я в РАБОТАБЩИЙ ЗАПРОС:
|SELECT | $ДокС.ТМЦ as [Товар $Справочник.ТМЦ], | SUM($ДокС.Кво) as Количество |FROM | $ДокументСтроки.РасходнаяНакладная as ДокС |INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.Closed & 1 = 1 |GROUP BY | $ДокС.ТМЦ"; добавил еще одно поле для выбора |SELECT | $ДокС.Ед as [Товар $Справочник.ЕдИзм], | $ДокС.ТМЦ as [Товар $Справочник.ТМЦ], | SUM($ДокС.Кво) as Количество при этом GROUP BY меня перестал понимать :( |
|||
130
Ёпрст
25.12.12
✎
16:35
|
(129)дык в гроуп бай кто добавлять поле будет ?
|
|||
131
bananan
25.12.12
✎
16:42
|
(130) полный код запроса:
|SELECT | $ДокС.Ед as [Товар $Справочник.ЕдИзм], | $ДокС.ТМЦ as [Товар $Справочник.ТМЦ], | SUM($ДокС.Кво) as Количество |FROM | $ДокументСтроки.РасходнаяНакладная as ДокС in |INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.Closed & 1 = 1 |GROUP BY | $ДокС.ТМЦ"; |
|||
132
Ёпрст
25.12.12
✎
16:45
|
GROUP BY
| $ДокС.ТМЦ,$ДокС.Ед |
|||
133
bananan
25.12.12
✎
16:51
|
(132) Спасибо. сейчас попробую
|
|||
134
bananan
25.12.12
✎
16:53
|
(132) Ура!!! Работает!! Сейчас буду пробывать делать реальный запрос
|
|||
135
bananan
25.12.12
✎
17:02
|
(132) Блин, что-то я круто туплю... Работало. Добавил в начале скрипта код:
НачДата = НачМесяца(ТекущаяДата()); КонДата = ТекущаяДата(); Стал он ругаться: State 42000, native 156, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'in'. Что за фи фигня? Или он у меня раньше не работал? |
|||
136
bananan
25.12.12
✎
17:15
|
+(135) Кажется я понял: у меня раньше работал такой запрос:
|SELECT | $ДокС.ТМЦ as [Товар $Справочник.ТМЦ], | SUM($ДокС.Кво) as Количество |FROM | $ДокументСтроки.РасходнаяНакладная as ДокС |INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.Closed & 1 = 1 |GROUP BY | $ДокС.ТМЦ"; ане этот: |SELECT | $ДокС.Ед as [Товар $Справочник.ЕдИзм], | $ДокС.ТМЦ as [Товар $Справочник.ТМЦ], | SUM($ДокС.Кво) as Количество |FROM | $ДокументСтроки.РасходнаяНакладная as ДокС in |INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.Closed & 1 = 1 |GROUP BY | $ДокС.ТМЦ,$ДокС.Ед"; |
|||
137
bananan
25.12.12
✎
17:20
|
+(136) Насколько я понимаю, ошибка здесь:
|INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.Closed & 1 = 1 |
|||
138
Ёпрст
25.12.12
✎
17:23
|
as ДокС in
че то у тя со зрением - однозначно |
|||
139
Ёпрст
25.12.12
✎
17:24
|
in выкини оттуда
|
|||
140
bananan
25.12.12
✎
17:38
|
(138) не со зрением,. а с головой
|
|||
141
bananan
25.12.12
✎
17:39
|
(139) Теперь, точно - роаботает, мне еще нужен номер документа
набрал: |SELECT | $ДокС.DocNo as НомерДок, | $ДокС.Ед as [Ед. измерения $Справочник.ЕдИзм], | $ДокС.ТМЦ as [Товар $Справочник.ТМЦ], | SUM($ДокС.Кво) as Количество |FROM | $ДокументСтроки.РасходнаяНакладная as ДокС |INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.Closed & 1 = 1 |GROUP BY | $ДокС.DocNo,$ДокС.ТМЦ,$ДокС.Ед"; Выдает: Meta name parser error: поле таблицы не найдено "$ДокС.DocNo |
|||
142
Ёпрст
25.12.12
✎
17:40
|
| Жур.DocNo
|
|||
143
bananan
25.12.12
✎
17:45
|
(142) Спасибо. А Жур - это типа синоним на журнал документов?
|
|||
144
Ёпрст
25.12.12
✎
17:46
|
(143) яя, натюрлих
|
|||
145
Ёпрст
25.12.12
✎
17:46
|
только не синоним, а псевдоним таблички _1SJourn в тексте запроса
|
|||
146
bananan
25.12.12
✎
17:48
|
(145) Еще раз спасибо!
|
|||
147
bananan
25.12.12
✎
18:03
|
Тут еще подводных (для меня) камней море... Поставил:
|SELECT | Жур.DocNo as НомерДок, | $ДокС.Ед as [Ед. измерения $Справочник.ЕдИзм], | $ДокС.ТМЦ as [Товар $Справочник.ТМЦ], | $ДокС.Кф as [Коэффициент $Справочник.ЕдИзм.Коэффициент], | SUM($ДокС.Кво) as Количество |FROM | $ДокументСтроки.РасходнаяНакладная as ДокС |INNER JOIN | _1SJourn as Жур ON Жур.IDDoc = ДокС.IDDoc | AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND | Жур.Closed & 1 = 1 |GROUP BY | Жур.DocNo,$ДокС.ТМЦ,$ДокС.Ед,$ДокС.Кф"; Дак он ругается: Meta name parser error: поле таблицы не найдено "$ДокС.Кф" |
|||
148
bananan
25.12.12
✎
18:04
|
+(147) Или здесь еще один подзпрос надо делать? если - даЮ то как?
|
|||
149
bananan
25.12.12
✎
18:25
|
Ау! Есьть кто живой? Как разрулить запрос (147)
|
|||
150
bananan
25.12.12
✎
18:37
|
Ёпрст4! Как ты мнре нужен!
|
|||
151
varelchik
25.12.12
✎
18:49
|
Усе пошли домой.
До встречи завтра. |
|||
152
bananan
25.12.12
✎
18:52
|
(151) Завтра так завтраЮ мне еще час ы 8 минут на работе голову ломать над этим запросом...
|
|||
153
viktor_vv
25.12.12
✎
18:55
|
(147) В расходной в бухии там нет такого реквизита Кф. Есть "Коэффициент".
В твоем случае. | $ДокС.Коэффициент as Коэффициент , Без типизации. |
|||
154
bananan
25.12.12
✎
18:59
|
(153) Спасибо, работает
|
|||
155
Stella0608
25.12.12
✎
19:32
|
Опять пропустила все самое интересное. :)
Хотела уточнить у местных спецов - а у обычных семерочных запросов есть возможность обращения к подчиненным справочникам? Не помню и сто лет их уже не писала :). |
|||
156
zak555
25.12.12
✎
19:35
|
(155) делай запрос по нему
|
|||
157
ADirks
26.12.12
✎
06:17
|
(155) и правильно, нефиг всякие гадости писать
|
|||
158
ЧеловекДуши
26.12.12
✎
06:46
|
Не забывай в селекте ставить команду (NOLOCK)
Иначе можешь писать заявление по собственному... ...дай другому поломать БД... |
|||
159
ЧеловекДуши
26.12.12
✎
06:47
|
+(147) Жур.Closed & 1 = 1
Убери из связей.... не кошерно это там иметьэ Познай для себя команду WHERE А по сути гуг рулит, в плане поисков ответов по SQL |
|||
160
ЧеловекДуши
26.12.12
✎
06:48
|
+ И это тоже AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
Убери в условие |
|||
161
ЧеловекДуши
26.12.12
✎
06:51
|
+ INNER JOIN - на SQL 2000 он отрабатывает медленней, нежели попросту выполнить команду LEFT(Right) OUTER JOIN?
|
|||
162
ADirks
26.12.12
✎
07:31
|
(161) У них смысл разный. Поэтому оценивать медленнее/быстрее не слишком осмысленное занятие.
|
|||
163
ЧеловекДуши
26.12.12
✎
07:55
|
(162)Смысл разный и бесполезный.
Может и писать меньше, но медленней работает, проверено :) |
|||
164
ADirks
26.12.12
✎
08:02
|
(163) Что значит "бесполезный"?
Кроме того, тупо сравнивать время выполнения запросов в SQL - тоже не информативно. Сравнивать надо планы запросов. |
|||
165
Stella0608
26.12.12
✎
09:30
|
Разве медленнее?
А вообще, некоторые условия превращают левое/правое соединение во внутреннее :). |
|||
166
Stella0608
26.12.12
✎
09:46
|
(159) Какой дает выигрыш перенос условия из соединения в Where?
|
|||
167
Ёпрст
26.12.12
✎
10:08
|
ТекстЗапроса="
|select | Жур.iddoc as [Док $Документ.РасходнаяНакладная] | ,$ДокС.ТМЦ as [Товар $Справочник.ТМЦ] | ,sum($ДокС.Кво*$ДокС.Коэффициент) as КоличествоВБазовойЕдиницеИзмерения | ,sum($ДокС.Кво*$ДокС.Коэффициент/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках |from | $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) |inner join | _1sjourn as Жур (nolock) on Жур.IDDoc = ДокС.IDDoc | 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,$ДокС.ТМЦ |"; Запрос.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик); .................. |
|||
168
ADirks
26.12.12
✎
10:46
|
(166) есть мнение, что никакого :)
Просто человеку почему-то не нравится. А мне наоборот - нравится, считаю что в inner join все условия д.б. именно там. Но ему и inner join тоже не нравится, так что логично :) |
|||
169
bananan
26.12.12
✎
11:45
|
(167) Неправильный запрос мы с вами сделали! Дело в том, что данный запрос показывает коэффициент ТМЦ по документа, а не берет коэффициент данного ТМЦ для еденицы ищмерения ящик!
Т.е. здесь таки надо делать еще один подзапрос |
|||
170
Ёпрст
26.12.12
✎
11:49
|
(169) Еще подумай
|
|||
171
bananan
26.12.12
✎
11:50
|
(167) Хотя я просмотрел код Ёпрст4 - это вроде должно работать.
|
|||
172
bananan
26.12.12
✎
11:51
|
(170) 169 я написал не просотрев твой код. Сейчас проверю в скрипте (там надо многое изменить - так что рещультат будет минут через 7)
|
|||
173
bananan
26.12.12
✎
11:53
|
(172) У всех прошу прощения за опечатки
|
|||
174
bananan
26.12.12
✎
11:58
|
+(172) Выдает ошибку:
Запр.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик); {\\SERVER12\VPKTEST$\EXTFORMS\ЗАПРОС01.ERT(101)}: Значение не представляет агрегатный объект (УстановитьТекстовыйПараметр) |
|||
175
Ёпрст
26.12.12
✎
11:59
|
(174) нам отсюда не видно, что есть Запр в твоём коде
|
|||
176
bananan
26.12.12
✎
12:00
|
(175) Дело в том что код менялся много раз
Запр это Запрос |
|||
177
bananan
26.12.12
✎
12:01
|
+(176) И меняться код еще будет не мало раз...
|
|||
178
bananan
26.12.12
✎
12:03
|
Дело в том что результаты работы запроса нужно выдать в Таблицу а не в ТблицуЗначений
|
|||
179
Ёпрст
26.12.12
✎
12:07
|
(178) да уж, мне бы твои проблемы
|
|||
180
bananan
26.12.12
✎
12:14
|
(179) а (174) что за фигнгя и как с ней бороться?
|
|||
181
Ёпрст
26.12.12
✎
12:15
|
(180) зачем бороться ?
Запр сделать объектом одбсрекордсет |
|||
182
bananan
26.12.12
✎
12:23
|
(181) Моя невнимательность!
Но, дело в том, что он показывает количество ТМЦ в ящиках по ВСЕХ документах (вернее не все,а по документах РасходнаяНакладная (надо еще сюда же и по документу РасходнаяНакладнаяН) |
|||
183
ЧеловекДуши
26.12.12
✎
12:25
|
(168)Останемся каждый при своем...
|
|||
184
bananan
26.12.12
✎
12:26
|
+(182) Но м количество проданых ящиков по всех документах - тожу надо
|
|||
185
Ёпрст
26.12.12
✎
12:26
|
(182) тогда тебе еще стоит ознакомится с юнион алл
|
|||
186
ЧеловекДуши
26.12.12
✎
12:27
|
(184)Сделай двумя запросами :)
(185)А я разочаровался в этом методе :( |
|||
187
bananan
26.12.12
✎
12:27
|
(182) насколько позволяют мои знания английского - это объеденение всех?
Это SQL? |
|||
188
Ёпрст
26.12.12
✎
12:28
|
(186) зря
|
|||
189
bananan
26.12.12
✎
12:29
|
Ёпрст4 так что мне разобраться с юнион алл?
|
|||
190
Ёпрст
26.12.12
✎
12:30
|
(189)
сделать запросы к табличным частям документов, объеденить их через юнион алл, отфильтровать их через внутреннее соедиенение с журналом доков. всё. |
|||
191
bananan
26.12.12
✎
12:33
|
(190) Думаешь я это, на данном этапе моиз щнаний, смогу сделать сам?
|
|||
192
Ёпрст
26.12.12
✎
12:35
|
(191) думаю нет, но мот попытаешься хотя бы ?
|
|||
193
bananan
26.12.12
✎
12:36
|
(192) Конечно попытаюсь (хотя попытка, зная, что она обречена - что даст?)
|
|||
194
bananan
26.12.12
✎
12:38
|
+(193) Мне уже страшно :(
|
|||
195
bananan
26.12.12
✎
12:39
|
(190) Данный запрос как раз обращается к табличным частым документов...
|
|||
196
Sinus1984
26.12.12
✎
12:42
|
ну из простого можно попробовать union all
|
|||
197
bananan
26.12.12
✎
12:42
|
+(194) Пока изучаю, вернее углубляю свои знания SQL
|
|||
198
Ёпрст
26.12.12
✎
12:47
|
ТекстЗапроса="
|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 | ,$ДокН.Кво*$ДокН.Коэффициент | 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,Таб.Товар |"; Запрос.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик); .................. |
|||
199
sapphire
26.12.12
✎
12:52
|
(198) Осталось только предположить, что ящик, это единица с максимальным коэффициентом
|
|||
200
Ёпрст
26.12.12
✎
12:54
|
(199) дык там же ищется максимум, только среди "ящиков"..
защита от дурака, мало ли. как они там единиц поназаводили.. |
|||
201
bananan
26.12.12
✎
12:56
|
(198) Я восхищет!
НО, выдает ошибку: State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 4: Incorrect syntax near 'Жур'. |
|||
202
Ёпрст
26.12.12
✎
12:58
|
(201)зпт воткни тут:
,Жур.iddocdef |
|||
203
bananan
26.12.12
✎
13:04
|
(202) Спасибо
|
|||
204
sapphire
26.12.12
✎
13:08
|
(202) :))))))))))
|
|||
205
bananan
26.12.12
✎
13:12
|
+(202) Мне надо не только РасходнаяНакладная, но и РасходнаяНакладнаяН - если бы не было as просто через запятую указал...
Попробывал через запятую (from $ДокументСтроки.РасходнаяНакладная, $ДокументСтроки.РасходнаяНакладнаяН as ДокС (nolock)) 1С тупо ЗАВИСЛА. Как здесь быть? |
|||
206
Ёпрст
26.12.12
✎
13:14
|
(205) п...ц
а в (198) по твоему что?! |
|||
207
sapphire
26.12.12
✎
13:14
|
ааа..... печалька
|
|||
208
sapphire
26.12.12
✎
13:15
|
(206) Нужен мозг. Срочно.
|
|||
209
sapphire
26.12.12
✎
13:15
|
(206) select * from * where *
|
|||
210
sapphire
26.12.12
✎
13:16
|
(206) Он не знает SQL
|
|||
211
bananan
26.12.12
✎
13:16
|
(206) ОГРОМНОЕ СПАСИБО, извини за невнимательность
|
|||
212
bananan
26.12.12
✎
13:22
|
+(211) А как в этом же запросе показать сколько ящиков ушло по каждой из накладных и вообще сколько ящиков товаров было продано за заданный период?
|
|||
213
Ёпрст
26.12.12
✎
13:25
|
дык он тебе и так всё это покажет.
у тя на выходе табличка документ товар количество количествоВЯщиках сворачивай по документу - будет количество в разрезе документ количество ящики.. |
|||
214
bananan
26.12.12
✎
13:27
|
(213) Извини, тут сказывается мой малый опыт работы в таком плане...
Мне нужно эти данные показать на екране в виде Таблицы, а не Таблицу значений показать.. Что тут делать и как? |
|||
215
Ёпрст
26.12.12
✎
13:28
|
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолчитьСтроку()=1 Цикл Таб.ВывестиСекцию("Строка"); КонецЦикла; Таб.Показать("ёёё..."); |
|||
216
sapphire
26.12.12
✎
13:34
|
|select
| Док as [Док $Документ] | ,Док_вид as [Док_вид $ВидДокумента] | ,Товар as [Товар $Справочник.ТМЦ] | ,КоличествоВБазовойЕдиницеИзмерения | ,КоличествоВЯщиках | ,SUM(КоличествоВЯщиках) OVER (PARTITION BY Док,Док_вид) КоличествоВЯщикахПоДокументу | ,SUM(КоличествоВЯщиках) OVER () КоличествоВЯщикахВсегоПоВсемДокументам |from |( |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 | ,$ДокН.Кво*$ДокН.Коэффициент | 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,Таб.Товар |) Документы |"; Запрос.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик); select | Жур.iddoc as [Док $Документ] | Жур.iddocdef as [Док_вид $ВидДокумента] | ,Таб.Товар as [Товар $Справочник.ТМЦ] | ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения | ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффицие |
|||
217
sapphire
26.12.12
✎
13:35
|
Ну в общем идея использовать предложение OVER
|
|||
218
bananan
26.12.12
✎
13:36
|
(215) Спасибо - сейчас попробую
(216) А это что за код? |
|||
219
Ёпрст
26.12.12
✎
13:36
|
(216) погоди, ща скажет , что у него 2000 скуль..
:)) и болт с овером |
|||
220
sapphire
26.12.12
✎
13:39
|
(219) Запросто :)
|
|||
221
bananan
26.12.12
✎
13:48
|
Запустил с периодом выборки один день, - просчитало все за секунду...
Запустил с периодом выборки - месяц (ноябрь) - зависла... :( |
|||
222
bananan
26.12.12
✎
13:50
|
+(221) Пардон. не зависла - просто ушла в себя
|
|||
223
bananan
26.12.12
✎
13:51
|
+(222) Т.е. в результате таки выдала информацию по запросе (но писала что программа "не отвечает)"
|
|||
224
Ёпрст
26.12.12
✎
13:53
|
(223) основное время занимает не запрос.выполнитьинструкцию, а ТЗ.Показать()
|
|||
225
bananan
26.12.12
✎
13:59
|
(224) я тоже так думаю, сейчас буду переделывать это под таблицу (вместо таблицаЗначений)
|
|||
226
bananan
26.12.12
✎
14:14
|
Что-то я таки туплю, как в таблице мне из даного запроса показать товар
В запросе мы написали: $ДокС.ТМЦ as Товар Пытаюсь вывести Запр.Товар Выдает: Поле агрегатного объекта не обнаружено (Товар) |
|||
227
bananan
26.12.12
✎
14:15
|
+(226) И номер документа как показать?
|
|||
228
bananan
26.12.12
✎
14:15
|
++(226) Ну и количесвто ящиков по документу. и количество ящиков по всех документах вместе
|
|||
229
Ёпрст
26.12.12
✎
14:17
|
||||
230
sapphire
26.12.12
✎
14:17
|
а ну ясно-красно почему коматозит :))_))
|
|||
231
bananan
26.12.12
✎
14:18
|
(229) С теорией я ознакомлюсь - тут читать на несколько часов...
А как мне показать Товар из запроса? |
|||
232
sapphire
26.12.12
✎
14:19
|
(229)
select | $ДокС.ТМЦ as Товар | ,ДокС.iddoc as Документ | ,$ДокС.Кво*$ДокС.Коэффициент as Количество | from $ДокументСтроки.РасходнаяНакладная as ДокС (nolock) | | union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент | from $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock) Ну тут ты погорячился, ИМХО :)))) Запрос по ВСЕМ ТЧ БД :) Он же сначала выборку обработает и только потом будет вычислять inner join :) Да и я не глядя OVER при-рисовал. |
|||
233
sapphire
26.12.12
✎
14:20
|
(231) Перепости код полностью
|
|||
234
chelentano
26.12.12
✎
14:20
|
(231) а сам думать пробовал?
|
|||
235
sapphire
26.12.12
✎
14:21
|
(234) Многие не приучены
|
|||
236
chelentano
26.12.12
✎
14:21
|
(235) так вы бы хоть деньги с него брали, что ли...
|
|||
237
sapphire
26.12.12
✎
14:22
|
(234) А есть экземпляры, коим нечем, вот пример
http://www.youtube.com/watch?v=Dsi55vRmLXU это отсюда "Красный декабрь": студенты РГТЭУ строят баррикады в ожидании ОМОНа http://top.rbc.ru/society/26/12/2012/838466.shtml |
|||
238
sapphire
26.12.12
✎
14:22
|
(236) Нам не жалко :)
|
|||
239
Ёпрст
26.12.12
✎
14:22
|
(232) ну и что ?
думаешь, если в подзапросе соединять какждый вид с журналом будет быстрее ? Нет. |
|||
240
Ёпрст
26.12.12
✎
14:23
|
>>>Запрос по ВСЕМ ТЧ БД :)
да и не по всем, а только по двум пока.. |
|||
241
sapphire
26.12.12
✎
14:24
|
(240) План будет не оптимальным
|
|||
242
sapphire
26.12.12
✎
14:25
|
(240) Просто интересно, а паренек в состоянии план запроса посмотреть?
|
|||
243
Ёпрст
26.12.12
✎
14:25
|
(241) нормальный там план будет, можешь проверить..
куча соединений на фильтрацию документов в самом юнионе будет не быстрее. |
|||
244
sapphire
26.12.12
✎
14:25
|
(239) Кстати, думаю, что да.
|
|||
245
bananan
26.12.12
✎
14:26
|
(232) Это я знаю, но как показать товар хотябы в окне сообщений?
|
|||
246
Ёпрст
26.12.12
✎
14:30
|
(245)
ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Сообщить(ТЗ.Товар); КонецЦикла; |
|||
247
bananan
26.12.12
✎
14:30
|
(229) выдает поле агрегатного объекта не обнаружено
|
|||
248
sapphire
26.12.12
✎
14:31
|
(243) Там не куча, там одно + однотипные
и c индексами будет нормально, по 1sjourn пойдет по DOCTYPE, а ТЧ по IDDOC |
|||
249
bananan
26.12.12
✎
14:33
|
Вывести номер документа как?
ТЗ.Жур.docno ошибка Жур.docno ошибка Как вывести? |
|||
250
sapphire
26.12.12
✎
14:41
|
(247) Полностью код покажи с начала запроса до низу
|
|||
251
sapphire
26.12.12
✎
14:42
|
(249) Это не восьмерка, да и восьмерке за количество точек более одной в полях наказывать надо
|
|||
252
Sinus1984
26.12.12
✎
14:45
|
Жур.docno это в запрос надо добавить
|
|||
253
sapphire
26.12.12
✎
14:50
|
(252) Маленькое уточнение, КАК :)
|
|||
254
Sinus1984
26.12.12
✎
14:50
|
(251)
типо так в 77 нельзя? да вроде и наказывать здесь не за что ОКЕИ = Товар.ЕдиницаИзмерения.ОКЕИ |
|||
255
Ёпрст
26.12.12
✎
14:52
|
(248) да, твоя правда.. не оптимальный план.. в 2 раза
:) |
|||
256
Ёпрст
26.12.12
✎
14:53
|
время компиляции запроса отличается.
|
|||
257
sapphire
26.12.12
✎
14:53
|
(254) Это прямой запрос, речь о прямом запросе к БД 77.
В восьмерке, конструкция вида Товар.ЕдиницаИзмерения.ОКЕИ приведет к неявному соединению |
|||
258
bananan
26.12.12
✎
14:54
|
(250) Полностью код запроса:
|
|||
259
bananan
26.12.12
✎
14:55
|
ТекстЗапроса = "
|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 | ,$ДокН.Кво*$ДокН.Коэффициент | 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,Таб.Товар"; |
|||
260
sapphire
26.12.12
✎
14:57
|
(259) Этот кусок у меня есть. Что ниже этого чуда?
|
|||
261
bananan
26.12.12
✎
15:00
|
(260)Запр=СоздатьОбъект("ODBCRecordset");
Запр.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик); Запр.УстановитьТекстовыйПараметр("НачДата", НачДата); Запр.УстановитьТекстовыйПараметр("КонДата", КонДата); ТЗ = Запр.ВыполнитьИнструкцию(ТекстЗапроса); //Таб.ВывестиСекцию("Шапка"); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Таб.ВывестиСекцию("Строка"); КонецЦикла; Кон=ТекущееВремя(); //Таб.Опции(0,0,Таб.ВысотаСекции("Шапка"),0); Таб.ТолькоПросмотр(1); Таб.Защита(0); Таб.Показать("Расход",""); Сообщить("Обрабатывалось с "+Нач+" до "+Кон); |
|||
262
Ёпрст
26.12.12
✎
15:01
|
>> по 1sjourn пойдет по DOCTYPE
неа.. в плане тупо индекс скан всегда.. не хочет бегать по индексу.. |
|||
263
sapphire
26.12.12
✎
15:02
|
(262) Странно-странно.
|
|||
264
sapphire
26.12.12
✎
15:04
|
не знаю, может als у мну старый, но вот:
ВыполнитьИнструкцию(<?>,<?>,<?>) Синтаксис: ExecuteStatement(strTextSQL, obVT, bEraseVT) Назначение: Выполняет SQL запрос, при ошибке парсинга или при ошибке на ODBC драйвере формируется исключение. Если запрос возвращает набор строк, метод возвращает объект с результатом запроса, если запрос не возвращает набор строк (не select, а DML или прочий), возвращается количество обработанных строк. Если запрос содержит несколько SQL инструкций (multistatement batch), результаты возвращаются только от первой инструкции. Однако, на драйвер уходит весь текст запроса (По спецификации ODBC, будут ли выполнены остальные инструкции в пакете зависит от драйвера. Для драйвера SQL Server они выполняются), остальные результаты игнорируются. Если запрос возвращает набор данных, и в наборе данных нет ни одной строки, это не является ошибкой. Если запрос не параметризированный - метод гарантированно закрывает курсор. Возвращает: объект с результатом запроса (ТаблицаЗначений или наследник), или число - количество обработанных строк. Параметры: - strTextSQL (Строка): текст запроса, если пустая строка запрос считается параметризированным. По умолчанию пустая строка. - obVT (объект): ТаблицаЗначений или наследник от нее для приема результатов запроса, именно этот объект и будет возвращаемым значением. Это должен быть именно ТаблицаЗначений или наследник, а не объект реализующий ее интерфейс. Если тип объекта - пустое значение, создается объект типа ТаблицаЗначений. По умолчанию: пустое значение. - bEraseVT (Число): 1 - очистить таблицу и создать колонки. 0 - не создавать. По умолчанию - 1. |
|||
265
sapphire
26.12.12
✎
15:05
|
(261) Версия 1с++ какая?
|
|||
266
bananan
26.12.12
✎
15:05
|
(265) а как узнать?
|
|||
267
bananan
26.12.12
✎
15:06
|
+(266) програмно
|
|||
268
Axel2009
26.12.12
✎
15:07
|
так какой запрос то оптимизируем в итоге?
|
|||
269
sapphire
26.12.12
✎
15:08
|
//Т.е. у мну выглядело бы так:
ТЗ = СоздатьОбъект("ТаблицаЗначений"); Запр.ВыполнитьИнструкцию(ТекстЗапроса,ТЗ); //-- далее итератор вывода и прочее -- |
|||
270
sapphire
26.12.12
✎
15:08
|
(268) см (259)
|
|||
271
Ёпрст
26.12.12
✎
15:08
|
(268) да пофик какой, атор один хрен результат работы любого запроса не в состоянии в моксель вывести
|
|||
272
bananan
26.12.12
✎
15:09
|
Вообще, я честно говоря, не понимаю.
Раз выражение ТЗ.Товар работает, то, по-идее, должно и работать выражение ТЗ.Жур.docno тоже бы должно было бы работать. Ан нет |
|||
273
Ёпрст
26.12.12
✎
15:09
|
(269) та нафига так явно то ?
:) он и так ТЗ возвращает всегда. хотя для вывода, лучше ИТЗ.. |
|||
274
Ёпрст
26.12.12
✎
15:10
|
(272) :)))))
ёёё.. |
|||
275
bananan
26.12.12
✎
15:10
|
(273) А что такое ИТЗ?
|
|||
276
sapphire
26.12.12
✎
15:10
|
(271) Ты слишком к нему суров, может он РГТЭУ закончил и ему лечится от такого образования надо...
|
|||
277
bananan
26.12.12
✎
15:10
|
И как, в конце-концов из даного запроса показать чилсо ящиков и т.д?
|
|||
278
sapphire
26.12.12
✎
15:10
|
(275) Объект из 1С++ Индексированная ТЗ
|
|||
279
Sinus1984
26.12.12
✎
15:11
|
ну в принципе и у него отработает и у тебя правильно
(269) Если тип объекта - пустое значение, создается объект типа ТаблицаЗначений. По умолчанию: пустое значение. |
|||
280
sapphire
26.12.12
✎
15:12
|
(273) Я последний раз 1С плюс-плюсил 6 лет назад, ты думаешь я следил за развитием проекта?
|
|||
281
sapphire
26.12.12
✎
15:13
|
у мну ALS от 1C++ 1.8.1.6 :))))))))))
|
|||
282
Sinus1984
26.12.12
✎
15:13
|
(272)
ну аналогия с товаром кривая какая то мож ТЗ.Док попробовать |
|||
283
Ёпрст
26.12.12
✎
15:13
|
(280) аа..
|
|||
284
sapphire
26.12.12
✎
15:14
|
(282) Да, да, насоветуй, пусть еще по-тормознее будет.
|
|||
285
bananan
26.12.12
✎
15:15
|
(282) Работает
|
|||
286
sapphire
26.12.12
✎
15:15
|
(283) кста, ТС стоило бы Толи-абсента статейку в кз почитать, да?
|
|||
287
Ёпрст
26.12.12
✎
15:16
|
(286) не помогает, ему еще в начале дали
|
|||
288
sapphire
26.12.12
✎
15:16
|
(285) А ТЗ.Док.НомерДок? :))))
|
|||
289
Ёпрст
26.12.12
✎
15:16
|
:)
|
|||
290
sapphire
26.12.12
✎
15:16
|
(287) Да, это уже патология. Ладно, не будем нервировать больного.
|
|||
291
sapphire
26.12.12
✎
15:17
|
(289) как пить дать он щас так и сделает как в (288) :)))
|
|||
292
Sinus1984
26.12.12
✎
15:17
|
(284) я так понял тут давно уже оптимизацией и не пахнет)) тут надо тупо чтоб взлетело)
|
|||
293
sapphire
26.12.12
✎
15:18
|
(292) Ну если ты всю оптимизацию агитируешь убить на корню используя разыменвание полей... То можно в этой ветке по-обсуждать... Да что угодно
|
|||
294
bananan
26.12.12
✎
15:19
|
Ребята, я всем благодарен за дельные советы!
С 1С++ работаю - второй день |
|||
295
Sinus1984
26.12.12
✎
15:20
|
(294) да и с 1С 7.7 день пятый походу
|
|||
296
sapphire
26.12.12
✎
15:21
|
(294) Если нужны прямые запросы... То надо хоть чуть-чуть почитать про SQL
|
|||
297
sapphire
26.12.12
✎
15:21
|
+(296) Рекомендую Ицик Бен-Ган Основы t-SQL.
Достаточно грамотно и просто. |
|||
298
bananan
26.12.12
✎
15:24
|
(297) Обязательно прочитаю (уже скачиваю)
|
|||
299
bananan
26.12.12
✎
15:26
|
Но, в каонце концов, как мне это сгрупировать по документах, чтобы я в каждой строке не писал номер документа товар количесвто
ачтобы выдал строка - номер документа след строка - товар и его количесвто в ящиках след строка - товар и его количесвто в ящиках .... Всего ящиков в документе |
|||
300
Ёпрст
26.12.12
✎
15:27
|
(299) это тебе еще поучиться надо..
|
|||
301
bananan
26.12.12
✎
15:28
|
(300) НЕ спорю и учусь.
А как сделать (299)? |
|||
302
sapphire
26.12.12
✎
15:30
|
(300) Может его спросить таки что за сервер у него? Вдруг OVER проканаяет? :)
|
|||
303
Ёпрст
26.12.12
✎
15:31
|
самое тупое, это отсортировать в запросе по позиции дока, потом при выводе
ПечДок=""; ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Ежели ПечДок<>ТЗ.Док Тогда ПечДок = ТЗДок; ВывестиСекцию("Документ"); КонецЕсли; ВывестиСекцию("Строка"); КонецЦикла; ВывестиСекцию("Подвал"); ежели еще и переменную для подсчета в ящиках воткнешь унутрь цикла, так еще и поимеешь количество по накладной.. это самый примитив . |
|||
304
Ёпрст
26.12.12
✎
15:32
|
(302) не, всё равно не поймет, как ТЗ вывести потом :))
Тут пальцем показывать надо :) |
|||
305
bananan
26.12.12
✎
15:34
|
(303) Те етот код и будет выводить инфу из запроса на экран?
|
|||
306
Ёпрст
26.12.12
✎
15:36
|
(305) исправишь ошибки синтаксиса - будет
|
|||
307
bananan
26.12.12
✎
15:40
|
(306) Исправил - работает
|
|||
308
Ёпрст
26.12.12
✎
15:41
|
аминь
|
|||
309
Sinus1984
26.12.12
✎
15:43
|
(307) ну круть теперь премию получишь наверно
|
|||
310
bananan
26.12.12
✎
15:43
|
(309) Премию? Ты не знаешь западно-украинских работодателей
|
|||
311
Sinus1984
26.12.12
✎
15:49
|
(310) я уже хотел порадоваться, что коллективный разум (в лице безработного Ёпрст4) сделал те подарок к НГ в виде премии
|
|||
312
Ёпрст
26.12.12
✎
15:50
|
С чего такая уверенность, что я безработный ?
|
|||
313
bananan
26.12.12
✎
15:51
|
Ёпрст4 - ОГРОМНОЕ СПАСИБО!!!!!!
|
|||
314
Sinus1984
26.12.12
✎
15:54
|
(312) ну не в смысле без зарплатного я сам на работе сижу а без работы ибо лень НГ скоро с наступающим
|
|||
315
bananan
26.12.12
✎
16:42
|
Ребята, еще помогите (я уже почти час ищу - ничего не нашел)
Короче, запрос работает правильно, но... в окне сообщений постоянно (вцикле) вылетает: Поле агрегатного объекта не обнаружено (ТМЦ) Вот весь код скрипта: Процедура ПриОткрытии() НачДата = НачМесяца(ПолучитьДатуТА())+19; КонДата = ПолучитьДатуТА(); КонецПроцедуры Процедура Подч() Нач=ТекущееВремя(); Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("НоваяТаблица"); ТекстЗапроса = " |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,Таб.Товар"; Запр=СоздатьОбъект("ODBCRecordset"); Запр.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик); Запр.УстановитьТекстовыйПараметр("НачДата", НачДата); Запр.УстановитьТекстовыйПараметр("КонДата", КонДата); ТЗ = Запр.ВыполнитьИнструкцию(ТекстЗапроса); //Таб.ВывестиСекцию("Шапка"); ТЗ.ВыбратьСтроки(); ПечДок=""; ТЗ.ВыбратьСтроки(); ДокЯщ = 0; Итог=0; Пока ТЗ.ПолучитьСтроку()=1 Цикл Если ПечДок<>ТЗ.Док Тогда ПечДок = ТЗ.Док; Таб.ВывестиСекцию("Документ"); ДокЯщ = 0; Иначе ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках; Итог= Итог + ДокЯщ; КонецЕсли; Таб.ВывестиСекцию("Строка"); КонецЦикла; Таб.ВывестиСекцию("Подвал"); Кон=ТекущееВремя(); //Таб.Опции(0,0,Таб.ВысотаСекции("Шапка"),0); Таб.ТолькоПросмотр(1); Таб.Защита(0); Таб.Показать("Расход",""); Сообщить("Обрабатывалось с "+Нач+" до "+Кон); КонецПроцедуры В таблице выводятся: ТЗ.Док ТЗ.Товар ТЗ.КоличествоВЯщиках Итог Где это чертово ТМЦ? |
|||
316
Ёпрст
26.12.12
✎
16:49
|
в расщифровке
|
|||
317
Ёпрст
26.12.12
✎
16:49
|
смотри свойства ячеек таблицы
|
|||
318
bananan
26.12.12
✎
16:58
|
(316) Спасибо. Я б до такого сам не догадался
|
|||
319
bananan
26.12.12
✎
17:39
|
Еще один вопрос, на сегодня надеюсь последний.
Код для вывод у меня такой: Пока ТЗ.ПолучитьСтроку()=1 Цикл Если ПечДок<>ТЗ.Док Тогда ПечДок = ТЗ.Док; Таб.ВывестиСекцию("Документ"); ДокЯщ = 0; ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках; Иначе ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках; Итог= Итог + ДокЯщ; КонецЕсли; Таб.ВывестиСекцию("Строка"); КонецЦикла; Таб.ВывестиСекцию("ПодвалДок"); Таб.ВывестиСекцию("Итог"); Где поставить Таб.ВывестиСекцию("ПодвалДок");, чтобы он у меня показывал число ящиков по документу, после каждого документа? |
|||
320
bananan
26.12.12
✎
17:51
|
+(319) Да и количесвто ящиков он у меня неправильно считает :(
|
|||
321
bananan
26.12.12
✎
17:53
|
Кто-нибудь, помогите!
|
|||
322
sapphire
26.12.12
✎
17:59
|
ВыведеноСтрокВДокументе=0;
Пока ТЗ.ПолучитьСтроку()=1 Цикл Если ПечДок<>ТЗ.Док Тогда Если 0<ВыведеноСтрокВДокументе Тогда Таб.ВывестиСекцию("ПодвалДок"); КонецЕсли; ПечДок = ТЗ.Док; Таб.ВывестиСекцию("Документ"); ДокЯщ = 0; ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках; ВыведеноСтрокВДокументе=0; Иначе ВыведеноСтрокВДокументе=ВыведеноСтрокВДокументе+1; ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках; Итог= Итог + ДокЯщ; КонецЕсли; Таб.ВывестиСекцию("Строка"); КонецЦикла; Если 0<ВыведеноСтрокВДокументе Тогда Таб.ВывестиСекцию("ПодвалДок"); КонецЕсли; // Таб.ВывестиСекцию("ПодвалДок"); Таб.ВывестиСекцию("Итог"); |
|||
323
sapphire
26.12.12
✎
18:00
|
(321) Приступ непонимания только по средам или ежедневно? :)
|
|||
324
sapphire
26.12.12
✎
18:01
|
и еще... код сам по себе кривой до безобразия
|
|||
325
sapphire
26.12.12
✎
18:02
|
ВыведеноСтрокВДокументе=0;
Пока ТЗ.ПолучитьСтроку()=1 Цикл Если ПечДок<>ТЗ.Док Тогда Если 0<ВыведеноСтрокВДокументе Тогда Таб.ВывестиСекцию("ПодвалДок"); КонецЕсли; ПечДок = ТЗ.Док; Таб.ВывестиСекцию("Документ"); ДокЯщ = 0; ВыведеноСтрокВДокументе=0; КонецЕсли; ВыведеноСтрокВДокументе=ВыведеноСтрокВДокументе+1; ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках; Итог= Итог + ДокЯщ; Таб.ВывестиСекцию("Строка"); КонецЦикла; Если 0<ВыведеноСтрокВДокументе Тогда Таб.ВывестиСекцию("ПодвалДок"); КонецЕсли; // Таб.ВывестиСекцию("ПодвалДок"); Таб.ВывестиСекцию("Итог"); |
|||
326
bananan
26.12.12
✎
18:03
|
(323-324) Приступ немонимания... Хотите верьте. хотите нет, но в этом году в феврале месяце умерла моя мама, а в ноябре умерла моя сеестра..
Может потому я торможу |
|||
327
bananan
26.12.12
✎
18:04
|
(325) Так он никогда Подвал док не выведет
Если 0<ВыведеноСтрокВДокументе Тогда Таб.ВывестиСекцию("ПодвалДок"); КонецЕсли; |
|||
328
sapphire
26.12.12
✎
18:05
|
(326) Ну и что? У меня жена умерла в ноябре, я же не ною.
|
|||
329
sapphire
26.12.12
✎
18:06
|
(327) Вы и вправду верите в то, что не зайдет?
|
|||
330
bananan
26.12.12
✎
18:07
|
(329) Пардон, опять торможу
|
|||
331
sapphire
26.12.12
✎
18:22
|
(330) Вооттт. Именно-с.
|
|||
332
bananan
26.12.12
✎
18:43
|
Опять какая-то фигня: задаю формат(Итог, "ЧЦ=15; ЧД=2; ЧРД='.'")
Выдает: 59Ц26 |
|||
333
Ёпрст
27.12.12
✎
09:33
|
(332) открой наконец СП и прочти про функцию Формат
|
|||
334
bananan
27.12.12
✎
12:23
|
Доброе утро! Скрипт работает - все нормально, но...
Теоретический вопрос запрос у нас задается так: |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 | $Спр.Коэффициент as Коэффициент | ,Спр.parentext as Владелец | from $Справочник.ЕдИзм as Спр (nolock) | where $Спр.Ед =:ВыбЕдиница | and $Спр.Коэффициент>0 | and Спр.ismark=0 | group by Спр.parentext | ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар | |group by | Жур.iddoc,Жур.iddocdef,Таб.Товар"; Так вот, в подзапросе union all | | select | $ДокН.ТМЦ | ,ДокН.iddoc | ,$ДокН.Кво*$ДокН.Коэффициент as Количество as Количество - добавил я (хотя и без этого оно работало нормально). Но, по идее, если нет as Количество во втором подзапросе, то через что будет работать union all? Второе в строке max($Спр.Коэффициент) as Коэффициент зачем вызывается max? (Хотя без max выдает ошибку: Column '???.SP115' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.) Т.е. зачем вроде понятно - чтобы не выдавал ошибку.. Но почему так? |
|||
335
Ёпрст
27.12.12
✎
12:33
|
(334)
1. http://msdn.microsoft.com/ru-ru/library/ms180026(v=sql.100).aspx не надо там никаких псевдонимов в селекте во втором запросе и всех последующих. 2. Это "защита от дурака" - если введут несколько единиц измерения "ящик" на одну номенклатуру с разными(одинаковыми/нулевыми) коэффицентами - берем тупо с максимальным коэффициентом |
|||
336
bananan
27.12.12
✎
12:33
|
(333) Открыл, прочел, исправил. а код (332) я брал с какого-то сайта :(
|
|||
337
bananan
27.12.12
✎
12:34
|
(335) А почему без max выдаетошибку?
|
|||
338
ЧеловекДуши
27.12.12
✎
12:36
|
(337)Познай для себя программу "Query Analyzer" - помогает
|
|||
339
bananan
27.12.12
✎
12:40
|
(338) Программа бесплатная? А то на этой фиирме только лицензионное по
|
|||
340
ЧеловекДуши
27.12.12
✎
12:41
|
(339)Оно в составе сервера :)
|
|||
341
Botanik8888
27.12.12
✎
12:41
|
(339) Вы это серьезно?
|
|||
342
ЧеловекДуши
27.12.12
✎
12:41
|
+ SQL сервера
|
|||
343
Ёпрст
27.12.12
✎
12:47
|
(337) потому, что гроуп бай
|
|||
344
Ёпрст
27.12.12
✎
12:49
|
и тебе как бэ, скуль дословно ответил:
Column '???.SP115' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause |
|||
345
bananan
27.12.12
✎
14:11
|
Прдон еще один (елементарный вопрос) могу я в ячейке таблицы выдать текст в котором к нему прибавлется значение переменной (в данном случае Всего ящиков за заданный период с НачДата по КонДата)?
|
|||
346
Ёпрст
27.12.12
✎
14:22
|
можешь
|
|||
347
bananan
27.12.12
✎
14:23
|
(346) Как? Выражение, шаблон. фиксированный шаблон?
|
|||
348
Ёпрст
27.12.12
✎
14:24
|
свойства ячейки - Шаблон
в формулу: Всего ящиков за [ПериодСтр(НачДата,КонДата)] [ВсегоЯщиков] |
|||
349
bananan
27.12.12
✎
14:24
|
+(347) Может там какой то синтксис которого я не знаю?
|
|||
350
bananan
27.12.12
✎
14:25
|
(348) Спасибо - дело в синтаксисе
|
|||
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) Спасибо за совет/подсказку - я просто не знал что так можно...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |