Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Йоксель.КонвертерВТаблицуЗначений портит числовые значения

v7: Йоксель.КонвертерВТаблицуЗначений портит числовые значения
Я
   АЛьФ
 
04.01.21 - 17:25
Вроде как много лет пользуемся Йоксель.КонвертерВТаблицуЗначений для загрузки из Excel. Но тут обнаружилось, что для некоторых файлов, в некоторых ячейках возвращает странно преобразованные числа.
Например, есть отчет, выгруженных из восьмерки в xls, мы его загружаем с помощью компоненты 7.7 и вместо суммы "12345,67" неожиданно видим "12345,66999999999999". Пытался пофиксить округлением, но это очень некрасиво. Кто-нибудь сталкивался? Как решить?
На родном форуме Йоксель подобную проблему не нашел. И, к сожалению, искать там помощи похоже бесполезно, ветки годами висят без ответа.
   DJ Anthon
 
1 - 04.01.21 - 21:54
Не знаю, я любые числовые данные при расчетах в 1Ске округляю. Даже сложению не доверяю.
   Злопчинский
 
2 - 04.01.21 - 23:33
1. убедиться что в отчете Экселя в ячейке ЗНАЧЕНИЕ именно .67, а не форматное отображение с двумя знаками после запятой
2. смириться.
3. формировать в экселе значения не числами, а строками
.
я как-то достаточно часто йокселем гружу, на такое не напарывался. или может везло...
ну и версия йокселя какая, на всяк случай
   АЛьФ
 
3 - 05.01.21 - 09:08
2(2)
1. Первым делом убедился.
2. Это не наш путь.
3. В принципе помогает, но это надо будет предварительно шерстить все входящие файлы. Не вариант :(

Версия Йокселя последняя - 1.1.27
   Salimbek
 
4 - 05.01.21 - 09:20
(3) Типа на это наступили?
https://habr.com/ru/post/337260/

Если да, то без округления никак.

З.Ы. При написании курсовой на ТурбоПаскале напоролся как-то, что pi/2-pi/2<>0
   АЛьФ
 
5 - 05.01.21 - 12:30
Чтобы не создавать новую тему попробую тут продолжить.
Решил переделать на запрос к файлу xls. Получается примерно такой код:
    База = СоздатьОбъект("ODBCDatabase");
    Если База.Соединение("DRIVER=Microsoft Excel Driver (*.xls); DBQ=" + СокрЛП(ИмяФайла) + ";") = 0 Тогда
        Сообщить("Ошибка открытия файла");
        Возврат 0;
    КонецЕсли;

    RecordSetXLS =СоздатьОбъект("ODBCRecordSet");
    RecordSetXLS.УстБД(База);
    ТекстЗапроса = "SELECT * FROM [" + ИмяПервогоЛиста + "]";
    
    RecordSetXLS.Отладка(1);
    тзРезультат = RecordSetXLS.ВыполнитьИнструкцию(ТекстЗапроса);

Естественно, в колонках данные разнотипные. И если в колонке сначала идет текстовое значение, а потом числовое, то числовое тупо получается пустым.
Можно как-то типизировать эту выборку? Или сделать CAST выбираемым значениям?

Пробовал для начала вот так:

SELECT CAST([F1] AS VARCHAR(100)),CAST([F2] AS VARCHAR(100)),CAST([F3] AS VARCHAR(100)),CAST([F4] AS VARCHAR(100)),CAST([F5] AS VARCHAR(100)),CAST([F6] AS VARCHAR(100)) FROM [Sheet1$]

Получил ошибку:
State 42000, native 4294964196, message [Microsoft][Драйвер ODBC Excel] Ошибка синтаксиса (пропущен оператор) в выражении запроса 'CAST([F1] AS VARCHAR(100))'.
   mistеr
 
6 - 05.01.21 - 12:51
(2) 4. Перейти наконец на нормальные форматы для транспорта данных, вместо гребаного Экселя.
   АЛьФ
 
7 - 05.01.21 - 12:56
2(6) Гениально! И как это я раньше-то не додумался?! Осталось поставить об этом в известность китайцев и финнов, который нам 10 лет вообще в PDF слали.
   mistеr
 
8 - 05.01.21 - 13:05
(7) >отчет, выгруженных из восьмерки в xls

О, постановка расширяется по ходу пьесы.
Ну, хотя бы попросите китайцев в xlsx выгружать.
   Salimbek
 
9 - 05.01.21 - 13:10
(5) Тут: https://stackoverflow.com/questions/10587993/cast-or-convert-in-excel-query
советуют Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";
   АЛьФ
 
10 - 05.01.21 - 13:11
2(9) Спасибо.
   АЛьФ
 
11 - 05.01.21 - 13:12
2(8) А, точно! Надо еще 1С и Сбер поставить в известность о принятом решении. Пусть поправят у себя.
   Salimbek
 
12 - 05.01.21 - 13:13
+(8) А тут: https://stackoverflow.com/questions/4900418/cast-a-data-type-with-the-odbc-excel-driver
советуют для вашего драйвера так:

Try:
rs.Open("SELECT CStr([Code]), Description FROM [sheet1$]", sconn)
Cast is not available in Jet/ACE SQL.
   Salimbek
 
13 - 05.01.21 - 13:14
   АЛьФ
 
14 - 05.01.21 - 13:32
2(12) И еще раз спасибо.
Пишет: "Недопустимое использование Null". ISNULL не удалось туда вписать.

Еще одна проблема нарисовалась. "DRIVER=Microsoft Excel Driver (*.xls);" не воспринимает "HDR=NO;" и постоянно по первой строке именует колонки. Пока это проблем не создает, но в общем решении это будет проблемой :(
   Salimbek
 
15 - 05.01.21 - 13:42
(14) А так? IIF(IsNull(Value),0,CStr(Value))
   Злопчинский
 
16 - 05.01.21 - 13:51
(7) Ты их заборол и начали слать в экселе!? ;-)
   Злопчинский
 
17 - 05.01.21 - 13:52
А нельзя тупо из экселя не запросом а через объект эксель? и тащить не value, а text?
   АЛьФ
 
18 - 05.01.21 - 14:00
2(15) Ошибку выдавать перестало, но все равно числовые данные пустыми выдает.

Подсказка в (9) натолкнула на мысль. Числовые данные получил, но пропали некоторые текстовые... Ы... :)
   АЛьФ
 
19 - 05.01.21 - 14:01
2(17) Можно. А потом что? До безалкогольного пива и резиновой женщины скатимся?
   Djelf
 
20 - 05.01.21 - 14:08
(0) Да есть тема на сайте Йокселя: http://yoksel.net.ru/forum/topic.php?id=171
А в чем проблема типизировать ТЗ через УстановитьПараметрыКолонки?
Со сложным форматированием так не получится, но с ним и КонвертерВТаблицуЗначений в принципе бесполезен...
   АЛьФ
 
21 - 05.01.21 - 14:20
2(20) Спасибо. Сложность в том, что в общем случае неизвестно какая там размерность у числа.
   АЛьФ
 
22 - 05.01.21 - 14:39
Всем огромное спасибо. Поставил округление и пусть весь мир подождет.
   alyuev
 
23 - 05.01.21 - 15:40
А если через ВК OLEExSup грузить в ТЗ?

    OLEExSup=СоздатьОбъект("OLEExSup");
    Массив = СоздатьОбъект("OleSafeArray");
...
    Область = Лист.Range(Лист.Cells(НомерПервойСтроки,НомерПервойКолонки), Лист.Cells(ПослСтрока,ПослКолонка));
    Массив=OLEExSup.ПолучитьСвойство(Область,"Value");
    Для нСтроки=Массив.GetLBound(1) По Массив.GetUBound(1) Цикл
        Для нКолонки=Массив.GetLBound(2) По Массив.GetUBound(2) Цикл
            ЗнЯч=Массив.GetValue(нСтроки,нКолонки);
            ТЗ.УстановитьЗначение(нСтроки,нКолонки,ЗнЯч);
        КонецЦикла;
    КонецЦикла;


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.