Имя: Пароль:
1C
1C 7.7
v7: Йоксель.КонвертерВТаблицуЗначений портит числовые значения
0 АЛьФ
 
04.01.21
17:25
Вроде как много лет пользуемся Йоксель.КонвертерВТаблицуЗначений для загрузки из Excel. Но тут обнаружилось, что для некоторых файлов, в некоторых ячейках возвращает странно преобразованные числа.
Например, есть отчет, выгруженных из восьмерки в xls, мы его загружаем с помощью компоненты 7.7 и вместо суммы "12345,67" неожиданно видим "12345,66999999999999". Пытался пофиксить округлением, но это очень некрасиво. Кто-нибудь сталкивался? Как решить?
На родном форуме Йоксель подобную проблему не нашел. И, к сожалению, искать там помощи похоже бесполезно, ветки годами висят без ответа.
1 DJ Anthon
 
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
4 Salimbek
 
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))'.
6 mistеr
 
05.01.21
12:51
(2) 4. Перейти наконец на нормальные форматы для транспорта данных, вместо гребаного Экселя.
7 АЛьФ
 
05.01.21
12:56
2(6) Гениально! И как это я раньше-то не додумался?! Осталось поставить об этом в известность китайцев и финнов, который нам 10 лет вообще в PDF слали.
8 mistеr
 
05.01.21
13:05
(7) >отчет, выгруженных из восьмерки в xls

О, постановка расширяется по ходу пьесы.
Ну, хотя бы попросите китайцев в xlsx выгружать.
9 Salimbek
 
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С и Сбер поставить в известность о принятом решении. Пусть поправят у себя.
12 Salimbek
 
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.
13 Salimbek
 
05.01.21
13:14
14 АЛьФ
 
05.01.21
13:32
2(12) И еще раз спасибо.
Пишет: "Недопустимое использование Null". ISNULL не удалось туда вписать.

Еще одна проблема нарисовалась. "DRIVER=Microsoft Excel Driver (*.xls);" не воспринимает "HDR=NO;" и постоянно по первой строке именует колонки. Пока это проблем не создает, но в общем решении это будет проблемой :(
15 Salimbek
 
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) Можно. А потом что? До безалкогольного пива и резиновой женщины скатимся?
20 Djelf
 
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
Всем огромное спасибо. Поставил округление и пусть весь мир подождет.
23 alyuev
 
05.01.21
15:40
А если через ВК OLEExSup грузить в ТЗ?

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