|
1С:Предприятие
:: 1С:Предприятие 7.7 и ранее
|
|
| ||
АЛьФ 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 | |||
АЛьФ 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(нСтроки,нКолонки); ТЗ.УстановитьЗначение(нСтроки,нКолонки,ЗнЯч); КонецЦикла; КонецЦикла; |
|
Список тем форума |