Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос 1с++ к сторонней базе
0 eshtrey
 
24.09.15
14:18
Из одной базы 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.ВыполнитьИнструкцию(ТекстЗапроса, Темп);

Как написать запрос для отбора сотрудников из другой базы? Департаменты совпадают по коду.
Спасибо
1 Boroda
 
24.09.15
14:38
Наверное, вместо RS.УстБД1С() использовать  RS.УстБД(НужнаяБаза)
2 eshtrey
 
24.09.15
14:43
это понятно
ODBCD = СоздатьОбъект("ODBCDataBase");
ODBCD.ПрисоединитьИБ(ПутьИмпортируемойБазы, глРобот, глРоботПароль);
RS = СоздатьОбъект("ODBCRecordset");
RS.УстБД(ODBCD);

а условие отбора такое же использовать? элементы в списке от текущей базы.
3 Ёпрст
 
24.09.15
14:53
Если базы не нв одном серваке, то прилинковать сервак , потом писать простой запрос, обрящаясь одновременно к табличкам разных баз в одном запросе.
4 Ёпрст
 
24.09.15
14:53
усё
5 Ёпрст
 
24.09.15
14:53
если удаленная база не прямой потомок, в тексте запроса синхронизировать по какому-либо реквизиту, например, коду.
6 Boroda
 
24.09.15
14:59
ID департаментов в списке будут будут разные, следовательно так делать нельзя.
Сперва найти элементы с нужными кодами,затем  их в список.
7 sergeev-ag-1977
 
24.09.15
15:00
NOLOCK - жесть !!!
8 Ёпрст
 
24.09.15
15:01
(6) че ?
9 Ёпрст
 
24.09.15
15:01
(7) ?
10 Ёпрст
 
24.09.15
15:05
На вот, развлекайся

Процедура Сформировать()
    
    
    рс=создатьОбъект("ODBCRecordSet");
    
     ТекстЗапроса = "
    |SELECT
    |    СпрНаш.DESCR as КлиентосВЭтойбазе  -- наименование клиентоса в  этой базе
    |    ,Спр.DESCR as КлиентосВУдаленнойБазе --наименование клиентоса в удаленной базе
    |FROM $Справочник.Контрагенты СпрНаш (nolock)
    |left join dataBase2.dbo.@Справочник.Контрагенты Спр (nolock) on СпрНаш.Code = Спр.Code
    |";    
    глМД = СоздатьОбъект("MetaDataWork");
    ТекстЗапроса=глМД.ОбрМетаСКЛ(ТекстЗапроса);
    глМД2 = СоздатьОбъект("MetaDataWork");
    ПутьКБазе2 = "D:\полный путьк базе данных\";
    глМД2.ПрисоединитьМД(ПутьКБазе2+"1Cv7.md");
    ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"@","$");
    ТекстЗапроса=глМД2.ОбрМетаСКЛ(ТекстЗапроса);
    
    Т = рс.ВыполнитьИнструкцию(ТекстЗапроса);
    Т.ВыбратьСтроку();

КонецПроцедуры
11 eshtrey
 
24.09.15
15:12
спасибо
12 eshtrey
 
07.10.15
15:52
(3)как прилинковать сервер?
13 eshtrey
 
08.10.15
10:49
Делал так
RS = СоздатьОбъект("ODBCRecordSet");
RS.УстБД1С();
ТекстЗапроса = "
|EXEC sp_addlinkedserver
|    server     = 'serv-1c-buh\BUH'
RS.ВыполнитьСкалярный(ТекстЗапроса);
и так |    server     = 'serv-1c-buh'
и по IP
14 eshtrey
 
08.10.15
10:52
в запросе ко второму серверу
LEFT JOIN serv-1c-buh.BUH.dbo.@Справочник.Контрагенты СпрКонтрБУ on СпрКонтрУУ.Code = СпрКонтрБУ.Code

и так BUH.dbo.@Справочник.Контрагенты СпрКонтрБУ on СпрКонтрУУ.Code = СпрКонтрБУ.Code

и еще куча разных вариантов, все время ошибка, то на дефис ругается, то сервер не определен
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.