| 
			
			 | 
		#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 Москва  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Самое простое возвращай значение в рекордсете как char(...) c использованием CAST() а  там посмотришь. Но что-то в Ваших ручках т.к. проблем не должно быть.   
		
		
		
		
		
		
			С ув. 
				__________________ 
		
		
		
		
	--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А ctrl+c, ctrl+v не подходит?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Так импорт каждый день нужно делать?  
		
		
		
		
		
		
		
	 
		 | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В этом то вся и проблема. 
		
		
		
		
		
		
		
	Выгружаются платежи для последующей обработки в сторонней системе. Falc0nman  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Выкладывайте код по первому варианту, может сможем что-нибудь посоветовать.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#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? Может поновее версию нужно взять?  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			По-третьему ничего сказать не могу, а вот по-первому - когда-то приходилось использовать ADO именно для экспорта/импорта данных по 17 табличке. Особых проблемы не было. Правда делали это из Navision используя хранимые процедуры на SQL. 
		
		
		
		
		
		
		
	Зачем вам Delphi?  
		 | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Falc0nMan
			 
 
			Первые два варианта - это попытка работать с БД Navision в Delphi. 
		
	Использовались стандартные компоненты Delphi TADOConnection, TADOQuery, TADOTable. Именно там при наличии поля Amount - таблица или запрос не открывается нормально, т.е. свойство Active равно True, но значения RecordCount, RecNo получить не удается. C Ув. 
				__________________ 
		
		
		
		
	--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица  | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Пробовал и DTS на MSSQL для переноса данных. Та же самая ошибка.  
		
		
		
		
		
		
		
	База Navision - не MSSQL, а .fdb и лежит локально на компе. Если бы база была MSSQL, то проблем бы и не было никаких.  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Понятно - 2 варианта возможного решения: 
		
		
		
		
		
		
			1. Толкать данные в MSSQL из клиента с использованием ADO 2. Попытаться поиграть версиями C/ODBC в старых версиях были проблемы даже с Access. С ув. 
				__________________ 
		
		
		
		
	--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Немножко не верно. В самом нави написать процедуру (Report, Codeunit) выгрузки в MS SQL  и запускать его в заданое время ручками или с помощью Application Server.  В этой процедуре в качестве переменной типа automation обьявит ADO и сооветственно INSERT into .... 
		
		
		
		
		
		
			C ув. И еще если нет прав на ОСХ попроси кого нибудь скомипилировать пустой отчет с глоб переменными ADO.Connection ADO.Recordset и пользуйся их методами и свойствами 
				__________________ 
		
		
		
		
	--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица  | 
| 
	
 | 
| 
			
			 | 
		#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 записей) срабатывает и все показывается). Где еще покопаться, подскажите пожалуйста.  | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Региональные настройки на SQL сервере и Navision Database Servere совпадают? 
		
		
		
		
		
		
		
	Если не получится - попробуйте также переписать запрос, сконвертив decimal поля в integer.  | 
| 
	
 | 
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ничего не помогает.   
		
		
		
		
		
		
		
	  Даже если заменить в таблице, куда будут копироваться данные, поля типа decimal на varchar. В этом случае DTS срабатывает, но вместо ожидаемых цифр получаем в этих полях символ "-" (минус). Наверное все дело в том, что используется старая версия Navision. Придется делать обходным путем. Всем спасибо за советы и комментарии.  | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			"Explicit conversion from data type numeric to text is not allowed" 
		
		
		
		
		
		
			А какой тип поля в таблице куда импортируются данные? Как я понял не "numeric" - может привести в соответствие? 
				__________________ 
		
		
		
		
	--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица  | 
| 
	
 | 
| 
			
			 | 
		#19 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В том то все и дело, что я пробовал разные типы полей: money, float, numeric и даже real. все равно - одна и та же ошибка. Пробовал играть количеством знаков после запятой - ничего не помогает.  
		
		
		
		
		
		
		
	Но это все в случае использования MSSQL сервера. Пробовал получить данные в Excel'е с помощью ADODB.Recordset - там как раз все нормально получается. Видно MSSQL не может корректно распознать тип поля Amount.  | 
| 
	
 | 
| 
			
			 | 
		#20 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А можно сделать совсем просто - выгрузить в текст и забирать на SQL? DataPort есть в 1.3?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 |