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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.11.2006, 18:54   #1  
Falc0nMan is offline
Falc0nMan
Участник
 
11 / 10 (1) +
Регистрация: 30.11.2006
Thumbs up
Добрый день!
Прошу не ругать, если подобное уже обсуждалось, но поиском по всем конфам я не нашел. Но пришлось столкнуться с 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  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Самое простое возвращай значение в рекордсете как char(...) c использованием CAST() а там посмотришь. Но что-то в Ваших ручках т.к. проблем не должно быть.
С ув.
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
Старый 01.12.2006, 10:59   #3  
Sitizen is offline
Sitizen
Участник
Аватар для Sitizen
 
305 / 10 (1) +
Регистрация: 10.01.2006
А ctrl+c, ctrl+v не подходит?
Старый 01.12.2006, 12:11   #4  
Falc0nMan is offline
Falc0nMan
Участник
 
11 / 10 (1) +
Регистрация: 30.11.2006
Цитата:
Сообщение от Sitizen Посмотреть сообщение
А ctrl+c, ctrl+v не подходит?
Тяжко каждый день раз по 2000 Ctrl-C, Ctrl-V жать.
Старый 01.12.2006, 13:44   #5  
OntheJump is offline
OntheJump
Участник
 
165 / 10 (1) +
Регистрация: 31.10.2006
Так импорт каждый день нужно делать?
Старый 01.12.2006, 13:56   #6  
Falc0nMan is offline
Falc0nMan
Участник
 
11 / 10 (1) +
Регистрация: 30.11.2006
В этом то вся и проблема.
Выгружаются платежи для последующей обработки в сторонней системе.

Falc0nman
Старый 01.12.2006, 13:59   #7  
OntheJump is offline
OntheJump
Участник
 
165 / 10 (1) +
Регистрация: 31.10.2006
Выкладывайте код по первому варианту, может сможем что-нибудь посоветовать.
Старый 01.12.2006, 15:12   #8  
Falc0nMan is offline
Falc0nMan
Участник
 
11 / 10 (1) +
Регистрация: 30.11.2006
Первые два варианта - это попытка работать с БД 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  
OntheJump is offline
OntheJump
Участник
 
165 / 10 (1) +
Регистрация: 31.10.2006
По-третьему ничего сказать не могу, а вот по-первому - когда-то приходилось использовать ADO именно для экспорта/импорта данных по 17 табличке. Особых проблемы не было. Правда делали это из Navision используя хранимые процедуры на SQL.

Зачем вам Delphi?
Старый 01.12.2006, 15:30   #10  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Цитата:
Сообщение от Falc0nMan Посмотреть сообщение
Первые два варианта - это попытка работать с БД Navision в Delphi.
Использовались стандартные компоненты Delphi TADOConnection, TADOQuery, TADOTable.
Именно там при наличии поля Amount - таблица или запрос не открывается нормально, т.е. свойство Active равно True, но значения RecordCount, RecNo получить не удается.
C Delphi есть проблемы. Поэтому используй ADO от MS

C Ув.
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
Старый 01.12.2006, 15:31   #11  
Falc0nMan is offline
Falc0nMan
Участник
 
11 / 10 (1) +
Регистрация: 30.11.2006
Пробовал и DTS на MSSQL для переноса данных. Та же самая ошибка.
База Navision - не MSSQL, а .fdb и лежит локально на компе.
Если бы база была MSSQL, то проблем бы и не было никаких.
Старый 01.12.2006, 15:41   #12  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Понятно - 2 варианта возможного решения:
1. Толкать данные в MSSQL из клиента с использованием ADO
2. Попытаться поиграть версиями C/ODBC в старых версиях были проблемы даже с Access.

С ув.
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
Старый 01.12.2006, 17:13   #13  
Falc0nMan is offline
Falc0nMan
Участник
 
11 / 10 (1) +
Регистрация: 30.11.2006
Цитата:
Сообщение от captain Посмотреть сообщение
C Delphi есть проблемы. Поэтому используй ADO от MS
Просто клиента к сторонней программе я пишу на Дельфи.
Придется MS Visual Studio покупать. И писать некий транслятор, который будет перекачивать данные из Navision в базу MSSQL.
Правильно ли я мысль уловил?
Старый 01.12.2006, 17:53   #14  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Немножко не верно. В самом нави написать процедуру (Report, Codeunit) выгрузки в MS SQL и запускать его в заданое время ручками или с помощью Application Server. В этой процедуре в качестве переменной типа automation обьявит ADO и сооветственно INSERT into ....
C ув.


И еще если нет прав на ОСХ попроси кого нибудь скомипилировать пустой отчет с глоб переменными ADO.Connection ADO.Recordset и пользуйся их методами и свойствами
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
Старый 04.12.2006, 10:45   #15  
Falc0nMan is offline
Falc0nMan
Участник
 
11 / 10 (1) +
Регистрация: 30.11.2006
Все бы ничего, но версия 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  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Региональные настройки на SQL сервере и Navision Database Servere совпадают?

Если не получится - попробуйте также переписать запрос, сконвертив decimal поля в integer.
Старый 05.12.2006, 10:37   #17  
Falc0nMan is offline
Falc0nMan
Участник
 
11 / 10 (1) +
Регистрация: 30.11.2006
Ничего не помогает.
Даже если заменить в таблице, куда будут копироваться данные, поля типа decimal на varchar. В этом случае DTS срабатывает, но вместо ожидаемых цифр получаем в этих полях символ "-" (минус).
Наверное все дело в том, что используется старая версия Navision. Придется делать обходным путем.
Всем спасибо за советы и комментарии.
Старый 05.12.2006, 11:23   #18  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
"Explicit conversion from data type numeric to text is not allowed"

А какой тип поля в таблице куда импортируются данные?
Как я понял не "numeric" - может привести в соответствие?
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
Старый 05.12.2006, 15:41   #19  
Falc0nMan is offline
Falc0nMan
Участник
 
11 / 10 (1) +
Регистрация: 30.11.2006
В том то все и дело, что я пробовал разные типы полей: money, float, numeric и даже real. все равно - одна и та же ошибка. Пробовал играть количеством знаков после запятой - ничего не помогает.
Но это все в случае использования MSSQL сервера.
Пробовал получить данные в Excel'е с помощью ADODB.Recordset - там как раз все нормально получается.
Видно MSSQL не может корректно распознать тип поля Amount.
Старый 05.12.2006, 17:58   #20  
satir is offline
satir
Участник
Аватар для satir
 
77 / 10 (1) +
Регистрация: 09.06.2006
А можно сделать совсем просто - выгрузить в текст и забирать на SQL? DataPort есть в 1.3?
 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:03.