Имя: Пароль:
1C
1C 7.7
v7: Как в ВыполнитьSQL_ИзТЗ передать DATETIME?
0 toypaul
 
гуру
10.12.13
12:46
Как в 1C++ в методе ВыполнитьSQL_ИзТЗ в таблице передать datetime (дату и время)?

Как строку 1998-09-24 10:02:20 передать не получается.
1 МихаилМ
 
10.12.13
13:09
получается . скорее всего Вы наступили на грабли: в скл >=2008

поменялся формат представления литерала даты
2 Mikeware
 
10.12.13
13:18
(1) у меня тоже не получалось, на 2000.
(0) передавай как строку и кастуй к datetime в замом запросе
3 Sorm
 
10.12.13
13:23
(0) Передавай как обычно "yyyyMMddhhmmss"
4 Mikeware
 
10.12.13
13:26
(3) попробовал. не получилось
5 Sorm
 
10.12.13
13:27
(0) Сорри, ошибся.
(4) Однако тоже. Что за ..? Ща разберемся.
6 toypaul
 
гуру
10.12.13
13:31
у меня 2000 сервер. есть мысль, что в 1С++ идет преобразование строки к дате некорректно. то есть 1С++ смотрит что поле datetime и думает (ИМХО) что будет передаваться тип Дата.

ну и следовательно выдается ошибка Неверный параметр дата.
7 toypaul
 
гуру
10.12.13
13:33
(2) пробовал в параметрическом запросе писать как

VALUES(?,?,CONVERT(DATETIME,?),?)

так выдает другую ошибку.

видимо придется делать построчную вставку ...
8 Sorm
 
10.12.13
13:34
(0) Хммм.. работает и 'yyyy-MM-dd hh:mm:ss' и 'dd-MM-yyyy hh:mm:ss'.
9 toypaul
 
гуру
10.12.13
13:35
(8) код какой?
10 toypaul
 
гуру
10.12.13
13:35
у меня такой не работает

    ТабЛога = СоздатьОбъект("ТаблицаЗначений");
    ТабЛога.НоваяКолонка("base_from","Строка",3);
    ТабЛога.НоваяКолонка("base_to","Строка",3);
    //ТабЛога.НоваяКолонка("eventdate","Строка",19); //1998-09-24 10:02:20
    ТабЛога.НоваяКолонка("eventdate","Дата"); //1998-09-24 10:02:20
    
    ТабЛога.НоваяКолонка("result","Число",1);
    ТабЛога.НоваяКолонка("direction","Число",1);
    ТабЛога.НоваяКолонка("error","Строка",300);
    
    ТекДата = ТекущаяДата();
    ДатаСКЛ = Формат(ДатаГод(ТекДата),"Ч(0)4")+"-"+Формат(ДатаЧисло(ТекДата),"Ч(0)2")+"-"+Формат(ДатаМесяц(ТекДата),"Ч(0)2");
    ДатаСКЛ = ДатаСКЛ + " "+ ТекущееВремя();
    
    Сообщить(ДатаСКЛ);

    ТабЛога.НоваяСтрока();
    ТабЛога.base_from = "111";
    ТабЛога.base_to = "222";
    ТабЛога.eventdate = ТекущаяДата();
    ТабЛога.result = 0;
    ТабЛога.direction = 1;
    ТабЛога.error = "ввв";
    
    Сообщить(ТабЛога.eventdate);

    ТабЛога.НоваяСтрока();
    ТабЛога.base_from = "333";
    ТабЛога.base_to = "444";
    ТабЛога.eventdate = ТекущаяДата();
    ТабЛога.result = 1;
    ТабЛога.direction = 2;
    ТабЛога.error = "";
    
    ЗаписатьТаблицуЛогаУРБД(ТабЛога);
11 toypaul
 
гуру
10.12.13
13:36
ой. это я уже переделывал.
12 toypaul
 
гуру
10.12.13
13:36
вот такой код

    ТабЛога = СоздатьОбъект("ТаблицаЗначений");
    ТабЛога.НоваяКолонка("base_from","Строка",3);
    ТабЛога.НоваяКолонка("base_to","Строка",3);
    ТабЛога.НоваяКолонка("eventdate","Строка",19); //1998-09-24 10:02:20
    //ТабЛога.НоваяКолонка("eventdate","Дата"); //1998-09-24 10:02:20
    
    ТабЛога.НоваяКолонка("result","Число",1);
    ТабЛога.НоваяКолонка("direction","Число",1);
    ТабЛога.НоваяКолонка("error","Строка",300);
    
    ТекДата = ТекущаяДата();
    ДатаСКЛ = Формат(ДатаГод(ТекДата),"Ч(0)4")+"-"+Формат(ДатаЧисло(ТекДата),"Ч(0)2")+"-"+Формат(ДатаМесяц(ТекДата),"Ч(0)2");
    ДатаСКЛ = ДатаСКЛ + " "+ ТекущееВремя();
    
    Сообщить(ДатаСКЛ);

    ТабЛога.НоваяСтрока();
    ТабЛога.base_from = "111";
    ТабЛога.base_to = "222";
    ТабЛога.eventdate = ДатаСКЛ;
    ТабЛога.result = 0;
    ТабЛога.direction = 1;
    ТабЛога.error = "ввв";
    
    Сообщить(ТабЛога.eventdate);

    ТабЛога.НоваяСтрока();
    ТабЛога.base_from = "333";
    ТабЛога.base_to = "444";
    ТабЛога.eventdate = ДатаСКЛ;
    ТабЛога.result = 1;
    ТабЛога.direction = 2;
    ТабЛога.error = "";
    
    ЗаписатьТаблицуЛогаУРБД(ТабЛога);
13 toypaul
 
гуру
10.12.13
13:37
Процедура ЗаписатьТаблицуЛогаУРБД(ТабЛога)
    
    RecordSet.Подготовить("INSERT urbd_log.dbo.log(base_from,base_to,eventdate,result,direction,error) VALUES (?,?,?,?,?,?)");
    RecordSet.ВыполнитьSQL_ИзТЗ(ТабЛога);
    
КонецПроцедуры // ЗаписатьТаблицуЛогаУРБД
14 toypaul
 
гуру
10.12.13
13:38
пля ... ну я тупой
15 toypaul
 
гуру
10.12.13
13:38
хотя один фиг. перепутал дату с месяцем - всеравно месяц за 12 не вылазит...
16 МихаилМ
 
10.12.13
13:39
(13)
а где описание параметров ?
17 toypaul
 
гуру
10.12.13
13:39
2013-12-10 13:38:35
2013-12-10 13:38:35
RecordSet.ВыполнитьSQL_ИзТЗ(ТабЛога);
{E:\PROJECTS\1C\V7\***\ТИС\EXTFORMS\ОБМЕНУРБД.ERT(302)}: Произошла ошибка при выполнении запроса.                  
State 22007, native 0, message [Microsoft][ODBC SQL Server Driver]Недопустимый формат времени
18 toypaul
 
гуру
10.12.13
13:40
(16) я с 1С++ не дружу. про какое описание параметров речь?
19 toypaul
 
гуру
10.12.13
13:43
если писать как в (10), то работает без всякого описания параметров
20 Mikeware
 
10.12.13
13:45
(19)
ДобПараметр(<?>)
AddParam(<?>)
Синтаксис:
ДобПараметр(<IOType>,<nSQLType>,<nLen>,<nDec>,<pname>)
Назначение:
добавляет описание параметра для параметризированного запроса.
Параметры:
<IOType> - (Число)  * 1 - SQL_PARAM_INPUT
* 2 - SQL_PARAM_OUTPUT
* 3 - SQL_PARAM_INPUT_OUTPUT
<nSQLType> - (Число)  * 1  - SQL_BIT
* 2  - SQL_TINYINT
* 3  - SQL_SMALLINT
* 4  - SQL_INTEGER
* 5  - SQL_REAL
* 6  - SQL_FLOAT
* 7  - SQL_DOUBLE
* 8  - SQL_TYPE_DATE
* 9  - SQL_TYPE_TIME
* 10 - SQL_TYPE_TIMESTAMP
* 11 - SQL_NUMERIC
* 12 - SQL_DECIMAL
* 13 - SQL_BIGINT
* 14 - SQL_CHAR
* 15 - SQL_VARCHAR
* 16 - SQL_LONGVARCHAR
* 17 - SQL_BINARY
* 18 - SQL_VARBINARY
* 19 - SQL_LONGVARBINARY
<nLen> - (Число)  длина
<nDec> - (Число)  точность
<pname> - (Строка)  Необязательный параметр.   именованный параметр вида Par1, необязательный параметр.
21 Mikeware
 
10.12.13
13:45
(16)Но с ним тоже не работало
22 toypaul
 
гуру
10.12.13
15:08
тынц
23 Sorm
 
10.12.13
15:13
(22) Профайлер запусти, посмотри, что там тебе 1с++ пытается с датой сделать.
24 toypaul
 
гуру
10.12.13
15:25
(23) да ничего не пытается. ошибка видимо возникает до отправки запроса на сервер.
25 Serginio1
 
10.12.13
15:35
26 Serginio1
 
10.12.13
15:44
Проще сделать Insert в цикле.
ТекстЗапроса = "insert into #ВидДок (Vid,ID36,ID10) values ('"+Вид+"','"+ИД36+"',"+ИД10+")";
рс.Выполнить(ТекстЗапроса)
27 Дык ё
 
10.12.13
15:53
10 это SQL_TYPE_TIMESTAMP, это одибисишный тип который для MSSQL соответствует типу datetime, а не timestamp.
Дело в том, что следующим параметром необходимо указать длину буфера в байтах, которая должна быть не меньше длины структуры SQL_TIMESTAMP_STRUCT.
Т.е. так надо:
ЗапросОстатковРезервов.AddParam(1,10,20,0);

(c) DmitrO
28 toypaul
 
гуру
10.12.13
16:24
(27) хитро.

но уже сделал запрос в цикле :)
29 Jaap Vduul
 
10.12.13
16:27
А я бы вот так сделал и не парился:
alter table dbo.log add constraint log_eventdate_def default getDate() for eventdate
30 КонецЦикла
 
10.12.13
16:40
А что нельзя самому построчно засунуть?
31 Ёпрст
 
10.12.13
18:40
32 toypaul
 
гуру
11.12.13
10:09
(31) спасибо. попробую.

пробовал искать на 1спп форуме, но видимо как-то не так искал. искал по ВыполнитьSQL_ИзТЗ - вообще ничего не нашло
33 toypaul
 
гуру
11.12.13
10:16
(31) да работает. видимо все-таки надо было добавить параметр правильно ... ну и cast
34 Ёпрст
 
11.12.13
10:40
(33) заметь, кто вопрос там спрашивал
:)
35 toypaul
 
гуру
11.12.13
10:58
(34) :)