Имя: Пароль:
1C
 
Как передать параметр в запрос через ADO?
0 Doomer
 
22.10.10
08:18
Есть вот такой запрос к Парусу через ADO:
   ТекстЗапроса="SELECT zHIS.* FROM zHIS
   |WHERE (zHIS.YEAR) = YEAR)
   |and (zHIS.MONTH) = MONTH)";
Нужно передать параметры YEAR и MONTH. Оба параметра типа число. Что то я никак не пойму как передать параметры в запрос.
1 АйЭм
 
22.10.10
08:39
Я так понимаю, что ответ "либо сформируй программно текст запроса с указанием значения примитивного типа, либо задай свойства объектной переменной ADO, отвечающие за параметры и используй их в запросе" не подойдет?

Ну блин, давно это было и нету под рукой куска кода.
2 smitru
 
22.10.10
08:41
(0) э-э-э.. ну типа:

ТекстЗапроса="SELECT zHIS.* FROM zHIS
   |WHERE (zHIS.YEAR) = " + YEAR + ")
   |and (zHIS.MONTH) = "+ MONTH + ")";

И не париться :-)
3 АйЭм
 
22.10.10
08:49
+ на YEAR закатать Формат - чтобы год не получился 2 010. ))))
4 Сергей Д
 
22.10.10
08:50
Поглядел в одной дописанной конфигурации - везде формируется текст запроса, как показано в (2).
5 smitru
 
22.10.10
08:51
(4) (задумчиво) может мой код и смотрел? :-)))
6 Doomer
 
модератор
22.10.10
09:06
(2) Я так по началу и сделал. Пишет - не соответствие типов.
7 smitru
 
22.10.10
09:10
(6) а формат() как в (3)  - ставил?

И как может быть "несовпадение типов" если сам говоришь что там число?
8 agarych
 
22.10.10
09:13
ТекстЗапроса="SELECT zHIS.* FROM zHIS
   |WHERE (zHIS.YEAR) = 2010
   |and (zHIS.MONTH) = 10";

так то работает?
9 Doomer
 
22.10.10
09:19
Я вообще хотел разобраться с передачей параметров в запрос через ADO. А не просто решить локальную проблему.
10 DmitrO
 
22.10.10
09:20
(9) В MSDN все написано же
11 DmitrO
 
22.10.10
09:23
примерно так:
добавляется параметр типа строка:
Command.Parameters.Append(Command.CreateParameter(, 129, 1, 18, ПрефиксНомера));
12 agarych
 
22.10.10
09:32
Функция ВыполнитьADOЗапрос(Con, ТекстЗапроса, ХранимаяПроцедура = Ложь, СписокПараметров = Неопределено)
   
   Попытка
       Cmd = Новый COMОбъект("ADODB.Command");
       Cmd.ActiveConnection = Con;
       Если ХранимаяПроцедура Тогда
           Cmd.CommandType = ТипКомандыАДО("dcmdstoredproc");
           Для я = 0 По СписокПараметров.Количество() - 1 Цикл
               Параметр = Cmd.CreateParameter (СписокПараметров[я].Значение.ИмяПараметра, СписокПараметров[я].Значение.ТипЗначения, СписокПараметров[я].Значение.Тип, СписокПараметров[я].Значение.Размер, СписокПараметров[я].Значение.Значение);
               Cmd.Parameters.Append(Параметр);
           КонецЦикла;
       КонецЕсли;
       Cmd.CommandText = ТекстЗапроса;
       
       Rs = Новый COMОбъект("ADODB.RecordSet");
       Rs = Cmd.Execute(); //Выполнение и получение набора данных
       
   Исключение
   Конецпопытки;
   
   Возврат Rs;
   
КонецФункции

ну и сам вызов

       СписокПараметров = Новый СписокЗначений;
       Параметры = "ИмяПараметра, ТипЗначения, Тип, Размер, Значение";
       Параметр1 = Новый Структура(Параметры, "@request_no",    КонстантаАДО("adinteger"),    ТипПараметраАДО("adparaminput"), 4,        Номер);
       Параметр2 = Новый Структура(Параметры, "@closed_date",    КонстантаАДО("addate"),        ТипПараметраАДО("adparaminput"), 128,    Дата);
       Параметр3 = Новый Структура(Параметры, "@state",        КонстантаАДО("advarchar"),    ТипПараметраАДО("adparaminput"), 128,    Статус);
       Параметр4 = Новый Структура(Параметры, "@cancel",        КонстантаАДО("adinteger"),    ТипПараметраАДО("adparaminput"), 4,        Отклонена);
       
       СписокПараметров.Добавить(Параметр1);
       СписокПараметров.Добавить(Параметр2);
       СписокПараметров.Добавить(Параметр3);
       СписокПараметров.Добавить(Параметр4);
       
       Con = СоздатьAdoСоединение();
       ВыполнитьADOЗапрос(Con, "ib_chReqClosedDate", Истина, СписокПараметров);
13 Doomer
 
22.10.10
09:34
(8)Нет. Выдает "function name is missing.
14 agarych
 
22.10.10
09:44
ТекстЗапроса="SELECT zHIS.* FROM zHIS
   |WHERE zHIS.YEAR = 2010
   |and zHIS.MONTH = 10";


Может так? )
15 774816
 
22.10.10
09:45
(13)может проблема в названии колонок, называть колонки MONTH или YEAR может вызвать ошибку в запросе, попробуй так
SELECT zHIS.* FROM zHIS
   WHERE zHIS.[YEAR] = 2010
   and zHIS.[MONTH] = 10  
ЗЫ
какой тип субд  млм бд использует Парус?
16 Doomer
 
22.10.10
13:29
(15) БД FoxPro.
В вашем варианте вываливается синтаксическая ошибка при выполнении запроса.
17 774816
 
22.10.10
14:36
можно еще так попробовать
WHERE zHIS.`YEAR` = 2010
   and zHIS.`MONTH` = 10
18 smaharbA
 
22.10.10
14:42
Запрс - это тут adodb.recordset

   Попытка
       Команда=Запрос.ActiveCommand;
   Исключение
       Команда=СоздатьОбъект("ADODB.Command");
       Команда.ActiveConnection = Запрос.ActiveConnection;
       Команда.Prepared=-1;
   КонецПопытки;
   Параметры=Команда.Parameters;
   Если Параметры.Count=0 Тогда
       Стр="
       |DECLARE @Количество AS INT
       |DECLARE @ВидИД AS CHAR(4)
       |DECLARE @ДокИД AS CHAR(6)
       |DECLARE @ДатаНач AS CHAR(23)
       |DECLARE @ДатаКон AS CHAR(23)
       |DECLARE @Виды AS VARCHAR(255)
       |DECLARE @Режим AS INT
       |DECLARE @КоличествоАбсолютное AS INT
       |DECLARE @РежимОтбора AS INT
       |DECLARE @ТекстФункции AS VARCHAR(MAX)
       |SET @Количество=?
       |
       |SET @ТекстФункции='
       |CREATE FUNCTION _IdToStr(in AS INT)
       |    RETURNS CHAR(6)
       |    BEGIN
       |        DECLARE @out AS VARCHAR(10), @tmp AS INT
       |        IF in<=''0'' RETURN (''0'')
       |        SET @out=''''
       |        WHILE in>0
       |            BEGIN
       |                SET @tmp=in % 36 + 48
       |                SET @out=CHAR(CASE WHEN @tmp<58 THEN @tmp ELSE @tmp+7 END)+@out
       |                SET in=CEILING(in/36)
       |            END
       |        RETURN (SPACE(6-LEN(@out))+@out)
       |    END'
       |
       |IF OBJECT_ID('dbo._IdToStr') IS NULL EXEC (@ТекстФункции)
       |
       |SET @ВидИД=RIGHT(dbo._IdToStr(?),4)
       |SET @ДокИД=dbo._IdToStr(?)
       |SET @ДатаНач=?
       |SET @ДатаКон=?
       |SET @Виды=REPLACE(REPLACE(?,' ',''),CHAR(9),'')
       |SET @РежимОтбора=?
       |SET @Режим=ABS(@РежимОтбора)
       |SET @КоличествоАбсолютное=ABS(@Количество)
       |
       |SET @ТекстФункции='
       |CREATE FUNCTION _StrToId(in AS VARCHAR(10))
       |    RETURNS INT
       |    BEGIN
       |        DECLARE i AS INT,@out AS INT,@pos AS INT,@bas AS INT,@len AS INT
       |        SET in=LTRIM(RTRIM(in))
       |        SET @out=0
       |        SET i=1
       |        SET @bas=1
       |        SET @len=LEN(in)
       |        WHILE i<=@len
       |            BEGIN
       |                SET @pos=ASCII(RIGHT(in,i))-47
       |                SET @pos=(CASE WHEN @pos>10 THEN @pos-7 ELSE @pos END)
       |                -- SET @pos=CHARINDEX(SUBSTRING(in,@len-i+1,1),''0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'')
       |                IF @pos>0
       |                    BEGIN
       |                        SET @out=@out+(@pos-1)*@bas
       |                        SET @bas=@bas*36
       |                    END
       |                SET i=i+1
       |            END
       |        RETURN (@out)
       |    END'
       |
       |IF OBJECT_ID('dbo._StrToId') IS NULL EXEC (@ТекстФункции)
       |
       |SET NOCOUNT ON
       |SET ROWCOUNT @КоличествоАбсолютное
       |
       |SELECT
       |    -- TOP (@Количество)
       |    Журнал.IDDOCDEF AS [ВидИД],RTRIM(Журнал.IDDOC) AS [ДокИД],'{""O"",""0"",""0"",""'+CAST(Журнал.IDDOCDEF AS VARCHAR(10))+'"",""0"",""0"",""'+CAST(dbo._StrToId(Журнал.IDDOC) AS VARCHAR(10))+'""}' AS [ЗначениеВСтрокуВнутр]
       |FROM
       |    _1SJOURN Журнал(NOLOCK INDEX=ACDATETIME),
       |    _1SCRDOC Ссылки(NOLOCK INDEX=PARENT)
       |WHERE
       |    Журнал.DATE_TIME_IDDOC=Ссылки.CHILD_DATE_TIME_IDDOC
       |    AND Ссылки.MDID=0
       |    AND Ссылки.PARENTVAL='O1'+@ВидИД+@ДокИД
       |
       |    AND (
       |        Ссылки.CHILD_DATE_TIME_IDDOC
       |            BETWEEN @ДатаНач
       |        AND (
       |            CASE @ДатаКон
       |                WHEN '' THEN '999912311FFUO0ZIK0ZJ   '
       |                ELSE @ДатаКон
       |            END
       |            )
       |        )
       |
       |    AND (
       |            @Виды = ''
       |        OR
       |            (','+@Виды+',' LIKE '%,'+CAST(Журнал.IDDOCDEF AS VARCHAR)+',%' AND @РежимОтбора>=0)
       |        OR
       |            (','+@Виды+',' NOT LIKE '%,'+CAST(Журнал.IDDOCDEF AS VARCHAR)+',%' AND @РежимОтбора<0)
       |        )
       |
       |    AND Журнал.ISMARK = (
       |        CASE @Режим
       |            WHEN 1 THEN 0
       |            WHEN 4 THEN 1
       |            ELSE Журнал.ISMARK
       |        END
       |        )
       |    AND Журнал.CLOSED = (
       |        CASE @Режим
       |            WHEN 2 THEN 1
       |            WHEN 3 THEN 0
       |            ELSE Журнал.CLOSED
       |        END
       |        )
       |ORDER BY
       |    Ссылки.MDID, Ссылки.PARENTVAL,
       |    CASE
       |        WHEN @Количество<0 THEN Ссылки.CHILD_DATE_TIME_IDDOC
       |    END DESC,
       |    CASE
       |        WHEN @Количество>=0 THEN Ссылки.CHILD_DATE_TIME_IDDOC
       |    END ASC
       |";
       Команда.CommandText=Стр;
       Параметры.Append(Команда.CreateParameter(,3,1,4,Кол));
       Параметры.Append(Команда.CreateParameter(,3,1,4,ВидИД));
       Параметры.Append(Команда.CreateParameter(,3,1,4,ДокИД));
       Параметры.Append(Команда.CreateParameter(,129,1,23,ДатаНач));
       Параметры.Append(Команда.CreateParameter(,129,1,23,ДатаКон));
       Параметры.Append(Команда.CreateParameter(,200,1,255,Виды));
       Параметры.Append(Команда.CreateParameter(,3,1,4,Реж));
       Сообщить("Запрос подготовлен");
   Иначе
       Параметры.Item(0).Value=Кол;
       Параметры.Item(1).Value=ВидИД;
       Параметры.Item(2).Value=ДокИД;
       Параметры.Item(3).Value=ДатаНач;
       Параметры.Item(4).Value=ДатаКон;
       Параметры.Item(5).Value=Виды;
       Параметры.Item(6).Value=Реж;
   КонецЕсли;
   Запрос.CursorType=0;
   Запрос.Open();
   Сч=0;
   Если Запрос.EOF=0 Тогда
19 smaharbA
 
22.10.10
14:43
пля !!! не думал, что так многа текста )))
20 smaharbA
 
22.10.10
14:44
прикол

@in AS VARCHAR(10)
21 smaharbA
 
22.10.10
14:46
еще разог

Это чё @in AS VARCHAR(10)

22 Megas
 
22.10.10
14:47
Set  @Year =  
Предлагали?
23 smaharbA
 
22.10.10
14:47

       |
       |CREATE FUNCTION _IdToStr(@in AS VARCHAR(10))
       |
24 smaharbA
 
22.10.10
14:47
что за фигня на @in в (18) вышла ?
25 Megas
 
22.10.10
14:48
(19) А нафига объявлять? Оно само определиться как надо вроде.
26 smaharbA
 
22.10.10
14:49
(25) этот кусок в контексте работает иначе чем кажется
27 Megas
 
22.10.10
14:50
А вот
   
ТекстЗапроса="SELECT zHIS.* FROM zHIS

   |WHERE (zHIS.YEAR) = '2010'
   |and (zHIS.MONTH) = '10'";
так пробовал?

' - проставлять