Имя: Пароль:
1C
1C 7.7
v7: ADODB.Command - ошибка при работе с параметром
0 pincet
 
16.01.15
11:33
кусок запроса
|WHERE 1=1
|AND M.MANDT='500'
|AND M.CHARG='1215010801'
|AND MA.MATKL=?

код 1с

command=createobject("ADODB.Command");
command.ActiveConnection=sapADO;
command.CommandType=1;
command.CommandText=commandText;
command.Parameters.Append(command.CreateParameter("@matkl",129,1,8,"1145100"));
command.Execute(,,);

вываливается с ошибкой

Microsoft OLE DB Provider for SQL Server: Incorrect syntax near the keyword 'DEFAULT'

в где править?
1 aka AMIGO
 
модератор
16.01.15
11:38
Не стОит коверкать язык на мисте
2 pincet
 
16.01.15
15:13
самое печальное в том, что из vba, к примеру, все отрабатывает
3 spectre1978
 
16.01.15
23:38
А что за база?
На Access я бы, к примеру, написал
AND MA.MATKL=:MATKL
4 spectre1978
 
16.01.15
23:39
и далее CreateParameter("matkl", ...
5 b_ru
 
17.01.15
00:06
Вроде в тексте ошибки все ясно написано, а тс даже текст запроса зажал. Я вот не помню, чтобы в oracle sql ключевое слово DEFAULT можно было в DML использовать.

З.Ы. Базис то уши не надерет за прямую работу с таблицами БД? Или это перевалочная база какая-то?
6 pincet
 
19.01.15
09:16
(5) не надерет, там схема только чтение
В тексте-то написано, но никаких DEFAULT я в T-SQL не знаю
Сервер - сиквел.
А запрос - мне не жалко , вот
|SELECT MAT    
            |,CAST([031] AS DATE) FISHDATE
            |,[032] PLANT
            |,[043] [RAW]
            |,CAST([049] AS FLOAT) PRICE
            |,CAST([050] AS FLOAT) VPRICE
            |,CAST([400] AS DATE) LOBM_VFDAT
            |,[422] LOBM_HSDAT
            |
            |FROM
            |(
            |
            |SELECT MA.MATNR MAT
            |    ,PIVOTF=
            |    CASE
            |        WHEN ATINN='0000000031' THEN STR(ATFLV)
            |        WHEN ATINN='0000000032' THEN ATWRT
            |        WHEN ATINN='0000000043' THEN ATWRT
            |        WHEN ATINN='0000000049' THEN STR(ATFLV,6,2)
            |        WHEN ATINN='0000000050' THEN STR(ATFLV,6,2)
            |        WHEN ATINN='9999999400' THEN STR(ATFLV)
            |        WHEN ATINN='9999999422' THEN STR(ATFLV)
            |    END
            |    ,SUBSTRING(ATINN,8,3) ATINNN
            |FROM MCH1 M
            |INNER JOIN MARA MA
            |ON MA.MANDT=M.MANDT
            |AND MA.MATNR=M.MATNR
            |INNER JOIN AUSP AU
            |ON M.MANDT=AU.MANDT
            |AND M.CUOBJ_BM=AU.OBJEK
            |WHERE 1=1
            |AND M.MANDT='500'
            |AND M.CHARG='1215010801'
            |AND MA.MATKL=@matkl) PT
            |
            |PIVOT
            |(    
            |        max(PIVOTF) FOR ATINNN IN([031],[032],[043],[049],[050],[400],[422])
            |) P
            |";
7 pincet
 
19.01.15
09:17
(6) вместо
AND MA.MATKL=@matkl
читать AND MA.MATKL=?
8 Jaap Vduul
 
19.01.15
09:52
'default' oledb провайдер подставляет в качестве значения при создании параметра, что-то типа такого:
declare @p1 varchar(8)
set @p1=default
Потом default заменяется на значение параметра.
Т.е. похоже в данном случае ado не может корректно распарсить текст запроса и ожидает значение более чем для одного параметра.
Можно попробовать добавить ещё одно объявление параметра (command.Parameters.Append(command.CreateParameter(...), т.е. что-то типа заглушки.
9 pincet
 
19.01.15
10:07
Я думаю не ADO, а 1с++ глючит где-то.
Добавить еще один параметр - не взлетает тоже, ошибка
Microsoft OLE DB Provider for SQL Server: Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена.
Что, в принципе, предсказуемо
Неужели будлокодить придется и конструировать текст запроса при помощи + ?
10 Ёпрст
 
гуру
19.01.15
10:09
>>>а 1с++ глючит где-то.

1с++ тут то вообще коим боком ?????

И еще, если есть 1с++, нахрена весь этот нелепый код  с АДО ???
11 Jaap Vduul
 
19.01.15
10:11
(10) +1
(9) Перед command.Execute() проверь, что у тебя в коллекции command.Parameters находится. Ну и я бы первым делом в профайлере посмотрел, что на сервер из 1цэ отправляется.
12 pincet
 
19.01.15
10:50
(10) что такого нелепого в ADO?
13 pincet
 
19.01.15
10:56
(11) на сервер ничего не уходит (в профайлере трассы с моим запросом нет)
14 pincet
 
19.01.15
11:04
(11) в Parameters мой параметр
15 pincet
 
19.01.15
11:13
command.Parameters.Append(command.CreateParameter("par1",129,1,8,"1145100"));
message(command.Parameters(0).Name);

par1
16 Jaap Vduul
 
19.01.15
11:31
(12) Имелось в виду, что непонятно, почему используется ADO, если в конфигурации уже используется 1цэ++.
(13) >>на сервер ничего не уходит
Надо нормально настроить профайлер - либо фильтры стоят из-за которых не видно активности oledb, либо мониторятся не те события (используйте, например шаблон TSQL_Replay).
(14), (15) >>в Parameters мой параметр
Это и так понятно. Но ведь там, скорее всего, ещё что-то нежелательное.
command.Parameters.count?
17 pincet
 
19.01.15
11:32
(16)
message(command.Parameters.count)

1
18 pincet
 
19.01.15
11:33
По незнанию думалось, что ADODB.Connection требует 1с++
19 Jaap Vduul
 
19.01.15
11:38
(17)
command.Parameters(0).value?

Ещё можно попробовать не создавать явно параметр, а вместо этого использовать command.Parameters.refresh()
и затем установить значение параметра:
command.Parameters(0).value = ...
20 pincet
 
19.01.15
11:45
на refresh()
Microsoft OLE DB Provider for SQL Server: Ошибка синтаксиса или нарушение прав доступа
21 Jaap Vduul
 
19.01.15
11:59
(20)Точно, oledb не может распарсить текст запроса, когда токены параметров находятся внутри вложенного запроса.
Переписывай на использование временной таблицы или хранимки.
22 pincet
 
19.01.15
12:30
(21) Excel и 1цэ пользуют один (SQLOLEDB) драйвер.
так вот Excel все спокойно хавает ЧЯДНТ?
23 pincet
 
19.01.15
15:21
up
24 pincet
 
19.01.15
15:58
шишкин лес. Даже Provider=SQLNCLI10 ругается
Microsoft SQL Server Native Client 10.0: Incorrect syntax near the keyword 'DEFAULT'
ппц какой-то
25 pincet
 
19.01.15
16:15
(16) включил только события oledb - тишина на сервере
26 pincet
 
19.01.15
16:17
(25) только есть подозрение, что это монитор вызовов со стороны сервера, а не к нему
27 Fragster
 
гуру
19.01.15
16:19
Команда = СоздатьКомандуАДО(Соединение,
        "SELECT
        |    [DOCUMENTTYPE]
        |    ,[RECORDID]
        |    ,[STATUS]
        |    ,[LOADEDDATETIME]
        |    ,[ITEMID]
        |    ,[ITEMBarcode]
        |FROM [FSINVENTBarcodeDAX]
        |WHERE
        |    RecordId IN
        |        (SELECT
        |            Min([RECORDID])
        |        FROM
        |            [FSINVENTBarcodeDAX]
        |        WHERE
        |            [STATUS] = ?
        |        GROUP BY
        |            [ITEMBarcode])
        |");
    
    Параметры = Новый COMSafeArray("VT_VARIANT", 1);
    Параметры.SetValue(0, мСтатусыСтрок.Выгружено);
    
    Recordset = Команда.Execute(,Параметры);




Функция СоздатьКомандуАДО(Соединение, Текст)
    Команда = Новый ComОбъект("ADODB.Command");
    Команда.ActiveConnection = Соединение;
    
    Команда.CommandType = мМагияСКЛ.adCmdText;
    Команда.Prepared = Истина;
    
    Команда.CommandText = Текст;
    Возврат Команда;
КонецФункции
28 Fragster
 
гуру
19.01.15
16:20
// магические числа
мМагияСКЛ = Новый Структура;

...
мМагияСКЛ.Вставить("adCmdText", 1);
...
29 pincet
 
19.01.15
16:39
:D спасибо, все гораздо проще (впрочем, как обычно)
command.Execute();
и все.
30 Ёпрст
 
гуру
19.01.15
16:40
Строка соединения какая хоть ?
31 Ёпрст
 
гуру
19.01.15
16:40
command.Parameters(0).value?
32 Ёпрст
 
гуру
19.01.15
16:42
и еще, на всякий..в качестве бреда пита:

//command.Parameters.Append(command.CreateParameter("par1",129,1,8,"1145100"));

Param = Command.CreateParameter("par1",129,1);
Command.Parameters.Append(Param );
Param.Value = "1145100";
33 pincet
 
19.01.15
16:47
пичалька только в execute() - вся благородная публика (со мной во главе) не заметила про execute(,,). Вот и вся любовь
34 pincet
 
19.01.15
16:49
(10) 1с++ видимо рациональней пользовать - с ADO много лисапедов рисовать придется
35 Ёпрст
 
гуру
19.01.15
16:58
(34) с 1cpp , просто проще и удобнее