Partager via


Procédure : Créer des éditeurs pour les sources de données tabulaires des services PerformancePoint Services

Dernière modification : mardi 30 août 2011

Dans Services PerformancePoint dans Microsoft SharePoint Server 2010, les éditeurs personnalisés permettent aux utilisateurs de définir des propriétés sur des objets personnalisés. Ils procurent des contrôles d’édition et extraient et mettent à jour des objets personnalisés dans le référentiel. Pour plus d’informations sur la fonctionnalité d’éditeur, voir Éditeurs pour les objets personnalisés des services PerformancePoint Services.

S’applique à : SharePoint Server 2010

Les procédures et exemples de code de cette rubrique sont basés sur la classe SampleDataSourceEditor de l’exemple d’objets personnalisés. L’éditeur est une application Web légère qui permet aux utilisateurs de modifier le nom et la description de la source de données, d’entrer des codes de titres boursiers et de spécifier une adresse de serveur proxy et un emplacement de fichier cache. Le code complet de la classe est fourni dans la section « Exemple » de cette rubrique.

Notes

Nous vous recommandons d’utiliser l’éditeur d’exemple comme modèle. L’exemple montre comment appeler des objets dans l’API PerformancePoint Services, fournit des objets d’assistance qui simplifient les appels pour les opérations de référentiels (telles que la création et la mise à jour d’objets) et illustre les meilleures pratiques pour le développement PerformancePoint Services.

La création d’un éditeur de source de données nécessite d’effectuer les deux procédures de base suivantes :

  • Création et configuration de la classe d’éditeur

  • Définition de la fonctionnalité d’édition

Pour créer un éditeur personnalisé, commencez par créer la classe d’éditeur.

Pour créer et configurer la classe d’éditeur

  1. Installez PerformancePoint Services ou copiez les DLL utilisées par votre extension (répertoriées à l’étape 3) sur votre ordinateur. Pour plus d’informations, voir DLL PerformancePoint Services utilisées dans les scénarios de développement.

  2. Dans Visual Studio, créez une bibliothèque de classes C#. Si vous avez déjà créé une bibliothèque de classes pour votre extension, ajoutez une nouvelle classe C#.

  3. Ajoutez les DLL suivantes en tant que références d’assemblys au projet :

    • Microsoft.PerformancePoint.Scorecards.Client.dll

    • Microsoft.SharePoint.dll (utilisé par les classes d’assistance)

    L’exemple d’éditeur contient également des références d’assemblys à System.Core.dll, System.Web.dll, System.Web.Services.dll et System.Xml.Linq.dll. Selon la fonctionnalité de l’extension, il se peut que d’autres références de projets soient requises.

  4. Ajoutez les classes suivantes de l’exemple au projet. Votre éditeur utilise ces classes d’assistance pour interagir avec le référentiel PerformancePoint Services et le fichier cache :

    • ExtensionRepositoryHelper.cs

    • DataSourceRepositoryHelper.cs

    • SampleDSCacheHandler.cs

  5. Dans votre classe d’éditeur, ajoutez une directive using pour l’espace de noms Microsoft.PerformancePoint.Scorecards. Selon la fonctionnalité de votre extension, il se peut que d’autres directives using soient requises.

  6. Héritez de la classe de base qui prend en charge votre implémentation d’éditeur. L’exemple d’éditeur de source de données étant une application Web, il hérite de la classe Page. D’autres implémentations peuvent dériver de classes de base telles que UserControl ou WebPart.

Après avoir créé et configuré la classe d’éditeur, vous devez définir la fonctionnalité de votre éditeur.

Pour définir la fonctionnalité d’édition

  1. Déclarez des variables pour les contrôles qui exposent les propriétés que vous souhaitez que les utilisateurs affichent ou modifient. L’exemple d’éditeur de source de données déclare d’abord des variables pour les contrôles de serveur Web définis dans le composant d’interface utilisateur, qui est une page ASPX. Il définit également un contrôle de bouton qui permet aux utilisateurs de soumettre des modifications. Ensuite, il appelle la méthode CreateChildControls() afin de rendre les contrôles disponibles sur la page.

    Notes

    L’éditeur définit la logique de programmation séparément de l’interface utilisateur. Les instructions de création du composant d’interface utilisateur sont au-delà de la portée de cette documentation.

  2. Extrayez les paramètres de la chaîne de requête, puis définissez-les comme valeurs pour des variables locales, comme illustré dans l’exemple de code suivant :

    // The URL of the site collection that contains the PerformancePoint Services repository.
    string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl];
    
    // The location of the data source in the repository.
    string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation];
    
    // The operation to perform: OpenItem or CreateItem.
    string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];
    

    Pour plus d’informations sur les paramètres de chaîne de requête, voir Éditeurs pour les objets personnalisés des services PerformancePoint Services.

  3. Extrayez l’objet DataSourceRepositoryHelper qui est utilisé pour effectuer des appels au référentiel, comme illustré dans l’exemple de code suivant.

    DataSourceRepositoryHelper = new DataSourceRepositoryHelper();
    
  4. Définissez l’emplacement de source de données en fonction du paramètre de chaîne de requête, comme illustré dans l’exemple de code suivant.

    RepositoryLocation repositoryDataSourceLocation = RepositoryLocation.CreateFromUriString(itemLocation);
    
  5. Extrayez l’opération à effectuer (OpenItem ou CreateItem) de la chaîne de requête, puis extrayez ou créez la source de données personnalisée, comme illustré dans l’exemple de code suivant.

    if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase)) 
    {
        // Use the repository-helper object to retrieve the data source.
        datasource = dataSourceRepositoryHelper.Get(repositoryDataSourceLocation);
        if (datasource == null)
        {
            displayError("Could not retrieve the data source for editing.");
            return;
        }
    }
    else
    {
        displayError("Invalid Action.");
        return;
    }
    

    Notes

    Par défaut, les utilisateurs peuvent créer des objets personnalisés uniquement à partir de PerformancePoint Dashboard Designer. Pour permettre aux utilisateurs de créer un objet personnalisé en dehors de Dashboard Designer, vous devez ajouter un élément de menu qui envoie une demande CreateItem à votre éditeur à partir du type de contenu dans le référentiel. Pour plus d’informations, voir Éditeurs pour les objets personnalisés des services PerformancePoint Services.

    L’exemple d’éditeur de source de données effectue les étapes 2 à 5 dans la méthode Page_Load. Page_Load sert également à initialiser et valider des variables et des contrôles, à remplir des contrôles et à enregistrer les informations d’état pour les objets d’assistance et de source de données personnalisés.

  6. Mettez à jour la source de données avec les modifications définies par l’utilisateur. L’exemple d’éditeur de source de données appelle la méthode DataSourceRepositoryHelper.Update pour mettre à jour les propriétés Name, Description et CustomData de l’objet de source de données dans le référentiel. Vous pouvez utiliser CustomData pour stocker une chaîne ou un objet sérialisé. L’exemple d’éditeur l’utilise pour stocker les codes de titres définis par l’utilisateur, l’emplacement du fichier cache qui contient les valeurs des cotations boursières et l’adresse du serveur proxy.

    Notes

    Les utilisateurs peuvent modifier les propriétés Name, Description et Owner (Person Responsible) d’un objet personnalisé et supprimer des objets personnalisés directement à partir de Dashboard Designer et du référentiel PerformancePoint Services.

  7. Appelez le fournisseur de source de données pour définir les mappages de colonnes, s’ils ne le sont pas encore.

    L’exemple d’éditeur de source de données effectue les étapes 6 et 7 dans les méthodes buttonOK_Click et CreateCacheFile. buttonOK_Click sert également à appeler la méthode AreAllInputsValid pour valider le contenu des contrôles et extraire les informations d’état de la source de données personnalisée et de l’objet d’assistance.

    Étape suivante : après avoir créé un éditeur de source de données (y compris son interface utilisateur, le cas échéant) et un fournisseur de source de données, déployez l’extension comme décrit dans Procédure : enregistrer manuellement des extensions PerformancePoint Services. Pour obtenir des instructions sur la façon d’installer et de configurer l’exemple d’extension de filtre, voir la section « Installation des objets de rapport, de filtre et de source de données de l’exemple » dans Exemple de code : objets personnalisés de rapport, de filtre et de source de données tabulaires.

Exemple

L’exemple de code suivant extrait et met à jour des sources de données tabulaires personnalisées dans le référentiel et fournit la logique de programmation pour les contrôles définis dans une page ASPX.

Notes

Pour pouvoir compiler cet exemple de code, vous devez configurer votre environnement de développement comme décrit dans Pour créer et configurer la classe d’éditeur.

using System;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.PerformancePoint.Scorecards;
using System.Xml.Linq;

namespace Microsoft.PerformancePoint.SDK.Samples.SampleDataSource
{
    // Represents the class that defines the sample data source editor.
    public class SampleDataSourceEditor : Page
    {

        #region Members
        // Declare private variables for the ASP.NET controls defined in the user interface.
        // The user interface is an ASPX page that defines the controls in HTML.
        private TextBox textboxName;
        private TextBox textboxDescription;
        private TextBox textboxStockSymbols;
        private TextBox textboxXMLLocation;
        private TextBox textboxProxy;
        private Label labelErrorMessage;
        private Button buttonOK;
        #endregion

        #region Page methods and events
        // Make the controls available to this class.
        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            if (null == textboxProxy)
                textboxProxy = FindControl("textboxProxy") as TextBox;
            if (null == textboxName)
                textboxName = FindControl("textboxName") as TextBox;
            if (null == textboxDescription)
                textboxDescription = FindControl("textboxDescription") as TextBox;
            if (null == textboxStockSymbols)
                textboxStockSymbols = FindControl("textboxStockSymbols") as TextBox;
            if (null == textboxXMLLocation)
                textboxXMLLocation = FindControl("textboxXMLLocation") as TextBox;
            if (null == labelErrorMessage)
                labelErrorMessage = FindControl("labelErrorMessage") as Label;
            if (null == buttonOK)
                buttonOK = FindControl("buttonOK") as Button;
        }

        // Handles the Load event of the Page control.
        // Methods that use a control variable should call the Control.EnsureChildControls
        // method before accessing the variable for the first time.
        protected void Page_Load(object sender, EventArgs e)
        {
            // Initialize controls the first time the page loads only.
            if (!IsPostBack)
            {
                EnsureChildControls();

                DataSourceRepositoryHelper dataSourceRepositoryHelper = null;
                try
                {
                    // Get information from the query string parameters.
                    string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl];
                    string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation];
                    string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];

                    // Validate the query string parameters.
                    if (string.IsNullOrEmpty(server) ||
                        string.IsNullOrEmpty(itemLocation) ||
                        string.IsNullOrEmpty(action))
                    {
                        displayError("Invalid URL.");
                        return;
                    }

                    // Retrieve the repository-helper object.
                    dataSourceRepositoryHelper =
                        new DataSourceRepositoryHelper();

                    // Set the data source location.
                    RepositoryLocation repositoryDataSourceLocation = RepositoryLocation.CreateFromUriString(itemLocation);

                    DataSource datasource;

                    // Retrieve the data source object by
                    // using the repository-helper object.
                    if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                    {
                        datasource = dataSourceRepositoryHelper.Get(repositoryDataSourceLocation);
                        if (datasource == null)
                        {
                            displayError("Could not retrieve the data source for editing.");
                            return;
                        }
                    }
                    else
                    {
                        displayError("Invalid Action.");
                        return;

                    }

                    // Save the original data source and helper objects across page postbacks.
                    ViewState["action"] = action;
                    ViewState["datasource"] = datasource;
                    ViewState["datasourcerepositoryhelper"] = dataSourceRepositoryHelper;

                    // Populate the child controls.
                    if (null != datasource.Name)
                        textboxName.Text = datasource.Name.ToString();

                    if (null != datasource.Description)
                        textboxDescription.Text = datasource.Description.ToString();

                    if (null != datasource.CustomData)
                    {
                        string[] splitCustomData = datasource.CustomData.Split('&');
                        if (splitCustomData.Length > 2)
                        {
                            textboxStockSymbols.Text = splitCustomData[0];
                            textboxXMLLocation.Text = splitCustomData[1].Replace(@"\SampleStockQuotes.xml", string.Empty);
                            textboxProxy.Text = splitCustomData[2];
                        }
                    }
                }
                catch (Exception ex)
                {
                    displayError("An error has occurred. Please contact your administrator for more information.");
                    if (dataSourceRepositoryHelper != null)
                    {
                        // Add the exception detail to the server
                        // event log.
                        dataSourceRepositoryHelper.HandleException(ex);
                    }
                }
            }
        }

        // Handles the Click event of the buttonOK control.
        protected void buttonOK_Click(object sender, EventArgs e)
        {
            EnsureChildControls();

            // Verify that the required fields contain values.
            if (!AreAllInputsValid())
                return;

            // Clear any pre-existing error message.
            labelErrorMessage.Text = string.Empty;

            // Retrieve the data source and helper objects from view state.
            string action = (string)ViewState["action"];
            DataSource datasource = (DataSource)ViewState["datasource"];
            DataSourceRepositoryHelper datasourcerepositoryhelper = (DataSourceRepositoryHelper)ViewState["datasourcerepositoryhelper"];

            // Update the data source object with form changes.
            datasource.Name.Text = textboxName.Text;
            datasource.Description.Text = textboxDescription.Text;

            // Define column mappings if they aren't already defined.
            if (datasource.DataTableMapping.ColumnMappings.Count <= 0)
            {
                datasource.DataTableMapping = WSTabularDataSourceProvider.CreateDataColumnMappings();
            }

            // Save the data source to the repository
            // by using the repository-helper object.
            try
            {
                CreateCacheFile(datasource);

                datasource.Validate();

                if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                {
                    datasourcerepositoryhelper.Update(datasource);
                }
                else
                {
                    displayError("Invalid Action.");
                }
            }
            catch (Exception ex)
            {
                displayError("An error has occurred. Please contact your administrator for more information.");
                if (datasourcerepositoryhelper != null)
                {
                    // Add the exception detail to the server event log.
                    datasourcerepositoryhelper.HandleException(ex);
                }
            }
        }
        #endregion

        #region Helper methods
        // Display the error string in the labelErrorMessage label.
        void displayError(string msg)
        {
            EnsureChildControls();

            labelErrorMessage.Text = msg;

            // Disable the OK button because the page is in an error state.
            buttonOK.Enabled = false;
            return;
        }

        // Validate the text box inputs.
        bool AreAllInputsValid()
        {
            if (string.IsNullOrEmpty(textboxProxy.Text))
            {
                labelErrorMessage.Text = "The proxy server address is required.";
                return false;
            }

            if (string.IsNullOrEmpty(textboxXMLLocation.Text))
            {
                labelErrorMessage.Text = "The location to save the cache file to is required.";
                return false;
            }

            if (string.IsNullOrEmpty(textboxName.Text))
            {
                labelErrorMessage.Text = "A data source name is required.";
                return false;
            }

            if (string.IsNullOrEmpty(textboxStockSymbols.Text))
            {
                labelErrorMessage.Text = "A stock symbol is required.";
                return false;
            }

            return true;
        }

        // Create the XML cache file at the specified location and
        // store it and the stock symbols in the CustomData
        // property of the data source.
        void CreateCacheFile(DataSource datasource)
        {
            string cacheFileLocation = string.Format("{0}\\{1}", textboxXMLLocation.Text.TrimEnd('\\'),
                                                     "SampleStockQuotes.xml");

            datasource.CustomData = string.Format("{0}&{1}&{2}", textboxStockSymbols.Text, cacheFileLocation, textboxProxy.Text);

            // Check if the cache file already exists.
            if (!File.Exists(cacheFileLocation))
            {
                // Create the cache file if it does not exist.
                XDocument doc = SampleDSCacheHandler.DefaultCacheFileContent;
                doc.Save(cacheFileLocation);
            }
        }
        #endregion
    }
}

Compilation du code

Pour pouvoir compiler cet exemple de code, vous devez configurer votre environnement de développement comme décrit dans Pour créer et configurer la classe d’éditeur.

Sécurité

Vous devez signer votre DLL avec un nom fort. De plus, assurez-vous que tous les assemblys référencés par votre DLL ont des noms forts. Pour plus d’informations sur la façon de signer un assembly avec un nom fort et sur la façon de créer une paire de clés publique/privée, voir How to: Create a Public/Private Key Pair.

Voir aussi

Tâches

Procédure : créer des fournisseurs pour les sources de données tabulaires des services PerformancePoint Services

Concepts

Éditeurs pour les objets personnalisés des services PerformancePoint Services

Autres ressources

Créer des objets personnalisés pour les services PerformancePoint Services

Exemples de code pour les pour les services PerformancePoint Services dans SharePoint Server 2010