|
1С 7.7 Запрос по Ole ! | ☑ | ||
---|---|---|---|---|
0
1СМол
29.01.10
✎
11:15
|
Помогите кто может!!!
Нужно выполнить такой запрос в базе открываемой по Ole из другой базы ТекстЗапроса = " Период с '" + ДН + "' по '" + ДК + "'; |Продукция = Регистр.Остатки.Продукция; |Контрагент = Регистр.Остатки.Контрагент; |КоличествоРеал = Регистр.Остатки.КоличествоРеал; |СуммаРеал = Регистр.Остатки.СуммаРеал;"; Если (ГрПрод=1) Тогда ТекстЗапроса=ТекстЗапроса+" |ГрПродукции = Регистр.Остатки.Продукция.Родитель;"; КонецЕсли; ТекстЗапроса=ТекстЗапроса+" |Функция КоличествоОтгрузка = Расход(КоличествоРеал); |Функция СуммаОтгрузка = Расход(СуммаРеал); |Функция КоличествоВозврат = Приход(КоличествоРеал); |Функция СуммаВозврат = Приход(СуммаРеал);"; Если (ГрКонт=0) Тогда ТекстЗапроса=ТекстЗапроса+"Группировка Контрагент без групп;"; КонецЕсли; Если (ГрПрод=1) Тогда ТекстЗапроса=ТекстЗапроса+" |Группировка ГрПродукции;"; КонецЕсли; ТекстЗапроса=ТекстЗапроса+"Группировка Продукция без групп;"; ТекстЗапроса=ТекстЗапроса+" |Условие (Контрагент в СписокЗначенийЗапроса[1]); |Условие(Контрагент.Выбран()=1); |"; Запрос = БазаОле.CreateObject("Запрос"); Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда Предупреждение("Запрос невыполнен!"); Возврат; КонецЕсли; Как мне в СписокЗначенийЗапроса[1] занести контрагентов кот-е выбираются в форме "местной" базы, при этом могут быть и группы контрагентов выбраны. Сам запутался, может кто делал такое? |
|||
1
VoditelKobyly
29.01.10
✎
11:32
|
Пробуй так (может получится):
1. Накидай в местной базе список кодов Контрагентов 2. По этому списку кодов, сделай поиск в базе по которой делаешь запрос и накидай там нужный список элементов. 3. Делай запрос по полученному списку. Лично я бы написал прямой запрос к соседней базе без подключения по OLE. |
|||
2
VoditelKobyly
29.01.10
✎
11:34
|
(1)+ Или вообще ставь условие не по списку контрагентов, а по списку кодов контрагентов.
|
|||
3
1СМол
29.01.10
✎
11:34
|
(1) Последнее это как?
(Я неочень хорошо знаю 1С) |
|||
4
VoditelKobyly
29.01.10
✎
11:37
|
Типа:
КодКонтрагента = Регистр.Остатки.Контрагент.Код; ... Условие (КодКонтрагента в СписокЗначенийКодовКонтрагентов); |
|||
5
VoditelKobyly
29.01.10
✎
11:39
|
(0),(3) А другая база 1С или это что-то другое?
|
|||
6
1СМол
29.01.10
✎
11:40
|
(4) СписокЗначенийКодовКонтрагентов - Как полулучить?
Я немогу сообразить как программно это сделать... База другая тоже 1С ("Отрезаны" 2008 и 2009 года) |
|||
7
VoditelKobyly
29.01.10
✎
11:46
|
(0) Вот это кто писал?
"... Как мне в СписокЗначенийЗапроса[1] занести контрагентов кот-е выбираются в форме "местной" базы, при этом могут быть и группы контрагентов выбраны. ..." Или коды в двух базах не совпадают? |
|||
8
1СМол
29.01.10
✎
11:50
|
(7) Коды совпадают...
Я немогу набранный список в форме местной базы передать в Оле базу, чтобы запрос делался в Оле базе только по этому списку |
|||
9
VoditelKobyly
29.01.10
✎
11:59
|
А так пробовал:
СписокЗначенийКодовКонтрагентов =V7.CreateObject("СписокЗначений"); СписокЗначенийКодовКонтрагентов.ДобавитьЗначение(); ... |
|||
10
1СМол
29.01.10
✎
12:01
|
(9) Кажется стал понимать, спасибо
|
|||
11
Ёпрст
29.01.10
✎
12:02
|
(0) в Оле для условий можно пихать только глобальный массив. элементами которго будет твой список значений.
(9) Не будет это работать .. |
|||
12
VoditelKobyly
29.01.10
✎
12:09
|
(0) А как запрос запускаешшь?
|
|||
13
1СМол
29.01.10
✎
12:13
|
(12) Непонял..
Как надо? |
|||
14
VoditelKobyly
29.01.10
✎
12:18
|
Покажи как запрос по OLE запускаешь.
|
|||
15
Ёпрст
29.01.10
✎
12:18
|
(13) Еще раз - не работает условие на список значений в оле запросе..
В условие можно только глобальный массив использовать, где элементом массива будет список значений. |
|||
16
VoditelKobyly
29.01.10
✎
12:20
|
(13) Не буду спорить с Ёпрстом, он умный, а я давно по Оле ничего не делал.
Время тратить не охота. |
|||
17
1СМол
29.01.10
✎
12:21
|
(14) я же в (0) написал
Запрос = БазаОле.CreateObject("Запрос"); Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда Предупреждение("Запрос невыполнен!"); Возврат; КонецЕсли; |
|||
18
1СМол
29.01.10
✎
12:23
|
(15) да у меня это масив, а первый элемент его список который я как раз немогу передать в Оле
|
|||
19
VoditelKobyly
29.01.10
✎
12:27
|
(15),(17) А если оформить запрос в качестве глобальной функции?
А потом вызывать через EvalExpression |
|||
20
Ёпрст
29.01.10
✎
12:29
|
(18)
В оле базе Перем СписокКлиентосов[1] Экспорт; В обработине ОЛЕ.ExecuteBatch("СписокКлиентосов[1] =СоздатьОбъект(""СписокЗначений"")"); м = ОЛЕ.EvalExpr("СписокКлиентосов[1]"); Спр = ОЛЕ.CreateObject("Справочник.Контрагенты"); Пока Спр.ПолучитьЭлемент() = 1 Цикл Если Спр.ЭтоГруппа()=0 Тогда м.ДобавитьЗначение(Спр.ТекущийЭлемент()); КонецЕсли; КонецЦикла; Запрос = ОЛЕ.CreateObject("Запрос"); ТекстЗапроса = " |Спр = Справочник.Номенклатура.ТекущийЭлемент; |Условие (Спр в СписокКлиентосов[1]); |Группировка Спр Без Групп;"; Запрос.Выполнить(ТекстЗапроса); Пока Запрос.Группировка(1)=1 Цикл Сообщить(Запрос.Спр.Наименование); КонецЦикла; |
|||
21
Ёпрст
29.01.10
✎
12:30
|
+20 это для примера..
|
|||
22
1СМол
29.01.10
✎
12:31
|
(20)(21) спасибо буду разбираться
|
|||
23
Ёпрст
29.01.10
✎
12:36
|
(19) да можно что угодно делать
:) Один хрен придёшь рано или поздно к тому - что оле гамно и долго.. Лучше прямиком из табличек тащить.. запросиком. |
|||
24
1СМол
29.01.10
✎
12:48
|
(23) Где почитать про "Лучше прямиком из табличек тащить.. запросиком."
Или это - выгрузить из одной базы в Табл. потом загрузить в другую...? |
|||
25
VoditelKobyly
29.01.10
✎
12:51
|
(23) Так я к этому давно и пришел. Смотри (1)
|
|||
26
Ёпрст
29.01.10
✎
12:53
|
(24) Ну.. с прямыми запросами работал ? Можно тут почитать, для начала:
http://www.1cpp.ru/forum/YaBB.pl?board=query |
|||
27
VoditelKobyly
29.01.10
✎
12:53
|
(24) Если время на изучение нет, то лучше делай пока так, как наметил.
|
|||
28
1СМол
29.01.10
✎
12:57
|
(26)(27) еще раз спасибо
|
|||
29
1СМол
29.01.10
✎
14:08
|
(20) Вот написал так:
В ОлеБазе в Глобальном: Перем СписокКонтрОле[1] Экспорт; В вызывающей процедуре Местной базы: БазаОле=СоздатьОбъект("V77.Application"); КаталогБазыОле = "E:\БазаОЛЕ\"; ПользовательОле = "Администратор"; ПарольОле = "админ"; МонопольныйРежимOLE = " /m"; // для немонопольного запуска указать пустую строку! ЗапускБезЗаставки = 1; // для появления заставки (например, чтобы наблюдать // процесс запуска базы OLE визуально) поставьте здесь "0" РезультатПодключения = БазаОле.Initialize ( БазаОле.RMTrade , "/d" + СокрЛП(КаталогБазыОле) + " /n" + СокрЛП(ПользовательОле)+ " /p" + СокрЛП(ПарольОле) + МонопольныйРежимOLE, ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW","")); Если РезультатПодключения = 0 Тогда Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!"); Иначе Предупреждение("Все Ок!"); КонецЕсли; // БазаОле.ExecuteBatch("СписокКонтрОле[1] =СоздатьОбъект(""СписокЗначений"")"); скОле = БазаОле.EvalExpr("СписокКонтрОле[1]"); СпрК = БазаОле.CreateObject("Справочник.Контрагенты"); Пока СпрК.ПолучитьЭлемент() = 1 Цикл Пока ВыбКонтрагенты.ПолучитьЭлемент() = 1 Цикл Если СпрК.ТекущийЭлемент() = ВыбКонтрагенты.ТекущийЭлемент() Тогда скОле.ДобавитьЗначение(СпрК.ТекущийЭлемент()); КонецЕсли; КонецЦикла; КонецЦикла; //Запрос=СоздатьОбъект("Запрос"); Запрос1=СоздатьОбъект("Запрос"); Если ДатаКон>=ПолучитьДатуТА() Тогда ДатаКон=ПолучитьДатуТА(); КонецЕсли; ДН=ДобавитьМесяц(ДатаНач,-12); ДК=ДобавитьМесяц(ДатаКон,-12); //ТекстЗапроса=" ТекстЗапроса = " Период с '" + ДН + "' по '" + ДК + "'; //|Период с ДН по ДК; |Продукция = Регистр.Остатки.Продукция; |Контрагент = Регистр.Остатки.Контрагент; |КоличествоРеал = Регистр.Остатки.КоличествоРеал; |СуммаРеал = Регистр.Остатки.СуммаРеал;"; Если (ГрПрод=1) Тогда ТекстЗапроса=ТекстЗапроса+" |ГрПродукции = Регистр.Остатки.Продукция.Родитель;"; КонецЕсли; ТекстЗапроса=ТекстЗапроса+" |Функция КоличествоОтгрузка = Расход(КоличествоРеал); |Функция СуммаОтгрузка = Расход(СуммаРеал); |Функция КоличествоВозврат = Приход(КоличествоРеал); |Функция СуммаВозврат = Приход(СуммаРеал);"; Если (ГрКонт=0) Тогда ТекстЗапроса=ТекстЗапроса+"Группировка Контрагент без групп;"; КонецЕсли; Если (ГрПрод=1) Тогда ТекстЗапроса=ТекстЗапроса+" |Группировка ГрПродукции;"; КонецЕсли; ТекстЗапроса=ТекстЗапроса+"Группировка Продукция без групп;"; ТекстЗапроса=ТекстЗапроса+" //|Условие(Контрагент в ВыбКонтрагенты); |Условие (Контрагент в СписокКонтрОле[1]); |Условие(Контрагент.Выбран()=1); |"; Запрос = БазаОле.CreateObject("Запрос"); Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда Предупреждение("Запрос невыполнен!"); Возврат; КонецЕсли; Получаю ошибку : Пока СпрК.ПолучитьЭлемент() = 1 Цикл {D:\ВОЛЕ\СРАВНИТЕЛЬНАЯ РЕАЛИЗАЦИЯОЛЕ.ERT(84)}: 1С:Предприятие: Не выбран элемент! В чем проблема? |
|||
30
Ёпрст
29.01.10
✎
14:12
|
(29) а вот это нафига вообще ?
СпрК = БазаОле.CreateObject("Справочник.Контрагенты"); Пока СпрК.ПолучитьЭлемент() = 1 Цикл Пока ВыбКонтрагенты.ПолучитьЭлемент() = 1 Цикл Если СпрК.ТекущийЭлемент() = ВыбКонтрагенты.ТекущийЭлемент() Тогда скОле.ДобавитьЗначение(СпрК.ТекущийЭлемент()); КонецЕсли; КонецЦикла; КонецЦикла; + что за нелепое условие ? + ВыбКонтрагенты - Это что ? ЗЫ: в моём примере - просто показ того, как условие сделать - тупо перебор всего справочника, запихивание его в Список и использование в тексте запроса - который выводит этот же список.. Какая цель у вас - хз. |
|||
31
Ёпрст
29.01.10
✎
14:12
|
+30 а ошибка у вас - нет ВыбратьЭлементы..
|
|||
32
Ёпрст
29.01.10
✎
14:12
|
+31 хотя, читай (30).
|
|||
33
1СМол
29.01.10
✎
14:19
|
(30) Моя цель - я набираю контрагентов в местной базе в ВыбКонтрагены
Мне надо сравнить по ним реализацию с оле-базой... Поэтому и запрос должен только по этим контрагентам сделать в олебазе. Про ВыбратьЭлементы да ошибся просто голова уже нета с этим отчетом... Но суть почему у меня нет в СпрК ничего - по вашему примеру написал.? |
|||
34
aka AMIGO
29.01.10
✎
14:20
|
+(31) Вот это условие:
Если СпрК.ТекущийЭлемент() = ВыбКонтрагенты.ТекущийЭлемент() Тогда не выполнится никогда, потому, что СпрК.ТекущийЭлемент()= OLE.. и это всё! надо-бы хоть коды сравнивать, если очень нужен этот участок |
|||
35
DrZombi
гуру
29.01.10
✎
14:22
|
(33)Ты хоть в курсе, что "Контрагент" в базе "А" !!НЕ равен!! "Контрагенту" в базе "ОЛЕ"! ;)
.... прими это как аксиому! |
|||
36
1СМол
29.01.10
✎
14:22
|
(34) (35) КАК быть
|
|||
37
1СМол
29.01.10
✎
14:23
|
Как прировнять чтоб потом сравнить?
|
|||
38
aka AMIGO
29.01.10
✎
14:23
|
+34 можно просто посмотреть в отладчике, что там видно по оле..
lkz byas^ http://web.archive.org/web/20080115002158/www.sinor.ru/~my1c/knowhow/v7&OLE.html |
|||
39
Ёпрст
29.01.10
✎
14:25
|
(33) да ужж..
Контрагент в Оле базе <> контрагенту в этой базе... ЗЫ: И смотри пример внимательнее - в список подбираются контрагенты !той базы! (оле) , а не откуда вызов обработки. |
|||
40
1СМол
29.01.10
✎
14:28
|
(39) Но как мне набрать то в список только нужных контрагентов ???
Только определенный список из оле-базы но сформированный в местной базе ??? |
|||
41
aka AMIGO
29.01.10
✎
14:29
|
(37) по оле передаются: число, дата, строка ограниченной длины.
остальное видно, как "OLE", т.е. никак (40) в список выбери коды контрагентов, а не контрагентов |
|||
42
Ёпрст
29.01.10
✎
14:47
|
(40) Вот ты своих клиентосов по каком принципу идентифицируешь ?
По реквизиту, по коду, по инн, еще как.. вот и из этого и исходи, ежели по коду - ищи "там"(в оле базе ) по коду и пихай в список для условия в запросе (создавай там справочник клиентосов и ищи по коду, который в этой базе) |
|||
43
1СМол
29.01.10
✎
15:00
|
(42) ребят а может при вызове оле-базы показывать форму для выбора клиентов и в запросе уже этот список использовать???
|
|||
44
1СМол
29.01.10
✎
15:02
|
так наверное нельзя...
|
|||
45
Ёпрст
29.01.10
✎
15:06
|
(43) можно.. Открыть модальную форму и поиметь клиентосов с неё..
Либо СпрОле.Выбрать() |
|||
46
Ёпрст
29.01.10
✎
15:08
|
А так, ежели клиентосы синхронизированы по какому-либо признаку, показываешь на форме список этой базы, а при запросе - ищешь в той базе по этому признаку.
|
|||
47
1СМол
29.01.10
✎
15:16
|
(45)(46) Буду плавать, спасибо
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |