AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.11.2011, 15:44   #1  
mandrake is offline
mandrake
Участник
 
18 / 10 (1) +
Регистрация: 30.06.2010
Всем, привет!
Собственно вопрос в теме: как прочитать длинный текст из Excel?

В ячейке excel - текст длиной > 1024 символов. Как его правильно оттуда достать\прочитать из MAV?

С самим excel я работаю через Automation
Следующий код
FORMAT(xlWorkSheet.Range(X+FORMAT(Y)).Text)
вываливается с ошибкой:

---------------------------
Microsoft Dynamics NAV Classic
---------------------------
Длина текстовой строки превосходит размер буфера строки.

---------------------------
OK
---------------------------

Спасибо!
Старый 30.11.2011, 17:06   #2  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Цитата:
Сообщение от mandrake Посмотреть сообщение
Всем, привет!
Собственно вопрос в теме: как прочитать длинный текст из Excel?

В ячейке excel - текст длиной > 1024 символов. Как его правильно оттуда достать\прочитать из MAV?

С самим excel я работаю через Automation
Следующий код
FORMAT(xlWorkSheet.Range(X+FORMAT(Y)).Text)
вываливается с ошибкой:

---------------------------
Microsoft Dynamics NAV Classic
---------------------------
Длина текстовой строки превосходит размер буфера строки.

---------------------------
OK
---------------------------

Спасибо!
Вообще, одно из требований работы с Automation: принимаемые и возвращаемые типы данных должны соответствовать типам данных в Навижн.
Так написано в документации, т.е. по идее задача не решаема в том виде, в котором поставлена. Но. Во-первых: есть обходной путь позволяющий Наву работать с текстовыми переменными длиннее 1024 символов, копать здесь: http://forum.mazzy.ru/index.php?showtopic=1477
А во-вторых: и именно этот вариант выбрал бы я, можно предварительно разбить переменную на части длинной не более 1024 символов и читать её по частям. Разбивать можно прямо из Нава. Весь код приводить не буду, но мейнстрим подкину. В примере рассматриваю случай строки больше 1024 символов, но меньше 2048. Если строка ещё длиннее, то дальше сами доработаете алгоритм.
С помощью Automation создаёте в экселе формулу, которая вычисляет длину строки =ДЛСТР(X+FORMAT(Y))
и записываете значение в переменную, назовём её strlen.
Далее, с помощью Automation создаёте в экселе, где-нибудь в свободных ячейках формулы
=ЗАМЕНИТЬ (X+FORMAT(Y);1025;strlen;'') //это скопирует в ячейку первые 1024 символа
=ЗАМЕНИТЬ (X+FORMAT(Y);1;1024;'') //это скопирует в ячейку оставшиеся символы
Ну вот собственно и всё, дальше читаете данные без проблем кусками по 1024 символа.

P.S. Есть ещё третий путь. Можно написать свой Automation, который сам будет делить строку на блоки по 1024 символа и возвращать данные через переменные переданные в него по ссылке.
Старый 30.11.2011, 17:42   #3  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Теоретически можно еще потоки использовать. Загонять значение аутомейшена в BLOB временной таблицы, а потом читать оттуда по нужному кол-ву символов.
Старый 30.11.2011, 17:53   #4  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Цитата:
Сообщение от InTacto Посмотреть сообщение
Теоретически можно еще потоки использовать. Загонять значение аутомейшена в BLOB временной таблицы, а потом читать оттуда по нужному кол-ву символов.
Хм... как-то не подумал об этом. Это наверное будет даже правильней, проще и удобней. Надо только поэкспериментировать с загонянием значения в BLOB, теоретически могут возникнуть проблемы, хотя вроде не должны. Самому сейчас проверять лень/некогда, но если кто поделится результатом эксперимента, будет интересно.
Старый 01.12.2011, 08:23   #5  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Сохраните Excel в XML формате, а дальше выдергивайте, пример писал здесь:
http://www.mibuso.com/forum/viewtopic.php?f=23&t=43794
Старый 01.12.2011, 10:56   #6  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Цитата:
Сообщение от rmv Посмотреть сообщение
Сохраните Excel в XML формате, а дальше выдергивайте, пример писал здесь:
http://www.mibuso.com/forum/viewtopic.php?f=23&t=43794
Метод substringData хорош, принимает позицию и длину подстроки для считывания, т.е. можно прочитать строку по частям. А вот есть ли метод для определения длины строки? Или, что будет если попытаться прочитать длину больше чем длина строки? Если просто прочитается то что есть, то отлично, если же будет ошибка, то без определения длины строки, этот метод не подходит.
Старый 01.12.2011, 10:56   #7  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
С BLOB не прокатила идея.
rmv, сенкс за пример.
Старый 01.12.2011, 11:57   #8  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Цитата:
Сообщение от Predatore Посмотреть сообщение
Цитата:
Сообщение от rmv Посмотреть сообщение
Сохраните Excel в XML формате, а дальше выдергивайте, пример писал здесь:
http://www.mibuso.com/forum/viewtopic.php?f=23&t=43794
Метод substringData хорош, принимает позицию и длину подстроки для считывания, т.е. можно прочитать строку по частям. А вот есть ли метод для определения длины строки? Или, что будет если попытаться прочитать длину больше чем длина строки? Если просто прочитается то что есть, то отлично, если же будет ошибка, то без определения длины строки, этот метод не подходит.
MSDN Вам в помощь, в дополнение хинт лишенцев-обладателей версий версий ниже 5.0- XmlDomTextNode можно использовать как аналог типа данных BigText, функциональность 1 в 1 - не удивлюсь если внутри BigText использует XmlDomTextNode
Старый 01.12.2011, 12:49   #9  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Цитата:
Сообщение от rmv Посмотреть сообщение
MSDN Вам в помощь, в дополнение хинт лишенцев-обладателей версий версий ниже 5.0- XmlDomTextNode можно использовать как аналог типа данных BigText, функциональность 1 в 1 - не удивлюсь если внутри BigText использует XmlDomTextNode
В MSDN я и посмотрел описание метода substringData, а вот по поводу его поведения при попытке прочитать больше чем есть или про метод возвращающий длину строки ничего не нашёл. Может плохо искал? Потому и спросил.
Старый 01.12.2011, 13:38   #10  
mandrake is offline
mandrake
Участник
 
18 / 10 (1) +
Регистрация: 30.06.2010
Цитата:
Сообщение от Predatore Посмотреть сообщение
Цитата:
Сообщение от mandrake Посмотреть сообщение
Всем, привет!
Собственно вопрос в теме: как прочитать длинный текст из Excel?

В ячейке excel - текст длиной > 1024 символов. Как его правильно оттуда достать\прочитать из MAV?

С самим excel я работаю через Automation
Следующий код
FORMAT(xlWorkSheet.Range(X+FORMAT(Y)).Text)
вываливается с ошибкой:

---------------------------
Microsoft Dynamics NAV Classic
---------------------------
Длина текстовой строки превосходит размер буфера строки.

---------------------------
OK
---------------------------

Спасибо!
Вообще, одно из требований работы с Automation: принимаемые и возвращаемые типы данных должны соответствовать типам данных в Навижн.
Так написано в документации, т.е. по идее задача не решаема в том виде, в котором поставлена. Но. Во-первых: есть обходной путь позволяющий Наву работать с текстовыми переменными длиннее 1024 символов, копать здесь: http://forum.mazzy.ru/index.php?showtopic=1477
А во-вторых: и именно этот вариант выбрал бы я, можно предварительно разбить переменную на части длинной не более 1024 символов и читать её по частям. Разбивать можно прямо из Нава. Весь код приводить не буду, но мейнстрим подкину. В примере рассматриваю случай строки больше 1024 символов, но меньше 2048. Если строка ещё длиннее, то дальше сами доработаете алгоритм.
С помощью Automation создаёте в экселе формулу, которая вычисляет длину строки =ДЛСТР(X+FORMAT(Y))
и записываете значение в переменную, назовём её strlen.
Далее, с помощью Automation создаёте в экселе, где-нибудь в свободных ячейках формулы
=ЗАМЕНИТЬ (X+FORMAT(Y);1025;strlen;'') //это скопирует в ячейку первые 1024 символа
=ЗАМЕНИТЬ (X+FORMAT(Y);1;1024;'') //это скопирует в ячейку оставшиеся символы
Ну вот собственно и всё, дальше читаете данные без проблем кусками по 1024 символа.

P.S. Есть ещё третий путь. Можно написать свой Automation, который сам будет делить строку на блоки по 1024 символа и возвращать данные через переменные переданные в него по ссылке.
Спасибо! Я как раз в этом направлении формул и работал )))
Старый 16.01.2012, 19:37   #11  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Цитата:
Сообщение от Predatore Посмотреть сообщение
MSDN Вам в помощь, в дополнение хинт лишенцев-обладателей версий версий ниже 5.0- XmlDomTextNode можно использовать как аналог типа данных BigText, функциональность 1 в 1 - не удивлюсь если внутри BigText использует XmlDomTextNode
у XmlDomTextNode есть св-во text, у которого есть св-во Length, которое вернет длинну строки. Дальше уже substringData считываем данные с контролем длинны.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:23.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.