LINQ для SAP

Введение

Много было написано о новой технологии доступа к данным Microsoft, LINQ (запросы, интегрированные в язык), с момента публикации первой предварительной версии. Но есть еще несколько интересных сторон в LINQ и его расширяемости. Данная статья описывает новый поставщик под названием LINQ для SAP, предоставляющий легкий способ извлечения коммерческих данных из систем SAP/R3 внутри приложения .NET.

С введением среды разработки .NET 3.5 и расширений языков программирования для C# и VB.NET Microsoft начала изменять способы, с помощью которых разработчики могли бы реализовать доступ к данным. Сейчас почти все приложения запрашивают данные из разных источников данных. Основные источники данных – базы данных SQL, файлы XML или коллекции в оперативной памяти. LINQ предоставляет универсальный и стандартизированный метод подключения ко всем этим источникам данных с помощью специальных поставщиков данных. Синтаксис языка LINQ очень похож на синтаксис SQL. Следующий пример показывает, как запрашивать данные из массива строк с помощью LINQ:

string[] names = {"John", "Patrick", "Bill", "Tom"}

var res = from n in names where n.Contains("o") select n;

foreach(var name in res)
  Console.WriteLine(name);

Этот простой запрос LINQ, основанный на коллекции в оперативной памяти (массиве), выбирает из массива все элементы, имена которых содержат букву “o”. Выводятся на консоль: Джон, Том. Знакомство с LINQ не входит в данную статью. Очень хорошую вводную статью можно найти на CodeProject.com.

Поставщики LINQ

Среда разработки .NET включает в себя встроенные поставщики для коллекций и списков (LINQ для объектов), для баз данных сервера Microsoft SQL (LINQ для SQL), для файлов XML (LINQ для XML) и, наконец, для экземпляров объектов наборов данных (LINQ для наборов данных). Кроме стандартных поставщиков, разработчики могут расширять LINQ, создавая пользовательские поставщики, чтобы поддерживать специальные источники данных. LINQ для LDAP, или LINQ для Amazon – примеры таких пользовательских поставщиков.

Для написания пользовательского поставщика LINQ нужно реализовать два интерфейса: IQueryable и IQueryProvider. Эти интерфейсы позволяют запрашивать объекты в выражениях LINQ. Разработка поставщика LINQ может быть очень сложной задачей, но в сетевых блогах есть хорошие статьи, подробно объясняющие шаги.

Данная статья рассматривает новый поставщик под названием LINQ для SAP от Theobald Software, предоставляющий разработчикам простой способ подключения к системам SAP/ R3 и их объектам данных. Программное обеспечение также предоставляет конструктор Visual Studio 2008, чтобы интерактивно определять объекты SAP и встраивать их в приложения .NET.

Вводные сведения о SAP

Данный раздел дает краткое объяснение и вводные сведения об объектах SAP, запрашиваемых LINQ для SAP. Самые важные объекты – функциональные модули, таблицы, кубы BW и запросы.

Функциональный модуль, по сути, похож на нормальную процедуру в стандартных языках программирования. Функциональные модули написаны на ABAP, языке программирования SAP, и доступны из любых других программ внутри системы SAP/ R3. Они принимают параметры импорта и экспорта, а также другие виды специальных параметров. Рисунок ниже показывает пример функционального модуля по имени BAPI_EQUI_GETLIST внутри инструментального средства SAP:

Кроме того, BAPI (Бизнес API) являются специальными функциональными модулями, установленными внутри репозитария бизнес-объектов SAP. LINQ для SAP также обеспечивает доступ к таблицам SAP. По сути, это простые таблицы реляционной базы данных. Более того, конструктор LINQ для SAP позволяет разработчикам определять и обращаться к кубам BW (бизнес-кубы) и запросам (запросы SAP). Кубы BW также именуются кубы OLAP. Внутри куба данные упорядочены многомерным образом. Запросы SAP работают точно так же, как и другие запросы. Чтобы уникально идентифицировать запрос SAP, нужны три части информации: зона пользователя (глобальная или локальная); группа пользователя и имя запроса. Благодаря концепции запросов SAP обеспечивает очень простую генерацию отчетов, без необходимости знать язык программирования SAP ABAP.

Конструктор Visual Studio 2008 для LINQ для SAP

Чтобы использовать LINQ для SAP и связанный с ним конструктор Visual Studio, сначала нужно установить библиотеку .NET ERPConnect.net от Theobald Software. Это программное обеспечение – базовый компоновочный блок между .NET и системой SAP/R3 и предоставляет простой API для обмена данными между двумя системами. Компания предлагает бесплатную пробную версию для загрузки. После установки ERPConnect.net LINQ для SAP должен быть установлен отдельно с помощью программы установки (смотрите руководство). Поставщик и конструктор фактически являются расширениями библиотеки ERPConnect.net. Поставщик LINQ для SAP сам состоит из конструктора Visual Studio 2008 и дополнительных библиотек классов, объединенных внутри пространства имен ERPConnect.Linq.

Установка добавляет новый тип ProjectItem (элемент проекта) в Visual Studio 2008 с расширением файла .erp и связывает его с конструктором. Двойной щелчок по файлу .erp открывает конструктор LINQ для SAP. Конструктор помогает разработчикам приложений, позволяя автоматически генерировать исходный код для интеграции с объектами SAP. Для всех объектов SAP, определенных в файле .erp, поставщик создает контекстный класс, унаследованный от базового класса ERPDataContext. Сгенерированный контекстный класс содержит методы и подклассы, представляющие определенные объекты SAP. Кроме файла .erp, конструктор LINQ для SAP сохранит связанный и автоматически сгенерированный исходный код в файле с расширением .Designer.cs.
 

Функциональные модули

Данный раздел показывает, как подключаться и получать данные с помощью функционального модуля BAPI_EQUI_GETLIST путем создания объекта LINQ для SAP. Модуль возвращает список оборудования для заранее заданных агрегатов. Сначала нужно добавить новый файл LINQ для SAP file (.erp) в новый или существующий проект Visual Studio 2008. При открытии файла .erp запустится конструктор LINQ для SAP. Двойной щелчок мышью по элементу функция в панели инструментов Visual Studio добавит новый функциональный модуль объекта SAP. На следующем шаге откроется диалоговое окно поиска объекта, в котором разработчик может искать функциональные модули.

Как только выбор сделан, конструктор LINQ для SAP покажет диалоговое окно функционального модуля со всеми данными, свойствами и определениями параметров выбранного модуля BAPI_EQUI_GETLIST. Теперь пользователь может изменить именование автоматически сгенерированного метода, а также всех используемых параметров.

Для каждого функционального модуля конструктор LINQ для SAP сгенерирует метод контекстного класса со всеми дополнительными классами и структурами объекта. Например, если пользователь определяет имя метода под названием GetEquipmentList для функционального модуля BAPI_EQUI_GETLIST, конструктор сгенерирует метод контекстного класса с данным именем и с сигнатурой определенного метода. Пользователь также может задать параметры для обмена. Нижняя область диалогового окна отображает типовые параметры SAP, такие как параметры IMPORT(импорт), EXPORT(экспорт), CHANGING(редактирование) и TABLES(таблицы). LINQ для SAP позволяет определять значения по умолчанию для параметров SAP. Эти параметры также могут использоваться в качестве параметров для автоматически генерируемого метода контекстного класса, а также для возвращаемых значений. Имена для параметров и связанные структуры также могут быть переименованы.

Сигнатура метода для функционального модуля, определенного выше, выглядит так:

public EquipmentTable GetEquipmentList(PlantTable plants)

Сам контекстный класс называется SAPContext по умолчанию. Имя контекстного класса, пространство имен, настройки подключения, а также другие флаги могут быть определены в окне свойства конструктора LINQ для SAP. Следующий код показывает, как использовать контекстный класс SAPContext:

class Program
{
  static void Main()
  {
    SAPContext dc = new SAPContext("TESTUSER", "XYZ");

    SAPContext.PlantTable plants = new SAPContext.PlantTable();
    SAPContext.PlantStructure ps = plants.Rows.Add();
    ps.SIGN = "I";
    ps.OPTION = "EQ";
    ps.LOW = "3000";

    SAPContext.EquipmentTable equipList = dc.GetEquipmentList(plants);
  }
}

Таблицы

Процедура добавления таблицы SAP в основном такая же, как и для функциональных модулей (смотрите выше). После добавления объекта таблицы SAP с панели инструментов в Visual Studio и нахождения таблицы с помощью диалогового окна поиска, появится диалоговое окно “Таблица”:

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

Рисунок выше показывает определение объекта таблицы SAP T001W. Эта таблица хранит информацию об агрегате. Класс не был изменен, поэтому конструктор создаст класс C# с именем T001W. К тому же, контекстный класс будет содержать свойство T001WList. Тип данного свойства - ERPTable<T001W>, являющийся запрашиваемым типом данных LINQ.
Следующий код показывает, как запрашивать таблицу T001W с помощью контекстного класса:

class Program
{
  static void Main()
  {
     SAPContext dc = new SAPContext("TESTUSER", "XYZ");
     dc.Log = Console.Out;

     var res = from p in dc.T001WList
               where p.WERKS == "3000"
               select p;

     foreach (var item in res)
       Console.WriteLine(item.NAME1);
  }
}

Контекстный класс и журналирование SAP

Чтобы обращаться к объектам с помощью LINQ для SQL, поставщик генерирует контекстный класс с именем DataContext. Поэтому LINQ для SAP также создает контекстный класс с именем SAPContext. Этот класс определен как частичный класс. Частичный класс является объявлением типа, которое может быть распределено по нескольким исходным файлам, что позволяет разработчикам легко расширять автоматически сгенерированные классы, такие как контекстный класс LINQ для SAP.

Пример кода ниже показывает, как добавлять частичный класс (файл SAPContext.cs), добавляющий новый пользовательский метод GetEquipmentListForMainPlant, чтобы расширить контекстный класс, сгенерированный конструктором LINQ для SAP. Этот новый метод внутренне вызывает автоматически сгенерированный метод GetEquipmentList с заранее заданным значением параметра. Компилятор C# внутренне объединит автоматически сгенерированный LINQtoERP1.Designer.cs с исходным файлом SAPContext.cs.

using System;

namespace LINQtoSAP
{
  partial class SAPContext
  {
    public EquipmentTable GetEquipmentListForMainPlant()
    {
      SAPContext.PlantTable plants = new SAPContext.PlantTable();
      SAPContext.PlantStructure ps = plants.Rows.Add();
      ps.SIGN = "I";
      ps.OPTION = "EQ";
      ps.LOW = "3000";
     
      return GetEquipmentList(plants);
    }
  }
}

LINQ для SAP также предоставляет возможность записывать в журнал преобразования запросов LINQ. Чтобы записывать данные в журнал, свойство LOG контекстного класса должно быть установлено в экземпляр TextWriter (модуль записи текста), например, консольный вывод Console.Out. LINQ для SAP выполняет крайне элементарное журналирование, ограниченное объектами таблиц. Но оно помогает разработчикам получать представление о том, как выглядит преобразованная часть.

Вывод

В целом, LINQ для SAP – очень простой, но мощный поставщик данных LINQ и конструктор Visual Studio 2008 для использования. Вы также получаете представление о том, как разрабатывать для системы SAP/R3 с помощью .NET. Дополнительную информацию о продукте смотрите на главной странице производителя, http://www.theobald-software.com.