Вход | Регистрация


1С:Предприятие ::

Метки: 

Пустой результат запроса MS SQL

Я
   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'
   Amfiaray
 
3 - 27.10.17 - 08:17
(1) А что с датами не так? Для проверки ставил точку останова. брал текст запроса из СоединениеSQL.CommandText и выполнял его в Management Studio, результат был нормальный.
   бомболюк
 
4 - 27.10.17 - 08:22
(3) а просто больше сюрпризов тут ждать неоткуда.
   Amfiaray
 
5 - 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
покажи новый код
   Amfiaray
 
8 - 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();
Возврат Таблица;
   1c_July
 
9 - 27.10.17 - 08:48
извините, что влезаю, хоть не совсем в теме, но возникли идеи: может какой-нибудь MoveFirst перед циклом?
(если по аналогии execute - "выполнить", а потом еще надо "выбрать" - перед тем как ходить по записям в цикле)
И еще попробовать ЗаписиSQL.count проверить.
   бомболюк
 
10 - 27.10.17 - 08:51
я предполагал ты мне нормальный текст запроса тут засветишь, безо всяких склеек. давай просто захардкодим:
           |      FT.CreateDate >= '20171001' and FT.CreateDate < '20171028'
 
 Рекламное место пустует
   Amfiaray
 
11 - 27.10.17 - 08:57
(9) MoveFirst() выдал ошибку:
Произошла исключительная ситуация (ADODB.Recordset): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись.
   Amfiaray
 
12 - 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

Результат тоже пустой.
   1dvd
 
13 - 27.10.17 - 09:00
попробуй прописать путь к базе в самом запросе
   Amfiaray
 
14 - 27.10.17 - 09:00
Может быть проблема в том что в запросе используются и базовые таблицы и представления?
   бомболюк
 
15 - 27.10.17 - 09:01
(12) а в Management Studio он не пустой?
   Amfiaray
 
16 - 27.10.17 - 09:01
(13) а в чем разница? запрос ведь выполняется, колонки в выборки есть, а сток нет.
   1dvd
 
17 - 27.10.17 - 09:01
(16) не помню. Давно занимался этим, но делал именно так
   Amfiaray
 
18 - 27.10.17 - 09:02
(15) нет не пустой, 119 записей выводит
   бомболюк
 
19 - 27.10.17 - 09:03
так не бывает. может базы или сервера разные в консоли и запросе из 1С?
   Amfiaray
 
20 - 27.10.17 - 09:05
(19)всё одинаково.
   Amfiaray
 
21 - 27.10.17 - 09:06
Пробовал добавлять эту базу как внешний источник данных, но почему то таблицы с представлениями были пустые.
   Amfiaray
 
22 - 27.10.17 - 09:07
Потом добавлял хранимую процедуру с этим запросом, также в Management Studio всё отрабатывает отлично, а при вызове из 1с пусто.
   SSSSS_AAAAA
 
23 - 27.10.17 - 09:09
(8)Убрать use [traffic] и добавить название базы перед таблицами. ТО есть traffic.vRefDocuments и т.д.
   Amfiaray
 
24 - 27.10.17 - 09:13
(23) Не помогло, по прежнему пустой результат
   Тихий омут
 
25 - 27.10.17 - 09:19
(24) чудес не бывает. отключай условия в запросе, найдёшь некорректное
   Rokford
 
26 - 27.10.17 - 09:19
Может не та ситуация, но похожа. Я в свое время намучился с получением набора данных, пока не указал тип курсора. Попробуй, может поможет (именно = 3).

        ADOНаборДанных = Новый COMОбъект("ADODB.RecordSet");
        ADOНаборДанных.CursorType = 3;
        ADOНаборДанных.Open(ТекстЗапроса, ADOConnection);
   Amfiaray
 
27 - 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";

Результат всё равно пустой.
   Amfiaray
 
28 - 27.10.17 - 09:26
(26) добавил ЗаписиSQL.CursorType = 3; 
Результат так же пустой.
   Тихий омут
 
29 - 27.10.17 - 09:29
(27) Двигайся дальше. Убери джойн из этой выборки - результат пустой? Если да, то не туда стучишься - не в ту базу. И вот это - [Traffic].[dbo] - мне оччень не нравится, эти вещи мне несколько лет назад (при скрещивании 7.7 и OLAP) основательно крови попили, постарайся от них избавиться - ты ведь при подключении указываешь точно имя базы, в запросе его дублировать ни к чему.
   SSSSS_AAAAA
 
30 - 27.10.17 - 09:30
(18) В 1с вы что-то делаете не так, как SSMS. Потому у вас и результата нет ни одним из способов. Ищите. Не тот сервер?
   Rokford
 
31 - 27.10.17 - 09:31
Почему используешь объект command а не RecordSet?
(22)Если получилось создать ХП, - попробуй вызывать ее
   LuciferArh
 
32 - 27.10.17 - 09:33
(8) А почему цикл Пока ЗаписиSQL.EOF = 0 Цикл
Я бы написал 
Пока НЕ ЗаписиSQL.EOF
Потому что EOF - EndOfFile, то есть достигнут конец файла, и оно булево.
   SSSSS_AAAAA
 
33 - 27.10.17 - 09:33
(31) Кстати, да. Сommand для запуска ХП и подобного. Но это так, мелочи. На внешние источники данных не влияющие. И потому не главная причина.
 
 
   Rokford
 
34 - 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();

    Возврат Таб;
КонецФункции// ЗапросБД()
   Amfiaray
 
35 - 27.10.17 - 12:17
Спасибо, вроде разобрался с причиной проблемы, не хватает прав у пользователя SQL, только теперь не могу разобраться с правами ((
   SSSSS_AAAAA
 
36 - 27.10.17 - 12:24
(35) И что с правами?
   Amfiaray
 
37 - 27.10.17 - 12:55
(35) Не понятно что с правами, select на каких то таблицах нормально отрабатывает? а на каких то пустой результат№
   бомболюк
 
38 - 27.10.17 - 13:07
возможно во вьюхе режется
   SSSSS_AAAAA
 
39 - 27.10.17 - 13:09
(37) Ну так надо смотреть прав этого юзера на все используемые таблицы. Они ведь на каждую таблицу отдельно могут быть.
   Yuri 83
 
40 - 27.10.17 - 13:15
(0) Ну смещение дат же! Прибавь пару тысяч лет.
   Amfiaray
 
41 - 27.10.17 - 13:20
(39) сказал админам которые базу обслуживают чтобы с правами разобрались? а пока выпросил у них пароль от sa



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует