|
|
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
День добрый. Пытаюсь делать запросы SQL 2005 из 1С8.1 Дошел до вот такого. Функция ЗапросSQL (SQLServer,Login,Password,ТекстSQL) //Функция выборки данных из SQL сервера и передача во временную таблицу 1С СтрокаСоединения = (" Provider=SQLOLEDB.1;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer + (";UID=") + Login + ("; PWD=") + Password + (";"); СоединениеSQL = Новый ComObject("ADODB.Connection"); СоединениеSQL.ConnectionString=СтрокаСоединения; Попытка СоединениеSQL.Open(); Состояние ("Подключение к серверу SQL..."); Исключение Сообщить(ОписаниеОшибки()); Возврат Ложь; КонецПопытки; Состояние ("Выполнение запроса SQL..."); ЗаписиSQL = Новый ComObject("ADODB.RecordSet"); ЗаписиSQL.ActiveConnection = СоединениеSQL; ЗаписиSQL = СоединениеSQL.Execute (ТекстSQL); //ЗаписиSQL = СоединениеSQL.Open (ТекстSQL); Таблица = Новый ТаблицаЗначений; Состояние ("Заполнение временной таблицы..."); Для НомерСтолбца = 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(); КонецЦикла; Состояние ("Закрываем соединение с SQL..."); ЗаписиSQL.Close(); СоединениеSQL.Close(); Возврат Таблица; // Возврат таблицы значений запроса SQL КонецФункции Эта функция в таком виде работает. Данная функция выводит в виртуальную таблицу вот такой запрос SQL. ТекстЗапросаSQL = ("select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы where Линия =1 and ДатаПриход between '") + Формат(НачалоПериода,"ДФ=ггггММдд") + ("' and '") + Формат(КонецПериода,"ДФ=ггггММдд") +("';"); Но как только пытаюсь в запросе SQL объявить переменные и присвоить им значения вот так: ТекстЗапросаSQL = ("declare @n int | set @n = 1 | select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы | where Линия =1 and ДатаПриход between '") + Формат(НачалоПериода,"ДФ=ггггММдд") + ("' and '") + Формат(КонецПериода,"ДФ=ггггММдд") +("';"); Вываливается ошибка Пока ЗаписиSQL.EOF=0 Цикл // Заполнение созданной таблицы по причине: Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт. На другом форуме нашел что метод при помощи которого я обращаюсь к SQL ЗаписиSQL = СоединениеSQL.Execute (ТекстSQL); Не подходит для такого запроса. Помогите, какой метод нужно использовать или как правильно сделать. Заранее большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 18:13 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, В ADO параметризированные запросы не пишутся в тексте запроса. Используйте ADODB.Parameter . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 18:44 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Спасибо. А можете поделится примитивным примером относительно 1С ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 18:54 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
на http://script-coding.info/ были ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 19:00 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Там такого нет (((. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 19:24 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 19:39 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Красота ни при чем. Нужен именно запрос с параметрами. Если где на примерчик наткнетесь, киньте пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 20:36 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_maxТам такого нет (((. http://script-coding.info/ADO.html чего там нет? Ctrl-C, Ctrl-V ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 20:37 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Тот пример что кинул, полный примитив, задумка более глобальнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 20:37 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Господин ПЖkharkov_maxТам такого нет (((. http://script-coding.info/ADO.html чего там нет? Ctrl-C, Ctrl-V ? Да как бы там нет примерчика запроса с параметрами (((. Возможно все описано, но примера я не увидел. т.к. не великий знаток SQL и 1С, по данной статье мне очень тяжело сделать вывод как правильно поступить в моей ситуации. Вот и хочу где нить найти пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 21:03 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, Стоит поискать книжку Михайлова aka MAV. "1С:Предприятие 7.7/8.0 Системное программирование". А еще проще зайти на MSDN и почитать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 21:31 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Возможный вариант: ado_cm = CreateObject("ADODB.Command"); ado_cm.ActiveConnection = obj_ADOConn; ado_cm.CommandText = "select * from tbl where tbl.DelDate = :DelDate"; ado_cm.Parameters.Append(ado_cm.CreateParameter("DelDate", 7, 1, , Date('01.01.2009'))); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 22:27 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max.... Но как только пытаюсь в запросе SQL объявить переменные и присвоить им значения вот так: ТекстЗапросаSQL = ("declare @n int | set @n = 1 | select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы | where Линия =1 and ДатаПриход between '") + Формат(НачалоПериода,"ДФ=ггггММдд") + ("' and '") + Формат(КонецПериода,"ДФ=ггггММдд") +("';"); Вываливается ошибка Пока ЗаписиSQL.EOF=0 Цикл // Заполнение созданной таблицы по причине: Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт. На другом форуме нашел что метод при помощи которого я обращаюсь к SQL ЗаписиSQL = СоединениеSQL.Execute (ТекстSQL); Не подходит для такого запроса. Помогите, какой метод нужно использовать или как правильно сделать. Заранее большое спасибо. К объектам ADODB обращаетесь правильно. Посто запрос был выполнен, вернув несколько объектов типа Recordset. Попробуйте изменить код: Код: plaintext 1. 2. 3. 4. Вставьте в текст запроса в начало "Set nocount on" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 10:20 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Всем огромное спасибо за помощь. В данный момент делаю так: СтрокаСоединения = ("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.CommandType = 4; Param = СоединениеSQL.CreateParameter("@n",3,1,9,1); СоединениеSQL.Parameters.Append(Param); //СоединениеSQL.Execute (ТекстSQL); Состояние ("Выполнение запроса SQL..."); ЗаписиSQL = Новый ComObject("ADODB.RecordSet"); Сообщить (ТекстSQL); ЗаписиSQL = СоединениеSQL.Execute (ТекстSQL); Для запроса: ТекстЗапросаSQL = ("select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы where Линия = @n and ДатаПриход between '") + Формат(НачалоПериода,"ДФ=ггггММдд") + ("' and '") + Формат(КонецПериода,"ДФ=ггггММдд") +("';"); Получаю вот такую ошибку: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver]Ошибка синтаксиса или нарушение доступа ЗаписиSQL = СоединениеSQL.Execute (ТекстSQL); по причине: Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver]Ошибка синтаксиса или нарушение доступа Думаю что принцип реализации запроса с параметрами у меня верный, но где то есть бок. Не пинайте сразу помогите разобраться. Еще раз огромное спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 10:56 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, попробуйте так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 11:16 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Похоже нашел ошибку. Исправил: Добавил - СоединениеSQL.CommandText = ТекстSQL; Исправил - ЗаписиSQL = СоединениеSQL.Execute(); В запросе добавил - объявил переменную @n (declare @n int) Вроде пробилось дальше, но результат запроса пустой, думаю что дело в Param = СоединениеSQL.CreateParameter("@n",3,1,9,1); Как правильно задать параметры переменной для целого числа ? Подскажите для теста, хочу увидеть что больше нигде нет косяков, а потом буду дальше ковыряться ... с остальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 11:19 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Егоров Александрkharkov_max, попробуйте так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Пока писал Вы ответили тоже самое )). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 11:20 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
http://www.1csql.ru/materials/articles/develop.html~bfd0f58f-25af-add2-6767-09a5bf664605 http://www.sql.ru/docs/mssql/adoandsql/index.shtml ftp://ftp.asu.ru/incoming/Sofi/Data%20Base/ado1.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 11:38 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, Главное чтобы заработало. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 12:08 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Не работает ((( Думаю что ошибки в параметрах Есть такие: Param1 = СоединениеSQL.CreateParameter("@n",3,1,1,1); СоединениеSQL.Parameters.Append(Param1); Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС",133,0,8,Формат(НачалоПериода,"ДФ=ггггММдд")); СоединениеSQL.Parameters.Append(Param2); Param3 = СоединениеSQL.CreateParameter("@ДатаПриходаПо",133,0,8,Формат(НачалоПериода,"ДФ=ггггММдд")); СоединениеSQL.Parameters.Append(Param3); Для такого запроса: ("declare @n |declare @ДатаПриходаС |declare @ДатаПриходаПо |select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы | where Линия = @n and ДатаПриход between @ДатаПриходаС and @ДатаПриходаПо"); Где не верно ? При выполнении ошибка: {Форма.Форма(106)}: Ошибка при вызове метода контекста (CreateParameter): Произошла исключительная ситуация (ADODB.Command): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом. Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС",133,0,8,Формат(НачалоПериода,"ДФ=ггггММдд")); по причине: Произошла исключительная ситуация (ADODB.Command): Аргументы имеют неверный тип, выходят за пределы допустимого Ругается на параметр даты, не могу понять в чем дело, вроде все верно описал .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 12:22 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
СоединениеSQL = Новый COMObject("ADODB.Command"); СоединениеSQL.ActiveConnection = Подключение; СоединениеSQL.CommandText=ТекстSQL; СоединениеSQL.CommandType = 1; --- вот где проблема, имхо СоединениеSQL.Prepared=Истина; СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter("@n",3,1,9,1)); ЗаписиSQL = СоединениеSQL.Execute(); И не надо в тексте SQL операторов declare - такой оператор tsql описывает переменные, а не параметры. строка SQL будет выполняться через системную хранимую процедуру sp_executesql (см описание если интересны детали) . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 12:41 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
а что подскажете по ошибке в этой строке ? Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС",133,0,8,Формат(НачалоПериода,"ДФ=ггггММдд")); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 12:54 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_maxа что подскажете по ошибке в этой строке ? Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС",133,0,8,Формат(НачалоПериода,"ДФ=ггггММдд")); Попробуйте Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС",200,1,8,Формат(НачалоПериода,"ДФ=ггггММдд")); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 12:59 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Спасибо, по параметрам прошло. Что за параметр 200 ? Если есть ссылка на эти параметры киньте плиз, почитаю. Дальше ошибка {Форма.Форма(113)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Необходимо объявить скалярную переменную "@n". ЗаписиSQL = СоединениеSQL.Execute(); по причине: Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server Настройки пока в таком состоянии СоединениеSQL.CommandType = 1; СоединениеSQL.Prepared = Истина; Param1 = СоединениеSQL.CreateParameter("@n",3,1,1,1); СоединениеSQL.Parameters.Append(Param1); Запрос вот: ("select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы | where Линия = @n and ДатаПриход between @ДатаПриходаС and @ДатаПриходаПо"); Если я создал параметры, почему их не видит запрос ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 13:11 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Если переменные объявляю: declare @n int declare @ДатаПриходаС datetime declare @ДатаПриходаПо datetime То запрос проходит, выводит столбцы, но строк нет т.е. не выбирает данные. Пока ЗаписиSQL.EOF = 0 Цикл // Заполнение созданной таблицы НоваяСтрока = Таблица.Добавить(); Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value); Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца); КонецЦикла; ЗаписиSQL.MoveNext(); КонецЦикла; По этому циклу пусто .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 13:16 |
|
||
|
|

start [/forum/topic.php?fid=28&msg=35873613&tid=1522928]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
159ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 503ms |

| 0 / 0 |
