Имя: Пароль:
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

и еще куча разных вариантов, все время ошибка, то на дефис ругается, то сервер не определен
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn