Имя: Пароль:
1C
1C 7.7
v7: SQL запрос
,
0 kupec
 
14.12.12
14:44
Здравствуйте! Подскажите пожалуйста по поводу SQL запроса, сам не разу с этим не сталкивался!
Есть база1 и база2, база1 на SQL, база2 на DBF, как с помощью SQL запроса из базы2 обратиться к SQL серверу чтобы вытащить значение конкретного реквизита конкретного справочника базы1
1 DrunkAnimal
 
14.12.12
14:46
1cpp.ru
2 kupec
 
14.12.12
14:48
(1) а пример самого простого кода можно?
3 Mikeware
 
14.12.12
14:50
[ИмяБазы].[ИмяВладельца].ИмяТаблицы
4 Wobland
 
14.12.12
14:50
Состояние("Соединение с центральной БД");
   ЦБ=СоздатьОбъект("ODBCDatabase");    
   ЦБ.Соединение(СокрЛП(Константа.СтрокаПодключенияЦБ));
   Если ЦБ.ЕстьСоединение()<>1 Тогда
       Предупреждение("Ошибка подключения к ЦБ");
       Возврат;
   КонецЕсли;
   /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   Результат=СоздатьОбъект("ТаблицаЗначений");
   Запрос=СоздатьОбъект("ODBCRecordSet");
   Запрос.УстБД(ЦБ);
   ТекстЗапроса=
   "select

   Запрос.УстановитьТекстовыйПараметр("Фирма", ОтборПоФирме);
   Запрос.ВыполнитьИнструкцию(ТекстЗапроса, Результат);
5 kupec
 
14.12.12
14:53
(4) что такое СокрЛП(Константа.СтрокаПодключенияЦБ)
6 Mikeware
 
14.12.12
14:54
(5) см (1)
7 Wobland
 
14.12.12
14:55
(5) строка
8 kupec
 
14.12.12
14:56
(6) я понимаю что все везде можно посмотреть но может быть подскажете
9 viktor_vv
 
14.12.12
14:58
(5) Ты бы пока не заморачивался с разными базами, получи сначала прямым запросом, то что тебе надо, в родной базе скульной.
Потом уже переходи как получить то же самое из другой базы.
10 Ёпрст
 
14.12.12
14:58
11 Wobland
 
14.12.12
14:59
(9) держи, болезный

Соединение(<?>)
Синтаксис:
Соединение(<СтрокаСоединения>)
Назначение:
присоединиться по указанному DSN к источнику. В случае успеха возвращает 1, иначе 0.
Возвращаемое значение:
(Число)  В случае успеха возвращает 1, иначе 0.
Параметры:
<СтрокаСоединения> - (Строка)  connection-string ::= empty-string[;] | attribute[;] | attribute; connection-string
empty-string ::=
attribute ::= attribute-keyword=attribute-value | DRIVER=[{]attribute-value[}]
attribute-keyword ::= DSN | UID | PWD
        | driver-defined-attribute-keyword
attribute-value ::= character-string
driver-defined-attribute-keyword ::= identifier
Где:
DSN - имя источника. (необязателен, по умолчанию DSN=Default)
FILEDSN - имя файла *.dsn с описание параметров соединения (необязателен)
DRIVER - имя драйвера соединения. (необязателен, по умолчанию значение атрибута берется  из настроек DSN)
UID - имя пользователя
PWD - пароль пользователя
Пример: db.DriverConnect(DSN=pubs; DRIVER=SQL Server; UID=sa; PWD=1234;);
12 Ёпрст
 
14.12.12
14:59
(9) да разницы то никакой нет, за исключением типизации
13 viktor_vv
 
14.12.12
15:01
(12) Согласен, но ему-то сначала просто потренироваться со скулем, а он сейчас упреться в методику подключения.
А глянув на (11) может и поплохеть :).
14 Irek-kazan
 
14.12.12
15:02
на как пример из экселя
Set @sql = 'INSERT INTO ds(NumDS, DateDS,gmDS,rsDS,dvigDS,nazn,accDS,s1,s2,s3,sumDS,pldocDS,podrDS,stDS,objDS,otchetDS,vidDS)
       SELECT * FROM OPENDATASOURCE(''Microsoft.Jet.OLEDB.4.0'',''Data Source=C:\1С_обмен\'+ @fname + ';Extended Properties=EXCEL 5.0'')...[Sheet1$]'
   Exec (@sql)
15 Irek-kazan
 
14.12.12
15:04
+ (14) OPENDATASOURCE глянь в инете какие параметры для DBF
16 kupec
 
14.12.12
15:05
(13) ПОПЛОХЕЛО...
17 Wobland
 
14.12.12
15:07
(15) это был контрольный в голову?
18 Irek-kazan
 
14.12.12
15:12
(17) да нет, пинок под зад, чтобы шел учить мат.часть. У меня еще в запасе есть загрузка в скуль из папки всех файлов в разные таблицы
19 kupec
 
14.12.12
15:16
ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"1cpp\1CPP.dll");
   Состояние("Соединение с центральной БД");
   ЦБ=СоздатьОбъект("ODBCDatabase");    
   ЦБ.Соединение("DSN=имясервера; DRIVER=SQL Server; UID=имяпользователя; PWD=пароль");

правильно или нет?
20 kupec
 
14.12.12
15:17
сам понял что нет...курю дальше
21 viktor_vv
 
14.12.12
15:25
Вариант помедленнее, но не такой страшный.

//*******************************************
Процедура Сформировать()

   БазаДляПодключения = СоздатьОбъект("ODBCDataBase");
   
   КаталогБазы = СокрЛП(фасНаправление.КаталогБазы) ;
   Логин = СокрЛП(фасНаправление.Логин) ;
   Пароль = СокрЛП(фасНаправление.Пароль) ;
   
   БазаДляПодключения.ПрисоединитьИБ(КаталогБазы+"\",Логин,Пароль);
   
   мЗапросСКЛ = СоздатьОбъект("ODBCRecordSet");
   мЗапросСКЛ.УстБД(БазаДляПодключения) ;    
   
   ТекстЗапроса = "
   |Select
   |    СпрТМЦ.Code as Код,
   |    СпрТМЦ.Descr as Наименование
   |From
   |    $Справочник.ТМЦ as СпрТМЦ
   |Where
   |    СпрТМЦ.Code = '20836'
   |";
   
   ТЗ = мЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса);
   
   ТЗ.ВыбратьСтроку();
КонецПроцедуры

Процедура ПриОткрытии()
   Попытка
       ЗагрузитьВнешнююКомпоненту("1cpp.dll"); // КаталогИБ()+
   Исключение
       Предупреждение("Не смогли загрузить внешние библиотеки !!!");
       СтатусВозврата(0);
       Возврат ;
   КонецПопытки;    
   
КонецПроцедуры
22 kupec
 
14.12.12
15:27
(21) спасибо
23 kupec
 
14.12.12
15:28
ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"1cpp\1CPP.dll");
   Состояние("Соединение с центральной БД");
   ЦБ=СоздатьОбъект("ODBCDatabase");    
   ЦБ.Соединение("DRIVER=SQL Server;Server=мойсервер;Database=моябаза;User Id=sa;Password=мойпароль");
   Если ЦБ.ЕстьСоединение()<>1 Тогда
       Сообщить(ЦБ.ПолучитьОписаниеОшибки());
       Предупреждение("Ошибка подключения к ЦБ");
       Возврат;
   КонецЕсли;

а вот так правильно
24 kupec
 
14.12.12
15:32
(21) а вот это от куда брать СпрТМЦ
25 Ёпрст
 
14.12.12
15:35
на вот тебе примерчик запроса одновременно к обоим базам с использованием метапарсера.


Процедура Сформировать()
   
   
   рс=создатьОбъект("ODBCRecordSet");

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

КонецПроцедуры
26 viktor_vv
 
14.12.12
15:36
(24) Отсюда

|From
|    $Справочник.ТМЦ as СпрТМЦ
27 Serginio1
 
14.12.12
15:42
(25) Оооо. Не знал. Спасибо.
28 Ёпрст
 
14.12.12
15:53
ну там юнион нужен, ну это так, для примеру
29 kupec
 
14.12.12
15:57
ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"1cpp\1CPP.dll");
   Состояние("Соединение с центральной БД");
   ЦБ=СоздатьОбъект("ODBCDatabase");    
   ЦБ.Соединение("DRIVER=SQL Server;Server=мойсервер;User Id=sa;Password=мойпароль");
   Если ЦБ.ЕстьСоединение()<>1 Тогда
       Сообщить(ЦБ.ПолучитьОписаниеОшибки());
       Предупреждение("Ошибка подключения к ЦБ");
       Возврат;
   КонецЕсли;                                                                      
   БазаДляПодключения = СоздатьОбъект("ODBCDataBase");
   БазаДляПодключения.ПрисоединитьИБ("\\ohrana\kupec\");
   мЗапросСКЛ = СоздатьОбъект("ODBCRecordSet");
   мЗапросСКЛ.УстБД(БазаДляПодключения) ;    
   ТекстЗапроса = "
   |Select
   |    СпрТМЦ.Code as Код,
   |    СпрТМЦ.Descr as Наименование
   |From
   |    $Справочник.Покупатели as СпрТМЦ
   |Where
   |    СпрТМЦ.Code = '3658'
   |";
   
   ТЗ = мЗапросСКЛ.ВыполнитьИнструкцию(ТекстЗапроса);
   ТЗ.ВыбратьСтроку();



вот так правильно?? или что то лучше подправить
30 kupec
 
14.12.12
16:16
я кажись вкурил....спасибо ребята !!! :-)