在SharePoint 2010中,外部内容类型(External Content Types)是一种可重用的元数据描述,它包含了连接信息和行为(标准化操作)的描述,这些操作应用于外部数据。SharePoint为开发者提供了多种创建外部内容类型并将其集成到平台的方法。例如,SharePoint Designer 2010允许创建和管理存储在支持的外部系统中的外部内容类型。这些外部系统可以是SQL Server、WCF Data Service或.NET Assembly Connector。
本文将向展示如何基于给定的SAP客户数据创建一个名为“Customer”的SharePoint外部内容类型。内容类型的定义将作为一个.NET程序集提供,并且数据将显示在SharePoint的外部列表中。
SAP客户数据将通过函数模块SD_RFC_CUSTOMER_GET
检索。一般来说,SAP R/3系统中的函数模块与C#中的public static
类方法相似,并且可以通过RFC(远程函数调用)从SAP外部访问。幸运的是,不需要手动编写RFC调用。将使用Theobald Software提供的非常实用的ERPConnect库。该库包括一个LINQ to SAP提供程序和设计器,这使得工作变得更加容易。
创建SAP的.NET Assembly Connector的第一步是使用Visual Studio 2010的SharePoint 2010 Developer Tools创建一个SharePoint项目。这些工具是Visual Studio 2010的一部分。将使用Business Data Connectivity Model项目模板来创建项目:
定义Visual Studio解决方案名称并点击“确定”按钮后,项目向导会询问想要创建哪种类型的SharePoint 2010解决方案。解决方案必须作为farm解决方案部署,而不是作为沙盒解决方案。Visual Studio现在正在创建一个新的SharePoint项目,附带默认的BDC模型(BdcModel1
)。也可以创建一个空的SharePoint项目,然后手动添加一个Business Data Connectivity Model项目项。这同样会在Visual Studio解决方案资源管理器中生成一个名为BdcModel1
的新节点。该节点包含一些项目文件:BDC模型文件(文件扩展名.bdcm
),以及Entity1.cs
和EntityService.cs
类文件。
接下来,通过在Visual Studio的“添加新项”对话框中选择LINQ to ERP项来添加一个LINQ to SAP文件,以处理SAP数据访问逻辑。这将向项目中添加一个名为LINQtoERP1.erp
的文件。LINQ to SAP提供程序在内部被称为LINQ to ERP。双击LINQtoERP1.erp
以打开设计器。现在,将设计器工具箱中的Function
对象拖到设计表面上。这将打开SAP连接对话框,因为尚未定义连接数据:
输入SAP连接数据和凭据。点击“测试连接”按钮以测试连接性。如果能够成功连接到SAP系统,点击“确定”按钮以打开函数模块搜索对话框。现在搜索SD_RFC_CUSTOMER_GET
,然后选择找到的项目,点击“确定”以打开RFC函数模块/BAPI对话框:
对话框为提供了定义想要在SAP上下文类中使用的名称和参数的选项。上下文类是由LINQ to SAP设计器自动生成的,包括所有定义的SAP对象。这些对象要么是C#(或VB.NET)类方法和/或方法使用的附加对象类。
对于项目,需要通过在“Pass”列中点击复选框来选择导出参数KUNNR
和NAME1
。这两个参数成为在生成的上下文类方法SD_RFC_CUSTOMER_GET
中的输入参数。还需要返回给定输入选择的客户列表。因此,在“Tables”标签上选择表参数CUSTOMER_T
,并将结构名称更改为Customer
。然后,点击对话框上的“确定”按钮,新对象将被添加到设计器表面。
重要提示:必须在LINQ设计器的属性编辑器中将“Create Objects Outside Of Context Class”标志设置为TRUE
,否则LINQ to SAP将生成的Customer
类作为SAP上下文类的嵌套类。这个特性和标志只在Visual Studio 2010的LINQ to SAP中可用。
LINQ设计器还自动生成了一个名为Customer
的类在LINQtoERP1.Designer.cs
文件中。这个类将成为BDC模型实体或外部内容类型。但首先,需要调整并重命名Visual Studio默认创建的BDC模型。当前,BDC模型看起来像这样:
将BdcModel1
节点和文件重命名为CustomerModel
。由于已经有一个实体类(Customer
),删除文件Entity1.cs
并将EntityService.cs
文件重命名为CustomerService.cs
。接下来,打开CustomerModel
文件并重命名设计器对象Entity1
。然后,将实体标识符名称从Identifier1
更改为KUNNR
。也可以使用BDC资源管理器进行重命名。最终调整结果应该如下所示:
在Visual Studio项目中需要做的最后一步是更改CustomerService
类中的代码。BDC模型方法ReadItem
和ReadList
必须使用自动生成的LINQ to SAP代码实现。首先,看看代码:
如所见,基本上只有几行代码。所有的SAP数据访问逻辑都封装在SAP上下文类中(参见LINQtoERP1.Designer.cs
文件)。CustomerService
类只是实现了一个静态构造函数来设置ERPConnect许可证密钥,并使用SAP凭据初始化静态变量_sc
以及两个BDC模型方法。
ReadItem
方法,BCS标准化操作SpecificFinder
,是由BCS调用以获取由标识符KUNNR
定义的特定项。在这种情况下,只是调用SD_RFC_CUSTOMER_GET
上下文方法,并传入标识符(变量id
),然后返回从SAP获得的第一个客户对象。
ReadList
方法,BCS标准化操作Finder
,是由BCS调用以返回所有实体。在这种情况下,只是返回SD_RFC_CUSTOMER_GET
上下文方法返回的所有客户对象。返回的结果已经是IEnumerable
类型。
最后一步是部署SharePoint解决方案。在Visual Studio解决方案资源管理器中右键单击项目节点,然后选择“部署”。这将在服务器上安装并部署SharePoint解决方案。也可以通过在CustomerService
类中设置一个断点并使用F5执行项目来调试代码。
完成了!
现在,启动SharePoint中央管理面板,然后按照链接“管理服务应用程序”,或直接导航到URL:http://<SERVERNAME>/_admin/ServiceApplications.aspx
。点击“业务数据连接性服务”以显示所有可用的外部内容类型:
在此页面上,找到了部署的BDC模型,包括客户实体。可以点击名称以检索有关实体的更多详细信息。现在,还有一个问题需要解决。需要设置权限!
标记实体复选框,然后点击功能区菜单栏上的“设置对象权限”。现在,为想允许访问实体的用户定义权限,然后点击“确定”按钮。在上面的屏幕截图中,管理员用户拥有所有可能的权限。
接下来,也是最后一步,将创建一个基于实体的外部列表。为此,打开SharePoint Designer 2010并连接到SharePoint网站。
点击“站点对象”面板上的“外部内容类型”以显示所有内容类型(见上图)。双击客户实体以打开详细信息。SharePoint Designer通过BCS读取所有可用的信息。
为了创建实体的外部列表,点击功能区菜单栏上的“创建列表和表单”(见下面的屏幕截图),并输入CustomerList
作为外部列表的名称。
好的,现在完成了!
打开列表,应该得到以下结果:
外部列表显示了实体的所有定义字段,尽管Customer
类(由LINQ to SAP自动生成)有超过这四个字段。这意味着只能为实体显示信息的子集。
另一个选择是仅在LINQ to SAP设计器中选择所需的字段。使用LINQ设计器,不仅可以访问SAP函数模块。可以集成其他SAP对象,如表、BW数据立方体、SAP查询或IDOCs。可以从Theobald Software首页下载ERPConnect库的演示版本。
如果点击列KUNNR
中客户编号的关联链接(见上面的屏幕截图),SharePoint将打开详细视图: