powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / [игнор отключен] [закрыт для гостей] / Выпольнить запрос SQL из 1С
25 сообщений из 78, страница 2 из 4
Выпольнить запрос SQL из 1С
    #35873973
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю вывод что параметры просто не передаются для моего запроса, т.к. таблица есть а данных нет.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873977
semyons
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Параметры в запросе вроде указываются как :param, а не как @param. Соответственно, при создании параметра нужно указывать его имя "param".
Не знаю, можно ли в MS SQL использовать неименованные параметры, а в Oracle можно указать вместо имени параметра "?"
И добавлять параметры в том порядке, как они следуют в запросе
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874090
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
semyonsПараметры в запросе вроде указываются как :param, а не как @param. Соответственно, при создании параметра нужно указывать его имя "param".
Не знаю, можно ли в MS SQL использовать неименованные параметры, а в Oracle можно указать вместо имени параметра "?"
И добавлять параметры в том порядке, как они следуют в запросе

Похоже действительно запрос должен выглядеть вот так:
select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы
where Линия = :n and ДатаПриход between :ДатаПриходаС and :ДатаПриходаПо

Т.е. параметры должны идти не через @ а через :
После выполнения запроса в таком виде, начало ругаться на неизвестный параметр.
Вот как теперь мои параметры туда передать .....

Народ помогите пожалуйста, вижу что осталось чуть чуть до решения.
Вот вся функция:

Функция ЗапросSQL (SQLServer,Login,Password,ТекстSQL) //Функция выборки данных из SQL сервера и передача во временную таблицу 1С

СтрокаСоединения = ("Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer +
(";UID=") + Login + ("; PWD=") + Password + (";");

Подключение = Новый ComObject("ADODB.Connection");
Подключение.ConnectionString=СтрокаСоединения;
Попытка
Подключение.Open(СтрокаСоединения);
Состояние ("Подключение к серверу SQL...");
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;

СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.NamedParameters = Истина;
СоединениеSQL.CommandText = ТекстSQL;
СоединениеSQL.CommandType = 1;
//СоединениеSQL.Prepared = Истина;

Param1 = СоединениеSQL.CreateParameter("n",3,1,1,1);
СоединениеSQL.Parameters.Append(Param1);

Param2 = СоединениеSQL.CreateParameter("ДатаПриходаС",200,1,8,Формат(НачалоПериода,"ДФ=ггггММдд"));//Формат(НачалоПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param2);

Param3 = СоединениеSQL.CreateParameter("ДатаПриходаПо",200,1,8,Формат(КонецПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param3);
//Сообщить (Param3.Value);

Состояние ("Выполнение запроса SQL...");
ЗаписиSQL = Новый ComObject("ADODB.RecordSet");

ЗаписиSQL = СоединениеSQL.Execute();

Таблица = Новый ТаблицаЗначений;
Состояние ("Заполнение временной таблицы...");
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл //Создание и добавление колонок во временную таблицу
ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name;
Таблица.Колонки.Добавить(ИмяСтолбца);
Сообщить(ИмяСтолбца);
КонецЦикла;

Сообщить (ЗаписиSQL.EOF);

Пока ЗаписиSQL.EOF = 0 Цикл // Заполнение созданной таблицы

НоваяСтрока = Таблица.Добавить();
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл
НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
КонецЦикла;

ЗаписиSQL.MoveNext();

КонецЦикла;

Состояние ("Закрываем соединение с SQL...");
ЗаписиSQL.Close();
Подключение.Close();

Возврат Таблица; // Возврат таблицы значений запроса SQL
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874117
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СоединениеSQL.Parameters.Count говорит что параметров 0. (((
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874258
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уфф... Вот так должно получиться - я проверял:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.CommandText = "sp_executesql"
СоединениеSQL.CommandType =  4 ;
ТекстЗапроса="select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы 
where Линия = @n and ДатаПриход between @ДатаПриходаС and @ДатаПриходаПо"
ПараметыЗапроса="@n int,@ДатаПриходаС datetime,@ДатаПриходаПо datetime"

ParamSqlText=СоединениеSQL.CreateParameter(, 130 , 1 , 5000 ,ТекстЗапроса)
СоединениеSQL.Parameters.Append(ParamSqlText);

ParamParamText=СоединениеSQL.CreateParameter(, 130 , 1 , 5000 ,ПараметыЗапроса)
СоединениеSQL.Parameters.Append(ParamParamText);

Param1 = СоединениеSQL.CreateParameter("@n", 3 , 1 , 1 , 1 );
СоединениеSQL.Parameters.Append(Param1);

Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС", 200 , 1 , 8 ,Формат(НачалоПериода,"ДФ=ггггММдд"));//Формат(НачалоПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param2);

Param3 = СоединениеSQL.CreateParameter("@ДатаПриходаПо", 200 , 1 , 8 ,Формат(КонецПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param3);

Оригинальный текст моей программы VBA Accces:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  Dim cmd As ADODB.Command
  Dim Rs As ADODB.Recordset
  Dim CmdStr As String
  Dim CmdPar As String
  Set cmd = New ADODB.Command
  Set cmd.ActiveConnection = CurrentProject.Connection
  cmd.CommandText = "sp_executesql"
  cmd.Prepared = True
  cmd.CommandType =  4 
  CmdStr = "select * from dbo.Журнал where Дата between @D1 and @D2"
  CmdPar = "@D1 datetime,@D2 datetime"
  cmd.Parameters.Append cmd.CreateParameter(, adWChar, adParamInput,  5000 , CmdStr)
  cmd.Parameters.Append cmd.CreateParameter(, adWChar, adParamInput,  5000 , CmdPar)
  cmd.Parameters.Append cmd.CreateParameter("@D1", adChar, adParamInput,  8 , "20070101")
  cmd.Parameters.Append cmd.CreateParameter("@D2", adChar, adParamInput,  8 , "20070101")
  Set Rs = cmd.Execute
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874285
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, не досмотрел - чего это у вас у типа int длина 1?
Param1 = СоединениеSQL.CreateParameter("@n",3,1, 4 ,1);
СоединениеSQL.Parameters.Append(Param1);
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874329
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladimirKrУфф... Вот так должно получиться - я проверял:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.CommandText = "sp_executesql"
СоединениеSQL.CommandType =  4 ;
ТекстЗапроса="select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы 
where Линия = @n and ДатаПриход between @ДатаПриходаС and @ДатаПриходаПо"
ПараметыЗапроса="@n int,@ДатаПриходаС datetime,@ДатаПриходаПо datetime"

ParamSqlText=СоединениеSQL.CreateParameter(, 130 , 1 , 5000 ,ТекстЗапроса)
СоединениеSQL.Parameters.Append(ParamSqlText);

ParamParamText=СоединениеSQL.CreateParameter(, 130 , 1 , 5000 ,ПараметыЗапроса)
СоединениеSQL.Parameters.Append(ParamParamText);

Param1 = СоединениеSQL.CreateParameter("@n", 3 , 1 , 1 , 1 );
СоединениеSQL.Parameters.Append(Param1);

Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС", 200 , 1 , 8 ,Формат(НачалоПериода,"ДФ=ггггММдд"));//Формат(НачалоПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param2);

Param3 = СоединениеSQL.CreateParameter("@ДатаПриходаПо", 200 , 1 , 8 ,Формат(КонецПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param3);

Оригинальный текст моей программы VBA Accces:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  Dim cmd As ADODB.Command
  Dim Rs As ADODB.Recordset
  Dim CmdStr As String
  Dim CmdPar As String
  Set cmd = New ADODB.Command
  Set cmd.ActiveConnection = CurrentProject.Connection
  cmd.CommandText = "sp_executesql"
  cmd.Prepared = True
  cmd.CommandType =  4 
  CmdStr = "select * from dbo.Журнал where Дата between @D1 and @D2"
  CmdPar = "@D1 datetime,@D2 datetime"
  cmd.Parameters.Append cmd.CreateParameter(, adWChar, adParamInput,  5000 , CmdStr)
  cmd.Parameters.Append cmd.CreateParameter(, adWChar, adParamInput,  5000 , CmdPar)
  cmd.Parameters.Append cmd.CreateParameter("@D1", adChar, adParamInput,  8 , "20070101")
  cmd.Parameters.Append cmd.CreateParameter("@D2", adChar, adParamInput,  8 , "20070101")
  Set Rs = cmd.Execute


Да действительно работает ...
Уважаемый подскажите пожалуйста почему Вы
ТекстЗапроса="select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы
where Линия = @n and ДатаПриход between @ДатаПриходаС and @ДатаПриходаПо"
ПараметыЗапроса="@n int,@ДатаПриходаС datetime,@ДатаПриходаПо datetime"

ParamSqlText=СоединениеSQL.CreateParameter(,130,1,5000,ТекстЗапроса)
СоединениеSQL.Parameters.Append(ParamSqlText);

ParamParamText=СоединениеSQL.CreateParameter(,130,1,5000,ПараметыЗапроса)
СоединениеSQL.Parameters.Append(ParamParamText);

Добавили в параметры.
Я пол инета перерыл нигде такого не встречал, и в описании нигде нет, если у Вас есть инфа по этому поводу поделитесь пожалуйста.

За запрос огромное спасибо.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874360
semyons
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык он использует выполнение хранимой процедуры sp_executesql, в параметры которой передаются текст запроса, список параметров и параметры.
Эта хранимка возвращает набор записей.
Кстати, не пробывали в CommandType передавать 2 вместо 1?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874362
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что исследование профайлером показало, что выполнить запрос напрямую с передачей параметров через ADO не получается. Но есть хранимая процедура sp_executesql (См. БОЛ на соседнем форуме). Эта хранимая процедура выполняет tsql текст с параметрами, имея первым параметром строку с tsql текстом,
вторым параметром - строку описания параметров, используемых в тексте, и далее параметры для строки sql-текста. Этакий аналог временной хранимой процедуры.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874372
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ огромное спасибо.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874381
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semyons... Кстати, не пробывали в CommandType передавать 2 вместо 1?
Не прокатит. 2 - Это же чтение таблицы напрямую (ADО просто подставит select * from ) к началу текста запроса и попробует выполнить - ну и получит ошибку.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35875972
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.
Хочу продолжить данную тему ибо опять наткнулся на проблему.
Предыдущий запрос был тестовым, а вот с настоящим:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
if object_id('tempdb..#temp_НомераПриходов') >  0  drop table #temp_НомераПриходов
create table #temp_НомераПриходов (Приход int)

-- выбираем во временную таблицу номера приходов,
-- которые в дальнейшем будем выгружать в 1С
insert into #temp_НомераПриходов (Приход)
select Приход from ankStr..Приходы where 
                        Поставщик = @Поставщик 
                        -- приход от стороннего поставщика
                        and Линия =  1 
                        and ДатаПриход between @ДатаПриходС and @ДатаПриходПо
                        order by Приход

-- выводим шапки приходных накладных
select Приход, Поставщик, ИмяПоставщика, ПрихСумма, ПрихТара, ДатаПриход, РасхТран, РасхДоп, КодМаг, НомНакл, ДатаНакл, НомерСФ, ДатаСФ, НН, Примечание from ankStr..Приходы where Приход in (select * from #temp_НомераПриходов)

Как-то не сростается, моя ошибка в принципе по которому я запрашиваю данные, вот где не могу найти. 
 Спецы уделите мне пожалуйста чуть своего драгоценного времени и подскажите где я делаю не так.
В запросе есть  3  переменные:
@Поставщик int
@ДатаПриходС datetime
@ДатаПриходПо datetime

Я их добавил в Переменные запроса.

            order by Приход

-- выводим табличные части свернутые по ставке НДС
select Приход, sum(ФактШт) as ФактШт, sum(ФактШт*ЦенаПА) as Стоимость, НДС from ankStr..ТоварыПриходов where 
            Приход in (select * from #temp_НомераПриходов)
            -- не учитываем тару (информация о сумме тары идет в шапке приходной накладной)
            and ТараФл =  0 
            group by Приход, НДС
            order by Приход
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35875979
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На нижнюю часть сообщения не обращайте внимание, случайно попало ...
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876032
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

Если я правильно понял вы пытаетесь выполнить несколько команд tsql на одном вызове Execute(). АДО так не работает. Одна команда tsql - один execute. в вашем случае

Код: plaintext
1.
2.
3.
СоединениеSQL.Execute("if object_id... ");
СоединениеSQL.Execute("create table... ");
СоединениеSQL.Execute("insert into... ");
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876043
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще похоже что вам лучше обернуть все в хранимку, возващающей рекордсет. Тогда ваш первоначальный запрос сведется к "exec MyProc1 @in, @ДатаПриходаС, @ДатаПриходаПо";
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876068
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Т.е. в параметрах СоединениеSQL.Execute (""), мне нужно указать Код SQL моего запроса ?
Я вас правильно понял ?

2. А если у меня запросы связаны. Т.е. Результат 2го это данные 1го, а результат 3го это результат 2го.

Я сделаю так

СоединениеSQL.Execute(1й, запрос)
СоединениеSQL.Execute(2й, запрос)
СоединениеSQL.Execute(3й, запрос)

у меня будет результат 3го запроса ?

3. Если до select у меня есть код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
if object_id('tempdb..#temp_НомераПриходов') >  0  drop table #temp_НомераПриходов
						|create table #temp_НомераПриходов (Приход int)
                        |insert into #temp_НомераПриходов (Приход)
						|select Приход from ankStr..Приходы where 
                        |Поставщик = @Поставщик 
                        |and Линия = @Линия
                        |and ДатаПриход between @ДатаПриходС and @ДатаПриходПо
                        |order by Приход


Мой запрос отработает ?

Заранее спасибо.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876246
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда..
Я не разобравшись в предыдущем сообщении написал чушь...

Не могда бы мне кинуть кусок кода, как можно использовать хранимую процедуру ?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876604
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался, получилось вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
Функция ЗапросSQL (SQLServer,Login,Password,txtSQL)   //Функция выборки данных из SQL сервера и передача во временную таблицу 1С
	
	СтрокаСоединения = ("Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer + 
					(";UID=") + Login + ("; PWD=") + Password + (";");
		              
    Подключение = Новый ComObject("ADODB.Connection");
	Подключение.ConnectionString=СтрокаСоединения;
	// Подключение.Mode =  3 ;
		Попытка
			Подключение.Open(СтрокаСоединения);
			Состояние ("Подключение к серверу SQL...");
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат Ложь;
		КонецПопытки;
		
	
	СоединениеSQL = Новый COMObject("ADODB.Command");
	СоединениеSQL.ActiveConnection = Подключение;
	СоединениеSQL.CommandType =  4 ; 
	СоединениеSQL.NamedParameters = True;
	// СоединениеSQL.CommandText = ("sp_executesql");  	// Запуск для select 
	СоединениеSQL.CommandText = (txtSQL[ 0 ][ 0 ]);  		// Имя хранимой процедуры на сервере 	
		
	Для i =  1  По txtSQL.Количество()- 1  Цикл  			// Заполняем запрос SQL переменными
		//Сообщить (txtSQL[i][ 0 ]+" "+txtSQL[i][ 1 ]+ " "+ txtSQL[i][ 2 ]+" "+txtSQL[i][ 3 ]+ " "+ txtSQL[i][ 4 ]);  // Тестовая срока
		СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter(txtSQL[i][ 0 ],txtSQL[i][ 1 ],txtSQL[i][ 2 ],txtSQL[i][ 3 ],txtSQL[i][ 4 ])); 
	КонецЦикла;
		
	Состояние ("Выполнение запроса SQL...");
	ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
	ЗаписиSQL = СоединениеSQL.Execute();
				
	Таблица = Новый ТаблицаЗначений;
	Состояние ("Заполнение временной таблицы...");
	Состояние (ЗаписиSQL.Fields.Count);
	Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл 		//Создание и добавление колонок во временную таблицу
		ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; 
		Таблица.Колонки.Добавить(ИмяСтолбца);
		Сообщить(ИмяСтолбца);
	КонецЦикла;
	
	Сообщить (ЗаписиSQL.Fields.Count());
	Пока ЗаписиSQL.EOF[ 0 ] =  0  Цикл								// Заполнение созданной таблицы
		
		НоваяСтрока =  Таблица.Добавить();
		Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл
			НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
			Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
		КонецЦикла;
								
		ЗаписиSQL.MoveNext();
		
	КонецЦикла;
	
	Состояние ("Закрываем соединение с SQL...");
    ЗаписиSQL.Close();
	Подключение.Close();
	
	Возврат Таблица;   // Возврат таблицы значений запроса SQL
	
КонецФункции

Но наткнулся на след проблему.
Результат хранимой процедуры есть 2 таблицы.
На данный момент я вычитываю столбцы первой, но не могу прочитать данные
Т.е.
Код: plaintext
1.
Пока ЗаписиSQL.EOF[ 0 ] =  0  Цикл

Не отрабатывает.
Подскажите пожалуйста как правильно обращаться к результату запроса если запрос выдает несколько таблиц ?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876840
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ ну помогите кто нить.

Убрал из хранимой процедуры 2ю таблицу.

На выходе есть колонки но нет данных Recordset.
В SQL хранимка трабатывает с данными.

Где то я с RecordSet не докрутил....
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876961
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

Давайте так (если я ошибаюсь - поправьте). Вам надо в 1С получить некий набор данных, который суть импорт данных из другой системы. При этом набор данных полчуается не "прямой выборкой", а результат некоей обработки "первичных" данных по некоему алгоритму, который от структуры и значений данных, хранящихся в 1С, не зависят. Собственно вам тогда лучше сделать процедуру непосредственно на сервере (содержащую те самые create table, insert...into и результирующий select), которая подготавливает полностью данные в том виде, который требуется вам получить в 1С. Из 1Са вам достаточно будет вызвать эту процедуру с необходимымми параметрами. Весь код процедуры будет "внутри" сервера, и в 1С вам не надо будет заморачиваться с вызовом каждой команды через АДО. И код этой процедуры нет необходимости писать в 1С - для этого есть более эффективные инструменты.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877069
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже так и сделал.
Подключил свою обработку к хранимой процедуре на сервере. Т.е. кода SQL уже в 1С нет.
Смог подключится к серверу из хранимки мне сейчас в 1С передаются колонки моей выборки.
А данных (наполнения) нет.

Я делю вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
СтрокаСоединения = ("Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer + 
					(";UID=") + Login + ("; PWD=") + Password + (";");
		              
    Подключение = Новый ComObject("ADODB.Connection");
	Подключение.ConnectionString=СтрокаСоединения;
	// Подключение.Mode =  3 ;
		Попытка
			Подключение.Open(СтрокаСоединения);
			Состояние ("Подключение к серверу SQL...");
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат Ложь;
		КонецПопытки;
		
	
	СоединениеSQL = Новый COMObject("ADODB.Command");
	СоединениеSQL.ActiveConnection = Подключение;
	СоединениеSQL.CommandType =  4 ; 
	СоединениеSQL.NamedParameters = True;
	//СоединениеSQL.CommandText = ("sp_executesql");  	// Запуск для select 
	СоединениеSQL.CommandText = (txtSQL[ 0 ][ 0 ], @);  		// Имя хранимой процедуры на сервере 	
		
	Для i =  1  По txtSQL.Количество()- 1  Цикл  			// Заполняем запрос SQL переменными
		Сообщить (txtSQL[i][ 0 ]+" "+txtSQL[i][ 1 ]+ " "+ txtSQL[i][ 2 ]+" "+txtSQL[i][ 3 ]+ " "+ txtSQL[i][ 4 ]);  // Тестовая срока
		СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter(txtSQL[i][ 0 ],txtSQL[i][ 1 ],txtSQL[i][ 2 ],txtSQL[i][ 3 ],txtSQL[i][ 4 ])); 
	КонецЦикла;
		
	Состояние ("Выполнение запроса SQL...");
	
	ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
	
	ЗаписиSQL = СоединениеSQL.Execute();
	
				
	Таблица = Новый ТаблицаЗначений;
	Состояние ("Заполнение временной таблицы...");
		
	Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл 		//Создание и добавление колонок во временную таблицу
		ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; 
		Таблица.Колонки.Добавить(ИмяСтолбца);
		Сообщить(ИмяСтолбца);
	КонецЦикла;
		
	Пока ЗаписиSQL.EOF  =  0  Цикл								// Заполнение созданной таблицы
		
		НоваяСтрока =  Таблица.Добавить();
		Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл
			НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
			Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
		КонецЦикла;
								
		ЗаписиSQL.MoveNext();
		
	КонецЦикла;


Подскажите что я делаю не верно.

Как я понимаю нужно делать так (при использовании хранимых процедур):
1. Создать соединение ComObject("ADODB.Connection")
2. Создать COMObject("ADODB.Command") и добавить мои переменные
.Parameters.Append(СоединениеSQL.CreateParameter
3. Потом ComObject("ADODB.RecordSet")
и в цикле выбирать данные из Recordset.

Вот вроде все сделал, но не работает, где то ошибся ... (((
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877076
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этому не пугайтесь:
Код: plaintext
1.
2.
3.
4.
5.
6.
СоединениеSQL.CommandText = (txtSQL[ 0 ][ 0 ]);  		// Имя хранимой процедуры на сервере 	
		
	Для i =  1  По txtSQL.Количество()- 1  Цикл  			// Заполняем запрос SQL переменными
		Сообщить (txtSQL[i][ 0 ]+" "+txtSQL[i][ 1 ]+ " "+ txtSQL[i][ 2 ]+" "+txtSQL[i][ 3 ]+ " "+ txtSQL[i][ 4 ]);  // Тестовая срока
		СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter(txtSQL[i][ 0 ],txtSQL[i][ 1 ],txtSQL[i][ 2 ],txtSQL[i][ 3 ],txtSQL[i][ 4 ])); 


Это значения переменных которые необходимы SQL запросу и которые выбираются из массива.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877088
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Плюс паралельный вопрос.
Если хранимая процедура делает выборку 2х таблиц, как правильно через ADO, к ним обращаться и выбирать данные.

Заранее спасибо.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877114
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее всего нет данных потому, что имя процедуры я передаю и запускаю верно, а параметры передаю не верно.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877216
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,


Для нескольких рекордсетов вам уже ответили. С хранимкой надобность в выполнении именно параметризированого запроса отпадает, так как параметры можно указать прямо в тескте запроса, выигрыша от использования sp_executesql уже не будет.

Дабы не молоть чепуху, покажите код вашей процедуры, или хотя бы заголовок с парметрами (от "create procedure" до "as")
...
Рейтинг: 0 / 0
25 сообщений из 78, страница 2 из 4
Форумы / [игнор отключен] [закрыт для гостей] / Выпольнить запрос SQL из 1С
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]