Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Доброго дня всем.
Пытаюсь достучаться к БД 1С через СОМ обьекты.
Делаю:
DECLARE @object int
DECLARE @hr int
DECLARE @src varchar(255), @desc varchar(255)
EXEC @hr = sp_OACreate 'V81.ComConnector', @object OUT
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT 
   raiserror('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc)
    RETURN
END
Обьект создается, но когда делаю соединение с базой:
EXEC @hr = sp_OAMethod @object, 'Connect(''srvr:=''Server1'''')'  
IF @hr <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT 
   raiserror('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc)
    RETURN
END

получаю ошибку:
Error Creating COM Component 0x80020006, ODSOLE Extended Procedure,  Неизвестное имя.
Не подскажите, где я допускаю ошибку? Синтаксис неправильный или мож еще что. Скрипт запускается на сервере, где крутится 1C.
Спасибо
10 июн 10, 10:15    [8921002]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
aleks2
Guest
kirser,

1.
>>где крутится 1C
Чо именно крутится? Ибо COM = клиентский комп.

2. Попрактикуйтесь на кошках.
VBS или VBA

dim c as object
set c=CreateObject('V81.ComConnector')

чо скажет?
10 июн 10, 10:33    [8921193]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Dim trade As Object
Dim Connection As Object
Dim ResultTable As Object

Set trade = CreateObject("V81.ComConnector")
Set Connection = trade.Connect("srvr=""Server1""; ref=""BD1""; usr=""User1""; pwd=""passw""")
Set ResultTable = Connection.GetMyFync("01.01.2010 00:00:0000", "31.05.2010 00:00:0000")
Этот скрипт через макрос на выполняемой машине отрабатывает без ошибок

Сам метод Create выполняется и через SQL, ошибка происходит на
EXEC @hr = sp_OAMethod @object, 'Connect(''srvr:=''Server1'''')'  
10 июн 10, 10:38    [8921252]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
valex13
Member

Откуда: Иркутск
Сообщений: 346
Вызов метода не верен. Параметры нужно передавать по другому. Вот пример (для 8-ки):

Declare @iResult as int,
		@OLEObject as int,
		@OLEObject1 as int

DECLARE @src varchar(255), @desc varchar(255)

EXEC @iResult = sp_OACreate 'v8.ComConnector', @OLEObject OUT
IF @iResult <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @OLEObject, @src OUT, @desc OUT 
   raiserror('Error Creating COM Component 0x%x, %s, %s',16,1, @iResult, @src, @desc)
    RETURN
END


EXEC @iResult = sp_OAMethod @OLEObject, 'Connect',@OLEObject1 OUT, 'Srvr="ASU-MAIN";Ref="HotBilling_chang1";usr="test";pwd=""'
IF @iResult <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @OLEObject, @src OUT, @desc OUT 
   raiserror('Error Creating COM Component 0x%x, %s, %s',16,1, @iResult, @src, @desc)
    RETURN
END

-- Запускаем метод
Declare @cResult as varchar(1024)

EXEC @iResult = sp_OAMethod @OLEObject1, 'Справочники.общДоговора.НайтиПоКоду(171).Наименование',@cResult OUT
IF @iResult <> 0
BEGIN
   EXEC sp_OAGetErrorInfo @OLEObject1, @src OUT, @desc OUT 
   raiserror('Ошибка при вополнении внешней процедуры/функции 0x%x, %s, %s',16,1, @iResult, @src, @desc)
    RETURN
END

Select @cResult
10 июн 10, 10:55    [8921440]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Огромное спасибо, получилось. Осталось самое главное: запустить функцию 1С и получить строки
Не поможете?

К примеру, у меня там есть самописная функция
Через VBA я ее запускаю так:
Connection.GetMyFync("01.01.2010 00:00:0000", "31.05.2010 00:00:0000")

Как мне это реализовать в моем слачае? И получить рез-т в виде выборки
10 июн 10, 11:07    [8921556]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1052
kirser,
Имхо

Зачем создавать такие тяжелые и стремные объекты на серверной стороне? Лучше пересмотреть логику программы и перенести вызовы на клиента. Или осуществлять доступ к к таблицам БД1С напрямую.
Структура таблиц БД 1С
10 июн 10, 11:08    [8921560]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Задача такова, чтобы получать выборку из SQL скрипта.
Сейчас не могу спорить, что было бы лучше.
10 июн 10, 11:10    [8921589]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
valex13,

если можете, скиньте пример запуска процедуры 1с с параметрами, через OAMethod
10 июн 10, 11:12    [8921606]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1052
kirser
Задача такова, чтобы получать выборку из SQL скрипта.
Сейчас не могу спорить, что было бы лучше.


Если выборка из SQL скрипта, то причем здесь V81.ComConnector?
10 июн 10, 11:12    [8921612]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
VladimirKr,

через соединение V81.ComConnector стучусь к 1С, вызываю ее функцию, и хочу получить ее результаты - набор строк с данными
10 июн 10, 11:14    [8921636]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1052
kirser
VladimirKr,

через соединение V81.ComConnector стучусь к 1С, вызываю ее функцию, и хочу получить ее результаты - набор строк с данными


Всякие наборы строк в 1С это тоже COM-объекты. Замучаетесь на T-SQL все это оформлять.
10 июн 10, 11:22    [8921739]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
valex13
Member

Откуда: Иркутск
Сообщений: 346
"Всякие наборы строк в 1С это тоже COM-объекты. Замучаетесь на T-SQL все это оформлять."
- это именног так, т.к. в SQL вы сможете работать только с простыми типами. Для начала дайте сообществу код вашей функции.
10 июн 10, 11:25    [8921783]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
VladimirKr
kirser
VladimirKr,

через соединение V81.ComConnector стучусь к 1С, вызываю ее функцию, и хочу получить ее результаты - набор строк с данными


Всякие наборы строк в 1С это тоже COM-объекты. Замучаетесь на T-SQL все это оформлять.


Все равно надо делать, расскажете как? Ксли можно, с примерами кода.
У меня на данный момент получилось запустить функцию, но как вернуть разультат не понимаю пока.
Сделала так :
set @str = 'GetMyFunc("01.01.2010 00:00:0000", "31.05.2010 00:00:0000")'

EXEC @hr= master.dbo.sp_OAMethod @Object1, @str , @Object2 OUT 
IF @hr <> 0
BEGIN
   EXEC master.dbo.sp_OAGetErrorInfo @object, @src OUT, @desc OUT 
   raiserror('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc)
    RETURN
END

SELECT @Object2
Но я в результате получаю целочисленное значение, а необходимо результат функции
10 июн 10, 11:25    [8921789]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
valex13
Member

Откуда: Иркутск
Сообщений: 346
По идеи, так должно работать. Параметры в Вашу функцию передаются в OAMethod.

Declare @Object2  as varchar(1024)
set @str = 'GetMyFunc'
EXEC @hr= master.dbo.sp_OAMethod @Object1, @str , @Object2 OUT , '01.01.2010 :00:0000', '31.05.2010 00:00:0000'

IF @hr <> 0
BEGIN
   EXEC master.dbo.sp_OAGetErrorInfo @object, @src OUT, @desc OUT 
   raiserror('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc)
    RETURN
END

SELECT @Object2
Но лучше все таки показать код функции 'GetMyFunc'
10 июн 10, 11:37    [8921955]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
valex13
"Всякие наборы строк в 1С это тоже COM-объекты. Замучаетесь на T-SQL все это оформлять."
- это именног так, т.к. в SQL вы сможете работать только с простыми типами. Для начала дайте сообществу код вашей функции.

Не знаю, получится ли достать ее код. Попробуюю
А что именно надо знать о функции?
Набор и типы возвращаемых полей? Или все более серьезно?
Как вообще, зная код обьекта получить значение поля в моем случае?
10 июн 10, 11:38    [8921959]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1052
kirser
Но я в результате получаю целочисленное значение, а необходимо результат функции


Это целочисленное значение и есть ссылка на объект "набор строк". Видимо это 1С ТаблицаЗначений. И пошло поехало. Потом понадобится объект СтрокаТаблицыЗначений, универсальная коллекция и т.п.

А всего-то. Осуществить вызов на клиенте, записать результат во временную таблицу и делать с ней на сервере все что угодно.
10 июн 10, 11:40    [8922005]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
valex13
Member

Откуда: Иркутск
Сообщений: 346
"А что именно надо знать о функции?
Набор и типы возвращаемых полей? Или все более серьезно?"
Конечно нужно знать что возвращает функция.
Например: Если вынкция состоит из элементарного выполнения запроса в среде 1С, то возможно с помощью профайлера поглядеть код SQL запроса и его проиграть, а не городить огород.
10 июн 10, 11:41    [8922006]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
valex13
По идеи, так должно работать. Параметры в Вашу функцию передаются в OAMethod.

Declare @Object2  as varchar(1024)
set @str = 'GetMyFunc'
EXEC @hr= master.dbo.sp_OAMethod @Object1, @str , @Object2 OUT , '01.01.2010 :00:0000', '31.05.2010 00:00:0000'

IF @hr <> 0
BEGIN
   EXEC master.dbo.sp_OAGetErrorInfo @object, @src OUT, @desc OUT 
   raiserror('Error Creating COM Component 0x%x, %s, %s',16,1, @hr, @src, @desc)
    RETURN
END

SELECT @Object2
Но лучше все таки показать код функции 'GetMyFunc'


Ваш код возвращает ошибку :
Для выходных значений типа Object требуются выходные параметры типа int

Там скорее всего и нужно тип int ставить, тогда точно ошибку не получаю
10 июн 10, 11:43    [8922032]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
VladimirKr
kirser
Но я в результате получаю целочисленное значение, а необходимо результат функции


Это целочисленное значение и есть ссылка на объект "набор строк". Видимо это 1С ТаблицаЗначений. И пошло поехало. Потом понадобится объект СтрокаТаблицыЗначений, универсальная коллекция и т.п.

А всего-то. Осуществить вызов на клиенте, записать результат во временную таблицу и делать с ней на сервере все что угодно.


Подскажите пожалуйста, как в моем случае доступиться к необходимым данным.
Что нужно сделать?
Еще один обьект создавать?
Помогите, сам не справлюсь
10 июн 10, 11:45    [8922068]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
valex13
Member

Откуда: Иркутск
Сообщений: 346
Поэтому я и просил код Вашей таинственной функции :-)
10 июн 10, 11:46    [8922081]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
valex13
Поэтому я и просил код Вашей таинственной функции :-)

Через пол часика появится доступ к 1С конфигуратору, скину текст функции.
10 июн 10, 11:56    [8922207]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
kirser
valex13
Поэтому я и просил код Вашей таинственной функции :-)

Через пол часика появится доступ к 1С конфигуратору, скину текст функции.


Получил текст функции:
Функция GetSalaryInfo(Д1, Д2, ТипСотрудника = Неопределено, ИНН = Неопределено) Экспорт
	З = Новый Запрос;
	З.Текст = "ВЫБРАТЬ
	          |	ЗП.id_number,
	          |	ЗП.fio КАК fio,
	          |	ЗП.type_person,
	          |	МАКСИМУМ(ЗП.salary1) КАК salary1,
	          |	МАКСИМУМ(ЗП.salary2) КАК salary2,
	          |	МАКСИМУМ(РаботникиОрганизаций.Период) КАК d_dismissal,
	          |	МАКСИМУМ(ПлановыеНачисленияРаботниковОрганизаций.Период) КАК d_change
	          |ИЗ
	          |	(ВЫБРАТЬ
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.Физлицо.КодПоДРФО КАК id_number,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.Наименование КАК fio,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.ТипСотрудника.Код КАК type_person,
	          |		СУММА(ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Показатель1) КАК salary1,
	          |		0 КАК salary2
	          |	ИЗ
	          |		РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(
	          |				КОНЕЦПЕРИОДА(&ДатаНач, ДЕНЬ),
	          |				Сотрудник.ТипСотрудника В (&ТипыСотрудника)
	          |					И (Сотрудник.Физлицо.КодПоДРФО = &ИНН
	          |						ИЛИ &ИНН = НЕОПРЕДЕЛЕНО)) КАК ПлановыеНачисленияРаботниковОрганизацийСрезПоследних
	          |	ГДЕ
	          |		(ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.ВидРасчета В (&ВидыРасчета)
	          |				ИЛИ ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.УчетВМотивацию)
	          |	
	          |	СГРУППИРОВАТЬ ПО
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.Физлицо.КодПоДРФО,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.Наименование,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.ТипСотрудника.Код
	          |	
	          |	ОБЪЕДИНИТЬ ВСЕ
	          |	
	          |	ВЫБРАТЬ
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.Физлицо.КодПоДРФО,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.Наименование,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.ТипСотрудника.Код,
	          |		0,
	          |		СУММА(ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Показатель1)
	          |	ИЗ
	          |		РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(
	          |				КОНЕЦПЕРИОДА(&ДатаКон, ДЕНЬ),
	          |				Сотрудник.ТипСотрудника В (&ТипыСотрудника)
	          |					И (Сотрудник.Физлицо.КодПоДРФО = &ИНН
	          |						ИЛИ &ИНН = НЕОПРЕДЕЛЕНО)) КАК ПлановыеНачисленияРаботниковОрганизацийСрезПоследних
	          |	ГДЕ
	          |		(ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.ВидРасчета В (&ВидыРасчета)
	          |				ИЛИ ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.УчетВМотивацию)
	          |	
	          |	СГРУППИРОВАТЬ ПО
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.Физлицо.КодПоДРФО,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.Наименование,
	          |		ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.ТипСотрудника.Код) КАК ЗП
	          |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
	          |		ПО ЗП.Сотрудник = РаботникиОрганизаций.Сотрудник
	          |			И (РаботникиОрганизаций.Период МЕЖДУ &ДатаНач И &ДатаКон)
	          |			И (РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение))
	          |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций КАК ПлановыеНачисленияРаботниковОрганизаций
	          |		ПО ЗП.Сотрудник = ПлановыеНачисленияРаботниковОрганизаций.Сотрудник
	          |			И (ПлановыеНачисленияРаботниковОрганизаций.Период МЕЖДУ &ДатаНач И &ДатаКон)
	          |			И (ПлановыеНачисленияРаботниковОрганизаций.ВидРасчета В (&ВидыРасчетаИзменение))
	          |
	          |СГРУППИРОВАТЬ ПО
	          |	ЗП.id_number,
	          |	ЗП.fio,
	          |	ЗП.type_person
	          |
	          |УПОРЯДОЧИТЬ ПО
	          |	fio";
			  
	СпВидовРасчета = Новый СписокЗначений;         
	СпВидовРасчета.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОкладПоДням);
	СпВидовРасчета.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("00087"));
	
	СпВидовРасчетаИзменение = Новый СписокЗначений;         
	СпВидовРасчетаИзменение.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОкладПоДням);
	СпВидовРасчетаИзменение.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("00087"));
	СпВидовРасчетаИзменение.Добавить(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("00088"));
	
	СпТиповСотрудника = Новый СписокЗначений;
	Если ТипСотрудника = Неопределено Тогда
		Выборка = Справочники.ТипыСотрудников.Выбрать();
		Пока Выборка.Следующий() Цикл
			СпТиповСотрудника.Добавить(Выборка.Ссылка);
		КонецЦикла;
	Иначе
		СпТиповСотрудника.Добавить(Справочники.ТипыСотрудников.НайтиПоКоду(ТипСотрудника));
	КонецЕсли;
	
	З.УстановитьПараметр("ВидыРасчета", СпВидовРасчета);
	З.УстановитьПараметр("ВидыРасчетаИзменение", СпВидовРасчетаИзменение);
	З.УстановитьПараметр("ИНН", ИНН);
	З.УстановитьПараметр("ТипыСотрудника", СпТиповСотрудника);
	З.УстановитьПараметр("ДатаНач", Дата(Д1));
	З.УстановитьПараметр("ДатаКон", Дата(Д2));
	
	Возврат З.Выполнить().Выгрузить();
КонецФункции

10 июн 10, 12:37    [8922687]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
valex13
Member

Откуда: Иркутск
Сообщений: 346
Однозначно через COM соединение "глупо" пытаться данную функцию вызывать. Себе дороже. Как я и подозревал, в ней только запрос. Сделайте проще. Откройте Profiler. В качестве приложения установите фильтр "1СV81". Запустите 1С. Выполните вашу функцию и найдите SQL запрос. Он примерно выглядит так (только в разы больше):
exec sp_executesql N'SELECT
_Consts._Fld2220 f_1
FROM
_Consts WITH(NOLOCK)
WHERE
_Consts._RecordKey = @P1
SELECT @@TRANCOUNT', N'@P1 varbinary(1)', 0x31

Смело убираете @@TRANCOUNT и все запихивайте в свою хранимую процедуру. Параметры свои передавайте. Удачи :-)
10 июн 10, 12:45    [8922782]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
kirser
Member

Откуда: Киев
Сообщений: 225
Попробую.
А все же, ради спортивного интереса, как получить данные тем методом, что я использую?
Что надо еще сделать? Хоть вкратце опишите.
10 июн 10, 12:52    [8922876]     Ответить | Цитировать Сообщить модератору
 Re: V81.ComConnector  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1052
kirser,
Я бы такой запрос втечение 1-2 рабочих дней переписал на прямой доступ к таблицам 1С.
Акуратненько, View c вменяемыми названиями полей на каждую таблицу. Функции на Регистр.СрезПоследних, потом из всего этого собрать T-SQL запрос.
Можно и через профайлер, но блин, предсталяю, какой T-SQL код он выдаст...

Кстати, вы представляете, что ст ит за выражением, например
"ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник.Физлицо.КодПоДРФО"

Каждая часть составного имени будет переводиться в (select ... from ... where _IDRef=[предыдущееимя]). Где-то, кажется даже в ИТС, я видел статью "как писать эффективные запросы в 1С". Понятное дело, там рекомендуют избегать длинных имен, заменяя их полями из добавленных left join таблиц.
10 июн 10, 13:09    [8923088]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить