|   |   | 
| 
 | 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(нСтроки,нКолонки); ТЗ.УстановитьЗначение(нСтроки,нКолонки,ЗнЯч); КонецЦикла; КонецЦикла; | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |