|
v7: Условие в ПрямомЗапросе 1С++ | ☑ | ||
---|---|---|---|---|
0
smitti911
24.11.14
✎
14:14
|
Здравствуйте. Чет туплю. Есть такой вот запрос (класс ПрямойЗапрос) :
оПЗ.Текст="ВЫБРАТЬ | $Жур.ТекущийДокумент КАК [Документ $Документ] |, $Жур.ВидДокумента КАК Документ_вид |, $Жур.Проведен КАК Проведен |, $Жур.ВремяДокумента КАК [ВремяДокумента $Время] |, $Жур.ДатаДокумента КАК [ДатаДокумента $Дата] | |, ВЫБОР КОГДА (($Жур.ВидДокумента в (:ВидДокумента.РасходнаяНакладнаяБ)) И ($Расх.Бетон = 1)) | ТОГДА 1 | КОГДА ($Жур.ВидДокумента в (:ВидДокумента.Калькуляция)) | ТОГДА 1 | КОГДА ($Жур.ВидДокумента в (:ВидДокумента.СчетБ)) И ($Счет.Бетон = 1) | ТОГДА 1 | ИНАЧЕ 0 КОНЕЦ КАК [Признак :Число.1.0] |ИЗ | ЖурналДокументов КАК Жур $nolock | |ЛЕВОЕ СОЕДИНЕНИЕ Документ.Калькуляция КАК Калк $nolock |ПО $Калк.ТекущийДокумент = $Жур.ТекущийДокумент | |ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладнаяБ КАК Расх $nolock |ПО $Расх.ТекущийДокумент = $Жур.ТекущийДокумент | |ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетБ КАК Счет $nolock |ПО $Счет.ТекущийДокумент = $Жур.ТекущийДокумент | |ГДЕ // |($Жур.Проведен = 1) | $Жур.ДатаДокумента МЕЖДУ :НачПериода и :КонПериода~ |И (($Жур.ВидДокумента = :ВидДокумента.РасходнаяНакладнаяБ) |ИЛИ ($Жур.ВидДокумента = :ВидДокумента.Калькуляция) |ИЛИ ($Жур.ВидДокумента = :ВидДокумента.СчетБ)) // |И (Признак = 1) Можна ли поставить фильтр на переменную Признак . Если раскомментировать последнюю строку - то выдает ошибку no such column |
|||
1
фобка
24.11.14
✎
14:16
|
Переменная в тексте запроса не прокатит
|
|||
2
фобка
24.11.14
✎
14:16
|
чо за Признак?
|
|||
3
smitti911
24.11.14
✎
14:17
|
Очень жаль.Придется фильтровать результат запроса после выполнения :(
|
|||
4
smitti911
24.11.14
✎
14:17
|
Признак - это просто имя переменной в запросе
|
|||
5
akaBrr
24.11.14
✎
14:26
|
(4) а просто значение переменной как планируется задавать?
|
|||
6
akaBrr
24.11.14
✎
14:27
|
+(5) почему у вас НачПериода не "просто переменная"?
|
|||
7
Попытка1С
24.11.14
✎
14:28
|
И (Признак = :ВыбПризнак)
Запрос.УстановитьТекстовыйПарметр("ВыбПризнак",трям) |
|||
8
Попытка1С
24.11.14
✎
14:28
|
Только вместо Признак должно быть что=то относящеесе к запросу хотя бы
|
|||
9
akaBrr
24.11.14
✎
14:33
|
(7) лучше ":Признак = 1"
|
|||
10
Попытка1С
24.11.14
✎
14:37
|
(9) Так мало ли что у него там
|
|||
11
Попытка1С
24.11.14
✎
14:38
|
А так вот
| ИНАЧЕ 0 КОНЕЦ КАК [Признак :Число.1.0] |
|||
12
Попытка1С
24.11.14
✎
14:39
|
Тогда в запросе пиши тупо
ГДЕ (($Жур.ВидДокумента в (:ВидДокумента.РасходнаяНакладнаяБ)) И ($Расх.Бетон = 1)) ИЛИ ($Жур.ВидДокумента в (:ВидДокумента.Калькуляция)) ИЛИ ($Жур.ВидДокумента в (:ВидДокумента.СчетБ)) И ($Счет.Бетон = 1)) |
|||
13
dk
24.11.14
✎
14:40
|
просто скопируй все из признака в условие
ВЫБОР КОГДА (($Жур.ВидДокумента в (:ВидДокумента.РасходнаяНакладнаяБ)) И ($Расх.Бетон = 1)) | ТОГДА 1 | КОГДА ($Жур.ВидДокумента в (:ВидДокумента.Калькуляция)) | ТОГДА 1 | КОГДА ($Жур.ВидДокумента в (:ВидДокумента.СчетБ)) И ($Счет.Бетон = 1) | ТОГДА 1 | ИНАЧЕ 0 КОНЕЦ) = 1 |
|||
14
smitti911
24.11.14
✎
14:48
|
Спасибо за ответы.Сейчас попробую и отпишусь...
|
|||
15
smitti911
24.11.14
✎
14:51
|
Мммдаа, помогает только засунуть все в "ГДЕ" :
| $Жур.ДатаДокумента МЕЖДУ :НачПериода и :КонПериода~ |И ((($Жур.ВидДокумента = :ВидДокумента.РасходнаяНакладнаяБ) И ($Расх.Бетон = 1)) |ИЛИ ($Жур.ВидДокумента = :ВидДокумента.Калькуляция) |ИЛИ (($Жур.ВидДокумента = :ВидДокумента.СчетБ) И ($Счет.Бетон = 1))) |
|||
16
smitti911
24.11.14
✎
14:52
|
Если будут еще условия то "ГДЕ" разрастется еще на пару строк :)
|
|||
17
dk
24.11.14
✎
14:56
|
если условия капец здоровые можно обернуть еще в один запрос, тогда можно ставить условия на просто Признак = 1
|
|||
18
smitti911
24.11.14
✎
14:57
|
(17) Я думал про это...
|
|||
19
smitti911
24.11.14
✎
14:59
|
Еще вопрос: Можно ли использовать класс ПоставщикДанных.Документ* для отображения результата запроса.То есть некий список документов разных видов.Или создавать ТабличноеПоле с поставщиком ТЗ?
|
|||
20
ado
24.11.14
✎
15:06
|
Что тебе в итоге нужно то? Зачем тебе в запросе условие на переменную, не относящуюся к запросу?
(19) А чем не устраивает поставщик ODBC? |
|||
21
КонецЦикла
24.11.14
✎
15:11
|
||||
22
smitti911
24.11.14
✎
15:11
|
(20) Там будет очень хитрое условие, вот и хотелось знать пойдет ли фильтр по переменной "Признак".
В классе Поставщик данных хотелось получить красивую формочку с командной панелькой и использованием всех возможностей данного класса... |
|||
23
smitti911
24.11.14
✎
15:11
|
База DBF
|
|||
24
КонецЦикла
24.11.14
✎
15:12
|
(22) Да, форма прекрасна...
|
|||
25
ado
24.11.14
✎
15:16
|
(22) В зависимости от внешней переменной просто присоединяй разные условия к запросу.
Ээээ, а какая еще форма у поставщика данных? Форму то все равно с помощью ТП придется делать, поставщик только данные для нее поставляет, не? |
|||
26
КонецЦикла
24.11.14
✎
15:18
|
(25) Еще есть замечательные другие классы :)
|
|||
27
ado
24.11.14
✎
15:32
|
(26) Штатно в составе 1С++ или внешние?
|
|||
28
smitti911
24.11.14
✎
15:36
|
||||
29
smitti911
24.11.14
✎
15:36
|
(25) Имелось ввиду командная панель Поставщика. Если ТипЗначений - Документ.***** - то в панели доступны кнопки выбора периода,отбора, и т.д.
|
|||
30
ado
24.11.14
✎
15:39
|
(28) Мммм, а можно ссылку источник этой красоты?
|
|||
31
akaBrr
24.11.14
✎
15:39
|
||||
32
ado
24.11.14
✎
15:41
|
Спасибо, а то в доках я про это что-то ничего не вижу (или плохо смотрю?)
|
|||
33
КонецЦикла
24.11.14
✎
15:50
|
(30) Ссылку дали, выглядит примерно так
http://1c911.by/uskorenie-1s-77.htm#1 |
|||
34
smitti911
24.11.14
✎
15:51
|
(33) Вот мне и надо такой журнальчик но с разными видами доков.
|
|||
35
Попытка1С
24.11.14
✎
16:24
|
(34) А зачем ты вот это джонишь?
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.Калькуляция КАК Калк $nolock |ПО $Калк.ТекущийДокумент = $Жур.ТекущийДокумент |
|||
36
smitti911
24.11.14
✎
16:41
|
(35) Будет условие :
$Калк.ТМЦ В (ВЫБРАТЬ val ИЗ #СписокТМЦ) |
|||
37
ado
24.11.14
✎
16:58
|
(33) Лепота. Жаль только FormEx в требованиях. Он у нас сейчас не используется, а подключить новую ВК -- это целая история (не техническая, организационная).
|
|||
38
Эльниньо
25.11.14
✎
11:10
|
Сколько тут прямозапросечников.
Неужели ни одного безработного нет? |
|||
39
КонецЦикла
25.11.14
✎
11:11
|
(38) Есть безработные :)
|
|||
40
DCKiller
25.11.14
✎
11:12
|
(38) Работу предлагаешь? Прям в Питере? :)
|
|||
41
Banned
25.11.14
✎
11:13
|
(38) А что по деньгам?
|
|||
42
Эльниньо
25.11.14
✎
11:25
|
В личку, велкам
|
|||
43
Banned
25.11.14
✎
12:17
|
(42) ну это скучно же ))
Сначала хотя бы порядок цифр... 50-70-100-150? )) |
|||
44
smitti911
25.11.14
✎
19:01
|
Проблема с запросом к регистру. Флаг БыстраяОбработкаДвижений = 0 , у реквизитов регистра флаг отбора движений = 0.
Текст запроса : оПЗ.Текст=" |ВЫБРАТЬ | $РегОб.Счет КАК [Счет $Счет] |, $РегОб.ТМЦ КАК [ТМЦ $Справочник.ТМЦ] |, НАЧАЛОПЕРИОДА($Жур.ДатаДокумента, Месяц ) КАК [Месяц $Дата] |, $РегОб.ТекущийДокумент [Док $Документ] |, $Жур.ВидДокумента КАК Док_вид |, $РегОб.ПризнакДвижения КАК ПризнакДвижения |, $РегОб.Склад КАК [Склад $Справочник.МестаХранения] |, СУММА($РегОб.ПриходСуммаСебест) КАК ОборотС |, СУММА($РегОб.ПриходКво) КАК ОборотК |, 0 КАК [ИспКво :Число.15.3] | |FROM Регистр.ОборотыБ КАК РегОб | |ЛЕВОЕ СОЕДИНЕНИЕ ЖурналДокументов КАК Жур $nolock |ПО $Жур.ТекущийДокумент = $РегОб.ТекущийДокумент | |ГДЕ $РегОб.ПризнакДвижения = :Перечисление.ПризнакДвижения.Приход |И $РегОб.ВидДвижения = 0 |И $РегОб.Счет = :ВыбСчет~ |И $РегОб.Склад В (ВЫБРАТЬ val ИЗ #СписокСкладов) |И ($Жур.Проведен = 1) |И ($Жур.ДатаДокумента МЕЖДУ :НачПериода и :КонПериода~) |И $Жур.ВидДокумента = :ВидДокумента.ПриходнаяНакладнаяБ // |И (ТМЦ В (ВЫБРАТЬ val ИЗ #СписокТМЦ)) | |СГРУППИРОВАТЬ $РегОб.ТМЦ,$РегОб.Склад,$РегОб.ТекущийДокумент | |УПОРЯДОЧИТЬ $РегОб.ТМЦ,$РегОб.Склад,$РегОб.ТекущийДокумент УБЫВ |"; //}Текст запроса ОпределитьСклады(НаДату); оПЗ.УстановитьТекстовыйПараметр("НачПериода",НачДата); оПЗ.УстановитьТекстовыйПараметр("КонПериода",КонДата); оПЗ.УстановитьТекстовыйПараметр("ВыбСчет",СчетПоКоду("281")); СпСкл = СоздатьОбъект("СписокЗначений"); Для Поз = 1 По глСписокТоргСкладов.РазмерСписка() Цикл ТекЗн = глСписокТоргСкладов.ПолучитьЗначение(Поз); Если Число(ТекЗн.Код) = 50 Тогда Продолжить; КонецЕсли; СпСкл.ДобавитьЗначение(ТекЗн); КонецЦикла; оПЗ.УложитьСписокЗначений(СпСкл,"#СписокСкладов"); Проблема : Подбор индекса для таблицы RA18284: Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=; Упорядочить: SP18288[ТМЦ], SP18287[Склад], IDDOC, Найдено в кэше Индекс не выбран. Стоимость: 9982 Подбор индекса для таблицы RA18284: Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=; Упорядочить: SP18288[ТМЦ], SP18287[Склад], IDDOC, Найдено в кэше Индекс не выбран. Стоимость: 9982 Подбор индекса для таблицы 1SJOURN: Ограничения: IDDOCDEF=; IDDOC=; Найдено в кэше Выбран индекс IDDOC: IDDOC Стоимость: 20 Подбор индекса для таблицы 1SJOURN: Ограничения: IDDOCDEF=; IDDOC=; Найдено в кэше Выбран индекс IDDOC: IDDOC Стоимость: 20 Как можно побороть Стоимость: 9982 ? |
|||
45
trad
25.11.14
✎
19:15
|
внутреннее соединение
если не поможет, внутреннее соединение и поменять таблицы местами |
|||
46
КонецЦикла
25.11.14
✎
21:53
|
Если уж настолько критично - подобрать штатный индекс или свой создать
Но другая сторона - проиграешь по времени записи движений Еще вариант - использование временных таблиц (иногда пригождается) http://1c911.by/stati_1s/statya-primery-resheniya-nestandartnyh-zadach-na-t-sql-v-1s.htm#4 |
|||
47
smitti911
26.11.14
✎
00:06
|
внутреннее соединение и поменять таблицы местами - это помогло, спасибо.
Подбор индекса для таблицы 1SJOURN: Ограничения: IDDOCDEF=; IDDOC=; Найдено в кэше Выбран индекс IDDOC: IDDOC Стоимость: 20 Подбор индекса для таблицы RA18284: Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=; IDDOC=; Упорядочить: SP18288[ТМЦ], SP18287[Склад], IDDOC, Найдено в кэше Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6) Стоимость: 54 Подбор индекса для таблицы 1SJOURN: Ограничения: IDDOCDEF=; Найдено в кэше Выбран индекс DOCTYPE: IDDOCDEF+DTOS(DATE)+TIME+IDDOC Стоимость: 80 Подбор индекса для таблицы RA18284: Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=; Упорядочить: SP18288[ТМЦ], SP18287[Склад], IDDOC, Найдено в кэше Индекс не выбран. Стоимость: 9982 Подбор индекса для таблицы RA18284: Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=; IDDOC=; Найдено в кэше Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6) Стоимость: 54 Подбор индекса для таблицы RA18284: Ограничения: SP18296[ПризнакДвижения]=; DEBKRED=; SP18285[Счет]=; IDDOC=; Найдено в кэше Выбран индекс IDLINE: IDDOC+STR(LINENO,4)+STR(ACTNO,6) Стоимость: 54 Может попробую еще временные таблицы |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |