Прямой запрос 1с++ к сторонней базе

1. eshtrey 24.09.15 11:56 Сейчас в теме
Из одной базы SQL надо подключится с другой базе и отобрать сотрудников.
Сотрудники отбираются по нескольким реквизитам, значения реквизитов указаны в списке на форме отчета. Сами реквизиты периодические.
Вот пример для одного реквизита для отбора из текущей базы
RS = СоздатьОбъект("ODBCRecordset");
RS.УстБД1С();
ТекстЗапроса = "
|SEL ECT Сотрудники.ID [Сотр $Справочник.Сотрудники]
|FROM $Справочник.Сотрудники AS Сотрудники With (NOLOCK)
|WHERE 
|    Сотрудники.IsFolder = 2 AND 
|    Сотрудники.IsMark = 0
|";
Если ВыбДепартаменты.РазмерСписка()>0 Тогда
	ТекстЗапроса=ТекстЗапроса+"AND ($ПоследнееЗначение.Сотрудники.Департамент(Сотрудники.ID, :ВыбДата)       IN (SELECT Val FR OM #Департаменты))
|";
	RS.УложитьСписокОбъектов(ВыбДепартаменты, "#Департаменты", "Департаменты");
КонецЕсли;
RS.УстановитьТекстовыйПараметр("ВыбДата", КонДата);
Темп = СоздатьОбъект("ТаблицаЗначений");
Темп = RS.ВыполнитьИнструкцию(ТекстЗапроса, Темп);
Показать


Как написать запрос для отбора сотрудников из другой базы? Департаменты совпадают по коду.
Спасибо
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Gkmy 28 24.09.15 14:26 Сейчас в теме
1cpp.ru

ПрисоединитьИБ / AttachIB

Синтаксис: ПрисоединитьИБ(КаталогИБ, [ИмяПользователя], [Пароль], [СтрокаСоединения])

Параметры:

КаталогИБ - тип: Строка. Путь к каталогу информационной базы. Должен заканчиваться "\".

ИмяПользователя - тип: Строка. Имя пользователя информационной базы как оно задано в конфигураторе. Значение по умолчанию - имя текущего пользователя.

Пароль - тип: Строка. Пароль на имя пользователя информационной базы как он задан в конфигураторе. Значение по умолчанию - пароль текущего пользователя.

СтрокаСоединения - тип: Строка. Строка соединения по спецификации ODBC. Значения по умолчанию:
для ИБ sql-формата: "Driver={SQL Server};Server=%1;Database=%2;Uid=%3;Pwd=%4;",где %1 - имя sql-сервера, %2 - имя базы данных, %3 - имя пользователя БД, %4 - пароль, взятые из параметров, сохраненных в каталоге ИБ.
для ИБ dbf-формата: "DRIVER={Microsoft Visual FoxPro Driver};Deleted=No;Null=Yes;Collate=RUSSIAN;Exclusive=No;SourceType=DBF;SourceDB=%1", где %1 - переданный КаталогИБ;
Описание: позволяет загрузить метаданные из указанного каталога ИБ и соединиться с источником данных по строке соединения. В дальнейшем, после установки соединения для объекта ODBCRecordset методом УстБД, при выполнении запросов, парсер будет разрешать метаимена по подключенным метаданным.

Примечание: имя пользователя и пароль проходят проверку только при подключении к ИБ sql-формата. (При подключении к ИБ dbf-формата значения не имеют.)

Пример:

ИБ=СоздатьОбъект("ODBCDataBase");
ИБ.ПрисоединитьИБ("\\server\КаталогИБ\");
рс=СоздатьОбъект("ODBCRecordset");
рс.УстБД(ИБ);
Результат=рс.ВыполнитьИнструкцию(ТекстЗапроса);
3. eshtrey 24.09.15 14:38 Сейчас в теме
(2) Gkmy, а такое условие отбора будет правильно отрабатывать? Элементы ВыбДепартамент принадлежат текущей базе.
Если ВыбДепартаменты.РазмерСписка()>0 Тогда
    ТекстЗапроса=ТекстЗапроса+"AND ($ПоследнееЗначение.Сотрудники.Департамент(Сотрудники.ID, :ВыбДата)       IN (SELECT Val FR OM #Департаменты))
|";
    RS.УложитьСписокОбъектов(ВыбДепартаменты, "#Департаменты", "Департаменты");
КонецЕсли;
4. Gkmy 28 24.09.15 15:28 Сейчас в теме
(3) eshtrey, нет не будет, другое будет
5. eshtrey 24.09.15 15:44 Сейчас в теме
6. Gkmy 28 24.09.15 16:49 Сейчас в теме
7. eshtrey 24.09.15 17:14 Сейчас в теме
8. ditp 91 24.09.15 17:39 Сейчас в теме
(7) eshtrey, чего объяснять-то?
Айдишники департаментов в базах могут отличаться, так что условие кривое.
Если коды совпадают - значит по ним и нужно фильтровать.
9. Gkmy 28 25.09.15 00:17 Сейчас в теме
(7) eshtrey, какая ещё суть?
вопрос
- (2) Gkmy, а такое условие отбора будет правильно отрабатывать?
ответ
- (3) eshtrey, нет не будет; другое (условие отбора) - будет.

так понятнее суть.
10. eshtrey 03.05.17 19:30 Сейчас в теме
Пришлось вернуться в данной задаче.
Так как все таки отобрать элементы из сторонней базы по реквизитам из списка?

RS = СоздатьОбъект("ODBCRecordset");
ODBCD = СоздатьОбъект("ODBCDataBase");
ODBCD.ПрисоединитьИБ(ПутьИмпортируемойБазы, глРобот, глРоботПароль);
RS.УстБД(ODBCD);
СписокСКЛ = СоздатьОбъект("СписокЗначений");
Мета = глСоздатьОбъект("MetaDataWork", ОЛЕ); // MetaDataWork в базе ОЛЕ
СпрОЛЕ = глСоздатьОбъект("Справочник." + ВидСпр, ОЛЕ); //справочник ОЛЕ
Для К = 1 По СписокФормы.РазмерСписка() Цикл
	Эл = СписокФормы.ПолучитьЗначение(К);
	Если СпрОЛЕ.НайтиПоКоду(Эл.Код, 0) = 1 Тогда
		Объект = Мета.ЗначениеВДлиннуюСтрокуБД(СпрОЛЕ); // ЗначениеВСтрокуБД
		СписокСКЛ.ДобавитьЗначение(Объект);
	КонецЕсли;
КонецЦикла;

...

ТекстЗапроса = ТекстЗапроса + "
|AND ($ПоследнееЗначение.Сотрудники." + РеквСпр + "(Сотрудники.ID, :ВыбДата) IN (SEL ECT Val FR OM #" + ИмяСКЛ + "))
|";
RS.УложитьСписокОбъектов(СписокСКЛ, "#" + ИмяСКЛ, ВидСпр); //УложитьСписокОбъектов13
Показать
11. eshtrey 03.05.17 19:32 Сейчас в теме
В СписокСКЛ добавлял ID ЗначениеВСтрокуБД (9 знаков) и ЗначениеВДлиннуюСтрокуБД (13 знаков)
В запрос список передавал методом УложитьСписокОбъектов13 и УложитьСписокОбъектов (с указанием вида справочника и без указания)
12. user730384 04.05.17 07:14 Сейчас в теме
ИБ=СоздатьОбъект("ODBCDataBase");
ИБ.ПрисоединитьИБ("\\server\КаталогИБ\");
рс=СоздатьОбъект("ODBCRecordset");
рс.УстБД(ИБ);
Результат=рс.ВыполнитьИнструкцию(ТекстЗапроса);
13. eshtrey 04.05.17 09:24 Сейчас в теме
(12) как в запрос передать список элементов, что бы по ним отфильтровать сотрудников?
14. jj_mail 04.05.17 09:39 Сейчас в теме
Составить список кодов департаментов, а потом проверять на вхождение в этот список
15. eshtrey 04.05.17 10:06 Сейчас в теме
(14) вы наверно про такую конструкцию?
ТекстЗапроса = ТекстЗапроса + "AND (LTRIM(RTRIM(Департаменты.CODE)) IN ('"+ глСписокВСтрокуДляSQL(СписокОтбор) + "'))
где СписокОтбор содержит коды департаментов, но хотелось бы передавать именно ID департаментов ОЛЕ базы
16. jj_mail 04.05.17 10:11 Сейчас в теме
Ну так ведь ЗначениеВСтрокуБД() как раз и возвращает внутренний ИД
17. jj_mail 04.05.17 10:17 Сейчас в теме
Только вот как Вы собираетесь сравнивать ИД из одной базы с ИД из другой ? они ведь никогда не будут совпадать. Тогда уж нужно и на форме список заполнять элементами из той базы, к которой выполняется запрос.
18. eshtrey 04.05.17 10:23 Сейчас в теме
(17)так я в список значений пихаю ID элементов ОЛЕ базы
СписокСКЛ = СоздатьОбъект("СписокЗначений");
Мета = ОЛЕ.CreateTable("MetaDataWork")
СпрОЛЕ = ОЛЕ.CreateTable("Справочник." + ВидСпр)
Для К = 1 По СписокФормы.РазмерСписка() Цикл //в СписокФормы выбраны элементы текущей базы
    Эл = СписокФормы.ПолучитьЗначение(К);
    Если СпрОЛЕ.НайтиПоКоду(Эл.Код, 0) = 1 Тогда
        ИД_в_базе_ОЛЕ = Мета.ЗначениеВСтрокуБД(СпрОЛЕ.ТекущийЭлемент()); //9 символов, "    31   "
        СписокСКЛ.ДобавитьЗначение(ИД_в_базе_ОЛЕ);
    КонецЕсли;
КонецЦикла;
Показать
19. jj_mail 04.05.17 11:02 Сейчас в теме
Хм... так а в чем тогда вопрос ?
20. eshtrey 04.05.17 11:09 Сейчас в теме
так ниче не выбирает, запрос возвращает пустую таблицу
21. jj_mail 04.05.17 11:43 Сейчас в теме
а что сейчас находиться в "СписокСКЛ" ?
res002t@result.com.pl; +1 Ответить
22. eshtrey 04.05.17 12:18 Сейчас в теме
в списокСКЛ ID элементов из базы ОЛЕ

Такая конструкция (пример для перечисления) работает
Объект =Мета.ЗначениеВСтрокуБД(ОЛЕ.Перечисление.ПолучитьАтрибут(Эл.Вид()).ЗначениеПоИдентификатору(Эл.Идентификатор()));
СписокСКЛ.ДобавитьЗначение(Объект);
....
ТекстЗапроса = ТекстЗапроса + "
|AND $ПоследнееЗначение.Сотрудники." + РеквСпр + "(Сотрудники.ID, :ВыбДата) IN ('"+ глСписокВСтрокуДляSQL(СписокСКЛ) + "')
|";
23. eshtrey 04.05.17 12:21 Сейчас в теме
Почему не хочу так же переделывать для кодов справочника? Потому что при выборе группы, придется в списокСКЛ добавлять все коды подчиненных элементов.
24. jj_mail 04.05.17 12:26 Сейчас в теме
Ну хорошо... А если сравнить содержимое списка с тем, что возвращает запрос ? Есть ли там совпадающие значения ?
25. eshtrey 04.05.17 12:53 Сейчас в теме
если выводить
ТекстЗапроса = "
|SELECT
| Отделы.ID ОтделID

то значение ОтделID равно тому что возвращает Мета.ЗначениеВСтрокуБД(СпрОЛЕ) (9 символов, пробелы не удаляю)
26. eshtrey 04.05.17 12:54 Сейчас в теме
конструкция
|AND " + ВидСпр + ".ID)) IN ('"+ глСписокВСтрокуДляSQL(СписокСКЛ) + "')
работает, только вхождение в группу не проверится. А хочется, что бы и на вхождение тоже проверялось
27. jj_mail 04.05.17 13:24 Сейчас в теме
Как вариант можно сделать предварительный запрос по справочнику (с учетом иерархии), запихнуть ИД элементов в список, а потом его уже использовать в основном запросе
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот