|
v7: Отбор по дате основания 1с 77 SQL | ☑ | ||
---|---|---|---|---|
0
Franchiser
гуру
16.08.18
✎
22:29
|
Есть запрос 1с 7.7 генерируемый обработкой settatrs (допиленной).
В запросе устанавливается фильтр на дату документа основания, но запрос не фильтрует данные, т.е. Неверно интерпретируется в SQL: вместо условия на дату основания ставится условие на дату документы. Есть ли варианты решения проблемы с помощью патча или как то еще? |
|||
1
NSSerg
16.08.18
✎
22:34
|
(0) нет такого глюка.
Приведи текст запроса который по твоему мнению работает неверно. напиши в коде сообщить(текстзапроса); |
|||
2
Franchiser
гуру
16.08.18
✎
22:40
|
Обрабатывать Все;
Период с гНачДата по гКонДата; ОбрабатыватьДокументы Все; ПеремОбъект = Документ.РасходнаяНакладная.ТекущийДокумент; Группировка ПеремОбъект; Без Итогов; Перем1 = Документ.РасходнаяНакладная.ДокументОснование.ДатаДок; Условие (Перем1 = гУсл1); |
|||
3
NSSerg
16.08.18
✎
22:44
|
(2) согласно этому запросу, должны обрабатываться расходные накладные с датой от гначдата по гкондата включительно, у которых дата документа основания равна гусл1
|
|||
4
Злопчинский
16.08.18
✎
22:58
|
(3) причем гУсл1 должна попадать в диапазон гНачДата по гКОндата
|
|||
5
Franchiser
гуру
16.08.18
✎
23:40
|
(4) даже период даже если указать огромный период все равно не работает.
Почему гусл1 должен попадать в период гначдата по гконлата? |
|||
6
Franchiser
гуру
16.08.18
✎
23:41
|
Вот ставлю период 01.01.18, в итоге отбираются документы за 01.01.18, у которых дата основания в 2017 году
|
|||
7
Franchiser
гуру
16.08.18
✎
23:43
|
Период указываю январь 2018, фильтр на дату основания = 01.01.2018
|
|||
8
Salimbek
16.08.18
✎
23:49
|
(6) Ну вроде правильно, по этому запросу. А как должно быть по вашему?
|
|||
9
Franchiser
гуру
16.08.18
✎
23:53
|
Нужны документы за период у которых дата основания 01.01.18
|
|||
10
Salimbek
17.08.18
✎
00:10
|
(9) Может быстрее сделать без запросов? Тупым перебором? (это если задача разовая и объемы обрабатываемых данных не гигантские)
|
|||
11
Franchiser
гуру
17.08.18
✎
00:25
|
Запрос динамический в обработке setattrs, понятно что если не получится буду делать отдельную обработку, но все таки хотелось бы разъяснений
|
|||
12
toypaul
гуру
17.08.18
✎
08:35
|
"Неверно интерпретируется в SQL" ну и какой запрос в СКЛ?
|
|||
13
Peltik
17.08.18
✎
09:06
|
закоменти Перем1, а в условии попробуй вот так
Условие (ПеремОбъект.ДокументОснование.ДатаДок = гУсл1) |
|||
14
АЛьФ
17.08.18
✎
09:43
|
2(13) Так в 7.7 не работает.
|
|||
15
АЛьФ
17.08.18
✎
09:44
|
+(14) Блин, коряво высказался.
|
|||
16
Мимохожий Однако
17.08.18
✎
09:46
|
Без условия отрабатывается запрос?
|
|||
17
Эльниньо
17.08.18
✎
09:55
|
4 точки. Нуна.
Что мешает сделать: ПеремОбъект = Документ.РасходнаяНакладная.ТекущийДокумент; ДокОсн = Документ.РасходнаяНакладная.ДокументОснование; |
|||
18
Peltik
17.08.18
✎
10:47
|
(16) нет, закоментить строку там где Перем1, а строку с условием изменить
Обрабатывать Все; Период с гНачДата по гКонДата; ОбрабатыватьДокументы Все; ПеремОбъект = Документ.РасходнаяНакладная.ТекущийДокумент; Группировка ПеремОбъект; Без Итогов; //Перем1 = Документ.РасходнаяНакладная.ДокументОснование.ДатаДок; Условие (ПеремОбъект.ДокументОснование.ДатаДок = гУсл1); вот так |
|||
19
Franchiser
гуру
17.08.18
✎
13:51
|
(17) когда в запросе 1с 7.7 идет выбор 2 и более полей одинакового типа, то sql делает одно соединение с таблице Документов и потом тупо подставляет одно и то же значение в поля запроса
|
|||
20
Franchiser
гуру
17.08.18
✎
14:11
|
(18) так что-то делает. но висит уже полчаса
|
|||
21
Peltik
17.08.18
✎
14:13
|
(20) ограничь маленьким периодом для проверки
|
|||
22
Peltik
17.08.18
✎
14:18
|
"//{{ЗАПРОС(Сформировать)
|Период с гНачДата по гКонДата; |ОбрабатыватьДокументы все; |Без итогов; |ТТН = Документ.ТТН.ТекущийДокумент; |Группировка ТТН; |Условие(ТТН.ДокументОснование.ДатаДок = гУсл1); |"//}}ЗАПРОС кароч, в таком варианте он у меня работет, вроде, так как тебе и надо, только на другом документе тренировался |
|||
23
Franchiser
гуру
17.08.18
✎
14:20
|
(21) Да, на маленьком периоде работает. Ладно всем спасибо
|
|||
24
NSSerg
17.08.18
✎
17:21
|
Проверяем код из (2)
Процедура Сформировать() гНачДата=ТекущаяДата()-10; гКонДата=ТекущаяДата(); гУсл1=ТекущаяДата()-5; Запрос=создатьобъект("Запрос"); ТекстЗапроса="Обрабатывать Все; |Период с гНачДата по гКонДата; |ОбрабатыватьДокументы Все; |ПеремОбъект = Документ.Реализация.ТекущийДокумент; |Группировка ПеремОбъект; |Без Итогов; |Перем1 = Документ.Реализация.ДокОснование.ДатаДок; |Условие (Перем1 = гУсл1);"; Запрос.Выполнить(ТекстЗапроса); Верно=0; Ошибок=0; Пока Запрос.Группировка()=1 Цикл Если Запрос.ПеремОбъект.ДокОснование.ДатаДок=гУсл1 Тогда Верно=Верно+1; Иначе Ошибок=Ошибок+1; КонецЕсли; КонецЦикла; Сообщить("Верно: "+Верно); Сообщить("Ошибок: "+Ошибок); КонецПроцедуры // Верно: 1468 Ошибок: 0 // Тут докоснование - документ определенного вида. Вторая проверка, докоснование - тип "Документ" неопределенного вида // //******************************************* Процедура Сформировать() гНачДата=ТекущаяДата()-10; гКонДата=ТекущаяДата(); гУсл1=ТекущаяДата()-5; Запрос=создатьобъект("Запрос"); ТекстЗапроса="Обрабатывать Все; |Период с гНачДата по гКонДата; |ОбрабатыватьДокументы Все; |ПеремОбъект = Документ.ПКО.ТекущийДокумент; |Группировка ПеремОбъект; |Без Итогов; |Перем1 = Документ.ПКО.ДокОснование.ДатаДок; |Условие (Перем1 = гУсл1);"; Запрос.Выполнить(ТекстЗапроса); Верно=0; Ошибок=0; Пока Запрос.Группировка()=1 Цикл Если Запрос.ПеремОбъект.ДокОснование.ДатаДок=гУсл1 Тогда Верно=Верно+1; Иначе Ошибок=Ошибок+1; КонецЕсли; КонецЦикла; Сообщить("Верно: "+Верно); Сообщить("Ошибок: "+Ошибок); КонецПроцедуры // Верно: 608 Ошибок: 0 // Это на SQL Повторюсь, нет такого глюка. |
|||
25
Ёпрст
17.08.18
✎
17:24
|
(0)
У переменных неопределенного вида/типа нельзя смотреть атрибуты в чорном запросе, исключение - общие реквизиты дока. ДатаДок как и Номер к ним не относится. В sql и в dbf варианте, где-то будет значение, а где-то нет. |
|||
26
Ёпрст
17.08.18
✎
17:26
|
Можешь сделать так, но про скорость, забудь :
Обрабатывать Все; Период с гНачДата по гКонДата; ОбрабатыватьДокументы Все; ПеремОбъект = Документ.РасходнаяНакладная.ТекущийДокумент; Группировка ПеремОбъект; Без Итогов; Перем1 = Документ.РасходнаяНакладная.ДокументОснование; Условие (Перем1.ДатаДок = гУсл1); |
|||
27
NSSerg
17.08.18
✎
17:26
|
(25) в (24) тест.
|
|||
28
Ёпрст
17.08.18
✎
17:31
|
(27) Сообщить(Запрос.Перем1) че возвращает у тебя ?
|
|||
29
Ёпрст
17.08.18
✎
17:33
|
Ну и вот это воткни
|Перем2 = Документ.ПКО.ДокОснование.НомерДок; и сообщи, чему равно Сообщить(Запрос.Перем2); |
|||
30
Franchiser
гуру
17.08.18
✎
21:29
|
(24) какой SQL у тебя?
|
|||
31
Franchiser
гуру
17.08.18
✎
21:34
|
(24) ДокОснование у тебя общий реквизит?
|
|||
32
Franchiser
гуру
17.08.18
✎
21:41
|
(26) я так понимаю этот вариант не лучше чем (22). Сначала SQL отберёт данные, а потом 1с 7.7 налодит условие на дату основания. На самом деле я раньше смотрел profiler, проблема alias таблиц, неужели нельзя сделать что-нибудь с bkend.dll ?
|
|||
33
Franchiser
гуру
17.08.18
✎
21:43
|
(25) у меня как раз общий реквизит, почему же нельзя поставить фильтр на Датадок из него ?
|
|||
34
Franchiser
гуру
17.08.18
✎
21:51
|
(24) ты не то сверяешь, нужно не это сверять Запрос.ПеремОбъект.ДокОснование.ДатаДок =гусл1, а запрос.перем1 = гусл1
|
|||
35
NSSerg
17.08.18
✎
23:02
|
(28) Конечно куча строк с 12.08.18, других значений нет.
(29) сообщить(""+Запрос.Перем2+" "+стрдлина(Запрос.Перем2)+" "+кодсимв(лев(Запрос.Перем2,1))); Выводит 1 32 то есть там один пробел. При этом сообщить(Запрос.ПеремОбъект.ДокОснование.номердок); eстественно выводит всё нормально. (30) SQL2000 (31) Это имеет значение? Нет, не общий (34) Я сверяю что в выборку попали правильные документы, с нужной датой документа основания. Естественно правильно проверяю. |
|||
36
NSSerg
17.08.18
✎
23:06
|
(29) Прикольный глюк.
|
|||
37
Franchiser
гуру
17.08.18
✎
23:19
|
У меня sql2008
|
|||
38
Злопчинский
18.08.18
✎
00:39
|
(14) работает, только надо ловко извернуться.
|
|||
39
Злопчинский
18.08.18
✎
00:40
|
(14) Условие (Запрос.ПеремОбъект.ДокументОснование.ДатаДок = гУсл1)
где Запрос = СоздатьОбъект("Запрос"); |
|||
40
Злопчинский
18.08.18
✎
00:43
|
(39) хотя это я м.б. не тему впихнулся, сорри
|
|||
41
Franchiser
гуру
18.08.18
✎
00:48
|
(39) может так и работает, но время работы далеко не на уровне прямого запроса
|
|||
42
Злопчинский
18.08.18
✎
00:49
|
(25) а мне удалось
глТекстЗапроса = " |Период с ДатаН По ДатаК; Без итогов; | |Заказ = Регистр.Заказы.Заказ; //Заказ - документ неопределенного вида ..... |Функция Заказано ..... | |Группировка Заказ Без Упорядочивания; | |Условие( .... |Условие(глЗапрос.Заказ.ДокументОснование = ВыбЗаказОснование); - и все отрабатывает норм.... ???? |
|||
43
Злопчинский
18.08.18
✎
00:51
|
(41) А кто сказал что будет легко...
|
|||
44
Franchiser
гуру
18.08.18
✎
00:54
|
(42) мне нужно отобрать документы за период, у которых есть основание и дата основания, например, меньше начала текущего периода. Прямым запросом можно отобрать за раз, а семерошным и за 30-60 мин не удается получить.
|
|||
45
Злопчинский
18.08.18
✎
00:54
|
(36) Поясни, плиз, в чем прикольгый глюк, а то я не улавливаю без глубокого погружения в тему...
|
|||
46
Злопчинский
18.08.18
✎
00:56
|
покажи итоговый текст запроса.
полный. который ты запускаешь. |
|||
47
Franchiser
гуру
18.08.18
✎
00:57
|
Черный запрос в (2) не отрабатывает, т.к. запрос в профайлере интерпретирует фильтр на дату в основании как фильтр на дату документа, т.е. из первой переменной в запросе перемобъект.
|
|||
48
Злопчинский
18.08.18
✎
00:58
|
я б, по ческгноку, вооьбще бы поостерегся выбирать/фильтровать какие-то документы/реквизитыдокументы, которые вне заданного периода запроса (параноик я). Или, по крайней мере, провел бы тестирование на вырожденных примерах чтобы убедиться что это работает как надо.
|
|||
49
Злопчинский
18.08.18
✎
00:59
|
(47) то есть в профалере неверно интепретирован исходны код чорного запроса?
|
|||
50
Злопчинский
18.08.18
✎
01:00
|
(47) я не знаю, глюк это или нет, но я всегда исходил из того, что период в запросе - ограничивает все документы, которыми оперирует запрос - поэтому и (48)
|
|||
51
Franchiser
гуру
18.08.18
✎
01:00
|
(46) но если пытаться делать другими способами , то да работает, но время работы запроса сопоставимо с получением всех документов без фильтра на дату основания, потому что в скуль фильтр на дату основания уже не идёт и фильтр отрабатывает на уровне платформы после выполнения запроса
|
|||
54
Злопчинский
18.08.18
✎
01:24
|
(51) а кто сказал что будет легко.
. попробуй первым запросом собрать все документы, которые потенциально могут быть документами-основаниями во втором запросе и во втором запросе фильтруй выборку докумеентов по вхождению документа-основания в список. |
|||
55
Franchiser
гуру
18.08.18
✎
10:25
|
(54) это универсальная обработка setattrs, я дорабатываю кусочный запрос, который выгружается в тз.
|
|||
56
NSSerg
18.08.18
✎
11:38
|
Не проще ли поменять тип реквизита?
Я в реализации поменял тип с "документ" на "документ.ЗаявкаПокупателя", как раз чтоб было проще писать эффективные запросы. |
|||
57
Ёпрст
20.08.18
✎
13:32
|
(35,36)
есть такое, а в дбф будет с точностью до наоборот, даты не будет, а номер будет. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |