Завязка.
И так, здравствуйте.
Работая в конторе, которая занимается внедрением такой штуки, как Ms Dynamics Nav пришлось, столкнуться с одной проблемой, решение которой средствами самого Навика (позволю себе столь фамильярное обращение), было невозможным.
Суть проблемы такова:
внедряя систему в предприятие, которое занимается переводом, встала жесткая проблема с названиями файлов, так как требования гласили, что название, которым был наречен исходный файл, должно полностью соответствовать названию, которое получит уже переведенный файл. При всем при этом, заказчик требовал записи файлов в базу данных MS SQL. Так как навик ооочень далек от юникода, то все встроенные функции работы с файлами коверкали название, убирая умляуты, аксанты и прочие элементы европейского алфавита.
Для решения сией проблемы была поставлена задача написать dll-ку, которая будет записывать в базу данных файлы с корректными названиями. А затем, по требованию возвращать эти файлы из базы данных в файловую систему. При всем при этом возникла проблема с загрузкой больших файлов, поэтому, опять-таки, было принято волевое решение об использовании в MS SQL такой вещи, как FILESTREAM.
Решение
Глава I
Искренне надеюсь, что суть проблемы стала ясна. Теперь же приступим к разрешению.
Так как лучше всего ваш покорный слуга обращается с С#, то решил писать именно на нем. Подобным никогда не занимался, поэтому пришлось перерыть кучу материалов.
Первым делом был написан ряд функция, которые осуществляют выше описанную деятельность, без подключения к навижну.
Следующим шагом нужно сделать нашу библиотеку Com доступной. То бишь прописать [assembly: ComVisible(true)] в файле AssemblyInfo.cs
Далее соответственно зарегистрировать ее в системе regasm — ом.
Regasm d:/Classlibraryfornav.dll /codebase /tlb
Глава II
Теперь нам необходимо подготовить таблицу куда все это будет записываться.
Сначала мы создаем таблицу в Навижне, а потом редактируем ее в MS SQL, для подключения FILESTREAM.
Поначалу таблица выглядит так:
Но потом, включаем на Эскуэль сервере FILESTREAM:
Для включения FILESTREAM необходимо:
1. Запустить SQL Server Configuration Manager и в свойствах SQL Server’а на вкладке FILESTREAM проставить все три галочки; затем выполнить следующий запрос:
EXEC sp_configure filestream_access_level, 2
RECONFIGURE
2. Далее необходимо добавить файловую группу и обозначить хранилище файлов.
ALTER database currentDb
ADD FILEGROUP Uploads
CONTAINS FILESTREAM
GO
ALTER database currentDb
ADD FILE
(
NAME= 'Upload',
FILENAME = 'C:\Users\Administrator\Upload'
)
TO FILEGROUP Uploads
GO
Ну и немного подправим саму табличку:
выполняем следующие три команды:
a. ALTER TABLE ***.dbo.*** ADD [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE — необходимо для FILESTREAM
b. ALTER TABLE ***.dbo.*** ADD UploadFiles VARBINARY(MAX) FILESTREAM — он сам, собственно
c. ALTER TABLE ***.dbo.*** ADD FileFullName NVARCHAR(MAX) — поле, плохо воспринимаемое Навиком, но необходимое, для мультиязыкового отображения.
То есть получается, что у нас дублируются два поля:
Id = NavId — одно для навижена, другое для FILESTREAM
FileName != FullFileName — в первом содержится название файла с путем, преобразованное в ASCII, для того, чтобы его возможно было просматривать в навике. И поле FullFileName, недоступное Навижну, но необходимое для сохранения полноценного имени файла.
Глава III
Следующим этапом, подключаем нашу длл-ку к Навику. То есть в Codeunit создаем переменную типа Automation и в подтипе находим нашу зарегистрированную библиотеку, с определенным, созданным нами, классом. У меня это вышло так:
Далее уже в коде:
CREATE(«Var»);
«Var».PutToDataBase('Order','Material','Project', TRUE);
P.s.
При использовании арабского, к примеру, языка, в навике по-любому показываются вопросики. Бороться с этим можно только ставя арабский язык, и переключаем программу на этот язык целиком.