|
v7: OLE, передаем параметры в запрос (да, опять) | ☑ | ||
---|---|---|---|---|
0
ptrtss
19.06.12
✎
12:30
|
Локальная задачка такая. Есть обработка, сравнивающая остатки и движения по резервам в двух базах. Данные одинаковые, разные только алгоритмы проведения. Это я так проверяю работу новых алгоритмов
В обработке есть таблица сравнения остатков. При даблклике на строчке хочу увидеть движения до этого момента в текущей базе и в OLE-шной Соответственно, при даблклике я запускаю один и тот же запрос в обеих базах. /////////////////////////////////////////////////////////////////////////// // ГЛОБАЛЬНЫЙ МОДУЛЬ /////////////////////////////////////////////////////////////////////////// Перем глПараметрыЗапроса Экспорт; //... Процедура глУстановитьПараметрЗапроса(Имя, СтрокаВнутр) Экспорт глПараметрыЗапроса.Установить(Имя, ЗначениеИзСтрокиВнутр(СтрокаВнутр)); КонецПроцедуры //... глПараметрыЗапроса = СоздатьОбъект("СписокЗначений"); /////////////////////////////////////////////////////////////////////////// // ОБРАБОТКА /////////////////////////////////////////////////////////////////////////// Процедура ПриВыбореСтрокиТаблицы() База = СоздатьОбъект("V77.Application"); //Коннект и все такое... ТекстЗапроса = "//{{ЗАПРОС(Движения) |Период с НачДата по КонДата; |Без итогов; |Док = Регистр.РезервыТМЦ.ТекущийДокумент; |Номенклатура = Регистр.РезервыТМЦ.Номенклатура; |Склад = Регистр.РезервыТМЦ.Склад; |ЗаявкаПокупателя = Регистр.РезервыТМЦ.ЗаявкаПокупателя; |ДоговорПокупателя = Регистр.РезервыТМЦ.ДоговорПокупателя; |Количество = Регистр.РезервыТМЦ.Количество; |Функция КоличествоПриход = Приход(Количество); |Функция КоличествоРасход = Расход(Количество); |Группировка Док упорядочить по Док.ДатаДок, Док.ВремяДок; |"//}}ЗАПРОС ; ТекстЗапроса = ТекстЗапроса + " |Условие(Номенклатура = глПараметрыЗапроса.Получить('Номенклатура')); |Условие(Склад = глПараметрыЗапроса.Получить('Склад')); |Условие(ЗаявкаПокупателя = глПараметрыЗапроса.Получить('ЗаявкаПокупателя')); |Условие(ДоговорПокупателя = глПараметрыЗапроса.Получить('ДоговорПокупателя')); |"; НачДата = '01.01.11'; КонДата = ВыбДата; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "НачДата", "'"+СокрЛП(Формат(НачДата, "ДДДММГГГГ"))+"'"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "КонДата", "'"+СокрЛП(Формат(КонДата, "ДДДММГГГГ"))+"'"); /////////////////////////////////////////////////////////////////////////// // ВОТ ЭТО - ОТРАБАТЫВАЕТ ХОРОШО /////////////////////////////////////////////////////////////////////////// Запрос = СоздатьОбъект("Запрос"); глУстановитьПараметрЗапроса("Номенклатура", ЗначениеВСтрокуВнутр(ТаблСравнения.Номенклатура)); глУстановитьПараметрЗапроса("Склад", ЗначениеВСтрокуВнутр(ТаблСравнения.Склад)); глУстановитьПараметрЗапроса("ЗаявкаПокупателя", ЗначениеВСтрокуВнутр(ТаблСравнения.ЗаявкаПокупателя)); глУстановитьПараметрЗапроса("ДоговорПокупателя", ЗначениеВСтрокуВнутр(ТаблСравнения.ДоговорПокупателя)); Запрос.Выполнить(ТекстЗапроса); /////////////////////////////////////////////////////////////////////////// // А ВОТ ЭТО - НЕТ, пишет что // // Запрос.Выполнить(ТекстЗапроса); // {F:\...\СРАВНЕНИЕ РЕЗЕРВОВ.ERT(145)}: 1С:Предприятие: Условие(Номенклатура = глПараметрыЗапроса.Получить('Номенклатура') <<?>> ); // Запрос[14] : Ошибка в выражении 'глПараметрыЗапроса' Запрос = База.CreateObject("Запрос"); /////////////////////////////////////////////////////////////////////////// База.глУстановитьПараметрЗапроса("Номенклатура", ЗначениеВСтрокуВнутр(ТаблСравнения.Номенклатура)); База.глУстановитьПараметрЗапроса("Склад", ЗначениеВСтрокуВнутр(ТаблСравнения.Склад)); База.глУстановитьПараметрЗапроса("ЗаявкаПокупателя", ЗначениеВСтрокуВнутр(ТаблСравнения.ЗаявкаПокупателя)); База.глУстановитьПараметрЗапроса("ДоговорПокупателя", ЗначениеВСтрокуВнутр(ТаблСравнения.ДоговорПокупателя)); Запрос.Выполнить(ТекстЗапроса); КонецПроцедуры Это почему так? |
|||
1
1Сергей
19.06.12
✎
12:31
|
в базу ОЛЕ надо подсовывать объекты из баз ОЛЕ
|
|||
2
1Сергей
19.06.12
✎
12:32
|
И собственно объект Запрос у тебя из текущей базы
|
|||
3
ptrtss
19.06.12
✎
12:33
|
(1) я знаю
(2) нет |
|||
4
1Сергей
19.06.12
✎
12:34
|
(3) чего нет? у тебя так написано
|
|||
5
ptrtss
19.06.12
✎
12:34
|
А ну да, сорри. В исконном коде он База.CreateObject
|
|||
6
1Сергей
19.06.12
✎
12:34
|
(5) у тебя база ОЛЕ - точная копия текущей?
|
|||
7
ptrtss
19.06.12
✎
12:35
|
Точнейшая. Только конфигурация немного старее
|
|||
8
ptrtss
19.06.12
✎
12:35
|
Обвязка для передачи параметров и в той и в той ))
|
|||
9
Ёпрст
19.06.12
✎
12:35
|
>>>|Условие(Номенклатура = глПараметрыЗапроса.Получить('Номенклатура'));
Вот это никогда не будет работать в оле |
|||
10
ptrtss
19.06.12
✎
12:36
|
(9) Ну дык оно и не работает. А что там за правило, что только глобальные переменные можно, без точек и вызовов?
|
|||
11
Ёпрст
19.06.12
✎
12:37
|
(10) в условиях можно использовать только явные строковые переменные или глобальный массив, элементами которого может быть всё что угодно: элементы, списки значений и т.д..
|
|||
12
dk
19.06.12
✎
12:38
|
а что за синтаксис с одинарными кавычками?
глПараметрыЗапроса.Получить('Номенклатура') |
|||
13
akaBrr
19.06.12
✎
12:38
|
что мешает ЗначениеВСтрокуВнутр(ТаблСравнения.Склад) прямо писать в текст запроса?
|
|||
14
ptrtss
19.06.12
✎
12:39
|
(12) Это у меня с двойными сразу чего-то не получилось, взял одинарные. Но в текущей то базе оно тем не менее отрабатывает
|
|||
15
ptrtss
19.06.12
✎
12:39
|
(13) Это OLE
|
|||
16
1Сергей
19.06.12
✎
12:40
|
(13) с кавычками придётся повозиться, а так взлетит
|
|||
17
1Сергей
19.06.12
✎
12:40
|
(15) используй массив
|
|||
18
akaBrr
19.06.12
✎
12:41
|
(15) спасибо за напоминание, ветка короткая, я помню, а по существу вопроса?
|
|||
19
ptrtss
19.06.12
✎
12:41
|
(13) Э... стоп, может имелось ввиду ДобавитьКавычек(ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(..)))
? |
|||
20
ptrtss
19.06.12
✎
12:42
|
(13) То есть ЗначениеИзСтрокиВнутр(ДобавитьКавычек(ЗначениеВСтрокуВнутр(..)))
? |
|||
21
ptrtss
19.06.12
✎
12:43
|
(17) пойду попробую массив...
|
|||
22
akaBrr
19.06.12
✎
12:43
|
глПараметрыЗапроса.Получить('Номенклатура') = ЗначениеВСтрокуВнутр(ТаблСравнения.Номенклатура)?
|
|||
23
Ёпрст
19.06.12
✎
12:44
|
На вот тебе пример, для понимания :
В оле базе Перем СписокКлиентосов[1] Экспорт; В обработине ОЛЕ.ExecuteBatch("СписокКлиентосов[1] =СоздатьОбъект(""СписокЗначений"")"); м = ОЛЕ.EvalExpr("СписокКлиентосов[1]"); Спр = ОЛЕ.CreateObject("Справочник.Контрагенты"); Пока Спр.ПолучитьЭлемент() = 1 Цикл Если Спр.ЭтоГруппа()=0 Тогда м.ДобавитьЗначение(Спр.ТекущийЭлемент()); КонецЕсли; КонецЦикла; Запрос = ОЛЕ.CreateObject("Запрос"); ТекстЗапроса = " |Спр = Справочник.Номенклатура.ТекущийЭлемент; |Условие (Спр в СписокКлиентосов[1]); |Группировка Спр Без Групп;"; Запрос.Выполнить(ТекстЗапроса); Пока Запрос.Группировка(1)=1 Цикл Сообщить(Запрос.Спр.Наименование); КонецЦикла; |
|||
24
Ёпрст
19.06.12
✎
12:44
|
(22) да не будет никогда список значений работать в оле-запросе.
Вот если он элемент массива - тогда запросто, а сам по себе никогда не работал. |
|||
25
ptrtss
19.06.12
✎
12:46
|
(22)
глПараметрыЗапроса.Получить('Номенклатура') = глПараметрыЗапроса.Получить('Номенклатура') ? Вроде да, но глПараметрыЗапроса.Получить('Номенклатура') использовать нельзя. Намек понятен? |
|||
26
akaBrr
19.06.12
✎
12:47
|
(24) текст запроса можно сформировать сразу и без параметров, ЗначениеВСтрокуВнутр - строка, ничего не мешает ее включить в текст
(25) мне давно :), я и предлагаю заменить его на стороне отчета, динамически сформированным текстом запроса, намек понятен? |
|||
27
Ёпрст
19.06.12
✎
12:48
|
(26) это всё хорошо, когда условие на одиночный параметр.. а вот если на вхождение в список ?
:)) тут только как в (23). |
|||
28
akaBrr
19.06.12
✎
12:48
|
+(26) без всяких глоб. переменных в оле базе
|
|||
29
akaBrr
19.06.12
✎
12:49
|
(27) у него вроде только сравнение
|
|||
30
Simod
19.06.12
✎
13:02
|
Все уже давно написано: http://mista.ru/articles1c/hare/article.15.html
|
|||
31
ptrtss
19.06.12
✎
13:02
|
Массив конечно же помог большое спасибо, коллеги. akaBrr, сорри нет времени пробовать работают ли ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр в запросах через OLE, в другой раз :)
|
|||
32
Ёпрст
19.06.12
✎
13:04
|
(30) написано, да не всё.
|
|||
33
Ёпрст
19.06.12
✎
13:05
|
(31) работают, вот только с кавычками и скобочками - тот еще подарок при передаче.
|
|||
34
Simod
19.06.12
✎
13:07
|
(32) Более чем достаточно для решения данной проблемы.
|
|||
35
Ёпрст
19.06.12
✎
13:08
|
(34) в статье нет фильтрации по списку значений.
|
|||
36
Ёпрст
19.06.12
✎
13:09
|
чего автор безусловно захочет сделать
+ фильтрация по коду элемента справочника - моветон |
|||
37
Simod
19.06.12
✎
13:12
|
(35) Да ну?! Ищем по "СкорректироватьСписок".
|
|||
38
ptrtss
19.06.12
✎
13:14
|
Да статейку то я видел, но хотелось чтобы в запросе были имена параметров, думал может как-то можно извратиться
|
|||
39
Ёпрст
19.06.12
✎
13:15
|
(37) да ну да
|
|||
40
Прохожий
19.06.12
✎
13:20
|
(6,7) Вас надо на пятницу приберечь...
|
|||
41
1Сергей
19.06.12
✎
13:26
|
(40) а что такого? если у него базы не родственные, то вся эта писанина не взлетит
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |