|   |   | 
| 
 | Пустой результат запроса MS SQL | ☑ | ||
|---|---|---|---|---|
| 0
    
        Amfiaray 27.10.17✎ 08:11 | 
        Добрый день!
 Делаю запрос к базе MS SQL, вот код: Подключение = Новый ComObject("ADODB.Connection"); Подключение.ConnectionString="SERVER="+Сервер+"; Database="+База+"; DRIVER=SQL Server; UID="+ИмяПользователя+"; PWD="+Пароль+";"; Попытка Подключение.Open(); Исключение Сообщить(ОписаниеОшибки()); Возврат Ложь; КонецПопытки; СоединениеSQL = Новый COMObject("ADODB.Command"); СоединениеSQL.ActiveConnection = Подключение; СоединениеSQL.CommandText = "use [Traffic] |select DISTINCT ReferenceID from vRefDocuments RD |inner join vFactHistory FH ON FH.HistoryDocId = RD.ReferenceId |inner join vFactTransport FT ON FT.FactHistoryId = FH.FactHistoryId AND FT.FactSource = 909237 |where RD.DocTypeId = 1041302 and | FT.CreateDate between convert(datetime, '"+Формат(НачалоДня(ДатаНачала), "ДФ='yyyy-MM-dd'")+" 00:00:00'"+", 120) and convert(datetime, '"+Формат(КонецДня(ДатаОкончания), "ДФ='yyyy-MM-dd'")+" 23:59:59'"+", 120) | and FT.DeletedFlag <> 1"; СоединениеSQL.CommandType = 1; ЗаписиSQL = Новый ComObject("ADODB.RecordSet"); Попытка ЗаписиSQL = СоединениеSQL.Execute(); Исключение Сообщить(ОписаниеОшибки()); Подключение.Close(); Возврат Ложь; КонецПопытки; Запрос отрабатывает без ошибок, но результат запроса пустой. Этот же текст запроса при выполнении в Management Studio выдает нормальный результат, не пустой. Подскажите как правильно сделать прямой запрос к SQL? | |||
| 1
    
        бомболюк 27.10.17✎ 08:15 | 
        дело в датах наверное     | |||
| 2
    
        бомболюк 27.10.17✎ 08:17 | 
        сравнивай просто со строками вида '20171027'     | |||
| 3
    
        Amfiaray 27.10.17✎ 08:17 | 
        (1) А что с датами не так? Для проверки ставил точку останова. брал текст запроса из СоединениеSQL.CommandText и выполнял его в Management Studio, результат был нормальный.     | |||
| 4
    
        бомболюк 27.10.17✎ 08:22 | 
        (3) а просто больше сюрпризов тут ждать неоткуда.     | |||
| 5
    
        Amfiaray 27.10.17✎ 08:26 | 
        (4) Не прокатило, результат тот же.
 Может я выборку как то не правильно обхожу? Вот код по заполнению ТЗ Таблица = Новый ТаблицаЗначений; Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; Таблица.Колонки.Добавить(ИмяСтолбца); КонецЦикла; Пока ЗаписиSQL.EOF = 0 Цикл НоваяСтрока = Таблица.Добавить(); Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value); КонецЦикла; ЗаписиSQL.MoveNext(); КонецЦикла; ЗаписиSQL.Close(); Подключение.Close(); Возврат Таблица; Колонка в таблицу добавляется, а строки нет. | |||
| 6
    
        бомболюк 27.10.17✎ 08:32 | 
        тут все верно     | |||
| 7
    
        бомболюк 27.10.17✎ 08:33 | 
        покажи новый код     | |||
| 8
    
        Amfiaray 27.10.17✎ 08:40 | 
        Подключение = Новый ComObject("ADODB.Connection");
 Подключение.ConnectionString="SERVER="+Сервер+"; Database="+База+"; DRIVER=SQL Server; UID="+ИмяПользователя+"; PWD="+Пароль+";"; Попытка Подключение.Open(); Исключение Сообщить(ОписаниеОшибки()); Возврат Ложь; КонецПопытки; СоединениеSQL = Новый COMObject("ADODB.Command"); СоединениеSQL.ActiveConnection = Подключение; СоединениеSQL.CommandText = "use [Traffic] |select DISTINCT ReferenceID from vRefDocuments RD |inner join vFactHistory FH ON FH.HistoryDocId = RD.ReferenceId |inner join vFactTransport FT ON FT.FactHistoryId = FH.FactHistoryId AND FT.FactSource = 909237 |where RD.DocTypeId = 1041302 and | FT.CreateDate between convert(datetime, '"+Формат(НачалоДня(ДатаНачала), "ДФ='yyyyMMdd'")+"'"+", 120) and convert(datetime, '"+Формат(КонецДня(ДатаОкончания), "ДФ='yyyyMMdd'")+"'"+", 120) | and FT.DeletedFlag <> 1"; СоединениеSQL.CommandType = 1; ЗаписиSQL = Новый ComObject("ADODB.RecordSet"); Попытка ЗаписиSQL = СоединениеSQL.Execute(); Исключение Сообщить(ОписаниеОшибки()); Подключение.Close(); Возврат Ложь; КонецПопытки; Таблица = Новый ТаблицаЗначений; Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; Таблица.Колонки.Добавить(ИмяСтолбца); КонецЦикла; Пока ЗаписиSQL.EOF = 0 Цикл НоваяСтрока = Таблица.Добавить(); Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value); КонецЦикла; ЗаписиSQL.MoveNext(); КонецЦикла; ЗаписиSQL.Close(); Подключение.Close(); Возврат Таблица; | |||
| 9
    
        1c_July 27.10.17✎ 08:48 | 
        извините, что влезаю, хоть не совсем в теме, но возникли идеи: может какой-нибудь MoveFirst перед циклом?
 (если по аналогии execute - "выполнить", а потом еще надо "выбрать" - перед тем как ходить по записям в цикле) И еще попробовать ЗаписиSQL.count проверить. | |||
| 10
    
        бомболюк 27.10.17✎ 08:51 | 
        я предполагал ты мне нормальный текст запроса тут засветишь, безо всяких склеек. давай просто захардкодим:
 | FT.CreateDate >= '20171001' and FT.CreateDate < '20171028' | |||
| 11
    
        Amfiaray 27.10.17✎ 08:57 | 
        (9) MoveFirst() выдал ошибку:
 Произошла исключительная ситуация (ADODB.Recordset): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись. | |||
| 12
    
        Amfiaray 27.10.17✎ 08:58 | 
        (10)С таким запросом:
 use [Traffic] select DISTINCT ReferenceID from vRefDocuments RD inner join vFactHistory FH ON FH.HistoryDocId = RD.ReferenceId inner join vFactTransport FT ON FT.FactHistoryId = FH.FactHistoryId AND FT.FactSource = 909237 where RD.DocTypeId = 1041302 and FT.CreateDate >='20170101' and FT.CreateDate <='20170131' and FT.DeletedFlag <> 1 Результат тоже пустой. | |||
| 13
    
        1dvd 27.10.17✎ 09:00 | 
        попробуй прописать путь к базе в самом запросе     | |||
| 14
    
        Amfiaray 27.10.17✎ 09:00 | 
        Может быть проблема в том что в запросе используются и базовые таблицы и представления?     | |||
| 15
    
        бомболюк 27.10.17✎ 09:01 | 
        (12) а в Management Studio он не пустой?     | |||
| 16
    
        Amfiaray 27.10.17✎ 09:01 | 
        (13) а в чем разница? запрос ведь выполняется, колонки в выборки есть, а сток нет.     | |||
| 17
    
        1dvd 27.10.17✎ 09:01 | 
        (16) не помню. Давно занимался этим, но делал именно так     | |||
| 18
    
        Amfiaray 27.10.17✎ 09:02 | 
        (15) нет не пустой, 119 записей выводит     | |||
| 19
    
        бомболюк 27.10.17✎ 09:03 | 
        так не бывает. может базы или сервера разные в консоли и запросе из 1С?     | |||
| 20
    
        Amfiaray 27.10.17✎ 09:05 | 
        (19)всё одинаково.     | |||
| 21
    
        Amfiaray 27.10.17✎ 09:06 | 
        Пробовал добавлять эту базу как внешний источник данных, но почему то таблицы с представлениями были пустые.     | |||
| 22
    
        Amfiaray 27.10.17✎ 09:07 | 
        Потом добавлял хранимую процедуру с этим запросом, также в Management Studio всё отрабатывает отлично, а при вызове из 1с пусто.     | |||
| 23
    
        SSSSS_AAAAA 27.10.17✎ 09:09 | 
        (8)Убрать use [traffic] и добавить название базы перед таблицами. ТО есть traffic.vRefDocuments и т.д.     | |||
| 24
    
        Amfiaray 27.10.17✎ 09:13 | 
        (23) Не помогло, по прежнему пустой результат     | |||
| 25
    
        Тихий омут 27.10.17✎ 09:19 | 
        (24) чудес не бывает. отключай условия в запросе, найдёшь некорректное     | |||
| 26
    
        Rokford 27.10.17✎ 09:19 | 
        Может не та ситуация, но похожа. Я в свое время намучился с получением набора данных, пока не указал тип курсора. Попробуй, может поможет (именно = 3).
 ADOНаборДанных = Новый COMОбъект("ADODB.RecordSet"); ADOНаборДанных.CursorType = 3; ADOНаборДанных.Open(ТекстЗапроса, ADOConnection); | |||
| 27
    
        Amfiaray 27.10.17✎ 09:24 | 
        (25) Вот запрос совсем без условий:
 "SELECT DISTINCT ReferenceID from [Traffic].[dbo].vRefDocuments RD |inner join [Traffic].[dbo].vFactHistory FH ON FH.HistoryDocId = RD.ReferenceId |inner join [Traffic].[dbo].vFactTransport FT ON FT.FactHistoryId = FH.FactHistoryId"; Результат всё равно пустой. | |||
| 28
    
        Amfiaray 27.10.17✎ 09:26 | 
        (26) добавил ЗаписиSQL.CursorType = 3; 
 Результат так же пустой. | |||
| 29
    
        Тихий омут 27.10.17✎ 09:29 | 
        (27) Двигайся дальше. Убери джойн из этой выборки - результат пустой? Если да, то не туда стучишься - не в ту базу. И вот это - [Traffic].[dbo] - мне оччень не нравится, эти вещи мне несколько лет назад (при скрещивании 7.7 и OLAP) основательно крови попили, постарайся от них избавиться - ты ведь при подключении указываешь точно имя базы, в запросе его дублировать ни к чему.     | |||
| 30
    
        SSSSS_AAAAA 27.10.17✎ 09:30 | 
        (18) В 1с вы что-то делаете не так, как SSMS. Потому у вас и результата нет ни одним из способов. Ищите. Не тот сервер?     | |||
| 31
    
        Rokford 27.10.17✎ 09:31 | 
        Почему используешь объект command а не RecordSet?
 (22)Если получилось создать ХП, - попробуй вызывать ее | |||
| 32
    
        LuciferArh 27.10.17✎ 09:33 | 
        (8) А почему цикл Пока ЗаписиSQL.EOF = 0 Цикл
 Я бы написал Пока НЕ ЗаписиSQL.EOF Потому что EOF - EndOfFile, то есть достигнут конец файла, и оно булево. | |||
| 33
    
        SSSSS_AAAAA 27.10.17✎ 09:33 | 
        (31) Кстати, да. Сommand для запуска ХП и подобного. Но это так, мелочи. На внешние источники данных не влияющие. И потому не главная причина.     | |||
| 34
    
        Rokford 27.10.17✎ 09:34 | 
        Вот из рабочей обработки функция, может поможет...
 Функция ЗапросБД(ТекстЗапроса) Экспорт // соединение с MS SQL Server Попытка ADOConnection = Новый COMОбъект( "ADODB.Connection" ); Исключение ФлагОтказ = Истина; КонецПопытки; ADOConnection.Provider = "SQLOLEDB.1"; ADOConnection.Properties( "Data Source" ).Value = СокрЛП("АААА"); //сервер; ADOConnection.Properties( "Initial Catalog" ).Value = СокрЛП("ББББ"); //база; ADOConnection.Properties( "User ID" ).Value = СокрЛП("ВВВВ"); //"uid"; ADOConnection.Properties( "Password" ).Value = СокрЛП("ГГГГ"); //"psw"; Попытка ADOConnection.Open(); Исключение ФлагОтказ = Истина; КонецПопытки; // запрос Попытка ADOНаборДанных = Новый COMОбъект("ADODB.RecordSet"); ADOНаборДанных.CursorType = 3; ADOНаборДанных.Open(ТекстЗапроса, ADOConnection); Исключение ФлагОтказ = Истина; КонецПопытки; Таб = Новый ТаблицаЗначений; КоличествоПолей = ADOНаборДанных.Fields.Count - 1; // Циклом пробегаем по всем полям в наборе данных // и создаем поля в таблице значений Для ПолеСч = 0 по КоличествоПолей Цикл ИмяКолонки = ADOНаборДанных.Fields.item(ПолеСч).name; Если Найти(ИмяКолонки, "Дата") > 0 Тогда ТипКолонки = Новый ОписаниеТипов("Дата",,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)); ИначеЕсли Найти(ИмяКолонки, "Количество") > 0 Тогда ТипКолонки = Новый ОписаниеТипов("Число",,); Иначе ТипКолонки = Новый ОписаниеТипов("Строка",,); КонецЕсли; Таб.Колонки.Добавить(ИмяКолонки, ТипКолонки, ИмяКолонки); КонецЦикла; // Заполнение таблицы значений Попытка ADOНаборДанных.MoveFirst(); Исключение //Сообщение = Новый СообщениеПользователю; //Сообщение.Текст = "Результат запроса к SQL-серверу пустой."; //Сообщение.Сообщить(); Возврат Таб; КонецПопытки; Счетчик = 0; Пока ADOНаборДанных.EOF = false Цикл НоваяСтрока = Таб.Добавить(); Счетчик = Счетчик + 1; НоваяСтрока[0] = Счетчик; Для ПолеСч = 0 по КоличествоПолей Цикл Поле = ADOНаборДанных.Fields.item(ПолеСч); НоваяСтрока[ПолеСч] = СокрЛП(Формат(Поле.Value,"ЧГ=0")); КонецЦикла; // Переходим дальше ADOНаборДанных.MoveNext(); КонецЦикла; ADOНаборДанных.Close(); ADOConnection.Close(); Возврат Таб; КонецФункции // ЗапросБД() | |||
| 35
    
        Amfiaray 27.10.17✎ 12:17 | 
        Спасибо, вроде разобрался с причиной проблемы, не хватает прав у пользователя SQL, только теперь не могу разобраться с правами ((     | |||
| 36
    
        SSSSS_AAAAA 27.10.17✎ 12:24 | 
        (35) И что с правами?     | |||
| 37
    
        Amfiaray 27.10.17✎ 12:55 | 
        (35) Не понятно что с правами, select на каких то таблицах нормально отрабатывает? а на каких то пустой результат№     | |||
| 38
    
        бомболюк 27.10.17✎ 13:07 | 
        возможно во вьюхе режется     | |||
| 39
    
        SSSSS_AAAAA 27.10.17✎ 13:09 | 
        (37) Ну так надо смотреть прав этого юзера на все используемые таблицы. Они ведь на каждую таблицу отдельно могут быть.     | |||
| 40
    
        Yuri 83 27.10.17✎ 13:15 | 
        (0) Ну смещение дат же! Прибавь пару тысяч лет.     | |||
| 41
    
        Amfiaray 27.10.17✎ 13:20 | 
        (39) сказал админам которые базу обслуживают чтобы с правами разобрались? а пока выпросил у них пароль от sa     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |