Navision Database доступ через C/ODBC WebService/ASP.NET приложение

 

Борис Макушкин

Alba Spectrum Technologies

(095) 918-3314, (095) 918-3111, help@albaspectrum.com  

 

 

Navision (прежняя Navision Attain) сегодня вместе с Microsoft Great Plains, Axapta, Solomon, Microsoft CRM и Microsoft RMS поддерживаются Microsoft Business Solutions.  Navision имеет множество возможностей для кастомизации.  Сегодня мы опишем простой случай использования C/ODBC драйвераЭтот драйвер и технология позволяют работать с Native или C/SIDE Navision базой данных.  Navision также доступна на Microsoft SQL Server – в этом случае вы используете традиционные Microsoft технологии, такие как OLEDB, MS SQL Server драйвер для открытия ADO.NET коннекции.   Наша цель помочь отделам информационных технологий поддерживать и настраивать Navision используя внетренние ресурсы.

В сегодняшней статье мы рассмотрим доступ  к данным Navision Attain с помощью WebService и представление полученных данных в ASP.NET приложении. Данные WebService будет получать из MS SQL Server 2000, сопряженный с Attain Database через интерфейс C/ODBC. Целью наших действий будет являться создание страницы просмотра Navision Items. Приступим:

  1. Для нашей работы мы используем Navision Attain 3.6 в составе Navision Database Server, Navision Application Server и Navision Client. Данные компоненты установлены на Windows XP. Для обеспечения работы через C/ODBC интерфейс, необходимо установить соответствующий компонент с дистрибутивного диска Navision Attain.
  2. Создадим ODBC DSN для доступа к нашим Navision данным. Для этого выберем Start -> Control Panel -> Administrative Tools -> Data Sources (ODBC). Затем выбираем вкладку System DSN и нажимаем кнопку Add. Мы будем использовать C/ODBC 32-bit драйвер для доступа к данным. Зададим Data Source Name  как Navision, Connection оставим Local. В качестве базы данных (кнопка Database) выберем \Program Files\Navision Attain\Client\database.fdb (демонстрационная база данных). Затем нажмем на кнопке Company – единственной доступной компанией для демонстрационной базы является CRONUS. Ее и будем использовать. Важным условием для корректной работы с C/SIDE базами данных является корректное выставление опций для C/ODBC соединения. Нажмем кнопку Options и посмотрим на доступные опции – нас будет интересовать параметр Identifiers – он определяет вид идентификаторов, которые будут переданы клиентской программе. Для корректной работы MS SQL Server 2000 с C/ODBC источником мы будем использовать тип a-z,A-Z,0-9,_”. На этом создание источника данных завершено. Приступим к организации Linked Server
  3. Откроем SQL Server Enterprise Manager.  Откройте дерево сервера, который будете использовать, в нем выберите пункт Security и подпункт Linked Servers. Правой кнопкой в контекстном меню выберите New Linked Server. В появившемся диалоговом окне, в меню Provider Name выберем Microsoft OLE DB Provider for ODBC Drivers. Пусть наш Linked Server называется NAVISION. В строке Data Source введем имя ODBC источника – у нас он назывался также NAVISION. Linked Server готов! Выберем в нем список таблиц и увидим данные из баз Navision Attain.
  4. Далее нам необходимо создать небольшую хранимую процедуру для выборки по продажам. Текст процедуры приведен ниже:

SET ANSI_NULLS ON

SET ANSI_WARNINGS ON

GO

 

CREATE PROCEDURE NavisionItems AS

 

DBCC TRACEON(8765)

SELECT * FROM OPENQUERY(NAVISION, 'SELECT * FROM Item')

 

RETURN

Поясним некоторые моменты. Директива TRACEON(8765) позволяет откорректировать работу с данными переменной длины, возвращаемыми C/ODBC драйвером. Без нее мы не сможем выбирать поля из таблиц Navision – мы будем получать ошибки типа:

 

OLE DB error trace [Non-interface error:  Unexpected data length returned for the column:  ProviderName='MSDASQL', TableName='[MSDASQL]', ColumnName='Ship_to_Filter', ExpectedLength='250', ReturnedLength='1'].

Server: Msg 7347, Level 16, State 1, Line 1

OLE DB provider 'MSDASQL' returned an unexpected data length for the fixed-length column '[MSDASQL].Ship_to_Filter'. The expected data length is 250, while the returned data length is 1.

 

Директива OPENQUERY открывает связанный сервер и передает ему запрос на выполнение, возвращая после этого выбранные данные. Необходимым условием для создания хранимой процедуры является задание директив ANSI_NULLS и ANSI_WARNINGS – они позволяют использовать в хранимых процедурах выполнение гетерогенных запросов. Проверить корректность работы процедуры можно дав команду в MS SQL Query Analizer EXEC NavisionItems

  1. Теперь приступим к собственно созданию ASP.NET приложения. Для разработки воспользуемся свободно распространяемой RAD средой ASP.NET WebMatrix. Ознакомиться с ней и загрузить ее можно по адресу http://asp.net/webmatrix . Перед ее установкой необходимо иметь установленный .NET SDK 1.1
  2. Запустив WebMatrix, выберем создание XML Web Service  в окне визарда. Предлагаемые параметры оставим по умолчанию, лишь зададим имя файла NavisionItems, имя класса NavisionItems, имя Namespace как NavDemo. Модифицируем код веб-сервиса как показано ниже (заменив строку коннекта на актуальные значения):

 

<%@ WebService language="VB" class="NavisionItems" %>

 

Imports System

Imports System.Web.Services

Imports System.Xml.Serialization

 

Public Class NavisionItems

 

<WebMethod> Function GetNavisionItems() As System.Data.DataSet

Dim connectionString As String = "server='(local)'; trusted_connection=true; database='Alba'"

Dim dbConnection As System.Data.IDbConnection = New System.Data.SqlClient.SqlConnection(connectionString)

 

Dim queryString As String = "EXEC NavisionItems"

Dim dbCommand As System.Data.IDbCommand = New System.Data.SqlClient.SqlCommand

dbCommand.CommandText = queryString

dbCommand.Connection = dbConnection

 

Dim dataAdapter As System.Data.IDbDataAdapter = New System.Data.SqlClient.SqlDataAdapter

dataAdapter.SelectCommand = dbCommand

 

Dim dataSet As System.Data.DataSet = New System.Data.DataSet

dataAdapter.Fill(dataSet)

 

Return dataSet

End Function

End Class

 

  1. Теперь приступим к написанию ASP.NET приложения для отображения результатов выборки веб-вервиса. Создадим пустую ASP.NET страницу с помощью визарда WebMatrix. Назовем новую страницу TestNavisionItems.aspx . На странице расположим контролы DataGrid и Button. После этого перейдем в режим Code и из пункта меню Tools запустим WebService Proxy Generator. В появивишемся диалоговом окне укажем в строке WSDL URL http://localhost/NavisionItems.asmx (если вы запускаете веб-сервис на другом хосте или веб-сервер работает на другом порту – измените необходимые значения). Примечание – в это время, если вы деплоите веб-сервис на локальной машине с помощью идущего вместе с WebMatrix веб-сервера Cassini, то он должен быть уже запущен к этому моменту. Задаем имя Namespace как NavDemo и выполняем генерацию кода. Далее, задаем обработчик для нашей Button:

 

         Sub Button1_Click(sender As Object, e As EventArgs)
                 ' Insert page code here
                 '
                 Dim wsProxy As New NavDemo.NavisionItems()
 
                 DataGrid1.DataSource = wsProxy.GetNavisionItems()
                 DataGrid1.DataBind()
         End Sub

 

  1. Далее, запускаем нашу страницу, жмем кнопку, расположенную на форме и получаем список Navision Items !

 

Борис Макушкин - Navision специалист и ведущий девелопер в Alba Spectrum Technologiesкомпаниипартнере Microsoft Business Solutions в городах Москва, Петербург, Екатеринбург, Казань, Ростов и обслуживающей всю Российскую Федерацию, Европу, США и Бразилию (www.albaspectrum.com)