Из одной базы 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.ВыполнитьИнструкцию(ТекстЗапроса, Темп);
ПоказатьКак написать запрос для отбора сотрудников из другой базы? Департаменты совпадают по коду.
Спасибо
По теме из базы знаний
- DBEng32 (8.0.1.2, Share) – выполнение прямых запросов и в монопольном режиме для DBFной версии 1С:Предприятие 7.7 в среде 1С++
- Стоит ли использовать Внешние компоненты для 1С?
- Консоль запросов EX (внешние данные)
- Как из 1С отдать миллионы строк в BI и успеть это сделать быстро
- Переход с 1С:УПП на 1C:ERP. Переделываем интеграции, использующие SQL запросы к СУБД (на примере УПП -> QlikView -> ERP)
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ПрисоединитьИБ / 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");
рс.УстБД(ИБ);
Результат=рс.ВыполнитьИнструкцию(ТекстЗапроса);
(2) Gkmy, а такое условие отбора будет правильно отрабатывать? Элементы ВыбДепартамент принадлежат текущей базе.
Если ВыбДепартаменты.РазмерСписка()>0 Тогда
ТекстЗапроса=ТекстЗапроса+"AND ($ПоследнееЗначение.Сотрудники.Департамент(Сотрудники.ID, :ВыбДата) IN (SELECT Val FR OM #Департаменты))
|";
RS.УложитьСписокОбъектов(ВыбДепартаменты, "#Департаменты", "Департаменты");
КонецЕсли;
Пришлось вернуться в данной задаче.
Так как все таки отобрать элементы из сторонней базы по реквизитам из списка?
Так как все таки отобрать элементы из сторонней базы по реквизитам из списка?
RS = СоздатьОбъект("ODBCRecordset");
ODBCD = СоздатьОбъект("ODBCDataBase");
ODBCD.ПрисоединитьИБ(ПутьИмпортируемойБазы, глРобот, глРоботПароль);
RS.УстБД(ODBCD);
СписокСКЛ = СоздатьОбъект("СписокЗначений");
Мета = глСоздатьОбъект("MetaDataWork", ОЛЕ); // MetaDataWork в базе ОЛЕ
СпрОЛЕ = глСоздатьОбъект("Справочник." + ВидСпр, ОЛЕ); //справочник ОЛЕ
Для К = 1 По СписокФормы.РазмерСписка() Цикл
Эл = СписокФормы.ПолучитьЗначение(К);
Если СпрОЛЕ.НайтиПоКоду(Эл.Код, 0) = 1 Тогда
Объект = Мета.ЗначениеВДлиннуюСтрокуБД(СпрОЛЕ); // ЗначениеВСтрокуБД
СписокСКЛ.ДобавитьЗначение(Объект);
КонецЕсли;
КонецЦикла;
...
ТекстЗапроса = ТекстЗапроса + "
|AND ($ПоследнееЗначение.Сотрудники." + РеквСпр + "(Сотрудники.ID, :ВыбДата) IN (SEL ECT Val FR OM #" + ИмяСКЛ + "))
|";
RS.УложитьСписокОбъектов(СписокСКЛ, "#" + ИмяСКЛ, ВидСпр); //УложитьСписокОбъектов13
Показать
В СписокСКЛ добавлял ID ЗначениеВСтрокуБД (9 знаков) и ЗначениеВДлиннуюСтрокуБД (13 знаков)
В запрос список передавал методом УложитьСписокОбъектов13 и УложитьСписокОбъектов (с указанием вида справочника и без указания)
В запрос список передавал методом УложитьСписокОбъектов13 и УложитьСписокОбъектов (с указанием вида справочника и без указания)
(14) вы наверно про такую конструкцию?
ТекстЗапроса = ТекстЗапроса + "AND (LTRIM(RTRIM(Департаменты.CODE)) IN ('"+ глСписокВСтрокуДляSQL(СписокОтбор) + "'))
где СписокОтбор содержит коды департаментов, но хотелось бы передавать именно ID департаментов ОЛЕ базы
ТекстЗапроса = ТекстЗапроса + "AND (LTRIM(RTRIM(Департаменты.CODE)) IN ('"+ глСписокВСтрокуДляSQL(СписокОтбор) + "'))
где СписокОтбор содержит коды департаментов, но хотелось бы передавать именно ID департаментов ОЛЕ базы
(17)так я в список значений пихаю ID элементов ОЛЕ базы
СписокСКЛ = СоздатьОбъект("СписокЗначений");
Мета = ОЛЕ.CreateTable("MetaDataWork")
СпрОЛЕ = ОЛЕ.CreateTable("Справочник." + ВидСпр)
Для К = 1 По СписокФормы.РазмерСписка() Цикл //в СписокФормы выбраны элементы текущей базы
Эл = СписокФормы.ПолучитьЗначение(К);
Если СпрОЛЕ.НайтиПоКоду(Эл.Код, 0) = 1 Тогда
ИД_в_базе_ОЛЕ = Мета.ЗначениеВСтрокуБД(СпрОЛЕ.ТекущийЭлемент()); //9 символов, " 31 "
СписокСКЛ.ДобавитьЗначение(ИД_в_базе_ОЛЕ);
КонецЕсли;
КонецЦикла;
Показать
в списокСКЛ ID элементов из базы ОЛЕ
Такая конструкция (пример для перечисления) работает
Такая конструкция (пример для перечисления) работает
Объект =Мета.ЗначениеВСтрокуБД(ОЛЕ.Перечисление.ПолучитьАтрибут(Эл.Вид()).ЗначениеПоИдентификатору(Эл.Идентификатор()));
СписокСКЛ.ДобавитьЗначение(Объект);
....
ТекстЗапроса = ТекстЗапроса + "
|AND $ПоследнееЗначение.Сотрудники." + РеквСпр + "(Сотрудники.ID, :ВыбДата) IN ('"+ глСписокВСтрокуДляSQL(СписокСКЛ) + "')
|";
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот