|
Формат даты при связке рекордсет - эксель - 1С | ☑ | ||
---|---|---|---|---|
0
nikolas260579
30.05.17
✎
11:14
|
Здравствуйте. Наверное, стандартный вопрос, но пока не могу найти ответ. Через АДО читаю экселевский файл. При этом возникает косяк с датами. Т.е. в ячейке стоит дата и время, например 23.05.2017 8:52
, формат - все форматы. А при чтении этой колонки с датами через 1с-ку я получаю значение "42878.369444". Т.е. текстовый формат. Почему так? В локальных настройках надо что-то изменить? Или в коде указать формат даты? Заранее спасибо. Connection = Новый COMОбъект("ADODB.Connection"); Recordset = Новый COMОбъект("ADODB.Recordset"); ВПервойСтрокеДанные = Истина; Connection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Файл + ";Extended Properties=""Excel 12.0;" + ?(ВПервойСтрокеДанные, "HDR=NO;", "HDR=YES;") + "IMEX=1;"""; Connection.Open(); Recordset = Connection.OpenSchema(20); Если Не Recordset.EOF Тогда ////проверим имена листов //Для Каждого Поле Из Recordset.Fields()Цикл // //КонецЦикла; ИмяЛиста = Recordset.Fields("TABLE_NAME").Value; Иначе ТекстСообщения = ТекстСообщения + Символы.ПС + "- Лист с данными не обнаружен"; Отказ = Истина; Возврат Ложь; КонецЕсли; Recordset.Close(); Исключение Инфо = ИнформацияОбОшибке(); ТекстСообщения = ТекстСообщения + Символы.ПС + "- Ошибка: Описание='" + Инфо.Описание + ?(Инфо.Причина = Неопределено, "", ", " + Инфо.Причина.Описание) + "', Модуль='" + Инфо.ИмяМодуля + "', Строка='" + Инфо.НомерСтроки + ":" + Инфо.ИсходнаяСтрока + "'"; Отказ = Истина; Возврат Ложь; КонецПопытки; ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "]"; Recordset.Open(ТекстЗапроса, Connection); |
|||
1
h-sp
30.05.17
✎
12:13
|
к чему этот кусок программы? Где тут даты?
|
|||
2
nikolas260579
30.05.17
✎
13:42
|
(1) вот здесь я текст получаю, а не дату
Пока Recordset.EOF() = Ложь Цикл Значение_ДатаВремя = СокрЛП(Recordset.Fields.Item(0).Value); |
|||
3
dezss
30.05.17
✎
13:44
|
а если
Значение_ДатаВремя = Дата(Recordset.Fields.Item(0).Value); что получишь? или можно даже так попробовать Значение_ДатаВремя = Дата(СокрЛП(Recordset.Fields.Item(0).Value)); |
|||
4
dezss
30.05.17
✎
13:45
|
просто не забывай, что СокрЛП всегда вернет строку, он не работает с датами.
|
|||
5
nikolas260579
30.05.17
✎
13:47
|
(3) Вылетает ошибка: "Преобразование к типу дата не может быть выполнено".
|
|||
6
nikolas260579
30.05.17
✎
13:49
|
Recordset.Fields.Item(0).DataFormat = Неопределено. Может, тут что кроется?
|
|||
7
dezss
30.05.17
✎
13:54
|
(5) значит он не считает это датой.
а если указать тип не общий, а дата, прокатывает? |
|||
8
nikolas260579
30.05.17
✎
13:57
|
а в экселе между значением даты в текстовом формате и разностью дат от 01.01.1900 есть разница? Просто я посчитал разность дат между началами дней 23.05.2017 и 01.01.1900, у меня получилось 42876. Если это дата с плавающей точкой, то вроде без часов, минут, секунд должно быть 42878?
(5) у меня не прошло пока |
|||
9
Rokford
30.05.17
✎
14:35
|
(3),(5)
Просто для преобразования в дату строка должна быть не "23.05.2017", а "2017.05.23" (в СП прописано). Как вариант (без учета часов и минут) массивДата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СокрЛП(Recordset.Fields.Item(0).Value), "."); Значение_ДатаВремя = Дата(массивДата[2], массивДата[1], массивДата[0]) |
|||
10
nikolas260579
30.05.17
✎
14:41
|
(9)массивДата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СокрЛП(Recordset.Fields.Item(0).Value), ".");
по причине: Произошла исключительная ситуация (ADODB.Field): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись. |
|||
11
nikolas260579
30.05.17
✎
14:44
|
Вопрос: почему, если я в экселе в функцию ДАТАЗНАЧ вставляю свою дату 23.05.2017 8:52, то получаю "42878.369444". Если я делаю РАЗНОСТЬДАТ() в запросе 1С, то получаю 42876?
|
|||
12
nikolas260579
30.05.17
✎
14:44
|
где копать?
|
|||
13
Операция 1Ы
30.05.17
✎
15:09
|
потому что
РАЗНОСТЬДАТ имеет числовой результат с 10 цифрами в целой части. Дробная часть отсутствует. |
|||
14
nikolas260579
30.05.17
✎
15:20
|
РазницаВСекундах = ДатаКон - ДатаНач;
РазницаВДнях = РазницаВСекундах/86400; ДатаКон = 23.05.2017 8:52, датанач = 01.01.1900 00:00:00. Получилось 42876.36944. Пока не понял, где я 2 дня потерял. |
|||
15
SSSSS_AAAAA
30.05.17
✎
16:20
|
(14) Опорной датой в некоторых случаях служит 30-12-1899
|
|||
16
nikolas260579
30.05.17
✎
16:33
|
(14)Спасибо, в экселе дате 01.01.1900, как оказалось, уже по умолчанию присвоено значение 1, и конечной дате - тоже 1. Вот два дня и взялись.
|
|||
17
nikolas260579
30.05.17
✎
16:33
|
(15), а не (14)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |