|
|
|
Выпольнить запрос 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 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Делаю вывод что параметры просто не передаются для моего запроса, т.к. таблица есть а данных нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 13:42 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Параметры в запросе вроде указываются как :param, а не как @param. Соответственно, при создании параметра нужно указывать его имя "param". Не знаю, можно ли в MS SQL использовать неименованные параметры, а в Oracle можно указать вместо имени параметра "?" И добавлять параметры в том порядке, как они следуют в запросе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 13:43 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 14:13 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
СоединениеSQL.Parameters.Count говорит что параметров 0. ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 14:20 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Уфф... Вот так должно получиться - я проверял: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Оригинальный текст моей программы VBA Accces: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 15:04 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Блин, не досмотрел - чего это у вас у типа int длина 1? Param1 = СоединениеSQL.CreateParameter("@n",3,1, 4 ,1); СоединениеSQL.Parameters.Append(Param1); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 15:12 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
VladimirKrУфф... Вот так должно получиться - я проверял: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Оригинальный текст моей программы VBA Accces: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Да действительно работает ... Уважаемый подскажите пожалуйста почему Вы ТекстЗапроса="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); Добавили в параметры. Я пол инета перерыл нигде такого не встречал, и в описании нигде нет, если у Вас есть инфа по этому поводу поделитесь пожалуйста. За запрос огромное спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 15:25 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Дык он использует выполнение хранимой процедуры sp_executesql, в параметры которой передаются текст запроса, список параметров и параметры. Эта хранимка возвращает набор записей. Кстати, не пробывали в CommandType передавать 2 вместо 1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 15:35 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Потому что исследование профайлером показало, что выполнить запрос напрямую с передачей параметров через ADO не получается. Но есть хранимая процедура sp_executesql (См. БОЛ на соседнем форуме). Эта хранимая процедура выполняет tsql текст с параметрами, имея первым параметром строку с tsql текстом, вторым параметром - строку описания параметров, используемых в тексте, и далее параметры для строки sql-текста. Этакий аналог временной хранимой процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 15:36 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Народ огромное спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 15:38 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
semyons... Кстати, не пробывали в CommandType передавать 2 вместо 1? Не прокатит. 2 - Это же чтение таблицы напрямую (ADО просто подставит select * from ) к началу текста запроса и попробует выполнить - ну и получит ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 15:41 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
День добрый. Хочу продолжить данную тему ибо опять наткнулся на проблему. Предыдущий запрос был тестовым, а вот с настоящим: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 11:08 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
На нижнюю часть сообщения не обращайте внимание, случайно попало ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 11:09 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, Если я правильно понял вы пытаетесь выполнить несколько команд tsql на одном вызове Execute(). АДО так не работает. Одна команда tsql - один execute. в вашем случае Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 11:24 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
И вообще похоже что вам лучше обернуть все в хранимку, возващающей рекордсет. Тогда ваш первоначальный запрос сведется к "exec MyProc1 @in, @ДатаПриходаС, @ДатаПриходаПо"; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 11:27 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
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. Мой запрос отработает ? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 11:32 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Мда.. Я не разобравшись в предыдущем сообщении написал чушь... Не могда бы мне кинуть кусок кода, как можно использовать хранимую процедуру ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 12:14 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Разобрался, получилось вот так: Код: 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. Но наткнулся на след проблему. Результат хранимой процедуры есть 2 таблицы. На данный момент я вычитываю столбцы первой, но не могу прочитать данные Т.е. Код: plaintext 1. Не отрабатывает. Подскажите пожалуйста как правильно обращаться к результату запроса если запрос выдает несколько таблиц ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 13:47 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Народ ну помогите кто нить. Убрал из хранимой процедуры 2ю таблицу. На выходе есть колонки но нет данных Recordset. В SQL хранимка трабатывает с данными. Где то я с RecordSet не докрутил.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 15:05 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, Давайте так (если я ошибаюсь - поправьте). Вам надо в 1С получить некий набор данных, который суть импорт данных из другой системы. При этом набор данных полчуается не "прямой выборкой", а результат некоей обработки "первичных" данных по некоему алгоритму, который от структуры и значений данных, хранящихся в 1С, не зависят. Собственно вам тогда лучше сделать процедуру непосредственно на сервере (содержащую те самые create table, insert...into и результирующий select), которая подготавливает полностью данные в том виде, который требуется вам получить в 1С. Из 1Са вам достаточно будет вызвать эту процедуру с необходимымми параметрами. Весь код процедуры будет "внутри" сервера, и в 1С вам не надо будет заморачиваться с вызовом каждой команды через АДО. И код этой процедуры нет необходимости писать в 1С - для этого есть более эффективные инструменты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 15:37 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Я уже так и сделал. Подключил свою обработку к хранимой процедуре на сервере. Т.е. кода 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. Подскажите что я делаю не верно. Как я понимаю нужно делать так (при использовании хранимых процедур): 1. Создать соединение ComObject("ADODB.Connection") 2. Создать COMObject("ADODB.Command") и добавить мои переменные .Parameters.Append(СоединениеSQL.CreateParameter 3. Потом ComObject("ADODB.RecordSet") и в цикле выбирать данные из Recordset. Вот вроде все сделал, но не работает, где то ошибся ... ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 16:05 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Этому не пугайтесь: Код: plaintext 1. 2. 3. 4. 5. 6. Это значения переменных которые необходимы SQL запросу и которые выбираются из массива. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 16:07 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Плюс паралельный вопрос. Если хранимая процедура делает выборку 2х таблиц, как правильно через ADO, к ним обращаться и выбирать данные. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 16:10 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Скорее всего нет данных потому, что имя процедуры я передаю и запускаю верно, а параметры передаю не верно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 16:16 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, Для нескольких рекордсетов вам уже ответили. С хранимкой надобность в выполнении именно параметризированого запроса отпадает, так как параметры можно указать прямо в тескте запроса, выигрыша от использования sp_executesql уже не будет. Дабы не молоть чепуху, покажите код вашей процедуры, или хотя бы заголовок с парметрами (от "create procedure" до "as") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 16:42 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Егоров Александрkharkov_max, Для нескольких рекордсетов вам уже ответили.... +1 Вообще, при ADODB чтении выходных данных из процедуры нужно иметь ввиду следующее: Любая строчка информацонного сообщения порождает закрытый рекордсет (ЗаписиSQL.State=0) для каждого select в теле ХП возвращается свой рекордсет. все рекордсеты можно получить методом NextRecordset В вашем случае лучше всего оформить процедуру так: Код: plaintext При чтении делаем следующее: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 18:15 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Возможно Вы меня не так поняли. У меня есть хранимая процедура, в которую я из 1С должен передать данные. Запускаю в SQL ее вот в таком виде: exec ЕЕ.dbo.ПН 333,'20090301','20090314' и она дает результат. Теперь мне необходимо из 1С обратится к ней со своими переменными не (333,'20090301','20090314' ), а какими нибудь другими... Т.е. я из 1С должен влиять на результат выполнения хранимой процедуры своими данными 1С. В данных момент, как я понимаю, я процедуру запускаю, но в нее не передаются параметры, поэтому у меня наименования столбцов есть, а данных нет. Если вот это: Код: plaintext 1. 2. 3. 4. 5. не верно, я уберу, только вот вопрос как тогда передать мои параметры в хранимку ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 18:24 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Егоров Александрkharkov_max, Для нескольких рекордсетов вам уже ответили. С хранимкой надобность в выполнении именно параметризированого запроса отпадает, так как параметры можно указать прямо в тескте запроса, выигрыша от использования sp_executesql уже не будет. Дабы не молоть чепуху, покажите код вашей процедуры, или хотя бы заголовок с парметрами (от "create procedure" до "as") Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 18:30 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Нашел ошибку.... Для упрощения проверки работы обработки, вставил период за который не было документов, соответственно мне поля выводило а данные нет. )) Извините что по этому поводу вам голову морочил. В данный момент процедура имеет такой вид: Код: 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. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. И она работает.... Параметры для передачи в хранимую процедуру, необходимы!!! Осталась одна проблема. Хранимая процедура выводит 2 таблицы, как мне получить данные из этих таблиц. Как я понимаю мне необходимо Recordset установить в нужную таблицу и провести цикл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 20:12 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max...В данных момент, как я понимаю, я процедуру запускаю, но в нее не передаются параметры, поэтому у меня наименования столбцов есть, а данных нет. Раз наименования столбцов есть - значит параметры передаются, но, возможно, не те. Приведите параметы вызова CreateParameter для дат. У вас, видимо, ошибка при создании типов параметров и передаются неправильные значения. Я боюсь, что дату из албанского языка передать как datetime будет сложно благодаря уникальной внутренней стрктуре даты в 1С. (в примере с sp_execute дата передается как varchar(8), а уж sp_execute сам преобразует дату в datetime). Объявите даты-параметры как varchar(8) в хранимой процедуре - при сравнении с датами строка yyyymmdd преобразуется к дате неяво, и передавайте даты как строки (см пример с sp_execute) Если ошибки - посмотрите профайлером, что передается при вызове execute. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2009, 20:34 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_maxИ она работает.... Параметры для передачи в хранимую процедуру, необходимы!!! Ну, главное чтобы работало. :) По поводу параметров. Они нужны когда вам нужно быстро и много раз выполнять один и тот же запрос с разными условиями. Использование параметров позволяет в этом случае более эффективно использовать ресурсы сервера. У вас же - открывается соединение, исполняется единственный раз запрос и соединение закрывается. Использование параметризированных запросов теряет всякий смысл. А раз так - много проще сфоримровать готовую строку запроса внутри 1С. kharkov_max Осталась одна проблема. Хранимая процедура выводит 2 таблицы, как мне получить данные из этих таблиц. Как я понимаю мне необходимо Recordset установить в нужную таблицу и провести цикл? ну ведь уже было. Я так понимаю вам надо как-то так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 07:46 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Егоров Александрkharkov_maxИ она работает.... [quot kharkov_max] Осталась одна проблема. Хранимая процедура выводит 2 таблицы, как мне получить данные из этих таблиц. Как я понимаю мне необходимо Recordset установить в нужную таблицу и провести цикл? ну ведь уже было. Я так понимаю вам надо как-то так: Код: plaintext Такое ЗаписиSQL=ЗаписиSQL.NextRecordset; Не понимает, ошибка .... Если кто знает как, подскажите пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 08:01 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, А ошибку не прведете? в васике используется Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 08:13 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, И еще... вам бы это в отдельную процедуру выделить, например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 08:23 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Вроде вот так ЗаписиSQL = ЗаписиSQL.NextRecordset(); Работает )) Буду ковырять дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 08:29 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, Ой! Извините, на работе запарка.... скобки забыл! Это же метод, а не свойство! на скобки только васику наплевать... :) Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 08:29 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Егоров Александрkharkov_max, И еще... вам бы это в отдельную процедуру выделить, например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Где то так и хочу сделать )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 08:31 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
В итоге хочу получить на выходе функции массив таблиц Т.е. если в другой хранимке их будет 5 то получится Т1,Т2,Т3 ..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 08:34 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, Ну можно результат функции возвращать как СписокЗначений, или как оно сейчас в 8-ке называется? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 08:36 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Продолжая тему... А как узнать количесво мной получаемых объектов Recordset ? Нужно для цикла по объектам ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 10:08 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Не уже ли никто не знает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 11:32 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, в АДО вроде нет счетчика рекордсетов, но могу и ошибаться... попробуйте так (правда код семерки): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 11:37 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Пока ПустоеЗначение(ЗаписиSQL)=0 Цикл Сообщить (ЗаписиSQL.Properties.Count); ЗаписиSQL=ЗаписиSQL.NextRecordset(); КонецЦикла; Так не работает, буду искать дальше.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 12:17 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
kharkov_max, счетчиков NextRecordset нет. поэтому нужно оборачивать вызов NextRecordset в "попытка;исключение;КонецПопытки" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 12:25 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Да, и не надо этого - Записи.Close(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 12:31 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Мне цикл нужен Как это дело реализовать ? Может цикл с выходом по ошибке ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 12:38 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Сделал.. вроде работает ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 13:13 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
После долгих вояний вот что получилось. Функция универсальна, может кому нить пригодится. Код: 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. 63. 64. 65. 66. 67. Данная функция использует переменные SQL запроса которые описываются тут: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Возможно кривовато выглядит, но работает. Всем спасибо, думаю тему можно закрывать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 13:31 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Апну тему. В строке поиска в виндах вбейте *ADO*.chm (лениво полный путь приводить) и получите полное руководство по методам и свойствам ADO. Это снимет многие ваши вопросы в дальнейшем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2009, 14:07 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, за то что сюда вклиниваюсь, но у меня проблема с RecordSet. Ситуация такая, надо после получения данных запроса вывести ProgressBar в 1С в последующей работе с результатами запроса, соотвественно, я добавил в запрос select @@ROWCOUNT и на выходе у меня получилось два RecordSet. Проблема в том, что данные из второго мне нужны до начала обработки результатов первого. И вот такая вещь, не срабатывает: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 11:01 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, я немного наколол народ, на самом деле Value берётся через переменную: Код: plaintext 1. Нашёл кое каие доки и напал на след, там вообще указывается, что NextRecordSet ОЧИЩАЕТ РекордСет и выполняет следующую часть запроса (Select), то есть вернуться вряд ли получиться. Второй момент, что там описывается, это возможность двигаться в двух направлениях и вообще море возможностей, типа поиска, получаения, удаления, добавления строк, столбцов и даже сортировка и фильтры или Save в XML. Правда я, уже интуитивно, пробовал PreviousRecordSet, но это не сработало. Так вот, там сказано, что работать всё-таки - будет, надо только указать в параметре открытия как-то OpenStatic, что немного замедлит работу. И самое главное - будет возможность получить RecordCount, что вообще решает все мои проблемы. Ну и ещё какой-то метод Clone(), как запасной вариант. Замечу ещё, что кроме EOF ставится и флаг BOF, так что можно проверять отсутствие записей, если оба этих флага, одновременно True. Осталось формализовать строчку отрытия.. если кто знает, напишите пожалуйста, у меня с такими элементарными вещами, всегда много мороки - только изучаю всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 14:54 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Ничего у меня не получается, пишу и просто СоединениеSQL.Open("Driver={SQL Server Native Client 10.0};Server=SQLVIRTUAL\SQLEXPRESS;Database=EVE;Trusted_Connection=Yes;CursorType=adOpenStatic"); и без CyrsorType, вроде бы не ругается, вроде бы разрешает сделать ParamCount, но результат всегда -1 и вот что написано в хелпе: "Свойство Recordset.RecordCount нормально функционирует только для курсоров типа Static и Keyset. Для курсоров типа ForwardOnly и Dynamic оно возвращает (-1), поскольку драйвер подключения не может определить количество записей." Ну прямо хоть Requery() делай или тупо забить целый столбец значением количества строк... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 16:44 |
|
||
|
Выпольнить запрос SQL из 1С
|
|||
|---|---|---|---|
|
#18+
Нашёл прекрасную доку и всё заработало . Ошибка была в том, что установить тип курсора можно только в двух местах: в обработчике Willexecute, который вызывается перед вызовом метода Execute объекта recordSet (что-то там многовато параметров, возможно, они не обязательные, но меня - очень напугало, тем более, что не совсем понятно само это всё будет вызваться или всё-таки надо вызывать.. так и вьются в голове CallBack и Overload procedure) Либо в самом ObjRecordSet.CursorType=3, но уже с последующим RecordSet.Open("запрос", ObjConnections); Слегка подрезаный реальный код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ParamCount заработал - Ура! Всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 18:39 |
|
||
|
|

start [/forum/topic.php?all=1&fid=28&tid=1522928]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
167ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
122ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 588ms |

| 0 / 0 |
