Freigeben über


Verwenden von externen Daten mithilfe von SharePoint Server 2010 Business Connectivity Services und Excel 2010-Add-Ins

Zusammenfassung: Hier erfahren Sie, wie Sie mithilfe von Microsoft Business Connectivity Services (BCS) in Microsoft SharePoint Server 2010 externe Daten verwenden und aktualisieren, indem Sie Microsoft Excel 2010 als Client verwenden.

Letzte Änderung: Montag, 9. März 2015

Gilt für: Business Connectivity Services | Excel 2010 | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

Inhalt dieses Artikels
Übersicht über die Verwendung von Business Connectivity Services und des Excel 2010-Add-Ins
Einrichten der Serverumgebung
Erstellen von externen Inhaltstypen mithilfe von SharePoint Designer
Erstellen des Excel-Add-Ins
Packen der Lösung
Schlussbemerkung
Weitere Ressourcen

Bereitgestellt von: Tajeshwar Singh (Blog lesen), MCM für SharePoint, Microsoft Services

Inhalt

  • Übersicht über die Verwendung von Business Connectivity Services und des Excel 2010-Add-Ins

  • Einrichten der Serverumgebung

  • Erstellen von externen Inhaltstypen mithilfe von SharePoint Designer

  • Erstellen des Excel-Add-Ins

  • Packen der Lösung

  • Schlussbemerkung

  • Weitere Ressourcen

Klicken Sie, um Code abzurufen.  Code zum Herunterladen: Business Connectivity Services Excel 2010-Add-In ("SalesOrderAddIn1.7.zip")

Übersicht über die Verwendung von Business Connectivity Services und des Excel 2010-Add-Ins

Das Feature Microsoft Business Connectivity Services (BCS) in Microsoft SharePoint Server 2010 bietet zahlreiche Möglichkeiten der Nutzung von Daten aus einem externen System, entweder offline oder online. Sie können Add-Ins, Aufgabenbereiche und andere Microsoft Office-Features für die Erweiterbarkeit erstellen, die die Interaktion mit externen Daten über die benutzerfreundlichen Office-Clientanwendungen ermöglichen.

In diesem Artikel wird ein Szenario beschrieben, in dem die in Microsoft SQL Server 2008 gehostete Beispieldatenbank AdventureWorks als externes System verwendet wird. Sie erstellen mithilfe von Microsoft SharePoint Designer 2010 einen externen Inhaltstyp. Anschließend erstellen Sie ein Microsoft Excel 2010-Add-In für die Interaktion mit einem externen System, um externe Elemente zu lesen, durch Zuordnungen zu navigieren und externe Elemente mithilfe des Business-Konnektivitätsdienste (Business Connectivity Services)-Clientobjektmodells zu aktualisieren. Das Excel-Add-In wird dem Client über ein ClickOnce-Paket bereitgestellt. Das Metadatenmodell wird dem Client separat bereitgestellt, und zwar mithilfe eines ClickOnce-Pakets, das mit dem Tool zum Packen von BCS-Lösungen erstellt wurde.

Einrichten der Serverumgebung

Damit Sie dieses Szenario ausführen können, müssen Sie die folgende Software in Ihrer Serverumgebung installieren und die AdventureWorks-Datenbank erstellen.

Installieren der erforderlichen Software

Für dieses Szenario installieren Sie die folgende Software:

  • Microsoft SQL Server 2008

  • Microsoft SharePoint Server 2010

  • Microsoft SharePoint Designer 2010

  • Microsoft Excel 2010

  • Microsoft Visual Studio 2010

Erstellen der "AdventureWorks"-Datenbank

Die auf CodePlex verfügbare Beispieldatenbank AdventureWorks dient in diesem Szenario als externes System. Die x64-Version der Beispieldatenbank AdventureWorks können Sie von der Website AdventureWorks 2008R2 RTM herunterladen.

Führen Sie das Setupprogramm aus, um die Datenbank zu erstellen. Sie verwenden die Tabellen SalesOrder und SalesOrderDetail, um die übergeordneten und untergeordneten externen Inhaltstypen in dieser Beziehung zu modellieren.

Erstellen von externen Inhaltstypen mithilfe von SharePoint Designer

SharePoint Designer 2010 umfasst Funktionen, mit denen Sie die externen Inhaltstypen grafisch entwerfen können. Basierend auf den Optionen, die auf der Benutzeroberfläche ausgewählt wurden, werden in SharePoint Designer XML-Metadaten im Hintergrund generiert. Mithilfe des Designers für externe Inhaltstypen in SharePoint Designer können Sie die Datenbank ermitteln und auf die Tabelle, Ansicht oder gespeicherte Prozedur verweisen, die die Vorgänge ausführt. Anschließend werden die benötigten Daten zurückgegeben und zum Erstellen des externen Inhaltstyp ohne Schreiben von Code oder XML verwendet. Erstellen Sie mithilfe der folgenden Verfahren den externen Inhaltstyp.

Definieren der allgemeinen Einstellungen für den externen Inhaltstyp

Beginnen Sie, indem Sie Einstellungen für den externen Inhaltstyp definieren.

So definieren Sie die allgemeinen Einstellungen für den externen Inhaltstyp

  1. Erstellen Sie eine Websitesammlung, die Sie zum Herstellen von Verbindungen über SharePoint Designer und zum Erstellen der externen Inhaltstypen verwenden.

  2. Starten Sie auf dem Clientcomputer SharePoint Designer, und öffnen Sie dann die von Ihnen erstellte Website.

  3. Zum Erstellen eines externen Inhaltstyps gehen Sie im linken Navigationsbereich zu Websiteobjekte, und klicken Sie dann auf Externe Inhaltstypen.

  4. Klicken Sie auf dem Menüband für die Serverkomponente in der Gruppe Neu auf Externer Inhaltstyp. Legen Sie zum Erstellen eines neuen externen Inhaltstyps die Eigenschaften wie in Tabelle 1 gezeigt fest.

    Tabelle 1. Eigenschaften zum Erstellen des externen Inhaltstyps

    Eigenschaft

    Wert

    Name

    SalesOrderHeader

    Anzeigename

    Sales Order Header

    Namespace

    http://intranet.contoso.com

    Version

    1.0.0.0

    Office-Elementtyp

    Generische Liste

    Offlinesynchronisierung für externe Liste

    Aktiviert

  5. Der ausgewählte Office-Elementtyp bestimmt das Microsoft Outlook-Verhalten, das Sie mit dem externen Inhaltstyp verknüpfen möchten. Das Feld Offlinesynchronisierung für externe Liste bestimmt, ob auf diesem externen Inhaltstyp basierende Listen in Outlook oder Microsoft SharePoint Workspace 2010 offline geschaltet werden können. Übernehmen Sie die Standardeinstellung Aktiviert.

  6. Klicken Sie auf den Link Klicken Sie hier, um externe Datenquellen zu ermitteln und Vorgänge zu definieren. Dadurch werden die Fenster geöffnet, in denen Sie die Verbindung zur AdventureWorks-Datenbank sowie Vorgänge für den externen Inhaltstyp definieren.

  7. Klicken Sie im Abschnitt Externe Datenquelle auf Verbindung hinzufügen, und wählen Sie für Datenquellentyp die Option SQL Server aus. Dadurch wird das Dialogfeld für SQL Server-Verbindungseigenschaften geöffnet. Legen Sie hier die Eigenschaften gemäß den Angaben in Tabelle 2 fest.

    Tabelle 2. SQL Server-Verbindungseigenschaften

    Eigenschaft

    Wert

    Database Server

    Fügen Sie hier den Namen des Servers ein (z. B. ContosoSrv)

    Database Name

    AdventureWorks2008

    Name

    AdventureWorks

    HinweisHinweis

    Die AdventureWorks-Datenbank wurde in diesem Szenario Adventureworks2008 genannt. Die Benutzer können den gleichen Namen verwenden, müssen aber u. U. den Verbindungsnamen im zugeordneten Modell ändern.

  8. Wählen Sie Verbindung mit der Identität des Benutzers herstellen, und klicken Sie dann auf OK, um die Verbindung zu erstellen. Die Verbindung AdventureWorks wird im Abschnitt Daten-Explorer angezeigt.

Definieren von Vorgängen für den externen Inhaltstyp "SalesOrderHeader"

Nach dem Einrichten der Verbindung definieren Sie Vorgänge für die SalesOrder-Tabelle, die SalesOrder-Kopfzeilenebenen-Informationen verfügbar macht.

So definieren Sie Vorgänge für den externen Inhaltstyp "SalesOrderHeader"

  1. Klicken Sie mit der rechten Maustaste auf die SalesOrder-Tabelle, um Optionen zum Erstellen von Methoden einzublenden. SharePoint Designer bietet Optionen zum Erstellen aller gängigen Vorgänge, die in Business Connectivity Services verfügbar sind. Sie können damit aber auch spezielle Vorgänge erstellen.

    Die folgenden beiden Vorgänge werden benötigt, um Daten aus dem externen System abzurufen und in einer Liste anzuzeigen:

    • Die Read List-Methode, die die Liste der Datensätze abruft und als Finder-Methode fungiert.

    • Die Read Item-Methode, die Daten für die jeweiligen externen Elemente abruft und als SpecificFinder-Methode fungiert.

  2. Zum Erstellen von Standardvorgängen klicken Sie auf Alle Vorgänge erstellen. In dem nun angezeigten Assistenten definieren Sie auf der Seite Filterparameterkonfiguration einen Filter vom Typ Grenzwert mit dem Standardwert 20 für die SalesOrderId-Spalte. Da wir die Anzahl der zurückgegebenen Datensätze beschränken möchten, werden hiermit die ersten 20 Zeilen aus dem externen System abgerufen.

  3. Gehen Sie zum Vorgang Element lesen, und benennen Sie ihn in SalesOrderHeaderReadItem um.

  4. Gehen Sie zum Vorgang Liste lesen, und benennen Sie ihn in SalesOrderHeaderReadList um.

  5. Speichern Sie den externen Inhaltstyp. Abbildung 1 zeigt die SalesOrderHeader-Eigenschaften und -Vorgänge.

    Abbildung 1. SalesOrderHeader-Eigenschaften und -Vorgänge

    SalesOrderHeader-Eigenschaften und -Vorgänge

Definieren von Vorgängen für den externen Inhaltstyp "SalesOrderLine"

In diesem Schritt definieren Sie eine Read Item-Methode, eine Read List-Methode, eine Association-Methode und eine Updater-Methode zum Aktualisieren der Tabelle SalesOrderDetails.

So definieren Sie Vorgänge für den externen Inhaltstyp "SalesOrderLine"

  1. Klicken Sie auf dem Menüband für die Serverkomponente in der Gruppe Neu auf Externer Inhaltstyp. Erstellen Sie im nun angezeigten Fenster einen externen Inhaltstyp. Legen Sie die Eigenschaften gemäß den Angaben in Tabelle 3 fest.

    Tabelle 3. Für den externen Inhaltstyp festzulegende Eigenschaften

    Eigenschaft

    Wert

    Name

    SalesOrderLine

    Anzeigename

    Sales Order Line

    Namespace

    http://intranet.contoso.com

    Version

    1.0.0.0

    Office-Elementtyp

    Generische Liste

    Offlinesynchronisierung für externe Liste

    Aktiviert

  2. Klicken Sie auf dem Menüband in der Gruppe Ansichten auf Entwurfsansicht für Vorgänge.

  3. Zum Einblenden von Optionen zum Erstellen von Methoden klicken Sie mit der rechten Maustaste auf die SalesOrderDetail-Tabelle.

  4. Klicken Sie auf Neuer "Element lesen"-Vorgang. Geben Sie im Feld Vorgangsname die Bezeichnung SalesOrderDetailReadItem ein. Klicken Sie auf Weiter.

  5. Klicken Sie auf der Seite Eingabeparameterkonfiguration auf das SalesOrderId-Datenquellenelement, und deaktivieren Sie die Map to Identifier-Eigenschaft. Sie entfernen dieses Element als Bezeichner, da Sie die SalesOrderDetailId-Spalte zum eindeutigen Bezeichnen der SalesOrderLine verwenden werden. Klicken Sie auf Weiter.

  6. Wiederholen Sie auf der Seite Rückgabeparameter die Aktionen in Schritt 5. Klicken Sie auf Fertig stellen.

  7. Klicken Sie mit der rechten Maustaste auf die SalesOrderDetail-Tabelle, und klicken Sie dann auf Neuer "Liste lesen"-Vorgang. Geben Sie im Feld Vorgangsname die Bezeichnung SalesOrderDetailReadList ein. Klicken Sie auf Weiter.

  8. Definieren Sie auf der Seite Filterparameterkonfiguration einen Filter vom Typ Grenzwert mit dem Standardwert 100 für die SalesOrderId-Spalte, um die Anzahl der zurückgegebenen Datensätze zu beschränken. Klicken Sie auf Weiter, und klicken Sie dann auf Fertig stellen, um den Vorgang zu erstellen.

  9. Klicken Sie mit der rechten Maustaste auf die SalesOrderDetail-Tabelle, und klicken Sie dann auf Neuer "Aktualisieren"-Vorgang. Geben Sie im Feld Vorgangsname die Bezeichnung SalesOrderDetailUpdateItem ein. Klicken Sie auf Weiter, und klicken Sie dann auf Fertig stellen, um den Vorgang zu erstellen.

  10. Klicken Sie mit der rechten Maustaste auf die SalesOrderDetail-Tabelle, und klicken Sie dann auf Neue Zuordnung. Geben Sie im Feld Vorgangsname die Bezeichnung SalesOrderDetailNavigateAssociation ein.

  11. Klicken Sie auf Durchsuchen, dann auf den externen Inhaltstyp SalesOrderHeader und anschließend auf Weiter.

  12. Klicken Sie auf der Seite Eingabeparameterkonfiguration auf das SalesOrderId-Element, und wählen Sie dessen Map to Identifier-Eigenschaft aus. Klicken Sie auf Fertig stellen, um den Vorgang zu erstellen. Abbildung 2 zeigt die SalesOrderLine-Eigenschaften und die dafür definierten Vorgänge.

    Abbildung 2. SalesOrderLine-Eigenschaften und definierte Vorgänge

    SalesOrderLine-Eigenschaften und definierte Vorgänge

Erstellen des Excel-Add-Ins

Jetzt können Sie anhand der folgenden Verfahren das Excel-Add-In erstellen.

Erstellen des Menübands und Implementieren der Ereignishandler

So erstellen Sie das Menüband und implementieren die Ereignishandler

  1. Öffnen Sie Visual Studio 2010, klicken Sie auf Neues Projekt, erweitern Sie den Knoten Office, klicken Sie auf 2010, und klicken Sie dann auf Excel 2010-Add-In-Vorlage. Nennen Sie die Vorlage SalesOrderAddIn. Stellen Sie sicher, dass .NET 3.5 als Zielplattform ausgewählt ist.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt SalesOrderAddin, und klicken Sie dann auf Neues Element hinzufügen. Wählen Sie Menüband (Visueller Designer) als Vorlage zum Erstellen des Menübands aus. Nennen Sie die Datei SalesOrderRibbon.cs.

  3. Legen Sie die Label-Eigenschaft von RibbonGroup auf Sales Orders fest.

  4. Ziehen Sie ein Box-Steuerelement aus der Kategorie Steuerelemente für Office-Menübänder in der Toolbox auf die RibbonGroup. Legen Sie den BoxStyle auf Vertikal fest.

  5. Ziehen Sie ein ComboBox-Steuerelement aus dem Box-Steuerelement, und legen Sie dann die Eigenschaften gemäß den Angaben in Tabelle 4 fest.

    Tabelle 4. Eigenschaften, die für das ComboBox-Steuerelement festzulegen sind

    Eigenschaft

    Wert

    Name

    cmbSalesOrderNumbers

    Beschriftung

    Order Number:

  6. Geben Sie UpdateSalesOrderDetails als Namen für den TextChanged-Ereignishandler für das ComboBox-Steuerelement an, das Sie zuvor hinzugefügt haben.

  7. Ziehen Sie ein EditBox-Steuerelement aus dem Box-Steuerelement, und legen Sie dann die Eigenschaften gemäß den Angaben in Tabelle  5 fest.

    Tabelle 5. Eigenschaften, die für das EditBox-Steuerelement festzulegen sind

    Eigenschaft

    Wert

    Name

    txtOrderAmount

    Beschriftung

    Order Amount

    BeschriftungAnzeigen

    True

  8. Ziehen Sie ein Separator-Steuerelement aus dem Box-Steuerelement, um das Steuerelement zu trennen, das Sie im nächsten Schritt verwenden.

  9. Ziehen Sie ein RibbonButton-Steuerelement aus dem Box-Steuerelement, und legen Sie dessen Eigenschaften gemäß den Angaben in Tabelle 6 fest.

    Tabelle 6. Eigenschaften, die für das RibbonButton-Steuerelement festzulegen sind

    Eigenschaft

    Wert

    Name

    UpdateLines

    GrößeSteuerelement

    RibbonControlSizeLarge

    Beschriftung

    Update Discount

    OfficeImageId

    FileSave

  10. Geben Sie UpdateLineItems als Namen für den Click-Ereignishandler für die Schaltfläche an, die Sie im vorherigen Schritt hinzugefügt haben.

  11. Schließen Sie die Datei SalesOrderRibbon.cs in das von Ihnen erstellte Projekt ein. (Diese Datei wird im Projekt unter Business Connectivity Services Excel 2010-Add-In) bereitgestellt. Der Code in dieser Klasse enthält die folgenden wichtigen Member:

    • "salesOrderTable"- und "salesOrderLineTable"-Variable: Diese Variablen auf Klassenebene enthalten die Daten, die durch Ausführen von Business Connectivity Services-Aufrufen im externen System zurückgegeben wurden.

    • "SalesOrderRibbon_Load"-Methode: Diese Methode wird beim erstmaligen Laden des Menübands ausgeführt. Sie erstellt die Tabellenstrukturen durch Lesen der Metadaten für Finder View und Association View für die externen Inhaltstypen SalesOrderHeader und SalesOrderLine. Finder View ist der Satz von Feldern, der vom Finder-Vorgang für Entity zurückgegeben wird. Association View ist der Satz von Feldern, der vom Finder-Standardvorgang für den zugeordneten externen Inhaltstyp zurückgegeben wird.

      Anschließend ruft die Methode die SalesOrderHeader Entities ab und füllt das ComboBox-Steuerelement mit SalesOrder-Nummern auf.

    • "UpdateSalesOrderDetails"-Methode: Diese Methode wird ausgeführt, wenn der Wert im ComboBox-Steuerelement sich ändert. Die Logik ruft mithilfe der Association-Methode die Positionen ab, die dem ausgewählten externen SalesOrderHeader-Inhaltstyp entsprechen. Das Arbeitsblatt Sheet1 in Microsoft Excel wird aktualisiert, und die zurückgegebenen externen SalesOrderLine-Elemente werden für den ausgewählten SalesOrderHeader angezeigt.

    • "UpdateLineItems"-Methode: Diese Methode wird ausgeführt, wenn der Benutzer die Option zum Speichern der Änderungen in SalesOrder-Zeilen mithilfe der Schaltfläche Update Discount auf dem Menüband ausgewählt hat. Sie durchläuft alle geänderten Positionen für SalesOrder, die in dem Kombinationsfeld ausgewählt werden, und führt anhand der geänderten Werte in dem Arbeitsblatt eine Updater-Methode für den externen Inhaltstyp SalesOrderLine aus.

    • "BindSalesOrderLines"-Methode: Diese Methode implementiert die Bindung des Excel-Arbeitsblatts an die Datentabelle mithilfe des ListObject-Steuerelements. ListObject ist eine Liste, die Ereignisse verfügbar macht und an Daten gebunden werden kann. Sie können sie direkt zum Programmieren verwenden, anstatt das Excel-Objektmodell zu durchlaufen.

Implementieren des BCS-Objektmodellcodes

Schließen Sie die SalesDataManager.cs-Klasse in das Projekt ein. (Diese Datei steht in dem Projekt unter Business Connectivity Services Excel 2010-Add-In) zur Verfügung. Diese Klasse implementiert das Abrufen von Daten aus dem externen System oder das Aktualisieren der SalesOrderLine mithilfe des Business-Konnektivitätsdienste (Business Connectivity Services)-Clientobjektmodells. Es folgt eine Auflistung der Kernfunktionen, mit denen diese Funktionalität implementiert wird.

"InitializeMetadataStore"-Methode

InitializeMetadataStore initialisiert den RemoteSharedFileBackedMetadataCatalog und ruft die externen Inhaltstypobjekte für SalesOrderHeader und SalesOrderLine ab. RemoteSharedFileBackedMetadataCatalog ist ein Metadatenspeicher, der in Microsoft Office-Clientanwendungen gemeinsam verwendet wird und der eine Schnittstelle zu den externen Inhaltstypobjekten bereitstellt, die im Business Connectivity Services-Clientcache zur Verfügung stehen. Dies wird im folgenden Codebeispiel veranschaulicht.

        private void InitializeMetadataStore()
        {
            // Open the shared metadatacatalog cache on the client to 
            // read line-of business information. This class represents the Office 
            // client shared storage for BCS metadata. After it is on the client,
            // this metadata can be accessed from any Office application.
            catalog =
                new RemoteSharedFileBackedMetadataCatalog();

            if (catalog != null)
            {
                // Get the SalesOrderHeader External Item by using 
                // namespace and name.
                entitySalesOrderHeader = catalog.GetEntity(
                    SalesOrderHeaderNamespace,
                    SalesOrderHeader);

                // Get the SalesOrderLine External Item by using 
                // namespace and name.
                entitySalesOrderLine = catalog.GetEntity(
                    SalesOrderHeaderNamespace,
                    SalesOrderLine);

                // Get the handle to LobSystem.
                lobInstance =
                catalog.GetLobSystem(SalesOrderLobSystemName).
                GetLobSystemInstances()[SalesOrderLobSystemName];
            }
        }

"CreateSalesOrderHeaderTableStructure"-Methode

CreateSalesOrderHeaderTableStructure erstellt die Struktur für die Datentabelle, in der externe Elemente für SalesOrderHeader gespeichert werden. GetFinderView gibt die View-Definition für die Finder-Methode des externen Inhaltstyps SalesOrderHeader zurück. Anhand der Felder in der Ansicht werden die Datenspalten erstellt. Dies wird im folgenden Codebeispiel veranschaulicht.

        public void CreateSalesOrderHeaderTableStructure()
        {
            if ((entitySalesOrderHeader != null)
                && (SalesOrderTable == null))
            {
                // Get the View that is associated with Finder by using name.
                IView viewSalesOrderHeader = entitySalesOrderHeader.
                    GetFinderView(SalesOrderHeaderFinderName);
                fieldsSalesOrderHeader = viewSalesOrderHeader.Fields;

                // Create the table definition.
                SalesOrderTable = new DataTable();
                foreach (IField field in fieldsSalesOrderHeader)
                {
                    SalesOrderTable.Columns.Add(field.Name,
                        field.TypeDescriptor.TypeName.GetType());
                }
            }
        }

"CreateSalesOrderLineTableStructure"-Methode

CreateSalesOrderLineTableStructure erstellt die Struktur für die Datentabelle, in der externe Elemente für SalesOrderLine gespeichert werden. GetAssociationView gibt die Ansicht für die Parameter zurück, die von der Association-Methode zurückgegeben werden, die zum Navigieren von Zuordnungen vom externen Inhaltstyp SalesOrderHeader zum externen Inhaltstyp SalesOrderLine verwendet wird. Dies wird im folgenden Codebeispiel veranschaulicht.

        public void CreateSalesOrderLineTableStructure()
        {
            if ((entitySalesOrderHeader != null)
                && (SalesOrderLineTable == null))
            {
                // Get associations where SalesOrderHeader is the source.
                INamedAssociationDictionary dict =
                    entitySalesOrderHeader.GetSourceAssociations();
                IAssociation associationSalesOrderLine =
                    dict[SalesOrderAssociationName];

                // Get the SalesOrderLine Entity.
                IEntity destinationEntity =
                    associationSalesOrderLine.GetDestination();

                // Get the fields that are returned by the Associated View.
                IView viewSalesOrderLine =
                    destinationEntity.GetAssociationView(associationSalesOrderLine);
                fieldsSalesOrderLine = viewSalesOrderLine.Fields;

                // Create table structure.
                SalesOrderLineTable = new DataTable();
                foreach (IField field in fieldsSalesOrderLine)
                {
                    SalesOrderLineTable.Columns.Add(field.Name,
                        field.Name.GetType());
                }
            }
        }

"GetSalesOrderHeaderItems"-Methode

GetSalesOrderHeaderItems ruft die externen SalesOrderHeader-Elemente ab, die auf der Standardsuche basiert, und füllt die Datentabelle auf. IEntity.FindFiltered dient zum Abrufen dieser Datensätze. OperationMode.Online bestimmt, ob Datensätze online oder offline aus dem lokalen Cache abgerufen werden. In diesem Szenario erhalten Sie die Datensätze immer aus dem externen System und nicht aus dem lokalen Cache, wie im folgenden Codebeispiel veranschaulicht.

        public DataTable GetSalesOrderHeaderItems()
        {
            if ((entitySalesOrderHeader != null)
                && (SalesOrderTable != null)
                && (lobInstance != null))
            {
                // Get the default filters.
                IFilterCollection filters =
                    entitySalesOrderHeader.GetDefaultFinderFilters();

                // Execute the FindFiltered method online.
                IEntityInstanceEnumerator enumerator =
                    entitySalesOrderHeader.FindFiltered(
                    filters,
                    SalesOrderHeaderFinderName,
                    lobInstance,
                    OperationMode.Online);

               
SalesOrderTable =null;
SalesOrderTable = catalog.Helper.CreateDataTable(enumerator);
            return SalesOrderTable;
        } 

"GetSalesOrderLineItems"-Methode

GetSalesOrderLineItems ruft die externen SalesOrderLine-Elemente ab, die einer bestimmten SalesOrderId entsprechen. GetSourceAssociations findet die Zuordnungen, wobei SalesOrderHeader die Quell-Entity ist. Die Zuordnung wird in der GetAssociatedInstances-Methode zum Abrufen der externen SalesOrderLine-Elemente verwendet, die das Ziel der Zuordnungsbeziehung sind. Dieser Vorgang wird auch ausgeführt, wenn der Online-OperationMode verwendet wird, wie im folgenden Codebeispiel gezeigt.

        
        public DataTable GetSalesOrderLineItems(int SalesOrderId)
        {
            Identity salesOrderIdentity = new Identity(SalesOrderId);

            // Get the specific SalesOrderHeader by using FindSpecific. 
            IEntityInstance salesOrderinstance =
                entitySalesOrderHeader.FindSpecific(
                salesOrderIdentity,
                SalesOrderSpecificFinderName,
                lobInstance,
                OperationMode.Online);

            // Get the association.
            IAssociation associationSalesOrderDetail =
                entitySalesOrderHeader.GetSourceAssociations()
                [SalesOrderAssociationName];

            // Get the associated SalesOrderLine instances.
            IEntityInstanceEnumerator enumerator =
                salesOrderinstance.GetAssociatedInstances(
                associationSalesOrderDetail,
                OperationMode.Online);

            // Populate the SalesOrderLine table.
            SalesOrderLineTable = null;

            // Clear the dirty rows, if any.
            changedSalesLineRows.Clear();

            SalesOrderLineTable = catalog.Helper.CreateDataTable(enumerator,true);               

            if (SalesOrderLineTable != null)
            {
                SalesOrderLineTable.RowChanged +=
                       new DataRowChangeEventHandler(SalesOrderLineTable_RowChanged);
            }

            return SalesOrderLineTable;
        }

            return SalesOrderLineTable;
        }

"UpdateSalesOrderLineItems"-Methode

UpdateSalesOrderLineItems aktualisiert die SalesOrderLine Entities im externen System. updaterMethod.GetMethod().GetParameters() gibt die Parameterdefinitionen zurück, die an die Updater-Methode übergeben werden müssen. Für jede SalesOrderLine wird eine Execute-Methode aufgerufen, um den externen Inhaltstyp im externen System zu aktualisieren. Dem Methodenaufruf werden die Parameter übergeben, die für die Aktualisierung erforderlich sind. Dies wird im folgenden Codebeispiel veranschaulicht.

        public void UpdateSalesOrderLineItems(DataRowCollection salesLineRows)
        {
            // Get the updater method.
            IMethodInstance updaterMethod =
            entitySalesOrderLine.GetMethodInstance("Update", MethodInstanceType.Updater);

            // Get the parameters to be passed to the Updater.
            IParameterCollection paramsDef = updaterMethod.GetMethod().GetParameters();

            // Parameter collection.
            object[] paramValues = new object[paramsDef.Count];

            int counter = 0;
            string colName = null;
            string colType = null;
            DataRow row = null;

            // Loop through and call Updater on each SalesOrderLine.
            IEnumerator enumerator = salesLineRows.GetEnumerator();
            while (enumerator.MoveNext())
            {
                row = (DataRow)enumerator.Current;

                while (counter < paramsDef.Count)
                {
                    colName = paramsDef[counter].GetRootTypeDescriptor().Name;
                    colType = paramsDef[counter].GetRootTypeDescriptor().TypeName;
                    switch (paramsDef[counter].GetRootTypeDescriptor().TypeName)
                    {
                        // Converting in format of Guid. 
                        case "System.Guid":
                            paramValues[counter] =
                               new System.Guid(row[colName].ToString());
                            break;
                        default:
                            paramValues[counter] =
                                row[colName];
                            break;
                    }
                    counter++;
                }

                // Call Updater.
                entitySalesOrderLine.Execute(
                    updaterMethod,
                    lobInstance,
                    ref paramValues);

                counter = 0;
            }
            return;
        }

Packen der Lösung

SharePoint Server 2010 bietet die folgenden zwei Mechanismen zum Installieren der Metadaten und Daten auf dem Clientcomputer:

  • Erstellen einer externen Liste auf dem Computer mit SharePoint Server auf der Grundlage des externen Inhaltstyps und Synchronisieren der Liste mit dem Clientcomputer durch Klicken auf die Schaltfläche Mit SharePoint Workspace synchronisieren auf dem Menüband der externen Liste. Dadurch werden die Metadaten von dem Server mit SharePoint und die Daten aus dem externen System abgerufen und im Business Connectivity Services-Clientcache und in Microsoft SharePoint Workspace 2010 verfügbar gemacht.

  • Erstellen einer DataSolution für das Excel-Add-In. Mithilfe des Tools zum Packen von BCS-Lösungen können Sie ein Microsoft Visual Studio-ClickOnce-Paket erstellen, das das BDC-Modell und die Abonnementdateien für den externen Inhaltstyp enthält. Wird es auf dem Client bereitgestellt, liest es die Abonnementregeln im Clientcache und importiert Metadaten in den Clientcache. Sobald es sich auf dem Client befindet, kann es zum Ausführen von Business-Konnektivitätsdienste (Business Connectivity Services)-Clientobjektmodell-Aufrufen zum Abrufen und Aktualisieren von Daten im externen System verwendet werden.

Das Excel-Add-In wird mithilfe der Unterstützung von Visual Studio als separates Paket für SharePoint-Entwicklungstools in Visual Studio 2010 gepackt.

Erstellen des "DataSolutionPackage"-Pakets

Das Tool zum Packen von BCS-Lösungen dient zum Erstellen von ClickOnce-Paketen für die Bereitstellung der Metadaten und Abonnementdateien. In diesem Szenario nutzen Sie das Tool, um die Metadaten zu packen und den Cache aufzufüllen. Das Paket wird als Datenlösung bezeichnet, weil die Daten nicht in einer Office-Anwendung angezeigt werden. Das Excel Add-In bietet die Funktionen zum Anzeigen dieser Daten auf der Benutzeroberfläche.

So erstellen Sie das Lösungspaket

  1. Erstellen Sie einen Ordner, und nennen Sie ihn DataSolutionPackage. (Sie können dem Ordner auch einen anderen Namen Ihrer Wahl geben.)

  2. Erstellen Sie eine Abonnementdatei im Ordner DataSolutionPackage, und nennen Sie sie SalesOrderHeaderSubscription.xml. (Oder geben Sie der Datei einen anderen Namen, dieser muss jedoch mit der Zeichenfolge subscription enden.) Weitere Informationen zum Cacheabonnement finden Sie unter Was ist ein Cacheabonnement?

    Diese Cacheabonnementdatei wird zum Erstellen des Abonnements für den externen Inhaltstyp SalesOrderHeader mit aktivierter Zwischenspeicherung verwendet. Die IsCached-Eigenschaft bestimmt, ob Daten des externen Inhaltstyps auf dem Client zwischengespeichert werden, wie im folgenden Beispiel gezeigt. Mithilfe des BCS Artifact Generator-Tools können Sie die Abonnementdatei basierend auf dem BDC-Modell erstellen.

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <Subscription LobSystemInstanceName="AdventureWorks" 
    EntityNamespace="http://intranet.contoso.com" 
                  EntityName="SalesOrderHeader" Name="Sales Order 
                  Header" View="SalesOrderHeaderReadItem" 
                  RefreshIntervalInMinutes="10" 
                  xmlns=
                  "https://schemas.microsoft.com/office/2006/03/BusinessDataCatalog" >
      <Queries>
        <Query Name="QuerySalesOrderHeader" IsCached="true" RefreshIntervalInMinutes="10"
               MethodInstanceName="SalesOrderHeaderReadList" Enabled="true"></Query>
      </Queries>
    </Subscription>
    
  3. Erstellen Sie im DataSolutionPackage-Ordner eine Abonnementdatei, und nennen Sie sie SalesOrderLineSubscription.xml. (Oder geben Sie der Datei einen anderen Namen, dieser muss jedoch mit der Zeichenfolge subscription enden.) Diese Cacheabonnementdatei wird zum Erstellen eines Abonnements für den externen Inhaltstyp SalesOrderLine mit aktivierter Zwischenspeicherung verwendet, wie im folgenden Beispiel gezeigt.

    Mithilfe des BCS Artifact Generator-Tools können Sie die Abonnementdatei basierend auf dem BDC-Modell erstellen.

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <Subscription LobSystemInstanceName="AdventureWorks" 
    EntityNamespace="http://intranet.contoso.com"
                  EntityName="SalesOrderLine" Name="Sales Order Line" 
                  View="SalesOrderDetailReadItem"
                  RefreshIntervalInMinutes="10"
                  xmlns=
                  "https://schemas.microsoft.com/office/2006/03/BusinessDataCatalog">
      <Queries>
        <Query Name="QuerySalesOrderLine" IsCached="true" RefreshIntervalInMinutes="10"
               MethodInstanceName="SalesOrderDetailReadList" Enabled="false"></Query>
      </Queries>
    </Subscription>
    
  4. Kopieren Sie die Datei metadata.xml, die mit Microsoft SharePoint Designer erstellt wurde, oder die Datei, die im Quellcode unter Business Connectivity Services-Add-In verfügbar ist, in den Ordner DataSolutionPackage. Wenn Sie die Datei metadata.xml im Business Connectivity Services-Add-In verwenden, ändern Sie den Datenbankservernamen und die Kontonamen, denen Berechtigungen erteilt werden müssen.

  5. Starten Sie das Tool zum Packen von BCS-Lösungen, und geben Sie Eigenschaftennamen an, wie in Tabelle 7 gezeigt.

    Tabelle 7. Eigenschaftennamen, die nach dem Starten des Tools zum Packen von BCS-Lösungen anzugeben sind

    Feld

    Wert

    Solution Name

    SalesOrderSolution

    Source Folder Path

    Pfad zum Ordner DataSolutionPackage

    Output Folder Path

    Pfad zum Ordner, in dem das Paket generiert werden soll

    Solution Version

    1.0.0.0

    Solution Type

    Data Solution for Office Add-In

  6. In diesem Szenario verwenden Sie das automatisch generierte Zertifikat zum Signieren des Pakets. Für Produktionsumgebungen wird ein kommerzielles Zertifikat empfohlen. Verwenden Sie die Schaltfläche Packen, um das Paket zu generieren.

    HinweisHinweis

    Informationen zu Zertifikaten und zur Lösung des Problems mit der Sicherheitsaufforderung finden Sie unter Vorgehensweise: Beseitigen der Warnung "Der Herausgeber kann nicht überprüft werden" beim Offlineschalten von externen Listen.

  7. Zum Bereitstellen der Lösung klicken Sie auf die Schaltfläche Bereitstellen. Ist der Zielclient ein anderer Computer, können die generierten Dateien im Ausgabeordner auf den Zielcomputer kopiert werden. Die Datenlösung stellen Sie bereit, indem Sie auf die Datei VSTO-Datei auf dem Client doppelklicken.

Erstellen des ClickOnce-Pakets für das Excel-Add-In

Verwenden Sie den Befehl Webpublishing-Assistent im Kontextmenü für das Visual Studio-Projekt, um das ClickOnce-Paket für das Excel-Add-In zu erstellen.

So erstellen Sie das ClickOnce-Paket für das Excel-Add-In

  1. Starten Sie Excel. Auf der Registerkarte Add-Ins sollte auf dem Menüband der Abschnitt Sales Orders angezeigt werden, wie in Abbildung 3 gezeigt. Das bedeutet, dass die Lösung erfolgreich auf dem Client installiert worden ist.

    Abbildung 3. Abschnitt Sales Orders auf der Registerkarte Add-Ins

    Abschnitt 'Verkaufsaufträge' auf der Add-Ins-Registerkarte

  2. Füllen Sie das ComboBox-Steuerelement zum Anzeigen der SalesOrder-Nummern durch Ausführen der Finder-Methode für den externen Inhaltstyp SalesOrderHeader auf. Das Textfeld zeigt den SubTotal-Betrag für den im Kombinationsfeld ausgewählten Auftrag an. Sheet1 zeigt die SalesOrderLine-Elemente für den ausgewählten SalesOrder im Kombinationsfeld an. Sie können die UnitPriceDiscount-Positionsspalte mit einem beliebigen Wert zwischen 0,00 und 1,00 aktualisieren, wobei 1 für 100 % steht.

  3. Nachdem Sie die gewünschten Änderungen vorgenommen haben, klicken Sie auf dem Menüband auf die Schaltfläche Update UnitPriceDiscount, um die neuen Werte zu speichern. Dadurch wird der Aktualisierungsprozess ausgeführt und SalesOrderLine im externen System aktualisiert. Intern werden SQL Server-Trigger im externen System ausgelöst, wodurch die UnitPrice-Positionsspalte und die SalesOrderHeaderSubTotal-Spalte aktualisiert werden. Nach der Aktualisierung ruft das Add-In die neuen Werte ab und aktualisiert das Excel-Arbeitsblatt und das Textfeld mit dem neuen Auftrags-Subtotal-Wert.

Schlussbemerkung

In diesem Artikel wird das Feature Microsoft Business Connectivity Services (BCS) in Microsoft SharePoint Server 2010 beschrieben. Es bietet zahlreiche Möglichkeiten der Nutzung von Daten aus einem externen System, sowohl offline oder online. Sie können damit Add-Ins, Aufgabenbereiche und andere Microsoft Office-Features für die Erweiterbarkeit erstellen, die die Interaktion mit den externen Daten über die benutzerfreundlichen Microsoft Office-Clientanwendungen ermöglichen.

Weitere Ressourcen

Weitere Informationen finden Sie in den folgenden Ressourcen: