30.11.2006, 18:54 | #1 |
Участник
|
Добрый день!
Прошу не ругать, если подобное уже обсуждалось, но поиском по всем конфам я не нашел. Но пришлось столкнуться с Navision вплотную и опыта никакого нет. Ситуация такова - есть Navision Financials весьма старой версии. Лицензии на C/FRONT нет. Версия C/ODBC - 2.10.0002 Нужно сделать импорт данных из таблички "G/L Entry" в таблицу на MSSQL сервере. Поскольку я с Navision никогда не работал решил попробовать сделать это такими способами: 1. Прямое подключение к таблице через ADO. Т.е. в приложение есть объекты ADOConnection, ADOTable. Результат - нулевой, т.е. таблица пустая. 2. Использование ADOQuery. Работает только в том случае, если в запросе не используются поля с суммами (Amount, Quantity, VAT_Amount, Debit_Amount и другие подобные). Если хотя бы одно из этих полей присутствует, то запрос не содержит ни одной записи. 3. Linked Server в MSSQL. SELECT ..... FROM OPENQUERY(NAV, 'SELECT * FROM G_L_Entry') Такая же ерунда, как с использованием ADOQuery - работает только если в списке полей отсутствуют суммы. При попытке включить скажем поле Amount - ошибка Server: Msg 7341, Level 16, State 2, Line 1 Could not get the current row value of column '[T1].Amount' from the OLE DB provider 'MSDASQL'. Could not convert the data value due to reasons other than sign mismatch or overflow. [OLE/DB provider returned message: Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена.] OLE DB error trace [OLE/DB Provider 'MSDASQL' IRowset::GetData returned 0x80040e21: Data status returned from the provider: [COLUMN_NAME=Amount STATUS=DBSTATUS_E_CANTCONVERTVALUE]]. И как бы я не пытался преобразовывать поле Amount - все равно ошибка. Уверен, что выход есть и он простой, но уже третий день с утра до вечера бьюсь над этой задачей и не получается. Falc0nman Москва |
|
30.11.2006, 22:30 | #2 |
Участник
|
Самое простое возвращай значение в рекордсете как char(...) c использованием CAST() а там посмотришь. Но что-то в Ваших ручках т.к. проблем не должно быть.
С ув.
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
01.12.2006, 10:59 | #3 |
Участник
|
А ctrl+c, ctrl+v не подходит?
|
|
01.12.2006, 12:11 | #4 |
Участник
|
|
|
01.12.2006, 13:44 | #5 |
Участник
|
Так импорт каждый день нужно делать?
|
|
01.12.2006, 13:56 | #6 |
Участник
|
В этом то вся и проблема.
Выгружаются платежи для последующей обработки в сторонней системе. Falc0nman |
|
01.12.2006, 13:59 | #7 |
Участник
|
Выкладывайте код по первому варианту, может сможем что-нибудь посоветовать.
|
|
01.12.2006, 15:12 | #8 |
Участник
|
Первые два варианта - это попытка работать с БД Navision в Delphi.
Использовались стандартные компоненты Delphi TADOConnection, TADOQuery, TADOTable. Именно там при наличии поля Amount - таблица или запрос не открывается нормально, т.е. свойство Active равно True, но значения RecordCount, RecNo получить не удается. вот код по третьему варианту DBCC TRACEON(8765) GO SELECT Entry_No_, G_L_Account_No_, Amount FROM OPENQUERY(NAV1, 'SELECT Entry_No_, G_L_Account_No_, Posting_Date, Document_Type, Amount FROM G_L_Entry WHERE Posting_Date IS NOT NULL ') При включении поля Amount в SELECT происходит именно та ошибка, про которую я писал. Т.е., как я предполагаю, во всех случаях по непонятным причинам приложение не может преобразовать значение Amount в известный ему тип данных. Но если я напишу CONVERT(text, Amount) то MSSQL ругается Explicit conversion from data type numeric to text is not allowed. Может проблема в C/ODBC? Может поновее версию нужно взять? |
|
01.12.2006, 15:28 | #9 |
Участник
|
По-третьему ничего сказать не могу, а вот по-первому - когда-то приходилось использовать ADO именно для экспорта/импорта данных по 17 табличке. Особых проблемы не было. Правда делали это из Navision используя хранимые процедуры на SQL.
Зачем вам Delphi? |
|
01.12.2006, 15:30 | #10 |
Участник
|
Цитата:
Сообщение от Falc0nMan
Первые два варианта - это попытка работать с БД Navision в Delphi.
Использовались стандартные компоненты Delphi TADOConnection, TADOQuery, TADOTable. Именно там при наличии поля Amount - таблица или запрос не открывается нормально, т.е. свойство Active равно True, но значения RecordCount, RecNo получить не удается. C Ув.
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
01.12.2006, 15:31 | #11 |
Участник
|
Пробовал и DTS на MSSQL для переноса данных. Та же самая ошибка.
База Navision - не MSSQL, а .fdb и лежит локально на компе. Если бы база была MSSQL, то проблем бы и не было никаких. |
|
01.12.2006, 15:41 | #12 |
Участник
|
Понятно - 2 варианта возможного решения:
1. Толкать данные в MSSQL из клиента с использованием ADO 2. Попытаться поиграть версиями C/ODBC в старых версиях были проблемы даже с Access. С ув.
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
01.12.2006, 17:13 | #13 |
Участник
|
|
|
01.12.2006, 17:53 | #14 |
Участник
|
Немножко не верно. В самом нави написать процедуру (Report, Codeunit) выгрузки в MS SQL и запускать его в заданое время ручками или с помощью Application Server. В этой процедуре в качестве переменной типа automation обьявит ADO и сооветственно INSERT into ....
C ув. И еще если нет прав на ОСХ попроси кого нибудь скомипилировать пустой отчет с глоб переменными ADO.Connection ADO.Recordset и пользуйся их методами и свойствами
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
04.12.2006, 10:45 | #15 |
Участник
|
Все бы ничего, но версия Navision у меня 1.30 и там отсутствуют такие типы, как ADO, OLE и т.п.
Попытка взять другие драйверы C/ODBC ни к чему не привела - ругается, что отличаются версии сервера и клиента. Можно сделать окружными путями - через dataport в текстовом формате, через импорт в Excel и послежующий импорт в MSSQL, но тогда не достигается основная цель - не получается автоматизации, т.е. все равно кому-то надо будет вручную перегружать информацию из Navision в MSSQL. Если у Delphi есть проблемы с компонентами ADO, то почему не получается сделать SELECT на MSSQL с прилинкованного сервера. В Excel все выгружается нормально, а в MSSQL - нет (ругаются как SELECT с linked server, так и простая попытка перегрузить данные с помощью DTS - хотя Preview (где показываются первые 100 записей) срабатывает и все показывается). Где еще покопаться, подскажите пожалуйста. |
|
04.12.2006, 12:27 | #16 |
Участник
|
Региональные настройки на SQL сервере и Navision Database Servere совпадают?
Если не получится - попробуйте также переписать запрос, сконвертив decimal поля в integer. |
|
05.12.2006, 10:37 | #17 |
Участник
|
Ничего не помогает.
Даже если заменить в таблице, куда будут копироваться данные, поля типа decimal на varchar. В этом случае DTS срабатывает, но вместо ожидаемых цифр получаем в этих полях символ "-" (минус). Наверное все дело в том, что используется старая версия Navision. Придется делать обходным путем. Всем спасибо за советы и комментарии. |
|
05.12.2006, 11:23 | #18 |
Участник
|
"Explicit conversion from data type numeric to text is not allowed"
А какой тип поля в таблице куда импортируются данные? Как я понял не "numeric" - может привести в соответствие?
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
05.12.2006, 15:41 | #19 |
Участник
|
В том то все и дело, что я пробовал разные типы полей: money, float, numeric и даже real. все равно - одна и та же ошибка. Пробовал играть количеством знаков после запятой - ничего не помогает.
Но это все в случае использования MSSQL сервера. Пробовал получить данные в Excel'е с помощью ADODB.Recordset - там как раз все нормально получается. Видно MSSQL не может корректно распознать тип поля Amount. |
|
05.12.2006, 17:58 | #20 |
Участник
|
А можно сделать совсем просто - выгрузить в текст и забирать на SQL? DataPort есть в 1.3?
|
|