114
Средства интеграции Navision

Ruru Navision 360 Int

Embed Size (px)

Citation preview

Page 1: Ruru Navision 360 Int

Средства интеграции Navision

Page 2: Ruru Navision 360 Int
Page 3: Ruru Navision 360 Int

Средства интеграции Navision

Page 4: Ruru Navision 360 Int

Настоящий материал предназначен только для ознакомительных целей. Navision a/s не берет на себя никаких обязательств в случае использования его для иных целей. Navision a/s не несет ответственности за любые факты специального, прямого, косвенного или последующего ущерба, вне зависимости от того, порожден ли он выполнением контрактных обязательств, является следствием халатности, либо вытекает из использования или представления настоящего материала. Настоящий материал может подвергаться изменениям без какого-либо уведомления.

В соответствии с законодательством Дании об авторском праве, воспроизведение любой части данного материала в любой форме и любыми средствами допустимо только с разрешения Navision a/s.

Представленное в материале программное обеспечение поставляется на условиях лицензирования и должно использоваться и копироваться в строгом соответствии с положениями лицензионных соглашений.

COPYRIGHT

Copyright 2002 Navision a/s, Frydenlunds Allé 6, 2950 Vedbaek, Denmark. All rights reserved.

ТОВАРНЫЕ ЗНАКИ

Товарные знаки, используемые в данном материале, и обозначаемые как TM или являются соответственно товарными знаками или зарегистрированными товарными знаками Navision a/s или Navision Development a/s. Товарные знаки Microsoft, Windows, Windows NT, SQL Server и BackOffice являются зарегистрированными товарными знаками и товарными знаками корпорации Microsoft, действующими на территории США и других стран мира.

Товарные знаки Navision a/s и Navision Development представлены на сайте http://trademarks.navision.com

Использована гарнитура Arial.

Опубликовано Microsoft Business Solutions CIS.

DocID: AT-360-SST-002-v.01.00-RURU

Page 5: Ruru Navision 360 Int

ОГЛАВЛЕНИЕ

ГЛАВА 1.

ВВЕДЕНИЕ 1-1

1.1 Введение в курс 1-2

1.2 Что такое порты данных? 1-3

1.3 Контрольные вопросы 1-6

ГЛАВА 2.

ИСПОЛЬЗОВАНИЕ ODBC С NAVISION 2-1

2.1 Введение в C/ODBC 2-2

2.2 Зачем используют C/ODBC 2-4

2.3 Установка и настройка C/ODBC-драйвера 2-5

2.4 Доступ к данным из запросов к БД 2-11

2.5 Запись данных в Navision 2-15

2.6 Ограничения C/ODBC 2-19

2.7 Контрольные вопросы 2-25

ГЛАВА 3.

ИСПОЛЬЗОВАНИЕ C/FRONT В NAVISION 3-1

3.1 Что такое C/FRONT 3-2

3.2 Установка и настройка C/FRONT 3-3

3.3 Два программных интерфейса – DLL и OCX 3-5

3.4 Доступ к данным из Visual Basic 3-8

3.5 Запись данных из Microsoft Excel 3-15

3.6 Ограничения при использовании C/FRONT 3-16

3.7 Контрольные вопросы 3-17

Page 6: Ruru Navision 360 Int

ОГЛАВЛЕНИЕ

ГЛАВА 4.

ИСПОЛЬЗОВАНИЕ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ В NAVISION 4-1

4.1 Настраиваемые элементы управления и элементы OCX 4-2

4.2 Установка и регистрация OCX 4-3

4.3 Создание переменных 4-5

4.4 Написание кода 4-8

4.5 Общие проблемы и ограничения 4-12

4.6 Упражнение 4-14

4.7 Контрольные вопросы 4-17

ГЛАВА 5.

ИСПОЛЬЗОВАНИЕ СЕРВЕРА АВТОМАТИЗАЦИИ В РАМКАХ NAVISION 5-1

5.1 Почему в Navision используется сервер автоматизации 5-2

5.2 Создание переменных 5-4

5.3 Написание программного кода 5-10

5.4 Обработка событий 5-15

5.5 Основные проблемы и ограничения 5-20

5.6 Упражнение 5-23

5.7 Контрольные вопросы 5-26

ПРИЛОЖЕНИЕ A.

ПАРАМЕТРЫ, ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ И ТИПЫ ДАННЫХ A-I

A.1 Обзор A-II

A.2 Отображение типов данных языка C/AL на типы данных COM A-III

A.3 Отображение типов данных COM на типы данных C/AL A-V

Page 7: Ruru Navision 360 Int

ПРЕДИСЛОВИЕ

Настоящий курс является одним из четырех учебных курсов в рамках программы обучения “Программирование в Navision” (Navision Programming), которая, в свою очередь, входит в состав учебных материалов “Разработка решений Navision” (Navision Solution Development). Данный курс ориентирован на применение в качестве материала для самостоятельного обучения и может использоваться как отдельно, так и совместно с любым из трех других курсов в рамках данной учебной программы.

Когда вы завершите все четыре курса по программе “Программирование в Navision”, вы сможете пройти тестирование на соответствие требованиям сертификации в качестве консультанта в области программирования для Navision (Navision Attain Consultant in Programming).

Page 8: Ruru Navision 360 Int

Предисловие

На следующей диаграмме представлены все курсы в рамках программы обучения Navision (серым цветом выделены предметные области).

Page 9: Ruru Navision 360 Int

Глава 1

Введение

Учебный курс “Средства интеграции Navision” познакомит вас с инструментарием, который может быть использован как вне, так и внутри Navision с целью достижения такого уровня интеграции с другими приложениями, которые требуются вашим клиентам.

Эта глава содержит следующие разделы.

• Введение в курс

• Что такое порты данных?

• Контрольные вопросы

Page 10: Ruru Navision 360 Int

1-2 Средства интеграции Navision

1.1 ВВЕДЕНИЕ В КУРС

Данный курс создан для тех, кто изучает вопросы интеграции Navision с другими приложениями. Этот курс исходит из того, что обучающийся понимает архитектуру C/SIDE и то, как использовать C/SIDE-объекты. Данный курс также исходит из того, что обучающийся знаком с реляционными базами данных, а также со следующими приложениями и инструментами — Microsoft Word, Microsoft Excel, ODBC и Microsoft Visual Basic.

В ходе курса вы познакомитесь с основами использования различных инструментов, которые вы сможете интегрировать с Navision, а также со способами интеграции Navision с другими приложениями. В курсе представлены следующие главы:

Глава 1: Введение – настоящая глава

Глава 2: Использование ODBC с Navision

Глава 3: Использование C/Front

Глава 4: Использованиеэлементов управления OCX с Navision

Глава 5: Использование сервера автоматизации с Navision C/AL

Помните, что данный курс предназначен для самообучения. Затрачивайте столько времени, сколько вам необходимо для завершения каждого упражнения. Вчитывайтесь в материал настолько тщательно, насколько это возможно. Если требуется вернуться и еще раз просмотреть главу, выделите на это необходимое время. Этот материал содержит контрольные вопросы.

Page 11: Ruru Navision 360 Int

Введение 1-3

1.2 ЧТО ТАКОЕ ПОРТЫ ДАННЫХ?

Порты данных могут использоваться для интегрирования с другими приложениями. Обычно в момент первой установки у клиента вы обнаружите, что у вас есть унаследованные данные, которые требуется ввести в Navision. Следовательно, обычно вы будете экспортировать данные из нынешней системы клиента, а затем импортировать данные в Navision с помощью порта данных. Порты данных могут также использоваться для экспорта ваших данных из Navision.

Интегрирование с использованием портов данных называется “интеграцией реального времени ”, так как вы должны запустить порт данных, чтобы модифицировать ту или иную систему.

Существуют ли какие-то недостатки портов данных? Да, если вы пытаетесь строить мост между двумя приложениями, порты данных требуют, чтобы вы создавали код для извлечения данных из унаследованной системы клиента или готовили код для ввода данных в систему клиента. Поэтому вам требуется вести двойное кодирование, подлежащее модификации.

Что означают названия ODBC, OCX, Automation и C/Front?

ODBC – это аббревиатура, образованная от Open DataBase Connectivity (“открытое соединение баз данных”), стандартного метода доступа к базам данных, разработанного корпорацией Microsoft. Цель ODBC – дать возможность получить доступ к любым данным из любого приложения вне зависимости от того, какая СУБД управляет этими данными. ODBC добивается этого путем использования промежуточного слоя (называемого драйвером БД) между приложением и СУБД. Назначение такого слоя – транслировать запросы к данным со стороны приложения в команды, воспринимаемые СУБД. Чтобы это обеспечить, и приложение, и СУБД должны быть ODBC-совместимы (ODBC-compliant ). Другими словами, приложение должно быть способно выдавать ODBC-команды, а СУБД – реагировать на них.

OCX является сокращением от OLE Custom control. Это независимый программный модуль, который может быть доступен другим программам в среде Windows. Элементы управления OCX имеют расширение файла .ocx. Элементы управления OCX служат вторым поколением архитектуры элементов управления, исповедуемой Microsoft. К первому относились элементы управления VBX, создававшиеся на языке Visual Basic.

Page 12: Ruru Navision 360 Int

1-4 Средства интеграции Navision

И VBX, и OCX являются частным случаем элементов управления ActiveX. В то же время ActiveX обратносовместимы с элементами управления OCX. Это означает, что ActiveX-контейнеры, такие как Microsoft Internet Explorer, могут исполнять OCX-компоненты.

Имеется большой выбор коммерчески доступных OCX-компонентов, которые решают все виды задач. Кроме того, вы можете разрабатывать собственные компоненты. Создание элементов управления OCX находится вне рамок данного курса. Здесь можно лишь порекомендовать для создания OCX, которые будут вызываться из Navision, использовать такие инструменты, как Borland Delphi, Microsoft Visual C++ и Visual Basic.

Автоматизация (Automation) – это сокращенное название OLE-автоматизации. OLE-автоматизация обозначает способность одной программы раскрывать произвольную или даже все свои функции для использования их другой программой. Программа, которая предоставляет подобную функциональность, называется сервером автоматизации (automation server), а программа, которая использует эту функциональность, – контроллером автоматизации, или клиентом (automation controller, client). Среда C/SIDE поддерживает серверы автоматизации, действуя как контроллер автоматизации и используя OCX (настраиваемые элементы управления). Однако, Navision не является сервером автоматизации. Наиболее распространенное использование автоматизации внутри Navision – это управление приложениями Microsoft, такими как Word, Excel, Outlook.

И OCX, и автоматизация (Automation) являются составной частью COM-технологий Microsoft. Для получения дополнительной информации о COM рекомендуем обратиться к главе 16 “Руководства дизайнера приложений”. Кроме того, подробную информацию о технологиях Microsoft можно найти на сайте этой корпорации.

Если вы планируете использовать существующие COM-объекты (элементы управления или серверы автоматизации) из среды C/SIDE, вам нет надобности разбираться в COM. Однако, это предполагает, что вы понимаете, как использовать объекты и как вы можете получать доступ к COM-объекту. Использование функциональности, предоставляемой COM-объектом, ничем не отличается от использования любой функции C/AL.

C/FRONT – это программный интерфейс, который может быть использован для доступа к БД в формате Navision. C/FRONT содействует высокоуровневому взаимодействию с Navision Server, а

Page 13: Ruru Navision 360 Int

Введение 1-5

также позволяет разработчикам оперировать произвольной БД в формате Navision. Центральным компонентом C/FRONT служит библиотека функций на языке C. Эти функции дают вам доступ ко всем аспектам хранения и сопровождения данных, а также позволяют вам интегрировать с вашей БД Navision как стандартные, так и специализированные приложения.

C/Front поставляется в виде DLL-библиотеки, предназначенной для прямой компоновки с вашей программой, а также как OCX-компонент, который может использовать ваша программа.

Как все это работает?

ODBC и C/Front используются либо для получения данных из Navision, либо для занесения данных в БД в формате Navision. OCX и автоматизация используются для Navision с целью управления другими приложениями и/или компонентами.

Page 14: Ruru Navision 360 Int

1-6 Средства интеграции Navision

1.3 КОНТРОЛЬНЫЕ ВОПРОСЫ

Вопросы

1 Что обозначает аббревиатура ODBC?

2 Что обозначает аббревиатура OCX?

3 Что означает слово “автоматизация” (Automation)?

4 Является ли Navision сервером автоматизации?

5 Что такое C/Front?

a. Инструментарий переднего плана для доступа к базам данных в формате MS Access

b. Вторичная база данных, которая может использоваться средой Navision

c. Программный интерфейс, используемый для доступа к БД в формате C/SIDE

d. Драйвер, используемый для доступа к ODBC-совместимым БД

6 Какие два типа COM-объектов используются в Navision?

7 Для чего преимущественно применяются C/ODBC и C/Front?

Page 15: Ruru Navision 360 Int

Введение 1-7

Ответы

1 Что обозначает аббревиатура ODBC?

Open DataBase Connectivity

2 Что обозначает аббревиатура OCX?

OLE Custom Control

3 Что означает слово “автоматизация” (Automation)?

OLE-автоматизацию (OLE Automation)

4 Является ли Navision сервером автоматизации?

Нет

5 Что такое C/Front?

Программный интерфейс, используемый для доступа к БД в формате C/SIDE

6 Какие два типа COM-объектов используются в Navision?

OCX и Automation

7 Для чего преимущественно применяются C/ODBC и C/Front?

C/ODBC и C/Front используются преимущественно для ввода и извлечения данных из Navision.

Page 16: Ruru Navision 360 Int

1-8 Средства интеграции Navision

Page 17: Ruru Navision 360 Int

Глава 2

Использование ODBC с Navision

В этой главе мы познакомим вас с C/ODBC-драйвером для Navision. Тем не менее, рекомендуем вам изучить руководство по C/ODBC и контрольные упражнения. В данной главе представлены следующие разделы.

• Введение в C/ODBC

• Зачем используют C/ODBC

Установка и настройка C/ODBC-драйвера

• Доступ к данным из запросов к БД

• Запись данных в Navision

• Ограничения C/ODBC

Контрольные вопросы•

Page 18: Ruru Navision 360 Int

2-2 Средства интеграции Navision

2.1 ВВЕДЕНИЕ В C/ODBC

C/ODBC – это выполненная компанией Navision реализация интерфейса Open DataBase Connectivity (ODBC) для системы Navision. C/ODBC позволяет передавать данные между БД в формате Navision и произвольной программой, которая поддерживает ODBC.

C/ODBC просто предоставляет другим приложениям, поддерживающим ODBC, способ взаимодействия с Navision. Поэтому такие приложения, как программы обработки электронных таблиц и текстовые редакторы, могут извлекать необходимые данные путем взаимодействия с Navision через C/ODBC-драйвер.

ODBC-драйвер работает в различных операционных системах, включая Windows 98, Windows NT, Windows 2000 и даже UNIX (AIX). В этих системах он может функционировать либо автономно, либо как клиент в клиент-серверной конфигурации.

Архитектура C/ODBC

Архитектура C/ODBC имеет четыре составляющих.

Приложение (Application) – осуществляет обработку и вызовы ODBC-функций для выдачи SQL-операторов и извлечения результатов.

Диспетчер драйверов (Driver Manager) – ведет загрузку и выгрузку драйверов от имени приложения. Обрабатывает вызовы ODBC-функций или передает их драйверу.

Драйвер (Driver) – обрабатывает вызовы ODBC-функций, выдает SQL-запросы специальному источнику данных, а также возвращает результаты в приложение. В случае необходимости драйвер изменяет запрос приложения таким образом, чтобы тот удовлетворял требованиям синтаксиса, который поддерживается соответствующей СУБД.

Источник данных (Data source) – состоит из данных, к которым пользователь хочет получить доступ, соответствующей операционной системы, СУБД, а также сетевой платформы (если таковая имеется), используемой для доступа к СУБД.

Page 19: Ruru Navision 360 Int

Использование ODBC с Navision 2-3

На следующем рисунке показана связь между этими четырьмя составляющими.

Прокомментируем этот рисунок. Во-первых, может существовать несколько драйверов и источников данных, что дает возможность приложению получать доступ сразу к более чем одному источнику данных. Во-вторых, программный интерфейс ODBC используется в двух местах: между приложением и диспетчером драйверов, а также между диспетчером драйверов и каждым драйвером. Интерфейс между диспетчером драйверов и драйверами иногда называют интерфейсом сервис-провайдера, или SPI (service provider interface). Для ODBC программный интерфейс (API) и интерфейс сервис-провайдера совпадают; т.е. диспетчер драйверов и каждый драйвер к одним и тем же функциям имеют один и тот же интерфейс.

Page 20: Ruru Navision 360 Int

2-4 Средства интеграции Navision

2.2 ЗАЧЕМ ИСПОЛЬЗУЮТ C/ODBC

Интеграция с другими приложениями является основной причиной использования ODBC с Navision. Применяя ODBC, вы можете использовать другие приложения, такие как текстовый редактор – для создания составных почтовых документов или редактор электронных таблиц – для сбора той информации, по которой вы хотите получать графики.

Существует несколько фактов, которые надо понимать, чтобы определить для себя, когда стоит использовать C/ODBC-драйвер с Navision. Во-первых, чтобы использовать C/ODBC-драйвер, вам нужно приобрести гранулу C/ODBC (гранула 1700). Во-вторых, вы можете подключиться к Navision либо через серверное соединение, либо через локальное. Вне зависимости от того, какой метод вы используете для соединения, C/ODBC-драйвер использует соединение подобно тому, как пользователь использует сеанс C/ODBC. Кроме того, если используется локальное соединение, вы должны помнить, что можете иметь только одно соединение с файлом БД в единицу времени. Пожалуйста, убедитесь в том, что локальный файл лицензии (fin.flf), размещенный в клиентском каталоге, содержит гранулу C/ODBC.

Сеансы (Sessions) используются:

• ODBC-соединением;

• C/Side-соединением (т.е. интерактивным пользователем, использующим клиентскую часть Navision).

Page 21: Ruru Navision 360 Int

Использование ODBC с Navision 2-5

2.3 УСТАНОВКА И НАСТРОЙКА C/ODBC-ДРАЙВЕРА

До того как вы установите C/ODBC, вы должны установить клиентскую часть Navision. По умолчанию C/ODBC-драйвер не является установленным, когда вы устанавливаете клиентскую часть Navision, поэтому следуйте приведенной ниже процедуре для установки C/ODBC-драйвера под Windows NT, Windows 98 или Windows 2000:

1 Запустите программу setup. Вы найдете ее в подкаталоге Codbc subfolder на компакт-диске Navision product CD. Появится окно Welcome. Это первая из трех форм в стандартном мастере Microsoft Installer.

2 Чтобы продолжить, щелкните мышью Next и следуйте инструкциям мастера.

Требуемые файлы будут скопированы в каталог windows\system на компьютере с Windows 98, winnt\system32 – в случае Windows NT и Windows 2000. C/ODBC будет зарегистрирован и тестовый источник данных C/ODBC будет установлен. Установка завершится, когда появится окно Setup Completed. Щелкните кнопку Finish, чтобы закрыть окно.

Задание источника данных

Как только вы установили все файлы, вы теперь готовы создавать источник данных DSN. Чтобы настроить DSN, вы должны перейти в Панель управления и щелкнуть Data Sources (ODBC). Обратите внимание, что в зависимости от используемой вами операционной системы, названия будут разные.

Находясь в окне ODBC Data Source Administrator, вы должны определить, какой тип DSN вы хотите настроить. Пользовательский DSN используется только в том случае, когда вы хотите, чтобы конкретные пользователи на данном компьютере могли видеть DSN. Однако мы будем использовать системный DSN, поскольку он доступен для всех пользователей на данном компьютере.

Page 22: Ruru Navision 360 Int

2-6 Средства интеграции Navision

Щелкните вкладку System DSN, а затем щелкните кнопку Add. Появится следующее окно.

Выберите из списка драйвер “C/ODBC 32 bit driver” и щелкните кнопку Finish. Вас запросят ввести информацию об установке. Сконфигурируйте свой драйвер следующим образом.

В представленном выше окне мы указали, что этот источник данных поключен к локальной БД. В этом случае, чтобы C/ODBC мог быть подключен, в поле Program Folder вы должны задать путь к файлу fin.exe.

Page 23: Ruru Navision 360 Int

Использование ODBC с Navision 2-7

Примечание

Клиентская часть системы Navision и C/ODBC-драйвер должны иметь одинаковый номер версии.

Обратите внимание, что в этом примере мы заполнили поле с названием компании; однако, если вы хотите, чтобы вас запрашивали имя компании, к которой хотите подключиться, то оставьте это поле пустым.

Мы также не вводили ни идентификатора пользователя, ни пароля, поскольку наша БД не имеет защиты. Однако в тех случаях, когда защита важна, мы рекомендуем, чтобы поля User ID и Password в настройке C/ODBC оставались незаполненными. Таким образом, от пользователя будут запрашиваться ввод идентификатора и пароля всякий раз, когда доступ к данным будет осуществляться извне Navision. Это даст гарантию того, что подключаться к БД будет разрешено только тем пользователям, которым вы позволяете. Более того, Navision будет гарантировать, что пользователи будут иметь доступ только к тем областям, для которых вы предоставляете им разрешение.

Здесь представлен краткий обзор вопросов разграничения полномочий при работе с C/ODBC. Navision использует заданные полномочия при доступе к БД из клиентской части Navision client, а также из другой программы с использованием C/ODBC. Если пользователь не имеет прав чтения для специфических табличных данных, то их нельзя считать ни из Navision, ни из C/ODBC. В дополнение к установке полномочий для пользователей вам также необходимо создать отдельную роль для пользователей C/ODBC.

Установка ролей для пользователей C/ODBC

До тех пор пока вы не установили права для пользователей C/ODBC, вы не можете извлекать данные из Navision с помощью внешних приложений, поскольку системные права по умолчанию назначены только суперпользователям. Чтобы разрешить другим пользователям работать с C/ODBC, вы должны ввести новую роль.

Чтобы создать роль для C/ODBC-пользователей, выполните следующие шаги.

1 Щелкните Tools, Security, Roles. Появится окно Roles.

Page 24: Ruru Navision 360 Int

2-8 Средства интеграции Navision

2 Щелкните Edit, Insert New (или нажмите клавишу F3), чтобы получить пустую строку, где будет вводиться новая группа.

3 В поле Role ID введите идентификатор для новой роли, например, CODBC.

4 В поле Name введите описание новой роли, например, “пользователи C/ODBC”.

5 Нажмите клавишу Enter или щелкните следующую строку, чтобы обеспечить ввод новой роли.

Чтобы назначить системные полномочия новой роли, выполните следующие действия.

1 В окне Roles щелкните на роли CODBC, которую вы создали на предыдущем шаге.

2 Щелкните Role, Permissions. Для этой новой роли появится окно Permissions. Поскольку это новая роль, окно будет пустым.

В окне Permissions вы можете корректировать, удалять и вставлять строки. Каждая строка представляет объект в программе. Объект – это имя для программной единицы в Navision, такой как таблица, окно или отчет.

3 В первой строке, в поле Object Type щелкните AssistButton и выберите из списка Table Data.

4 В поле Object ID щелкните AssistButton и выберите в появившемся окне Object List таблицу номер 2000000006, Company.

5 В поле Insert щелкните AssistButton, выберите <Blank> и нажмите клавишу ENTER. Это приведет к удалению из этой роли права Insert для данного объекта.

6 Повторите шаг 5 для полей Modify и Delete.

Для данного объекта новая роль должна иметь только права чтения (Read) и исполнения (Execute).

7 В окне Permissions перейдите на следующую строку и в поле Object Type щелкните AssistButton, а затем выберите из списка слово System.

Page 25: Ruru Navision 360 Int

Использование ODBC с Navision 2-9

8 В поле Object ID щелкните AssistButton и в появившемся окне Object List выберите таблицу номер 913, C/ODBC.

9 Обратите внимание, что для данного объекта выбраны все права.

Такие полномочия дадут возможность пользователям выполнять C/ODBC-драйверы и извлекать данные с помощью приложений извне Navision. Для получения дополнительной информации об информационной безопасности в Navision см. руководство Installation and System Management для Navision Server или для Microsoft SQL Server Option.

Вы должны теперь назначить эту роль всем тем пользователям, кому требуется получить доступ к Navision с использованием C/ODBC.

Опции C/ODBC

Настало время конфигурировать опции C/ODBC. Вы делаете это путем открытия окна C/ODBC Setup и нажатия кнопки Options для указания источника данных. Появится окно C/ODBC Options.

Когда вы указываете C/ODBC-драйвер, вы не должны забывать об опциях, способных повлиять на производительность C/ODBC. Прежде всего вам нужно удостовериться, что поле Commit Cache содержит выставленный флажок и что вы указали достаточно большое для улучшения производительности значение кэша СУБД. Затем вам нужно ввести путь Tmp Path. Для этого каталога должно быть доступно значительный объем дискового пространства. Кроме того, вам потребуется сбросить флажок из поля Enable BLOB fields, если вы не намерены использовать BLOB-поля в нашем примере.

Опции в поле Identifiers управляют тем способом, которым идентификаторы (имена таблиц и полей) передаются из Navision во внешнюю программу. Сделанный вами выбор затрагивает то, как вы используете идентификаторы во внешних программах и как будете

Page 26: Ruru Navision 360 Int

2-10 Средства интеграции Navision

записывать SQL-операторы. В частности, Microsoft Query не поддерживает идентификаторы с точками (например, поле No., используемое во многих таблицах). Чтобы Microsoft Query смог корректно обрабатывать эти имена, используйте источник данных с опцией All Except DOT в поле Identifiers. К тому же при написании своих SQL-операторов мы должны использовать идентификаторы, заключенные в кавычки. Для получения дополнительной информации смю руководство C/ODBC Guide.

Наконец, щелкните OK в окне C/ODBC Options и в окне C/ODBC Setup.

Примечание

C/ ODBC теперь поддерживает даты закрытия и мультиязычность.

Page 27: Ruru Navision 360 Int

Использование ODBC с Navision 2-11

2.4 ДОСТУП К ДАННЫМ ИЗ ЗАПРОСОВ К БД

После того, как сконфигурирован C/ODBC-драйвер, вы можете осуществлять запросы к БД Navision. Наш пример – это отчет Customer Delinquent. Нам дали задание включить в отчет следующие столбцы: Customer No_, Due Date, Document Type, Document No_, Document Date, Amount, Open. Кроме того, вы должны вычислить срок счета (Age), указав его в столбце с именем Age.

Далее приводятся шаги, которые необходимо для этого сделать.

1 Запустите Microsoft Excel и откройте новый лист электронной таблицы.

2 Щелкните на Data, выберите Get External Data, а затем Create New Query. Появится Мастер запросов (Query Wizard), который поможет выбрать столбцы из используемой вами таблицы (таблиц).

3 Выберите столбцы, как показано в примере, и щелкните кнопку Next.

Page 28: Ruru Navision 360 Int

2-12 Средства интеграции Navision

4 Далее нам необходимо определить, какие данные мы хотим фильтровать. Поскольку нам требуется видеть открытые записи, мы зададим фильтр, как показано на следующем экране.

Обратите внимание, что False = 0 и 1 = True.

5 После ввода параметров фильтра (Filter Data), щелкните кнопку Next.

6 Теперь вы должны определить порядок сортировки данных. Допустим, вы хотите сортировать по полям Customer No и Due Date. Следовательно, мы зададим порядок сортировки, как показано ниже, и затем щелкнем кнопку Next.

Page 29: Ruru Navision 360 Int

Использование ODBC с Navision 2-13

7 Теперь мы готовы завершить запрос; однако мы собираемся выбрать пункт промостра данных или редактирования запроса в Microsoft Query (View data or edit query in Microsoft Query), а затем щелкаем кнопку Finish.

Ниже представлен финальный экран, который должен перед нами появиться.

Вы имеете возможность редактировать SQL-оператор, чтобы удалить столбец Open из оператора SELECT. Тот SQL-оператор, который мы хотим получить, имеет вид:

SELECT "Cust_ Ledger Entry"."Customer No_", "Cust_ Ledger Entry"."Due Date”, "Cust_ Ledger Entry"."Document Type", "Cust_ Ledger Entry"."Document

Page 30: Ruru Navision 360 Int

2-14 Средства интеграции Navision

No_", "Cust_ Ledger Entry"."Document Date", "Cust_ Ledger Entry".Amount

FROM "Cust_ Ledger Entry" "Cust_ Ledger Entry"

WHERE ("Cust_ Ledger Entry".Open=1)

ORDER BY "Cust_ Ledger Entry"."Customer No_", "Cust_ Ledger Entry"."Due Date"

После этого идет выбор File и выбор пункта меню Return Data to Microsoft Excel:

На экране ниже показано, как выглядят наши данные с дополнительным столбцом Age, который мы создали (он показывает количество дней, прошедших с даты платежа для просроченного счета).

Page 31: Ruru Navision 360 Int

Использование ODBC с Navision 2-15

2.5 ЗАПИСЬ ДАННЫХ В NAVISION

Приведенный выше пример довольно прост и не требует программирования. Мы будем использовать MS Access 97 (в рамках данного курса) и будем создавать ссылки в Navision.

Курс предполагает, что вы обладаете знаниями по работе с Microsoft Access.

1 Откройте Microsoft Access, выберите Blank Database, а затем щелкните OK.

2 Щелкните пункт меню File, выберите Get External Data, а затем Link Tables. Появится следующее окно.

Page 32: Ruru Navision 360 Int

2-16 Средства интеграции Navision

3 Щелкните Files of type и выберите ODBC Databases(). Появится представленное ниже окно. Щелкните на закладке Machine Data Source.

4 Выберите имя источника данных (Data Source Name), который вы создали, и щелкните OK.

5 Щелкните File, выберите Get External Data, а затем Link Tables. Появится следующее окно. Выберите Location и щелкните OK.

Page 33: Ruru Navision 360 Int

Использование ODBC с Navision 2-17

Теперь вы готовы выбирать и открывать связанную таблицу. Ниже приведен соответствующий экран:

Мы добавим пункт BLACK с соответствующей информацией:

Code Name Address City Country Post Code

Contact

BLACK Black ware-house

2 Late St Atlanta USA 30096 Joe B. Cool

Как только вы закрыли свой C/ODBC-сеанс, вы можете открыть свой клиент Navision и удостовериться в том, что ваши данные действительно введены.

Внимание

Данные, введенные через C/ODBC, не будут достоверными. Поэтому очень важно, чтобы вы проверили, соответствуют ли введенные данные типу данных Navision, заданному для этого поля. Кроме того, любые поля, которые могли бы быть заполнены автоматически, в Navision должны быть заполнены вручную.

При использовании C/ODBC-драйвера мы рекомендуем сначала

Page 34: Ruru Navision 360 Int

2-18 Средства интеграции Navision

сохранять свои данные в заблокированной таблице (holding table). Затем вы должны написать код на языке C/AL для обработки тех данных, которые вы импортировали. Другая возможность – заставить пользователя проверить и подтвердить данные. Однако, как нетрудно представить, это не столь быстрый процесс и он сохраняет вероятность того, что кое-что просто будет упущено.

Если вы вошли в Navision и выбрали Warehouse Management, а затем щелкнули Setup, то вы сможете выбирать ячейки. Далее, взгляните на ячейку BLACK, которую мы создали. К счастью, большинство полей в этой конкретной таблице не имеет отношений с другими таблицами. Однако, поле Country такое отношение имеет. См. на приведенную ниже карточку ячейки BLACK:

Если вы щелкните в этом поле, то увидите, что мы в нем сохранили неверные данные. Country Code (код страны) должен быть US. Правка значения данного поля выполняется легко, поскольку данные уже существуют. Однако, можно заметить, что существует также и определение почтового индекса (Post Code). Если вы раскроете это поле, то увидите, что записи в нем нет. Следовательно, вы должны создать запись вручную.

Как показывает этот короткий пример, нужно быть осторожным при импортировании данных с использованием драйвера C/ODBC. Более того, так как проверка данных вручную занимает немало ресурсов, мы еще раз рекомендуем, чтобы вы хранили данные в заблокированной таблице и использовали C/AL-код для обработки данных и проверки информации.

Page 35: Ruru Navision 360 Int

Использование ODBC с Navision 2-19

2.6 ОГРАНИЧЕНИЯ C/ODBC-ДРАЙВЕРА

При использовании C/ODBC не разрешается проверять поля. Следовательно, при записи данных в БД Navision через C/ODBC данные не будут подвергаться проверке на соответствие бизнес-правилам.

Обратите внимание, что настройка фильтров потоков (flow filters) и систематизации на определенных версиях Navision будет приводить к зависанию фильтров.

Драйвер C/ODBC не поддерживает внешнее объединение полей (outer joins).

Драйвер C/ODBC разработан для Navision Server. Если вы хотите использовать функциональность ODBC для SQL Server Option, вам нужно использовать драйвер Microsoft SQL ODBC.

Замечание

Драйвер Microsoft ODBC позволяет вам исполнять SQL statements, но он не может вычислять поля FlowFields. Поля FlowFields обычно вычисляются на клиентской части Navision, и когда вы используете драйвер Microsoft ODBC, данная функциональность вам недоступна.

Однако, вы можете получить доступ к таблице, с которой связано поле flow field и использовать ее для вычисления значения.

SQL DTS использует функции OLE-DB, а драйвер C/ODBC не совместим с OLE-DB. Поэтому когда предпринимается попытка вставить данные в Navision и соответствующие серверы, вы можете получить следующее сообщение об ошибке: "Expected lexical element not found" (“Ожидаемый лексический элемент не найден”), что говорит о синтаксической проблеме (например, нарушена структура SQL-оператора).

Основные проблемы

Одна из основных проблем состоит в том, что пользователю требуется гранула 1700. Кроме того, как уже ранее было сказано в этой главе, пользователь C/ODBC должен иметь доступ к системе Navision. Другие часто встречающиеся проблемы, с которыми приходится сталкиваться, приводятся ниже.

Page 36: Ruru Navision 360 Int

2-20 Средства интеграции Navision

• Версия драйвера C/ODBC отличается от версии используемых исполняемых файлов. Обычно это приводит к тому, что всякий раз при попытке подключиться с использованием C/ODBC-соединения будет появляться окно C/ODBC Setup. Вы можете проверить версию, щелкнув на закладке драйверов и сравнить версии драйвера C/ODBC и системы Navision.

• Путь к папке Program не был заполнен или указан некорректно на экране C/ODBC Setup.

• Предпринимается попытка подсоединиться к составной БД (multi-part database) и при этом указывается только первая часть имени БД. Помните, что если БД состоит из нескольких частей (файлов), то вы должны вводить все имена файлов, отделяя их плюсом (+). Однако, если вы открываете части со стороны клиента, то вы не должны столкнуться с подобной проблемой.

• Делается попытка переместить образы или иные BLOB-данные, когда флажок Enable BLOB Fields в окне C/ODBC Options остается сброшенным. Это означает, что BLOB-поля скрыты. Щелкните на флажок, чтобы сделать BLOB-поля видимыми из ODBC.

Существуют также общие проблемы использования, они приведены ниже.

• Намерение выбрать группу (company) при открытом C/ODBC-соединении. Решение: оставить имя группы пустым при установке DSN.

• Забывание того, что каждый пользователь и приложение при работе с C/ODBC использует сеанс.

• Попытка поключиться одновременно к нескольким группам одной и той же БД. Вы не можете этого сделать, поскольку каждый источник данных, который вы создаете, должен ссылаться на уникальную БД и вы можете открывать единовременно только одну группу (company). Более того, вы не можете работать с несколькими группами, если используете выделенный DNS, поскольку он указывает на один и тот же драйвер. Следовательно, для получения доступа к нескольким группам вы должны использовать несколько C/Front-соединений.

• Забывание задать права доступа.

Page 37: Ruru Navision 360 Int

Использование ODBC с Navision 2-21

Поскольку довольно много пользователей используют драйвер C/ODBC с СУБД Microsoft Access, мы расширили список проблем следующими.

• При попытке очистить значение в поле (например, в поле "Name 2"), высвечивается сообщение о намерении присвоить значение Null переменной, которая не относится к типу Variant. Это известная проблема при работе с Microsoft Access. В справочной системе Microsoft Knowledge Base мы обнаружили разъяснение.

Microsoft Access поддерживает строки нулевой длины. C/ODBC не преобразовывает строку нулевой длины в значение, которое может быть использовано БД в формате Navision. Поэтому Navision интерпретирует строку нулевой длины как значение NULL и возвращает сообщение об ошибке.

Если вы вызываете SQL-операторы Modify из VBA-кода в MS Access, то проблема в том, что данные не могут быть пустыми.

• Microsoft Access имеет проблему со связыванием внешней ODBC table как источника данных File Data. Access (MS Jet) выдаст следующую ошибку:

Reserved error code (-7778)

Reserved error code означает, что MS Jet не может найти подстроку “DSN=” в строке подключения к ODBC-драйверу.

Решение: использовать ODBC Administrator, чтобы добавить новый (C/ODBC, 32 бита) System DSN, здесь именуемый CODBC SDSN и содержащий нужную вам процедуру установки.

Затем добавьте пустой источник данных (C/ODBC, 32 бита) File Data Source, здесь именуемый CODBC FDSN.

Наконец, отредактируйте File Data Source с помощью текстового редактора. (Источники File Data Source обычно размещаются в каталоге C:\Program Files\Common Files\Odbc). Текст в CODBC-файле FDSN.dsn

[ODBC]

DRIVER=C/ODBC 32 bit

надо изменить на

Page 38: Ruru Navision 360 Int

2-22 Средства интеграции Navision

[ODBC]

DSN=CODBC SDSN

Источник данных File Data Source теперь использует процедуру установки из CODBC SDSN. Обратите внимание, что если вы редактируете File Data source, то фактически вы редактируете System Data Source.

• Другие проблемы Access и связывания таблиц

Одна из причин, почему с Access связано много проблем, состоит в том, что драйвер C/ODBC не поддерживает параметрические поля, которые Access использует при связывании внешних таблиц.

Рассмотрим следующий SQL-оператор:

SELECT * FROM Customer

Данный оператор извлекает все записи и во всех столбцах из таблицы Customer. Однако, когда вы связываете таблицу в Access, программа создает SQL-оператор такого вида:

SELECT * FROM Customer WHERE Field1 = ? OR

Field2 = ? OR Field 3 = ? … etc.

Access всегда извлекает 10 записей за единицу времени, поэтому упомянутый оператор будет содержать 10 вопросительных знаков. Знак вопроса указывает на адрес памяти, которые модифицируется всякий раз, когда вы запрашиваете в Access новую страницу данных. Значения в ячейках памяти для первого оператора будут 1,2,3,4,5,6,7,8,9,10, если первые 10 клиентов нумеровались последовательно от 1 в порядке возрастания. Таким образом, SQL-оператор становится динамическим в том смысле, что Access только модифицирует адреса памяти со значениями для следующих 10 записей. Однако, как ранее уже отмечалось, драйвер C/ODBC не поддерживает динамические поля (параметрические поля).

Изменение записи в системном Реестре Window.

1 Найдите в системном Реестре следующий ключ:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\

<Version>\Engines

Page 39: Ruru Navision 360 Int

Использование ODBC с Navision 2-23

Где <Version> – это версия механизма Jet, который вы используете (например, 4.0).

2 Создайте новый ключ с именем ODBC, если таковой еще не существует.

3 Создайте в ODBC новое двойное слово (DWORD) с именем SnapshotOnly и значение 1 in the ODBC, если таковое еще не существует.

Наконец, поскольку при попытке соединиться из MS Excel или MS Word используется MS Query, мы добавили в список проблем следующее.

• Почему я получаю сообщение "Connection in use" (“соединение используется”) при попытке изменить источник данных с C/ODBC на иной без завершения MS-Query?

MS-Query не закрывает источник данных перед подключением к новому. Поэтому чтобы решить проблему, установите MS-Query в AutoDisconnect путем изменения файла MSQUERY.INI, расположенного в каталоге Windows.

[Microsoft Query]

AutoDisconnect=1

Среди общих проблем есть и такие.

• Почему драйвер C/ODBC не может получить доступ к некоторым таблицам среды C/SIDE? Ответ в том, что доступ к некоторым виртуальным таблицам C/SIDE скрыт, поскольку они содержат значительный объем виртуальных данных (в частности, таблица Integer). Таблица может быть видна в списке таблиц, но при этом не быть доступной.

• Где можно найти сообщения об ошибках, которые возвращает ODBC-драйвер? Вы можете найти все подобные сообщения в файле CODBC.ETX или NODBC.ETX (в зависмости от продукта). После установки они находятся в вашем каталоге \WINDOWS\SYSTEM (для Windows 98) и \WINNT\SYSTEM32 (для Windows NT/2000 ).

• Различает ли C/ODBC регистр символов? Как правило, да. Однако, это зависит от типа поля, по которому вы хотите вести фильтрование. Поля Option не различают регистр символов, а

Page 40: Ruru Navision 360 Int

2-24 Средства интеграции Navision

поля Text и Code различают. Поэтому если вы всегда рассматриваете фильтрующее поле как чувствительное к регистру символов, ваш запрос будет успешным.

Page 41: Ruru Navision 360 Int

Использование ODBC с Navision 2-25

2.7 КОНТРОЛЬНЫЕ ВОПРОСЫ

Вопросы

1 Чтобы ваш клиент использовал C/ODBC с Navision вы должны (сделайте выбор из трех вариантов):

установить драйвер Microsoft ODBC;

приобрести гранулу C/ODBC;

установить полномочия для пользователей C/ODBC;

настроить DSN.

2 Верно ли утверждение? Вы можете использовать любую версию C/ODBC, чтобы открыть любую БД Navision.

3 Верно ли утверждение? Navision для всех своих соединений использует Microsoft ADO.

4 Верно ли утверждение? Драйвер C/ODBC поддерживает внешнее объединение полей (outer joins).

5 Верно ли утверждение? Ввод данных через ODBC будет подвергаться такой же проверке, как если бы вы работали в Navision.

Page 42: Ruru Navision 360 Int

2-26 Средства интеграции Navision

Ответы

1 Чтобы ваш клиент использовал C/ODBC с Navision вы должны (сделайте выбор из трех вариантов):

установить драйвер Microsoft ODBC;

приобрести гранулу C/ODBC;

установить полномочия для пользователей C/ODBC;

настроить DSN.

2 Верно ли утверждение? Вы можете использовать любую версию C/ODBC, чтобы открыть любую БД Navision.

Нет, версии клиента и драйвера C/ODBC должны совпадать.

3 Верно ли утверждение? Navision для всех своих соединений использует Microsoft ADO.

Нет, Navision не поддерживает ADO.

4 Верно ли утверждение? Драйвер C/ODBC поддерживает внешнее объединение полей (outer joins).

Нет.

5 Верно ли утверждение? Ввод данных через ODBC будет подвергаться такой же проверке, как если бы вы работали в Navision.

Нет.

Page 43: Ruru Navision 360 Int

Глава 3

Использование C/FRONT в Navision

В этой главе мы познакомим вас с Navision C/FRONT. Однако этот курс не заменяет собой справочное руководство по C/FRONT.

В главе представлены следующие разделы:

• Что такое C/FRONT

• Установка и настройка C/FRONT

Два программных интерфейса – DLL и OCX

• Доступ к данным из Visual Basic

• Запись данных из Microsoft Excel

Ограничения при использовании C/FRONT

Контрольные вопросы

Page 44: Ruru Navision 360 Int

3-2 Средства интеграции Navision

3.1 ЧТО ТАКОЕ C/FRONT

C/FRONT представляет собой программный интерфейс, который может быть использован для доступа к БД в C/SIDE. C/FRONT обеспечивает высокоуровневое взаимодействие с менеджером БД в C/SIDE и позволяет разработчикам на языке C работать с любой БД в C/SIDE.

Центральным компонентом C/FRONT служит библиотека функций языка C. Эти функции дают вам доступ к каждому аспекту хранения и сопровождения данных и позволяет вам интегрировать со своей БД в C/SIDE как стандартные, так и вновь созданные приложения.

Поскольку C/FRONT яляется инструментом переднего плана для Navision, то возможно, что вы захотите использовать C/FRONT для добавления, удаления или просмотра данных в своих приложениях. Кроме того, возможно вам понадобится создавать или обрабатывать табличные объекты или вести поиск информации в таблицах так, что вы не сможете использовать драйвер C/ODBC. C/FRONT работает гораздо быстрее, чем драйвер C/ODBC, и он является наиболее близким к коммуникационным возможностям, которые вы можете получить при использовании Navision. Однако, для того чтобы воспользоваться C/FRONT, вы должны применять другие языки программирования, такие как Delphi, Kylix, C++, C или Visual Basic. C/FRONT предоставляет два способа доступа к Navision: либо через библиотеки DLL на C, либо через интерфейс OCX. Наши примеры будут использовать Microsoft Visual Basic 6.0 и OCX.

Page 45: Ruru Navision 360 Int

Использование C/FRONT в Navision 3-3

3.2 УСТАНОВКА И НАСТРОЙКА C/FRONT

C/FRONT может быть установлен из набора HTML-страниц, размещенных на продуктовом компакт-диске Navision (product CD). Следуйте инструкциям эксперт-программам установки и прочитайте файл readme.txt с компакт-диска Navision.

Примечание

При установке C/FRONT имейте в виду, что комплект поставки содержит два .dll-файла – cfront.dll и cfrontsql.dll. Скопируйте оба файла в указанный выше каталог. Убедитесь в том, что в значении свойства CfrontDllName вы указали имя той DLL-библиотеки, которую вы будете использовать. Если вы работает на SQL Server, выберите файл cfrontsql.dll. В противном случае выберите cfront.dll.

Обычно библиотека C/FRONT library (cfront.dll/cfrontsql.dll) просматривает Реестр, чтобы определить местонахождение СУБД Navision. Однако, если установлено несколько систем Navision или же если Navision не присутствует в системе, то функция SetNavisionPath в библиотеке cfront.dll/cfrontsql.dll должна вызываться с указанием пути к тому каталогу, где установлен Navision, или к каталогу, содержащему следующие файлы из поставки Navision.

После установки системы Navision следующие файлы должны быть скопированы с продуктового компакт-диска:

dbm.dll

nc_netb.dll

nc_tcp.dll

slave.exe

fin.etx

fin.stx

fin.flf

Page 46: Ruru Navision 360 Int

3-4 Средства интеграции Navision

Список файлов C/FRONT

C/FRONT состоит из следующих файлов:

Имя файла Описание

cfront.dll C/FRONT C-API библиотека для Navision Server

cfrontsql.dll C/FRONT C-API библиотека для SQL Server

cfront.ocx C/FRONT OCX

cf.h Файл заголовков C/FRONT

libload.c Исходный текст на C, содержащий функции для загрузки и выгрузки cfront.dll

dberror.txt Коды возврата и коды ошибок для СУБД

cfront.chm Файл интерактивной справки (C/FRONT OCX)

cfront.xls Пример приложения Microsoft Excel (C/FRONT OCX)

Mfc42.dll Библиотека Microsoft Foundation Classes

msvcrt.dll Библиотека исполняющей системы Microsoft Visual C Run-Time Library

readme.txt Файл, содержащий наиболее актуальную информацию по продукту

Кроме того, установлены также следующие примеры:

Имя файла Описание

sample.c Пример C/FRONT-приложения

sample.exe Пример исполняемого приложения

sample.fdb Пробная БД Navision

sample.fbk Архив пробной БД Navision

sample.txt Документ, описывающий то, как создавать и запускать пример приложения с помощью программного интерфейса C/FRONT C-API

Page 47: Ruru Navision 360 Int

Использование C/FRONT в Navision 3-5

3.3 ДВА ПРОГРАММНЫХ ИНТЕРФЕЙСА – DLL И OCX

Различия между программными интерфейсами C/FRONT API DLL и OCX

Существует немало различий между программными интерфейсами C/FRONT API DLL и OCX. Интерфейс C/FRONT API DLL в основном предназначен для программистов на C, но может быть использован с любым языком и компилятором, способным загружать и использовать DLL-библиотеки, а также поддерживающим соглашение о вызовах _CDECL. Интерфейс OCX преимущественно используется для получения простого доступа к базам данных Navision из программных сред, таких как Microsoft Excel, Microsoft Word и Microsoft Visual Basic.

Справочное руководство C/FRONT (C/FRONT Reference Guide) предназначено прежде всего для разработчиков DLL и программистов на C, но может быть использовано и при работе с OCX. Оно предоставляет базовую информацию и содержит значительное количество примеров.

Если вы знакомы с DLL, рекомендуем вам прочитать интерактивную справку (online Help) по той функции, которую собираетесь использовать при работе с OCX – здесь имеется немало различий. Кроме того, некоторые функции в DLL не имеют эквивалентов OCX: в OCX есть немало новых функций. Следует также заметить, что ошибки обрабатываются по-разному. Например, при использовании OCX вы не можете установить свой собственный обработчик ошибок или сообщений вместо стандартного.

Основные различия

Для всех функций в DLL, которые начинаются с DBL_*, соответствующие методы в OCX не используют префикс DBL_. Например, метод, который соответствует функции DBL_OpenDatabase,– это OpenDatabase.

Функция GetLastErrorCode в DLL эквивалентна методу LastError в OCX.

Функция Field_2_Str в DLL эквивалентна методу FieldToStr в OCX.

Даты закрытия не могут использоваться в OCX. Если дата закрытия извлекается из БД, она рассматривается как обычная дата. Соответственно невозможно из OCX сохранить дату закрытия в БД.

Page 48: Ruru Navision 360 Int

3-6 Средства интеграции Navision

В OCX не поддерживаются сотые доли секунд для значений Time.

Функция Allow заменяется четырьмя методами – AllowKeyNotFound, AllowRecordExists, AllowRecordNotFound и AllowTableNotFound.

Функции без эквивалентов

Нет больше необходимости в функциях преобразования, поскольку такие функции, как GetFieldData и AssignField используют тип данных Variant.

Следующие функции не имеют эквивалентов в OCX:

Alpha_2_Str

BCD_2_Str

Date_2_Str

Date_2_YMD

HMST_2_Time

Str_2_Alpha

Str_2_BCD

Str_2_Date

Str_2_Time

Time_2_HMST

Time_2_Str

YMD_2_Date

Обработка ошибок в OCX выполняется иначе (см. раздел Error Handling в справочном руководстве по C/Front в интерактивной справке), и вы не можете заменять стандартный обработчик ошибок или сообщений собственной функцией. В то же время мы рекомендуем, чтобы вы удостоверились в том, что включили достаточное количество проверок на наличие ошибок, поскольку в основном ошибки возникают из-за некорректно заданных значений.

Следующие функции не имеют эквивалентов в OCX:

SetExceptionHandler

SetMessageShowHandler

Page 49: Ruru Navision 360 Int

Использование C/FRONT в Navision 3-7

При использовании OCX нет надобности в явной инициализации и деинициализации. Следующие функции не имеют эквивалентов в OCX:

Exit

Init

Указанные ниже две функции были изъяты, поскольку измененная функциональность GetFieldData делает их избыточными и поскольку те программные среды, с которыми обычно используется OCX, как правило, не поддерживают использование указателей на том уровне, как это делается в языке C.

GetFieldDataAddr

GetFieldDataSize

Следующая функция оставлена в DLL для того чтобы упростить перенос приложений C-Toolkit for Navision 3.XX. Эта функция не требуется в OCX.

FieldDataOffset

Page 50: Ruru Navision 360 Int

3-8 Средства интеграции Navision

3.4 ДОСТУП К ДАННЫМ ИЗ VISUAL BASIC

Следующий пример, который мы рассмотрим, исходит из того предположения, что вы намереваетесь открыть предопределенную БД, таблицу Customer, и хотите представить на экране заказчиков в виде списка. Пример не разъясняет, как использовать Visual Basic.

1 Откройте Visual Basic и выберите тип проекта (Standard.Exe), а затем щелкните кнопку Open.

2 В окне Project Window выберите Project1, щелкните правой кнопкой мыши и выберите Rename. Переименуйте свой проект в Cfront_Test.

3 Щелкните на форме Form1 в окне Project Window и затем выберите свойства. Установите следующие значения свойств:

Name = MainForm

Height = 6450

Width = 6650

Startup Position = 2 - CenterScreen

4 Щелкните на Projects и выберите компоненты, либо используйте последовательность горячих клавиш (CTRL + T). Затем выберите модуль Cfront OLE Control Module, Microsoft Common Dialog SP3 и Microsoft FlexGrid Control 6.0 (SP3). После чего убедитесь в том, что рядом с каждым именем компонента выставлен флажок.

Page 51: Ruru Navision 360 Int

Использование C/FRONT в Navision 3-9

Взгляните на следующий экран:

5 Мы должны описать некоторые переменные, которые нам потребуются. Щелкните на варианте View главного меню и выберите Code. Появится окно работы с программным текстом. Выберите (General) из левого выпадающего списка и (Declarations) из правого списка, а затем создайте следующие public-переменные.

Public NavisionPath As String

Public LicenseFileName As String

Public DatabaseFileName As String

Public CompanyName As String

Public UserId As String

Public TableNo As Long

Public TableHandle As Long

Public hRec As Long

Public GridRow As Integer

Public GridCol As Integer

6 Нам требуется создать собственное меню. Щелкните на варианте Tools из основного меню и выберите Menu Editor, либо нажмите CTRL+E. Добавьте следующие пункты выбора меню – File, Open, Exit, View и Write (см. экран):

Page 52: Ruru Navision 360 Int

3-10 Средства интеграции Navision

Обратите внимание, что мы отделили пункты выбора Open и Exit. Далее, каждый пункт выбора в меню имеет заголовок (с использованием знака &) и имя. Теперь сформируем пункты выбора меню (как это описано выше) и создадим заголовки в соответствии с приведенным экраном.

7 Дважды щелкните на значке OCX в окне Components. Это приведет к размещению OCX (CFront) на форме. Выберите значок OCX и переместите его в левый верхний угол формы. Затем задайте следующие значения свойств:

Visible = No

(Name) = Cfront

Примечание. Возможно вы захотите уменьшить размеры значка так, чтобы он не превышал размеров командной кнопки.

8 Дважды щелкните на значке CommonDialog в окне Components. Это приведет к размещению значка компонента CommonDialog на форме. Выберите значок компонента CommonDialog и перемещайте его в верхнюю часть формы, чтобы он оказался справа от значка Cfront. Измените название свойства с CommonDialog1 на CommonDialog.

Page 53: Ruru Navision 360 Int

Использование C/FRONT в Navision 3-11

9 Дважды щелкните на значке MSFlexGrid с окне Components. Это приведет к размещению компонента MSFlexGrid component на форме. Задайте следующие значения свойств:

(Name) = TableBox

Top = 520

Height = 5655

Width = 6495

Rows = 0

TabIndex = 0

10 Теперь настало время добавить немного программного кода. Из того меню, что мы создали, нажмите File и затем Open. При этом автоматически откроется окно Code и будет создана процедура Open_Click. Добавьте в тело этой процедуры Open_Click следующий код.

'If connecting to a Navision database

DriverName = "NDBCN"

ServerName = ""

NetType = "tcp"

CacheSize = 1000

UseCommitCache = 0

NTAuthentication = 0

UserId = ""

Password = ""

'If connecting to a SQL Server database

'DriverName = "NDBCS"

'NetType = "Named Pipes"

'CacheSize = 0

'UseCommitCache = 0

'NTAuthentication = 1 'Yes

Примечание

Если вы используете SQL Server, вам все еще необходимо вводить значение 0 для CacheSize и UseCommitCache несмотря на то, что это относится только к Navision Server.

Page 54: Ruru Navision 360 Int

3-12 Средства интеграции Navision

CommonDialog.ShowOpen DatabaseFileName = CommonDialog.FileName NavisionPath = Mid(CommonDialog.FileName, 1, InStr(1, CommonDialog.FileName, CommonDialog.FileTitle, vbTextCompare) - 2) DatabaseFileName = CommonDialog.FileTitle 'Set the license file to be in the location where 'the database is located LicenseFileName = NavisionPath + "\fin.flf" CFRONT.SetNavisionPath NavisionPath CFRONT.LoadLicenseFile LicenseFileName CFRONT.CheckLicenseFile (9110) Call CFRONT.ConnectServerAndOpenDatabase(DriverName, ServerName, NetType, DatabaseFileName, CacheSize, UseCommitCache, NTAuthentication, UserId, Password) CompanyName = "CRONUS International Ltd." CFRONT.OpenCompany CompanyName

Имя драйвера играет очень важную роль. Обратите внимание, что приведенный выше код использует NDBCN for Navision Server и NDBCS for SQL Server. Если при выполнении операции открытия/подключения произошел сбой, функция генерирует исключение, которое приводит к завершению приложения. Помните, что в единицу времени может быть открыто только одно соединение БД-сервер.

В единицу времени может быть открыта только одна группа (company). Вы должны открывать группу перед тем, как приложение сможет получить доступ к данным из таблиц БД. В то же время вы можете иметь одновременно открытыми произвольное число таблиц в одной группе. Таблица идентифицируется уникальным числом; следовательно, когда таблица открывается, менеджер БД возвращает уникальное служебное имя (handle), которое остается корректным до тех пор, пока таблица не будет закрыта. Это имя должно передаваться во все операции, совершаемые над таблицей.

Обратите внимание, что приведенный выше код обеспечивает также проверку лицензионного файла, чтобы включить полномочия для C/Front. В случае неудачи здесь возникает сообщение об ошибке.

Теперь в левом выпадающем списке в окне Code выберите Exit и добавьте следующий программный код:

If TableHandle <> 0 Then CFRONT.CloseTable (TableHandle) End If

Page 55: Ruru Navision 360 Int

Использование C/FRONT в Navision 3-13

If CompanyName <> "" Then CFRONT.CloseCompany End If

If Connected Then CFRONT.DisconnectServer End If

CFRONT.ReleaseAllObjects MainForm.Hide

Заметьте, что мы должны предусмотреть проверку на ошибки, чтобы не получать сообщения об ошибках при попытке выйти из нашего приложения, когда мы не открыли группу и не просматриваем записи. Если у вас нет программного кода для TableHandle, вы получите сообщение об ошибке Error 12000 – Invalid Handle (“недопустимое служебное имя”). Если у вас нет кода для проверки CompanyName, вы получите сообщение об ошибке Error 1046 No Company Selected (“группа не выбрана”). Наконец, помните, что после отсоединения от сервера, требуется убедиться в том, что мы освободили все объекты, а, соответственно, и всю память, используемую C/Front.

11 Далее в левом верхнем выпадающем списке в окне Code выберите пункт меню View и добавьте следующий программный код:

Dim CurRow As Long TableNo = 23 'Vendor If Not MainForm.CFRONT.OpenTable(TableHandle, TableNo) Then MsgBox "Unable to Open Table 23 – Vendor." Return End If

Если номер таблицы не найден, высветиться сообщение о том, что таблица не может быть найдена, а затем мы получим ошибку Error 1001 – Table does not exist (“таблица не существует”).

GridRow = 0 NumColumns = 1 FieldNo = MainForm.CFRONT.NextField(TableHandle, 0) While FieldNo > 0 NumColumns = NumColumns + 1 TableBox.Cols = NumColumns TableBox.Row = GridRow TableBox.Col = NumColumns - 1 TableBox.Text =

Page 56: Ruru Navision 360 Int

3-14 Средства интеграции Navision

MainForm.CFRONT.FieldName(TableHandle, FieldNo) FieldNo = MainForm.CFRONT.NextField(TableHandle, FieldNo) Wend

'load the data hRec = MainForm.CFRONT.AllocRec(TableHandle) If MainForm.CFRONT.FindRec(TableHandle, hRec, "-") Then GridRow = 1 Do RecFields = "" & GridRow GridRow = GridRow + 1 FieldNo = MainForm.CFRONT.NextField(TableHandle, 0) While FieldNo > 0 RecFields = RecFields & Chr(9) & MainForm.CFRONT.FieldToStr(TableHandle, hRec, FieldNo) FieldNo = MainForm.CFRONT.NextField(TableHandle, FieldNo) Wend TableBox.AddItem RecFields Loop Until MainForm.CFRONT.NextRec(TableHandle, hRec, 1) = 0 End If MainForm.CFRONT.FreeRec hRec

Если вы используете значение строки, которое не существует, вы получите сообщение об ошибке 3009 – Invalid Row Value (“недопустимое значение строки”).

Page 57: Ruru Navision 360 Int

Использование C/FRONT в Navision 3-15

3.5 ЗАПИСЬ ДАННЫХ ИЗ MICROSOFT EXCEL

Система Navision поставляется с великолепным примером, который демонстрирует процессы чтения и записи в таблицу Budget. Более того, данный пример покажет вам, как вы можете создавать собственную процедуру обработки ошибок. Напомним, что в примере с OCX, который мы использовали в Visual Basic, нельзя создавать собственную процедуру обработки ошибок.

Page 58: Ruru Navision 360 Int

3-16 Средства интеграции Navision

3.6 ОГРАНИЧЕНИЯ ПРИ ИСПОЛЬЗОВАНИИ C/FRONT

Операционная система Windows не будет переходить в спящий режим, если остается открытым подключение к серверу из C/FRONT.

Точки входа C/FRONT не будут активизировать триггеры на предмет выполнения произвольного проверочного кода.

C/FRONT – очень специфичен и в зависимости от лицензии выглядит в разное время в разном операционном контексте по-разному. Лишний раз убедитесь, что везде, где надо (на клиентских компьютерах, на сервере и т.п.) у вас есть необходимая лицензия.

В контексте ограничений основное недоразумение состоит в том, что многие считают, будто C/FRONT можно использовать вместо множественных сеансов. Однако, это не так. Каждое соединение в C/FRONT трактуется как сеанс. При использовании обычной Navision, клиента и ODBC-интерфейса версии CFRONT должны совпадать с версией SERVER, к которому вы пытаетесь подключиться.

Клавиши могут быть активными и неактивными. Вы не можете активировать клавиши из C/FRONT; поэтому в C/FRONT доступны только активные клавиши.

Page 59: Ruru Navision 360 Int

Использование C/FRONT в Navision 3-17

3.7 КОНТРОЛЬНЫЕ ВОПРОСЫ

Вопросы

1 Что такое C/FRONT?

2 Использует ли C/FRONT сеанс?

3 Можно ли активизировать клавиши из C/FRONT?

4 Верно ли следующее утверждение? C/FRONT не требует никаких файлов из папки Navision Attain Client.

Page 60: Ruru Navision 360 Int

3-18 Средства интеграции Navision

Ответы

1 Что такое C/FRONT?

C/FRONT—это программный интерфейс, который может быть использован для доступа к БД в C/SIDE.

2 Использует ли C/FRONT сеанс?

Да

3 Можно ли активизировать клавиши из C/FRONT?

Нет

4 Верно ли следующее утверждение? C/FRONT не требует никаких файлов из папки Navision Attain Client.

Неверно

Page 61: Ruru Navision 360 Int

Глава 4

Использование элементов управления OCX в Navision

В этой главе мы обсудим, как использовать элементы управления OCX с языком Navision C/AL.

Глава содержит следующие разделы.

Настраиваемые элементы управления и элементы OCX

• Установка и регистрация OCX

• Создание переменных

• Написание кода

• Общие проблемы и ограничения

• Упражнение

• Контрольные вопросы

Page 62: Ruru Navision 360 Int

4-2 Средства интеграции Navision

4.1 НАСТРАИВАЕМЫЕ ЭЛЕМЕНТЫ УПРАВЛЕНИЯ И ЭЛЕМЕНТЫ OCX

Настраиваемые элементы управления (Custom Controls) хорошо известны также как элементы управления OLE и элементы управления ActiveX. Из-за того, что они обычно имеют расширение файла *.ocx, их также называют OCX-ами. Следует отметить, что настраиваемые элементы управления могут иметь либо расширение DLL, либо OCX.

OCX позволяет вам воспользоваться преимуществами программного кода, который был сделан коммерчески доступным, а также дает возможность единожды написав код, вызывать его из любой программы, которая поддерживает настраиваемые элементы управления.

Использование настраиваемых элементов управления позволит сократить время разработки и уменьшить стоимость.

Page 63: Ruru Navision 360 Int

Использование элементов управления OCX в Navision 4-3

4.2 УСТАНОВКА И РЕГИСТРАЦИЯ OCX

Чтобы использовать настраиваемый элемент управления, он должен быть загружен на компьютер, который будет задействован при разработке. Он должен быть загружен и на все остальные компьютеры, которые будут использовать OCX, интегрированный в ваш программный код. Поэтому важной частью использования OCX, разработанного вне стен вашей компании, являются вопросы лицензирования в отношении последующего распространения данного OCX. Как только вы разрешите эти вопросы, необходимо установить OCX-компонент на каждый компьютер, где предполагается использовать ваш программный код. После того, как OCX-компонент будет скопирован на компьютер, вы сможете применить разработанный в компании Navision простой метод регистрации данного элемента управления.

Чтобы продемонстрировать простоту регистрации и использования настраиваемого элемента управления в системе Navision Attain, давайте рассмотрим пример финансового элемента управления (finsamp.ocx), который идет в составе поставки на CD. Этот OCX был сделан в среде Microsoft Visual C++ 4.2 с использованием OLE ControlWizard и ClassWizard. Данный компонент содержит множество методов для подсчетов ежегодного дохода.

Первое требование в отношении использования элемента управления состоит в том, что он должен быть физически установлен на целевой компьютер. Кроме того, чтобы его можно было использовать, он также должен быть зарегистрирован в соответствующей операционной системе.

Если элемент управления физически скопирован на жесткий диск, но еще не зарегистрирован, вы можете зарегистрировать его из среды C/SIDE, выполнив следующие действия.

1 Скопируйте элемент управления из дистрибутивного устройства на жесткий диск. Если имеются примеры C/OCX, изучите файл readme.txt для получения более подробной информации.

2 В строке меню щелкните Tools, Custom Controls. Появится следующее окно:

Page 64: Ruru Navision 360 Int

4-4 Средства интеграции Navision

3 Щелкните Control, Browse, чтобы открыть следующее окно:

4 Когда вы разместили элемент управления, выберите его и щелкните Open. При этом произойдет его регистрация в системе. Как только регистрация завершится, вы получите подтверждающее сообщение. Щелкните OK, чтобы вернуться в окно Custom Controls. Чтобы проверить факт добавления элемента управления, вы можете закрыть данную форму и снова щелкнуть Tools, Custom Controls. Новый элемент управления появится в следующем списке (см. верхнюю строчку в приведенном ниже окне):

Page 65: Ruru Navision 360 Int

Использование элементов управления OCX в Navision 4-5

4.3 СОЗДАНИЕ ПЕРЕМЕННЫХ

Когда вы хотите использовать элемент управления, вы описываете переменную (глобальную или локальную) типа OCX и ссылку на элемент управления как подтип этой переменной. В списке будут появляться только те элементы управления, которые зарегистрированы на данном компьютере, используемом для разработки.

Примечание

Если вы не можете выбрать OCX в качестве типа данных, это означает, что в вашей лицензии нет гранулы C/OCX.

Описание элемента управления в качестве переменной

Чтобы описать элемент управления в качестве переменной, надо выполнить следующие шаги:

1 На строке меню щелкните View, C/AL Globals, чтобы открыть следующее окно:

2 Дайте переменной имя (в данном примере используется имя FIN) и выберите OCX в качестве ее типа.

Page 66: Ruru Navision 360 Int

4-6 Средства интеграции Navision

3 В поле Subtype щелкните AssistButton, чтобы открыть следующее окно:

4 Найдите в списке нужный элемент управления и выделите его. Затем щелкните кнопку OK.

5 Теперь окно C/AL Globals будет выглядеть примерно так, как показано на следующей картинке:

Обратите внимание, что поле Subtype содержит идентификатор CLSID для элемента управления FinSamp.

Page 67: Ruru Navision 360 Int

Использование элементов управления OCX в Navision 4-7

6 Когда вы переместите курсор за пределы поля Subtype, имя элемента управления заменит CLSID:

Page 68: Ruru Navision 360 Int

4-8 Средства интеграции Navision

4.4 НАПИСАНИЕ КОДА

Как только вы описали переменную, вы можете в языке C/AL получить доступ к методам и свойствам данного элемента управления. Вы можете просматривать эти методы и свойства в окне C/AL Symbol Menu.

1 Щелкните View, C/AL Symbol Menu, чтобы открыть это окно:

2 Вне зависимости от того, выбран метод или свойство (они находятся в колонке справа), вы можете видеть краткое синтаксическое описание в нижней части окна. Если у элемента управления имеется интерактивная справка, вы можете получить к ней доступ путем нажатия клавиши F1, когда при этом выделено интересующее вас свойство или метод.

Page 69: Ruru Navision 360 Int

Использование элементов управления OCX в Navision 4-9

Ниже приведен экран интерактивной справки для метода PVAL:

3 Когда вы щелкните кнопку OK или Apply в меню C/AL Symbol Menu, в редакторе C/AL Editor в текущей точке вставки появится типовой оператор с методом или свойством (предполагается, что редактор открыт):

4 Как можно видеть на приведенном выше экране, проверка аргументов Paste Arguments различается тем, что возвращается в редактор. Когда аргументы Paste Arguments проверяются, то

Page 70: Ruru Navision 360 Int

4-10 Средства интеграции Navision

возвращается метод или свойство наряду с ожидаемыми аргументами. В противном случае возвращается только метод или свойство.

Можно видеть, что при использовании метода или свойства в случае OCX практически нет разницы по сравнению с Navision. Единственное различие, с которым вы обычно сталкиваетесь, – это типы данных и преобразование этих типов к типам данных системы Navision. Зная соответствие между типами данных позволит вам правильно вызывать метод или свойство. Кроме того, это поможет в определении тех ситуаций, когда определенные методы или свойства нельзя использовать в Navision, если в Navision нет соответствующего типа данных для ожидаемых аргументов. Для получения списка типов данных языка C++ и соответствующих типов данных в Navision см. Приложение A.

Ниже приведены примеры использования метода и свойств в случае OCX.

Следующий оператор использует метод PVAL элемента управления FinSamp:

Amount := Fin.PVAL(Rate,NoOfPeriods,-Payment,0,0);

Следующий оператор получает значение свойства Error элемента управления FinSamp:

Result := Fin.Error

В случае OCX допустимо, что вы можете ожидать параметризованные свойства, которые также известны как массивы свойств (property arrays). Термин “массив свойств” в точности описывает ситуацию – это группа взаимосвязанных свойств, которые будучи собраны вместе составляют единое свойство. Доступ к каждому значению осуществляется как к элементу массива через механизм индексации (subscripting). Предположим, что мы используем элемент управления, описанный как OCX-переменная с именем MyControl. Этот элемент управления имеет параметризованное свойство типа SHORT, носящее название COLOR. Данное свойство имеет два параметра и оба – типа SHORT.

Если переменная Result описана как C/AL Integer, то значение свойства в C/AL можно получить следующим кодом:

Result := MyControl.COLOR(2,3);

Page 71: Ruru Navision 360 Int

Использование элементов управления OCX в Navision 4-11

Если переменная NewValue описана как C/AL Integer, то значение свойства COLOR[2][3] задается такой последовательностью операторов:

NewValue := 4;

MyControl.COLOR(2,3,NewValue);

Обработка исключений

Элемент управления имеет два свойства: Error и ErrorCode. Они предназначены для обработки исключений (exception handling). Всякий раз, когда вызывается метод свойство Error (типа Boolean) используется для сигнализирования об ошибках – оно устанавливается в значение TRUE, если ошибка возникла. В противном случае принимает значение FALSE. Причина, приведшая к ошибке, выявляется методами элемента управления. В элементе управления, приведенном в примере C/OCX Samples, одна ошибка, в частности, происходит по причине числового переполнения при выполнении арифметического действия, а другая – следствие передачи в качестве параметра некорректного значения, выходящего за допустимый диапазон.

Когда возникает ошибка (и значение Error устанавливается в TRUE), ErrorCode содержит числовой код, котрый может быть использован вызывающей программой с тем, чтобы определить, какие действия надо предпринять (например, высветить на экране соответствующее сообщение для пользователя).

Вызовы методов в элементе управления могут быть в языке C/AL оформлены следующим образом:

IF (Fin.Error) THEN

// do error handling, for example:

ErrorHandlerFunction(Fin.ErrorCode)

ELSE

// continue processing

Page 72: Ruru Navision 360 Int

4-12 Средства интеграции Navision

4.5 ОБЩИЕ ПРОБЛЕМЫ И ОГРАНИЧЕНИЯ

Общие проблемы

Основная проблема, которая возникает, состоит в том, что необходимый OCX-объект не зарегистрирован на данном компьютере. Один способ регистрации OCX на вашем компьютере изложен в разделе "Установка и регистрация OCX".

Вторая важная проблема возникает, когда в объект вносятся изменения, при этом данный объект зависит от OCX-компонента, который не зарегистрирован на инструментальном компьютере. Если инструментальная версия OCX не загружена на компьютере, объект не удастся откомпилировать. Таким образом, вам нужно определиться с тем, модифицировать этот объект или реализовывать модификацию в другом объекте. Если вы приняли решение вносить изменения в сам объект, вам нужно загрузить инструментальные файлы и инструменты, необходимые для компиляции объекта. Если же вы отказались от модификации объекта, то необходимо проэкспортировать нетронутый объект из чистой версии в формате .fob, а затем проимпортировать его в вашу БД в формате Navision.

Разработчикам нужно помнить, что строки в Navision ограничены размером в 1024 символа. До выхода Navision Attain 3.00 строки были ограничены размером в 250 символов. Таким образом, исходя из знания используемой версии Navision вам нужно гарантировать, что настраиваемый элемент управления будет возвращать строку соответствующего размера.

Основная проблема, связанная с вопросами лицензирования, всплывает тогда, когда лицензия не включает гранулу OCX. Более того, если у вас нет этой гранулы в составе лицензии, то вы даже не сможете в выпадающем списке доступных типов данных увидеть тип OCX. Важно отметить, что гранула OCX нужна только для разработки. Клиентам, которые будут работать с вашими откомпилированными объектами, гранула OCX не требуется. Им лишь нужно, чтобы откомпилированный объект был загружен на их компьютере и вместе с настраиваемым элементом управления был там зарегистрирован.

Наиболее важная проблема реализации заключается в том, что забывают о разграничении прав доступа. Т.е. если вы хотите ограничить круг тех, кто может запускать объект, работающий с OCX, вы можете создать роль, которой даны полномочия получать доступ к объекту типа System и к объекту ID 9140 (это и есть C/OCX).

Page 73: Ruru Navision 360 Int

Использование элементов управления OCX в Navision 4-13

Ограничения

Имеются два ограничения, связанные с использованием COM-технологий (OCX и Automation) в рамках Navision.

• Поддерживаются только невизуальные элементы управления. Это означает, что вы не можете добавлять к объекту C/SIDE графические элементы (в частности, нельзя добавлять в форму элементы управления сторонних производителей). В то же время вы можете использовать элементы управления, которые отображают информацию и обеспечивают взаимодействие с пользователем через собственное окно.

• Обработка исключений. C/SIDE не позволяет извлекать информацию об исключениях из элемента управления или сервера автоматизации через метод Invoke интерфейса IDispatch interface и структуру EXCEPINFO (как описано, например, в Inside OLE). Имеются пути обхода данного ограничения.

Есть также и такое ограничение, как невозможность формировать отклик на события внутри Navision (т.е C/SIDE не поддерживает callback-механизм для OCX).

Page 74: Ruru Navision 360 Int

4-14 Средства интеграции Navision

4.6 УПРАЖНЕНИЕ

От вас требуется сформировать метод, который запрашивает у пользователя имя музыкального файла с целью его последующего воспроизведения на Windows media player. Клиентом служит Windows Media Player 6.0 на компьютере пользователя. Требуется, чтобы диалоговое окно при запросе имени файла выглядело подобно другим диалоговым окнам Microsoft. Следовательно, руководитель проекта (project leader) после получения разрешения от Microsoft на распространение необходимых элементов включает в проектный список для вас следующие элементы управления:

• File Dialog – элемент управления Microsoft Common Dialog (comdlg32.ocx)

• Windows Media Player 6.0 или более поздней версии (MSDXM.OCX)

Для завершения упражнения выполните следующие шаги.

1 Создайте пустую форму.

2 Создайте следующие переменные:

3 Создайте текстовую зону (Text Box) и установите значение следующих свойств:

Editable = No

Focusable = No

Border = No

Page 75: Ruru Navision 360 Int

Использование элементов управления OCX в Navision 4-15

MultiLine = Yes

SourceExpr = CaptionMsg

4 Создайте надпись (Label) и задайте следующие значения свойств:

Caption = File to Open

5 Создайте другую текстовую зону и установите свойства:

AssistEdit = Yes

SourceExpr = FileName

6 В триггер OnAssistEdit для текстовой зоны, которую вы создали на шаге 5, добавьте следующий программный код.

MSCommonDialog.Filter := 'All Files|*.*|Text’ +

‘(*.txt)|*.txt|Pictures (*.bmp;*.ico)|*.bmp;*.ico';

MSCommonDialog.ShowOpen;

IF NOT MSCommonDialog.CancelError THEN

FileName := MSCommonDialog.FileName;

7 Создайте командную кнопку и задайте следующее свойство:

Caption = &Play

8 В триггер OnPush для созданной вами командной кнопки (Play) добавьте код.

WindowsMediaPlayer.AutoStart := TRUE;

WindowsMediaPlayer.ShowDisplay := TRUE;

WindowsMediaPlayer.AnimationAtStart := TRUE;

WindowsMediaPlayer.Open(FileName);

9 Создайте другую командную кнопку и задайте следующие свойства:

Caption = &Stop

10 В триггер OnPush для созданной вами командной кнопки (Stop) добавьте код.

WindowsMediaPlayer.Stop;

Page 76: Ruru Navision 360 Int

4-16 Средства интеграции Navision

11 В триггер OnOpenForm добавьте следующий код

CaptionMsg := 'The following is an example of using ‘ +

‘two OCXs.\ \The first is the file dialog which ‘ +

‘makes use of Microsoft comdlg32.ocx that is used ‘ +

‘by Microsoft to prompt for a file name.\ \The ‘ +

‘second example takes the file name selected ' +

'and passes it to the Windows Media control to ‘ +

‘play the file selected.';

12 В триггер OnCloseForm добавьте код

WindowsMediaPlayer.Stop;

CLEAR(WindowsMediaPlayer);

CLEAR(MSCommonDialog);

Page 77: Ruru Navision 360 Int

Использование элементов управления OCX в Navision 4-17

4.7 КОНТРОЛЬНЫЕ ВОПРОСЫ

Вопросы

1 Зачем использовать элементы управления OCX?

2 Что требуется сделать до того, как можно будет использовать элементы управления OCX?

3 В чем причина невозможности выбрать OCX в качества типа данных?

4 Отличается ли вызов метода или задание свойств для OCX от работы с другими стандартными объектами Navision?

Page 78: Ruru Navision 360 Int

4-18 Средства интеграции Navision

Ответы

1 Зачем использовать элементы управления OCX?

Чтобы сократить время разработки и сократить стоимость

2 Что требуется сделать до того, как можно будет использовать элементы управления OCX?

Нужно на каждом компьютере загрузить и зарегистрировать OCX. При разработке нужно удостовериться, что в наличии имеется необходимый инструментарий.

3 В чем причина невозможности выбрать OCX в качества типа данных?

В вашу лицензию не включена гранула OCX.

4 Отличается ли вызов метода или задание свойств для OCX от работы с другими стандартными объектами Navision?

Нет

Page 79: Ruru Navision 360 Int

Глава 5

Использование сервера автоматизации в рамках Navision

Данная глава служит введением в механизм автоматизации (automation). Вы узнаете, зачем использовать автоматизацию, а также то, как в действительности работает этот механизм. В главе раскрываются следующие вопросы, связанные с автоматизацией.

Почему в Navision используется сервер автоматизации

• Создание переменных

• Написание программного кода

• Обработка событий

• Основные проблемы и ограничения

• Упражнение

• Контрольные вопросы

Page 80: Ruru Navision 360 Int

5-2 Средства интеграции Navision

5.1 ПОЧЕМУ В NAVISION ИСПОЛЬЗУЕТСЯ СЕРВЕР АВТОМАТИЗАЦИИ

Основная цель использования механизма автоматизации – предоставить плавный интерфейс к внешним приложениям без вмешательства со стороны пользователя. В качестве примера будет автоматически создаваться письмо в Microsoft Word, при этом будут учитываться определенные обстоятельства. В частности, создание письма при заведении записи клиента. Вторая причина применения механизма автоматизации – сохранение времени разработки и, как следствие, уменьшение стоимости разработки.

Чтобы использовать автоматизацию, программа, по отношению к которой вы хотите применить этот механизм, должна быть сервером автоматизации (automation server). Примерами таких серверов являются MS Word, MS Excel, MS Outlook.

Ниже приводится каркас процедур для использования сервера автоматизации из среды C/SIDE. Как нетрудно видеть, имеется лишь несколько шагов, специфичных для C/SIDE (C/AL). Применение сервера автоматизации включает следующие шаги.

1 Опишите высокоуровневый интерфейс (класс) сервера автоматизации как переменную типа Automation.

2 Опишите все остальные интерфейсы (классы) как переменные типа Automation.

3 Используйте функцию CREATE языка C/AL по отношению к переменной, описанной на шаге 1. Не используйте CREATE с другими переменными.

4 Используйте в своем C/AL-коде методы и свойства сервера автоматизации.

Если требуется, вы можете применить CLEAR (удалить) для высокоуровневого объекта. В противном случае он будет удален автоматически, когда он окажется вне области видимости других переменных.

Вы будете писать большую часть своего программного кода на шаге 4, применяя методы и свойства сервера автоматизации. Синтаксис и семантика этих методов и свойств представлены в документации для соответствующего сервера автоматизации. Использование этих методов и свойств в языке C/AL не затрагивает ничего нового.

Если вы решаете, где разместить программный код, связанный с автоматизацией, надо иметь в виду два момента. Во-первых, объект,

Page 81: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-3

использующий сервера автоматизации, может быть откомпилирован, только если сервер автоматизации установлен на том компьютере, где ведется компиляция. Это означает, что если объект должен быть перекомпилирован и модифицирован на компьютере, где сервер автоматизации не установлен, вам понадобится радикально менять код, чтобы перекомпилировать его заново. Вот почему мы рекомендуем выделять код, который использует механизм автоматизации в отдельные программные модули.

Второй момент – производительность. При создании сервера автоматизации (с использованием системного вызова CREATE) имеют место определенные накладные расходы. Если сервер автоматизации используется многократно, с точки зрения производительности было бы лучше, если бы таким образом перестроили свой код, чтобы сервер создавался один раз (вместо серии вызовов CREATE/CLEAR).

Очевидно, что эти два аспекта иногда вступают в конфликт, поэтому вы должны принять компромиссное решение исходя из реального контекста, в котором будет применяться ваш программный код.

Page 82: Ruru Navision 360 Int

5-4 Средства интеграции Navision

5.2 СОЗДАНИЕ ПЕРЕМЕННЫХ

Если вы хотите управлять сервером автоматизации, вам нужно описать переменную (глобальную или локальную) типа Automation и ссылку на Automation Server в качестве подтипа этой переменной. В списке серверов автоматизации будут появляться только те серверы, которые загружены на данном инструментальном компьютере.

Как только вы выбрали сервер автоматизации, вы сможете увидеть список всех доступных для него классов. Как правило, приложение является первым из выбранных классов. Затем вы должны описать переменные для всех остальных интерфейсов (классов), которыми вы хотите управлять или с которыми взаимодействовать из вашего программного кода.

Выявление тех классов, которые вам надо описать, зависит от вашего понимания сервера автоматиазции. Если имеются Microsoft-программы, которыми вы хотите управлять, то легко определить что каждый класс делает путем просмотра интерактивной справки Visual Basic. Доступ к ней осуществляется через пункты меню Tools, Macros, а затем Visual Basic Editor. В то же время, если вы не знакомы с классами, вы можете выстроить схему нужных классов, если задумаетесь о приложении. Например, если вы хотите вызывать Microsoft Word, вы подумаете о приложении и затем о документе. Аналогичным образом, если вы хотите использовать Microsoft Excel, вы подумаете о приложении, электронной таблице, отдельном листе и конкретном диапазоне ячеек.

Далее мы рассмотрим пример, который использует Microsoft Excel для построения графика наших 10 лучших клиентов. В завершение работы мы создадим отчет.

Чтобы описать в качестве переменной элемент автоматизации, выполните следующие шаги.

Page 83: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-5

1 Щелкните View, C/AL Globals, чтобы открыть следующее окно:

2 В поле Name введите Excel, а в поле DataType выберите Automation. Находясь в поле Subtype, щелкните кнопку AssistButton, чтобы открыть следующее окно:

3 Находясь в поле Automation Server, щелкните кнопку AssistButton, чтобы открыть следующее окно:

Page 84: Ruru Navision 360 Int

5-6 Средства интеграции Navision

4 После выбора сервера автоматизации вам надо выбрать класс (как показано ниже):

Как только вы описали переменную, вы можете из C/AL получать доступ к методам и свойствам данного элемента управления. Вы можете просматривать эти методы и свойства в меню C/AL Symbol Menu.

1 Щелкните View, C/AL Symbol Menu или нажмите клавишу F5, чтобы открыть следующее окно:

Page 85: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-7

Обратите внимание, что когда метод или свойство выделены (они расположены в колонке справа), вы можете видеть краткое синтаксическое описание в нижней части окна. Если у элемента управления имеется интерактивная справка, вы можете получить к ней доступ путем нажатия клавиши F1, когда при этом выделено интересующее вас свойство или метод.

2 Когда вы щелкните кнопку OK или Apply в меню C/AL Symbol Menu, в редакторе C/AL Editor в текущей точке вставки появится типовой оператор с методом или свойством (предполагается, что редактор открыт):

Как можно видеть на приведенном выше экране, проверка аргументов Paste Arguments различается тем, что возвращается в редактор. Когда аргументы Paste Arguments проверяются, то возвращается метод или свойство наряду с ожидаемыми аргументами. В противном случае возвращается только метод или свойство.

Можно видеть, что при использовании метода или свойства в случае

Page 86: Ruru Navision 360 Int

5-8 Средства интеграции Navision

OCX практически нет разницы по сравнению с Navision. Единственное различие, с которым вы обычно сталкиваетесь, – это типы данных и преобразование этих типов к типам данных системы Navision. Зная соответствие между типами данных позволит вам правильно вызывать метод или свойство. Кроме того, это поможет в определении тех ситуаций, когда определенные методы или свойства нельзя использовать в Navision, если в Navision нет соответствующего типа данных для ожидаемых аргументов.

Для получения более подробной информации см. Приложение A в конце предыдущей главы "Использование элементов управления OCX Controls в рамках Navision".

Создание отчета

1 Откройте Дизайнер объектов и щелкните Report.

2 Щелкните New для создания нового отчета.

Затем введите Customer для элемента данных.

Описание переменных

Первая серия шагов включает описание необходимых переменных:

1 Находясь на строке меню, щелкните View, C/AL Globals.

2 Задайте Record-переменную, которая в качестве подтипа имеет таблицу Customer Amount. Мы назовем ее CustAmount. В наборе свойств установите значение свойства Temporary в Yes.

3 Определите Automation-переменную с библиотекой Microsoft Excel 8.0 Object Library в качестве сервера автоматизации и Application в качестве объекта автоматизации. Назовите ее Excel.

4 Определите Automation-переменную с библиотекой Microsoft Excel 8.0 Object Library в качестве сервера автоматизации и Workbook в качестве объекта автоматизации. Назовите ее Book.

5 Определите Automation-переменную с библиотекой Microsoft Excel 8.0 Object Library в качестве сервера автоматизации и Range в качестве объекта автоматизации. Назовите ее Range.

6 Определите Automation-переменную с библиотекой Microsoft Excel 8.0 Object Library в качестве сервера автоматизации и

Page 87: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-9

Worksheet в качестве объекта автоматизации. Назовите ее Sheet.

7 Определите Automation-переменную с библиотекой Microsoft Excel 8.0 Object Library в качестве сервера автоматизации и Chart в качестве объекта автоматизации. Назовите ее Chart.

8 Опишите три переменные типа Text. Первую из них назовите CustFilter и установите для нее размер 250. Вторую назовите CustDateFilter и установите для нее размер 30. Третью назовите j и установите для нее размер 30.

9 Опишите переменную типа Option со значениями Sales (LCY), Balance (LCY). Назовите ее ShowType.

10 Определите две переменные типа Integer. Первую назовите NoOfRecordsToPrint, а вторую – i.

11 Опишите переменную типа Decimal и назовите ее MaxAmount.

После выполнения этих шагов окно C/AL Globals будет выглядеть примерно так:

Page 88: Ruru Navision 360 Int

5-10 Средства интеграции Navision

5.3 НАПИСАНИЕ ПРОГРАММНОГО КОДА

Создание отчета – начальные шаги

Программный код сам по себе достаточно прост. Сначала в отчете мы получим все фильтры, которые были заданы. Затем мы получим фильтр “Date Filter”. Потом добавим приведенный ниже код в триггер OnPreReport.

CustFilter := Customer.GETFILTERS;

CustDateFilter := Customer.GETFILTER("Date Filter");

В триггере OnPreDataItem проинициализируем некоторые переменные:

i := 0;

CustAmount.DELETEALL;

CurrReport.CREATETOTALS("Sales (LCY)","Balance (LCY)");

Теперь будем создавать Microsoft Excel. Обратите внимание, что CREATE имеет необязательный аргумент NewServer, который по умолчанию имеет значение FALSE. Это означает, что будет повторно использоваться уже исполняемый экземпляр автоматизации. Если мы установили NewServer в значение TRUE, то в случае CREATE(wdApp, TRUE) мы должны запросить новый экземпляр Microsoft Excel. Обратите внимание, что в конечном счете сервер автоматизации может управлять сам, вне зависимости от того, повторно он используется или нет (см. документацию для сервера, если данный аспект важен для вашего приложения).

CREATE(Excel);

Затем мы сделаем Microsoft Excel видимым:

Excel.Visible(TRUE);

Microsoft Excel генерирует ошибку General Protection Fault, когда вы закрываете новый Excel-лист, созданный в то время пока Microsoft Excel был невидимым. Чтобы решить эту проблему, вы можете сделать Microsoft Excel видимым тотчас же после того, как вы создали новый лист. В качестве альтернативы вы можете сделать Microsoft Excel видимым до того, как создаете новый лист, а затем вновь сделать его невидимым сразу после создания листа.

Теперь мы добавим новую электронную таблицу в Microsoft Excel:

Page 89: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-11

Book:=Excel.Workbooks.Add(-4167);

Sheet:=Excel.ActiveSheet;

Sheet.Name := 'TOP 10';

В первой строке мы используем метод Add из набора Workbooks, чтобы вернуть новую электронную таблицу. Затем мы используем свойство ActiveSheet класса Application, чтобы подготовить условия для работы с активным листом новой таблицы. В третьей строке мы присваиваем листу имя.

Мы передаем число -4167. Для получения дополнительной информации см. главу “Использование COM-технологий в C/SIDE” (в руководстве Application Designers' Guide). Там приведены пошаговые инструкции, показывающие, как добиваться нужного результата.

В триггере OnAfterGetRecord нам необходимо сначала вызвать функцию CALCFIELDS, чтобы передать ей значения “Sales (LCY)” и “Balance (LCY)”.

CALCFIELDS("Sales (LCY)","Balance (LCY)");

Если оба поля равны нулю, то мы пропустим эту запись. В противном случае мы проинициализируем запись CustAmount, заполним запись с Customer No. и затем присвоим количество, основанное на том ShowType, который выбрал пользователь. Обратите внимание, что мы присвоим отрицательное значение от хранящегося результата с тем, чтобы наш график отображался справа вверху.

IF ("Sales (LCY)" = 0) AND ("Balance (LCY)" = 0) THEN

CurrReport.SKIP;

CustAmount.INIT;

CustAmount."Customer No." := "No.";

IF ShowType = ShowType::"Sales (LCY)" THEN BEGIN

CustAmount."Amount (LCY)" := -"Sales (LCY)";

CustAmount."Amount 2 (LCY)" := -"Balance (LCY)";

END ELSE BEGIN

CustAmount."Amount (LCY)" := -"Balance (LCY)";

CustAmount."Amount 2 (LCY)" := -"Sales (LCY)";

END;

Мы будем вставлять запись. Затем, если NoOfRecordsToPrint равно нулю или значение i меньше, чем NoOfRecordsToPrint, то мы увеличим i на 1; в противном случае мы найдем последнюю запись и ее удалим. Причина подобных действий в том, что при вставке записи все записи

Page 90: Ruru Navision 360 Int

5-12 Средства интеграции Navision

размещаются в порядке от старшей к младшей, и мы лишь хотим указать номер.

CustAmount.INSERT;

IF (NoOfRecordsToPrint = 0) OR (i < NoOfRecordsToPrint)

THEN

i := i + 1

ELSE BEGIN

CustAmount.FIND('+');

CustAmount.DELETE;

END;

В триггере OnPostDataItem мы зададим имена столбцов, как показано ниже:

Sheet.Range('A2').Value := 'No.';

Sheet.Range('B2').Value := 'Name';

Sheet.Range('C2').Value := 'Sales (LCY)';

Далее мы посмотрим, существуют ли записи в таблице CustAmount. Если да, то мы установим значение переменной j в ‘3’. Затем в цикле начнем перебирать все записи в таблице CustAmount. В рамках цикла мы попробуем обнаружить запись в таблице Customer. Сначала мы установим SETRANGE на “No.” и CustAmount.”Customer No.”. Если нам не удастся найти запись, появится сообщение об ошибке и данный отчет завершится. Но поскольку мы только что добавили записи, ошибки быть не должно. Наконец, мы добавим значения Customer No., Customer Name и Amount (LCY) в тот лист, который мы создали.

IF CustAmount.FIND('-') THEN BEGIN

j:='3';

REPEAT

Customer.SETRANGE("No.",CustAmount."Customer No.");

Customer.FIND('-');

Sheet.Range('A'+j).Value := CustAmount."Customer

No.";

Sheet.Range('B'+j).Value := Customer.Name;

Sheet.Range('C'+j).Value := -CustAmount."Amount

(LCY)";

j:=INCSTR(j);

UNTIL CustAmount.NEXT = 0;

END;

Page 91: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-13

Теперь мы готовы представить в виде графика ту информацию, которая помещена в Excel. Сначала мы зададим диапазон для строк и столбцов, которые мы обрабатываем. Затем мы добавим новый график и вызовем эксперт-программу ChartWizzard, чтобы отобразить информацию в графическом виде. Использование ChartWizzard – самый быстрый и простой путь к нашей цели. Вы можете более четко управлять дизайном графика, используя методы и свойства различных Chart-объектов(ChartArea, Legend и т.п.).

Сначала мы должны задать диапазон значений для данных в графике:

Range:=Sheet.Range('B3:C12');

Затем мы добавим новый лист диаграммы и дадим ему имя:

Chart:=Book.Charts.Add; Chart.Name := 'Top 10 Customers - Graph';

Наконец, следующий вызов приведет к построению графика:

Chart.ChartWizard(Range,-4100,2,2,1,0,0,'Top 10 Customers','Customer','Sales (LCY)'); ChartWizard([Source], [Gallery], [Format], [PlotBy], [CategoryLabels], [SeriesLabels], [HasLegend], [Title], [CategoryTitle], [ValueTitle], [ExtraTitle])

Мы используем первые 8 необязательных аргументов метода ChartWizard:

Аргумент Описание Значение

Source Диапазон, который содержит для новой диаграммы исходные данные

xlRange – объект, возвращаемый при вызове xlSheet.Range(‘A2:C3’).

Gallery Тип диаграммы -4100 – нумератор для Stacked Column с объемным эффектом. См. "Нахождение значения нумератора" в главе “ИспользованиеCOM-технологий в C/SIDE” (в руководстве дизайнера приложений).

Page 92: Ruru Navision 360 Int

5-14 Средства интеграции Navision

Аргумент Описание Значение

Format Номер опции для встроенного автоформатирования

Мы обнаружили эту функцию методом проб и ошибок: документация Microsoft Excel о ней умалчивает.

PlotBy Указывает, как расположены данные для каждой серии: в строках или столбцах

2 – нумератор для xlRows XlRowCol нумератор.

CategoryLabels Целое число, указывающее количество строк или столбцов внутри исходного диапазона, который содержит надписи категорий.

1 – у нас есть одна строка с надписями категорий

SeriesLabels Целое число, указывающее количество строк или столбцов внутри исходного диапазона, который содержит надписи серий.

1 – в наших данных не содержится надписей серий

HasLegend Значение TRUE означает, что условные обозначения включены

0 – в силу ряда причин это значение работает корректно. Видимо, есть ошибка в Microsoft Excel или в документации.

Title Вариант с названием диаграммы

Мы передаем строку ‘Top 10 Customers’. Это работает хорошо, и динамическое преобразование выполняется успешно.

ValueTitle Вариант: значение (X) ось название

‘Customer’

Extra Title Вариант: категория (Z) ось название

‘Sales (LCY)’

Page 93: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-15

5.4 ОБРАБОТКА СОБЫТИЙ

Среда C/SIDE может получать события из компонентов, которыми она управляет (серверы автоматизации и OCX-ы). Когда вы описываете глобальную переменную типа Automation, вы можете указать, хотите ли получать события. Это достигается путем задания свойству WithEvents для данной переменной значения Yes. При этом для событий, формируемых компонентом, будут автоматически сгенерированы AL-триггеры. Имя триггера состоит из имени переменой автоматизации, за которой следует "::<имя_события>." Например, если вы описали переменную автоматизации с именем MyEventVar, а компонент формирует событие MessageReceived(...), то имя триггера будет MyEventVar::MessageReceived(...).

Для более детальной информации об отклике на события см. главу "Получение событий в C/SIDE" в руководстве Application Designer’s Guide.

Примечание

Если вы удаляете глобальную переменную, с которой связаны событийные триггеры, то будут удалены также эти триггеры и их код. Кроме того, если вы изменяете тип данных или подтип для глобальной переменной с типа Automation на другой тип, то все событийные триггеры и их код будут удалены.

В следующем примере мы попробуем продемонстрировать то, как вы можете использовать события Microsoft Word в рамках системы Navision. Нас проинформировали, что мы собираемся работать, используя по одному документу на каждого клиента. Поэтому мы будем оперировать двумя объектами (таблица 18 Customer и форма 21 Customer Card).

1 Откройте таблицу 18 в режиме макета (design) и добавьте новое поле. Идентификатор ID = 50000, а имя – WordDoc.

2 Задайте ему тип Blob.

3 Сохраните результат работы и выйдите из Дизайнера таблиц.

4 Находясь в окне Object Designer, щелкните Forms. Выберите форму Form 21 – Customer Card, а затем щелкните Design, чтобы открыть Дизайнер форм.

Page 94: Ruru Navision 360 Int

5-16 Средства интеграции Navision

5 В окне Form Designer щелкните кнопку меню Customer, а затем в основном меню щелкните View, Menu Items. Для кнопки Customer появится Дизайнер меню:

6 Добавьте новую строку с заголовком Edit Word Document как показано на экране выше.

7 Установив курсор на строку с новой опцией “Edit Word Document”, которую вы только что добавили, нажмите клавишу F9 или выберите View, C/AL Code.

8 Опишите следующие глобальные переменные, с которыми мы будем работать. Задайте их следующим образом:

Имя Тип данных

Подтип Размер

MSWordApp Automation Microsoft Word 9.0 Object Library.Applicaton

MSWordDoc Automation Microsoft Word 9.0 Object Library.Document

MSWordDocs Automation Microsoft Word 9.0 Object Library.Documents

MSWordRange Automation Microsoft Word 9.0 Object Library.Range

FileName Text 250

DocExists Boolean

SaveChanges Integer

Page 95: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-17

Имя Тип данных

Подтип Размер

NoPrompt Integer

9 Выберите первую automation-переменную, MSWordApp, и откройте значения свойств для этой переменной. Убедитесь, что WithEvents имеет значение Yes. Вы получите оповещение о том, что для событий MSWordApp были созданы несколько триггеров. Мы добавим к паре этих триггеров программный код чуть позже.

10 Вы должны создать две функции. Первая функция названа CreateWordDoc, а вторая ClearWordDoc. Код для этих функций приведен ниже:

CreateWordDoc() IF ISCLEAR(MSWordApp) THEN CREATE(MSWordApp);

ClearWordDoc() CLEAR(MSWordRange); CLEAR(MSWordDoc); CLEAR(MSWordApp);

11 В соответствии с требованиями спецификации вы можете иметь только один документ на одного клиента. Всякий раз когда пользователь щелкает опцию меню, которую вы только что создали, нужно проверять, существует ли документ для данного клиента. Если да, то вы должны проэкспортировать документ из BLOB-поля, в котором он хранится и открыть его из Word через механизм автоматизации. Если документ не существует, вы должны создать новый документ. Проектный документ требует, чтобы документу всегда давалось то же самое имя файла и чтобы вы проверяли, не открыто ли еще одно письмо для другого клиента. Следовательно, мы должны внести изменения в триггер OnPush, как показано ниже:

OnPush() FileName := 'C:\TempNaviDoc.DOC'; SaveChanges := 0; NoPrompt := 0; DocExists := Rec.WordDoc.HASVALUE;

IF DocExists THEN BEGIN IF EXISTS(FileName) THEN BEGIN MESSAGE('You currently have a document open for another customer.'); EXIT;

Page 96: Ruru Navision 360 Int

5-18 Средства интеграции Navision

END ELSE BEGIN Rec.CALCFIELDS(WordDoc); Rec.WordDoc.EXPORT(FileName); CreateWordDoc; MSWordDoc:= MSWordApp.Documents.Open(FileName); END; END ELSE BEGIN CreateWordDoc; MSWordDoc:= MSWordApp.Documents.Add; MSWordDoc.SaveAs(FileName); END;

MSWordApp.Visible := TRUE;

Обратите внимание, что в Navision вы должны использовать текстовую константу, чтобы высвечивать сообщения пользователю. Для краткости данное упражнение содержит жестко запрограммированное сообщение в Редакторе C/AL, но мы не рекомендуем использовать такой подход.

12 Как только код выполнится, у вас появится Word-документ, озаглавленный TempNaviDoc и содержащий информацию, которая уже подвергалась редактированию, либо новый документ, если ранее ничего не вводилось. Наши требования к программе заставляют нас модифицировать триггер DocumentBeforeClose для MSWordApp, чтобы убедиться в том, что мы записали документ. Ниже приведен соответствующий код:

MSWordApp::DocumentBeforeClose(Doc : Automation "'Microsoft Word 9.0 Object Library'.Document";VAR Cancel : Boolean)

Doc.Save;

13 Наконец, в соответствии с исходными требованиями, когда пользователь выходит из приложения Microsoft Word, мы должны удалить из памяти переменные автоматизации, загрузить файл, который был создан, в BLOB-поле, созданное для данного клиента, а затем удалить временный файл, который вы создали. При работе с BLOB-полями помните, что вы должны обязательно вызывать команду Calcfields как показано ниже:

MSWordApp::Quit() ClearWordDoc;

WordDoc.IMPORT(FileName);

CurrForm.UPDATE(TRUE); CALCFIELDS(WordDoc);

Page 97: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-19

IF NOT ERASE(FileName) THEN MESSAGE('Unable to erase the file ' + FileName);

14 Существует еще одна правка, которую необходимо сделать, чтобы закончить наш пример. Вы должны вписать в OnAfterGetCurrRecord следующую строчку кода:

CALCFIELDS(WordDoc);

Пример, который мы рассмотрели, нельзя рекомендовать в качестве реализации данного решения. Если вы изучите раздел Navision CRM, то вы найдете там более удачный подход к обработке набора документов.

Page 98: Ruru Navision 360 Int

5-20 Средства интеграции Navision

5.5 ОСНОВНЫЕ ПРОБЛЕМЫ И ОГРАНИЧЕНИЯ

Основные проблемы

Наиболее общая проблемой, которая возникает при модификации объекта, состоит в том, что объект зависит от сервера автоматизации, не зарегистрированного на данном инструментальном компьютере. Следовательно, вам необходимо определиться, нужно ли модифицировать данный объект или реализовать модификацию в другом объекте. Если вы решили модифицировать сам объект, то, чтобы его откомпилировать, вам нужно убедиться, что сервер автоматизации загружен на вашем компьютере. Если же вы отказались от модификации объекта, то необходимо проэкспортировать нетронутый объект из чистой версии в формате .fob, а затем проимпортировать его в вашу БД.

Ограничения

Использование механизма автоматизации накладывает следующие ограничения.

• Обработка исключений *Exception Handling). Среда C/SIDE не позволяет извлекать информацию об исключениях из элемента управления или сервера автоматизации через метод Invoke интерфейса IDispatch и структуры EXCEPINFO (как, например, описано в книге Inside OLE). Имеются пути обхода данного ограничения.

• Среда C/SIDE поддерживает только стандартный outgoing-механизм, т.е. исходные интерфейсы, которые определяются переменной автоматизации. Если сервер автоматизации определяет в качестве сопутствующего класса (coclass) более одного outgoing-интерфейса, то в AL-коде генерируются только событийные триггеры для стандартного outgoing-интерфейса.

• В вызовах функций допускается не более 39 параметров.

• В текстовых строках для функций может быть максимум 1024 символа.

• Для подключения системы Navision и сервера автоматизации используется стратегия подключаемых объектов (connectable object strategy) объектной модели COM. Объект Sink, определенный в этой стратегии и реализованный в системе Navision, поддерживает только интерфейс IDispatch (и IUnknown).

Page 99: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-21

Следовательно, что при выполнении событий сервер автоматизации осуществляет обращения к IDispatch.

• Имена параметров будут усекаться до 30 символов.

• В событийных триггерах не возвращаются значения.

• Имена переменных, содержащие "::" и имена триггеров усекаются до 30 символов.

Ограничения по входным данным

Все поступающие данные копируются во внутренний тип данных, который может обрабатывать любые допустимые в COM типы данных. При таком преобразовании потери данных не происходит и потому не производится проверка на корректность типов данных в AL.

Данные сохраняются в форме этого внутреннего типа данных до той поры, пока не будут использоваться в триггере.

При использовании данных они преобразуются в соответствующий тип данных языка AL. Следует, однако, заметить, что если типом данных является Variant, то никакого преобразования не производится. При преобразовании данные не теряются и проводятся все необходимые проверки. Если преобразование невозможно в силу некорректности типа данных или в виду выхода данных за допустимый диапазон, то событийный триггер в отдельном окне высвечивает сообщение об ошибке и завершает выполнение. Обратие внимание, что если данные никогда не используются в данном событийном триггере, то и не производится никаких проверок на корректность самих данных, их типа и диапазона значений.

Если параметр передается по ссылке (VAR-параметр. Называемый также ByRe ) и данные используются внутри событийного триггера, то перед возвратом из событийного триггера происходит неявное преобразование. Производится проверка на возможность такого преобразования. Если оно недопустимо, то высвечивается сообщение об ошибке и событийный триггер завершает выполнение.

Входные данные типов float и double (которые отображаются в языке C/AL на тип данных Decimal) сжимаются до диапазона представления от -1E15 до 1E15. Никаких сообщений об ошибках при этом не появляется.

Page 100: Ruru Navision 360 Int

5-22 Средства интеграции Navision

Входные данные типа string (которые в языке C/AL отображаются на тип данных Text) усекаются до размера не более 1024 символов (исключая символ завершения). Никаких сообщений об ошибках при этом также не появляется.

Page 101: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-23

5.6 УПРАЖНЕНИЕ

Создайте программный модуль, который выгружает информацию из G/L Account в Microsoft Excel и строить простую диаграмму. Клиент указал, что он хочет только видеть сводную информацию по счетам доходов.

Шаги:

1 Создайте программный модуль.

2 Создайте следующие переменные, как показано на экране:

Остальная часть программного кода будет размещена в триггере OnRun.

3 Сначала нам нужно отфильтровать счета доходов. Затем нам понадобится просматривать только Account Types с опцией End-Total, поскольку они содержат балансы.

WITH GLAccount DO BEGIN // We only want to look at the Income Accounts SETRANGE("No.", '6000', '6995'); //We want to only look at the totals for each category SETRANGE("Account Type", GLAccount."Account Type"::"End-Total");

Page 102: Ruru Navision 360 Int

5-24 Средства интеграции Navision

4 Мы хотим удостовериться в том, что в соответствии с нашим условием некоторые счета существуют в нашей таблице. Есл это такI, то мы хотим создать сервер автоматизации и убедиться в том, что сделали его видимым. Мы также хотим создать лист электронной таблицы, куда будем заносить нашу информацию.

// Make sure there are records in the GLAccount table IF FIND('-') THEN BEGIN CREATE(Excel); Excel.Visible(TRUE); Book:=Excel.Workbooks.Add(-4167); Sheet:=Excel.ActiveSheet; Sheet.Name := 'Account Information';

5 Мы хотим присвоить нашим столбцам имена и подготовиться к копированию информации о счетах в соответствующие строки. Поскольку мы в точности не знаем, сколько понадобится строк, нам нужно инициализировать счетчик. Затем по мере занесения нашей информации мы будем увеличивать счетчик строк с тем, чтобы можно было определить диапазон ячеек и передать это значение в эксперт-программу. Обратите внимание, что нам надо сменить знак баланса, поскольку в системе Navision он хранится как отрицательное число.

Sheet.Range('A1').Value := 'No.'; Sheet.Range('B1').Value := 'Name'; Sheet.Range('C1').Value := 'Balance';

RowNo :='3'; TotalRows := 0; REPEAT CALCFIELDS(Balance); Sheet.Range('A'+RowNo).Value := GLAccount."No."; Sheet.Range('B'+RowNo).Value := GLAccount.Name; Sheet.Range('C'+RowNo).Value := -GLAccount.Balance; RowNo :=INCSTR(RowNo); TotalRows := TotalRows + 1; UNTIL NEXT = 0; END; END;

6 Наконец, мы хотим задать диапазон, для которого мы будем строить график, создавать и размечать нашу диаграмму, а затем вызывать эксперт-программу для ее построения. В завершение мы удалим из памяти переменную сервера автоматизации.

LastRow := FORMAT(3 + TotalRows); Range:=Sheet.Range('B3:C'+LastRow); Chart:=Book.Charts.Add;

Page 103: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-25

Chart.Name := 'Income - Graph'; Chart.ChartWizard(Range,-4100,2,2,1,0,0,'Income','Account','Balance');

CLEAR(Excel);

Page 104: Ruru Navision 360 Int

5-26 Средства интеграции Navision

5.7 КОНТРОЛЬНЫЕ ВОПРОСЫ

Вопросы

1 Зачем нужно использовать механизм автоматизации в системе Navision?

2 Верно ли, что можно реагировать на события автоматизации в системе Navision?

3 Верно ли, что перед тем, как использовать объект автоматизации, вы должны сначала вызвать команду CREATE?

4 Верно ли, что для удаления объекта автоматизации из памяти нужно использовать команду FREE?

См. ответы на следующей странице.

Page 105: Ruru Navision 360 Int

Использование сервера автоматизации в рамках Navision 5-27

Ответы

1 Зачем нужно использовать механизм автоматизации в системе Navision?

Чтобы обеспечить плавный интерфейс к внешним приложениям

Чтобы сократить время разработки

Чтобы уменьшить стоимость

Чтобы автоматизировать процесс

2 Верно ли, что можно реагировать на события автоматизации в системе Navision?

Да

3 Верно ли, что перед тем, как использовать объект автоматизации, вы должны сначала вызвать команду CREATE?

Да

4 Верно ли, что для удаления объекта автоматизации из памяти нужно использовать команду FREE?

Нет, надо использовать команду CLEAR.

Page 106: Ruru Navision 360 Int

5-28 Средства интеграции Navision

Page 107: Ruru Navision 360 Int

Приложение A.

Параметры, возвращаемые значения и типы данных

В данном приложении даются пояснения параметрам, возвращаемым значениям и различиям между типами данных Navision и компонентной модели COM, а также способам переключения между двумя разными типами.

Приложение содержит следующие разделы:

• Обзор

• Отображение типов данных языка C/AL на типы данных COM

• Отображение типов данных COM на типы данных C/AL.

Page 108: Ruru Navision 360 Int

A-II Средства интеграции Navision

A.1 ОБЗОР Как можно видеть из литературы, посвященной компонентной модели COM, механизмы вызова методов в элементе управления, механизмы передачи параметров и получения возвращаемых значений достаточно сложны. Использование инструментов, подобных эксперт-программам в Microsoft Visual C++, поможет вам избавиться от большей части чрезмерной сложности.

Следует также иметь в виду, что не существует взаимно однозначного соответствия между типами данных, которые вы используете при реализации методов, например, на Visual C++, и типами данных языка C/AL. Некоторые типы данных компонентной модели COM не поддерживаются в C/AL, а другие имеют ограничения, налагаемые на их использование.

При работе с меню C/AL Symbol Menu вы можете видеть, что синтаксис метода или свойства с возвращаемым значением и параметрами приведен с типами данных COM.

Page 109: Ruru Navision 360 Int

Параметры, возвращаемые значения и типы данных A-III

A.2 ОТОБРАЖЕНИЕ ТИПОВ ДАННЫХ ЯЗЫКА C/AL НА ТИПЫ ДАННЫХ COM

Следующая таблица показывает, как типы данных языка C/AL отображаются на типы данных компонентной модели COM.

Тип данных для C/AL

Тип данных для COM

Пояснения

Boolean VARIANT_BOOL (VT_BOOL)

Option long (VT_I4)

Integer long (VT_I4)

Decimal CURRENCY (VT_CY)

Тип CURRENCY в COM – это специальный тип данных с фиксированной запятой, который имеет 15 цифр до запятой и 4 цифры – после. Важно знать, что тип Decimal в C/AL не имеет фиксированной запятой и может содержать максимум 18 цифр. Это способно привести к некоторым погрешностям округления, которые происходят при передаче значения типа Decimal методу, ожидающему значение типа CURRENCY. Сервер преобразовывает число и приводит его к типу CURRENCY. Не важно, сколько цифр в исходном значении типа Decimal находится справа от запятой: возвращаемое значение типа CURRENCY будет иметь не более 4 таких цифр.

Char BSTR (VT_BSTR)

Text BSTR (VT_BSTR)

Page 110: Ruru Navision 360 Int

A-IV Средства интеграции Navision

Тип данных для C/AL

Тип данных для COM

Пояснения

Code BSTR (VT_BSTR)

Date DATE (VT_DATE)

Time void (VT_VOID)

Automation TypedObject, UntypedObject (VT_DISPATCH)

InStream VT_STREAM

OutStream VT_STREAM

Variant VARIANT (VT_VARIANT)

Page 111: Ruru Navision 360 Int

Параметры, возвращаемые значения и типы данных A-V

A.3 ОТОБРАЖЕНИЕ ТИПОВ ДАННЫХ COM НА ТИПЫ ДАННЫХ C/AL В следующей таблице показано, как типы данных компонентной модели COM отображаются на типы данных C/AL.

Тип данных для COM

Тип данных для C/AL

Пояснения

VT_UNKNOWN InStream или OutStream

Поддерживаются только компонентные интерфейсы IID_IStream и IID_SequentialStream. Если вы передаете любой иной неизвестный интерфейс, то генерируется ошибка периода выполнения.

short (VT_I2) Integer

long (VT_I4) Integer

float (VT_R4) Decimal

double (VT_R8) Decimal

CURRENCY (VT_CY)

Decimal Тип CURRENCY в COM – это специальный тип данных с фиксированной запятой, который имеет 15 цифр до запятой и 4 цифры – после. Важно знать, что тип Decimal не имеет фиксированной запятой и может хранить значения до 18 цифр.

DATE (VT_DATE) Date Тип DATE компонентной модели COM содержит одновременно значения даты и времени. В зяыке C/AL дата (Date) и время (Time) представлены разными типами данных. Поэтому та часть типа DATE в модели COM, которая отвечает за время, будет утеряна при отображении типа DATE в модели COM на тип Date в языке C/AL.

BSTR (VT_BSTR) Text

Page 112: Ruru Navision 360 Int

A-VI Средства интеграции Navision

Тип данных для COM

Тип данных для C/AL

Пояснения

VARIANT_BOOL (VT_BOOL)

Boolean

TypedObject/ UntypedObject (VT_DISPATCH)

Automation/OCX

VT_EMPTY Text

VARIANT (VT_VARIANT)

Unsigned char (VT_UI1), SCODE (VT_ERROR) и SAFEARRAY (VT_ARRAY)

Variant

Вы можете использовать вариантный тип данных (Variant) языка C/AL для передачи значений типа unsigned char, SCODE или SAFEARRAY другому варианту, который поддерживает эти типы. Вы не можете присваивать их типам данных языка C/AL.

Когда вы вызываете метод с параметром ByRef, обычное преобразование типов данных C/AL не производится. Это означает, в частности, что если параметр имеет тип float, то вы должны использовать переменную в C/AL типа Decimal. Вы не можете использовать тип Integer и должны провести преобразование в C/AL. (Совет: если значение, которое вы хотите передать, имеет “неверный” тип, например, когда значение извлекается из поля БД, вы можете до вызова метода объекта в COM сначала присваивать его переменной языка C/AL.)

Иногда вы встретитесь с методом объекта COM или со свойством в C/AL Symbol Menu, которое имеет тип IDispatch. Это означает, что метод или свойство передают или ожидают передачи COM-объекта. В этом случае вы должны использовать переменную в C/AL типа Automation, которая должна быть декларирована (через подтип) как корректный COM-объект. Для получения соответствующей информации, вам необходимо изучить документацию по серверу автоматизации (automation server).

Page 113: Ruru Navision 360 Int

Параметры, возвращаемые значения и типы данных A-VII

Вы также встретитесь со свойствами и методами, которые не имеют ни одного из “нормальных” типов данных. Например, метод в Microsoft Excel может возвращать значение типа WORKBOOK. Это означает, что сервер автоматизации располагает реализованным типом USERDEF. Среда C/SIDE поддерживает типы USERDEF двух разновидностей: IDispatch и Enumeration.

Если тип USERDEF относится к IDispatch, т.е. является интерфейсом (иногда также называемым классом или объектом) со специфическим идентификатором GUID. Вы должны для возвращаемого значения или параметра использовать тот же самый объект. Это достигается созданием переменной типа Automation с корректным подтипом.

Например, Microsoft Excel имеет немало методов, которые возвращают переменную типа WORKBOOK. Это означает, что вы должны декларировать переменную типа Automation и подтип 'Microsoft Excel 8.0 Object Library'.Workbook.

Если тип USERDEF относится к Enumeration, то вы должны знать, что нельзя использовать символьные имена (например, xl3DPie), а вместо этого только числовые коды (например, -4102). В случае продуктов семейства Microsoft Office вы сможете найти это значение, используя навигатор объектов VBA Object Browser.

Page 114: Ruru Navision 360 Int

A-VIII Средства интеграции Navision