Имя: Пароль:
1C
1C 7.7
v7: Вытягивание данных из SQL запроса
,
0 ВежливаяТварь
 
24.09.12
12:57
Есть код который вытягивает данные из MSSQl. проблема в том что при вытягивании программа спотыкается на одной колонке в которой хранится число и выдает ошибку "Тип переменой не поддерживается". Сам код:    ТекстЗапроса="SET NOCOUNT ON exec [dbo].[rpt_SalOutList_Desktop]   @datefrom= '"+ДатаНачалаПроверки+"', @dateto='"+ДатаКонцаПроверки+"'";
     
   Cmd.Commandtext=СокрЛП(ТекстЗапроса);
   Попытка
       Rs.ActiveConnection=Соединение;
       Rs=Cmd.Execute();
   Исключение
       Сообщить(ОписаниеОшибки());  
   КонецПопытки;
   
   КоличествоПолей=Rs.Fields.Count();
   Попытка
       for i = 0 to RS.Fields.Count-1  do //Создание и добавление колонок
           ColumnName = RS.Fields.Item(i).Name;
           ColumnName=СтрЗаменить(ColumnName,",","");
           ColumnName=СтрЗаменить(ColumnName," ","");
           ColumnName=СтрЗаменить(ColumnName,".","");
           ColumnName=СтрЗаменить(ColumnName,"-","");  
           ТаблицаЗагрузки.НоваяКолонка(ColumnName);
       enddo;
       
       СтрокаТЗ=1;
       while RS.EOF = 0 do // Заполнение созданной таблицы
           ТаблицаЗагрузки.НоваяСтрока();  
           for НомерСтолбца = 1 По RS.Fields.Count  do
               ТаблицаЗагрузки.УстановитьЗначение(СтрокаТЗ,НомерСтолбца,Строка(RS.Fields(НомерСтолбца-1).Value));
           enddo;
           RS.MoveNext();        
           СтрокаТз=СтрокаТЗ+1
       enddo;  
   Исключение
       Сообщить(ОписаниеОшибки());
   КонецПопытки;
   
   Rs.Close();
   Соединение.Close();
        ТаблицаЗагрузки.ВыбратьСтроку();


Может нужно не с помощью value эту колонку вытягивать?
1 ДенисЧ
 
24.09.12
12:58
а какой там тип? Если что, CAST'уй в строку.
2 ВежливаяТварь
 
24.09.12
12:59
(1) визуально тип число.
3 Jaap Vduul
 
24.09.12
13:02
numeric 7,7 не умеет
4 ВежливаяТварь
 
24.09.12
13:02
(1) Прочистал про CAST. не совсем понимаю как его вызвать из 1c
5 ВежливаяТварь
 
24.09.12
13:02
(3) А как вытащить?
6 Jaap Vduul
 
24.09.12
13:04
(4)Результат ХП - во временную таблицу и уже к ней запрос с преобразованием numeric во что-то, перевариваемое 7,7
7 ВежливаяТварь
 
24.09.12
13:04
(1) CAST вставить в сам запроса не получится так как я вызываю уже готовую процедуру.
8 Mikeware
 
24.09.12
13:10
(7) вызывай ее внутри запроса...
9 ВежливаяТварь
 
24.09.12
13:12
(8)    ТекстЗапроса="SET NOCOUNT ON exec [dbo].[rpt_SalOutList_Desktop]   @datefrom= '"+ДатаНачалаПроверки+"', @dateto='"+ДатаКонцаПроверки+"'"; Вы не подскажите как её сюда добавить?
10 Jaap Vduul
 
24.09.12
13:14
(9)
Если c t-sql не дружишь, можно рекордсет в виде строки получить (getstring()), а потом распарсить
11 ВежливаяТварь
 
24.09.12
13:15
(10) Понял. Сейчас попробую. Спасибо.
12 ВежливаяТварь
 
24.09.12
13:23
При попытке сделать так RS.GetString(НомерСтолбца-1)   выдаёт это
ADODB.Recordset: Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
13 Jaap Vduul
 
24.09.12
13:24
А это зачем?
НомерСтолбца-1
14 ВежливаяТварь
 
24.09.12
13:27
(13) А я понял мы получаем всю строку целиком все колонки в одной строке а потом уже разгребаем?
15 ВежливаяТварь
 
24.09.12
13:40
(13) Да получилось. Но если честно не очень нравится вариант разгребать всю строку, оставлю его как самый последний. Попробую подружится с t-sql. Скажите, а если передавать в тексте запроса не самоназвание процедуры а то, что она делает то можно будет в неё добавить CAST в тип данных строка.
16 Jaap Vduul
 
24.09.12
13:44
(15) см. (6)
Т.е.
create table ...
insert into ... exec ...
select ... from table
17 ВежливаяТварь
 
24.09.12
14:08
(16) Понял сейчас попробую
18 Mikeware
 
24.09.12
14:11
(16) временную можно заранее и не создавать....
(15) если можешь получить текст хранимки - естественно, сможешь.
19 ВежливаяТварь
 
24.09.12
15:59
Получилось вытянуть текст запроса, ни как не могу понять куда нужно вставить CAST, что бы   dbo.tblSalOutH.TotalSum читалось.

DECLARE @datefrom datetime  
SET @datefrom = '20120901'

DECLARE @dateto datetime
SET @dateto = '20120924'

BEGIN

set datefirst 1
set dateformat mdy

select
   dbo.tblSalOutH.Date,
   dbo.tblMerchandisers.MerchName,
   dbo.tblSalOutH.Invoice_No,
   dbo.tblOutletOrderH.OlOrderDate,
   dbo.tblOutletOrderH.OrderNo,
   dbo.tblSalOutH.TotalSum,
   dbo.tblDocTypes.DocTypeName
from
   dbo.tblSalOutH
left join dbo.tblMerchandisers on (dbo.tblMerchandisers.Merch_id = dbo.tblSalOutH.Merch_id)
left join dbo.tblOutletOrderH on (dbo.tblOutletOrderH.OrderNo = dbo.tblSalOutH.OrderNo)
inner join dbo.tblDocTypes on (dbo.tblDocTypes.Doc_Type = dbo.tblSalOutH.Doc_Type)
where
   convert (datetime, convert (varchar, dbo.tblSalOutH.date, 104), 104) between @datefrom and @dateto
   and
   dbo.tblSalOutH.[Status] = 2
   and
   dbo.tblSalOutH.Doc_Type in (2, 3, 4, 6)
order by
   Date,
   dbo.tblMerchandisers.MerchName

END
20 ВежливаяТварь
 
24.09.12
16:08
И ещё вопрос когда я вот так пытаюсь передать запрос

ТекстЗапроса="SET NOCOUNT ON
        |DECLARE @datefrom datetime  
        |SET @datefrom ='"+ДатаНачалаПроверки+"'
        |DECLARE @dateto datetime
        |SET @dateto = '"+ДатаКонцаПроверки+"'
        |BEGIN
        ||set datefirst 1
        |set dateformat mdy
        |select
        |    dbo.tblSalOutH.Date,
        |    dbo.tblMerchandisers.MerchName,
        |    dbo.tblSalOutH.Invoice_No,
        |   dbo.tblOutletOrderH.OlOrderDate,
        |   dbo.tblOutletOrderH.OrderNo,
        |  dbo.tblSalOutH.TotalSum,
        |    dbo.tblDocTypes.DocTypeName
        |from
        |    dbo.tblSalOutH
        |left join dbo.tblMerchandisers on (dbo.tblMerchandisers.Merch_id = dbo.tblSalOutH.Merch_id)
        |left join dbo.tblOutletOrderH on (dbo.tblOutletOrderH.OrderNo = dbo.tblSalOutH.OrderNo)
        |inner join dbo.tblDocTypes on (dbo.tblDocTypes.Doc_Type = dbo.tblSalOutH.Doc_Type)
        |where
        |    convert (datetime, convert (varchar, dbo.tblSalOutH.date, 104), 104) between @datefrom and @dateto
        |    and
        |    dbo.tblSalOutH.[Status] = 2
        |    and
        |    dbo.tblSalOutH.Doc_Type in (2, 3, 4, 6)
        |order by
        |    Date,
        |    dbo.tblMerchandisers.MerchName END";

выдаёт вот такую ошибку Microsoft OLE DB Provider for SQL Server: Неправильный синтаксис около конструкции "|".
21 ВежливаяТварь
 
24.09.12
16:11
(20) Прошу прощения, нашёл
22 vmv
 
24.09.12
16:14
(0) скорее это проблема источника ОДБС, вернее драйвера.

до последнего релиза платформы была схожая проблема с дробной частью под Оракл, полгода ее удавалось обходить путем установки костыльного драйвера.
23 ВежливаяТварь
 
24.09.12
16:26
(22) Учту. Спасибо.
24 ВежливаяТварь
 
24.09.12
17:01
Получилось. Может кому -нибудь пригодится:
    ТекстЗапроса="SET NOCOUNT ON
        |DECLARE @datefrom datetime  
        |SET @datefrom = '"+ДатаНачалаПроверки+"'
        |DECLARE @dateto datetime
        |SET @dateto = '"+ДатаКонцаПроверки+"'
        |
        |BEGIN
        |set datefirst 1
        |set dateformat mdy
        |
        |select
        |    dbo.tblSalOutH.Date,
        |    dbo.tblMerchandisers.MerchName,
        |    dbo.tblSalOutH.Invoice_No,
        | CAST (dbo.tblOutletOrderH.OlOrderDate AS Char(20)) As OlOrderDate,    
        | CAST (dbo.tblOutletOrderH.OrderNo AS Char(15)) As OrderNo,
        | CAST (dbo.tblSalOutH.TotalSum AS float) As TotalSum,
        |    dbo.tblDocTypes.DocTypeName
        |from
        |    dbo.tblSalOutH
        |left join dbo.tblMerchandisers on (dbo.tblMerchandisers.Merch_id = dbo.tblSalOutH.Merch_id)
        |left join dbo.tblOutletOrderH on (dbo.tblOutletOrderH.OrderNo = dbo.tblSalOutH.OrderNo)
        |inner join dbo.tblDocTypes on (dbo.tblDocTypes.Doc_Type = dbo.tblSalOutH.Doc_Type)
        |where
        |    convert (datetime, convert (varchar, dbo.tblSalOutH.date, 104), 104) between @datefrom and @dateto
        |    and  dbo.tblSalOutH.[Status] = 2 and  dbo.tblSalOutH.Doc_Type in (2, 3, 4, 6)
        |order by
        |    Date, dbo.tblMerchandisers.MerchName
              |END";

Всем огромное спасибо.
Основная теорема систематики: Новые системы плодят новые проблемы.