Partager via


Créer des éditeurs de rapports pour PerformancePoint Services dans SharePoint

Découvrez comment créer le composant Éditeur d’une extension de rapport personnalisée pour PerformancePoint Services.

Quelles sont les éditeurs de rapport personnalisé pour PerformancePoint Services ?

In PerformancePoint Services, custom report editors enable users to set properties on custom reports. Report editors also initialize the report endpoint, which receives parameter values from scorecard and filter providers. For more information about editor requirements and functionality, see Éditeurs pour les objets personnalisés des services PerformancePoint Services.

Les procédures et les exemples suivants sont basés sur la classe SampleReportViewEditor à partir de l' exemple d'objets personnalisés. L'éditeur est une application web léger qui permet aux utilisateurs de modifier le nom et la description de l'état. Pour obtenir le code complet de la classe, voir Exemple de code : Créer, récupérer et mettre à jour des rapports PerformancePoint Services personnalisés dans SharePoint.

Nous vous recommandons d'utiliser l'éditeur de l'exemple en tant que modèle. Le montre l'exemple comment faire pour appeler des objets l'API, PerformancePoint Services fournit les objets d'assistance qui simplifient des appels pour les opérations du référentiel (tels que la création et la mise à jour des objets) et présente les méthodes conseillées pour le développement de PerformancePoint Services.

Créer des éditeurs pour les rapports personnalisés PerformancePoint Services

  1. Install PerformancePoint Services, or copy the DLLs that your extension uses (listed in step 3) to your computer. Pour plus d’informations, consultez DLL avec bibliothèques de classes.

  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#.

    Vous devez signer votre DLL en utilisant un nom fort. Par ailleurs, assurez-vous que tous les assemblys référencés par votre DLL ont des noms forts. Pour plus d’informations sur la signature d’un assembly avec un nom fort et sur la création d’une paire de clés publique/privée, consultez Guide pratique pour créer une paire de clés publique/privée.

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

    • Microsoft.PerformancePoint.Scorecards.Client.dll
    • Microsoft.PerformancePoint.Scorecards.ServerCommon.dll
    • Microsoft.PerformancePoint.Scorecards.Store.dll (utilisée par les classes d’assistance)
    • Microsoft.SharePoint.dll (utilisée par les classes d'assistance)

    L'éditeur de l'exemple contient également des références d'assembly aux DLL System.Web.dll et System.Web.Services.dll. Selon le fonctionnement de votre extension, d'autres références de projet peuvent être requises.

  4. Ajoutez les classes suivantes à partir de l'échantillon au projet. L'éditeur utilise ces classes d'assistance pour interagir avec le référentiel de PerformancePoint Services:

    • DataSourceConsumerHelper.cs
    • ExtensionRepositoryHelper.cs
    • ReportViewRepositoryHelper.cs
    • IDataSourceConsumer.cs

    Remarque

    [!REMARQUE] The sample report obtains data from a filter, so it does not use DataSourceConsumerHelper or IDataSourceConsumer objects. Toutefois, si votre rapport obtient des données à partir d’une source de données PerformancePoint Services, vous pouvez utiliser les méthodes exposées par la classe DataSourceConsumerHelper pour récupérer des sources de données, comme décrit dans Créer des éditeurs de filtre pour PerformancePoint Services dans SharePoint.

  5. Dans votre classe d'éditeur, ajoutez des directives using pour les espaces de noms PerformancePoint Services suivantes :

    • Microsoft.PerformancePoint.Scorecards
    • Microsoft.PerformancePoint.Scorecards.ServerCommon

    Selon le fonctionnement de votre extension, d'autres directives using peuvent être requises.

  6. Héritez de la classe de base qui prend en charge votre implémentation d'éditeur. Étant donné que l’exemple d’éditeur de rapport est 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 .

  7. Déclarez des variables pour les contrôles exposant les propriétés que vous souhaitez que les utilisateurs puissent afficher ou modifier. L'exemple d'éditeur de rapport commence par déclarer des variables pour les contrôles serveur Web définis dans le composant d'interface utilisateur, qui est une page ASPX. L'exemple d'éditeur définit également un contrôle bouton qui permet aux utilisateurs de soumettre des modifications. Ensuite, l’éditeur appelle la méthode CreateChildControls() pour rendre les contrôles disponibles sur la page.

    Remarque

    L’éditeur définit la logique de programmation séparément de l’interface utilisateur. La méthode de création du composant d'interface utilisateur de l'éditeur dépasse le cadre de cette documentation.

    L'éditeur de rapport exemple effectue les étapes 8 à 12 dans la méthode Page_Load. Page_Load est également utilisé pour initialiser et valider des variables et des contrôles, remplissez les contrôles et enregistrer les informations d'état pour les objets d'assistance et de rapport personnalisés.

  8. Définissez la propriété AllowUnsafeUpdates sur true. Cela permet à l'éditeur de rapport écrire des données dans le référentiel sans l'utilisation des opérations de POST de formulaire.

  9. Récupérez les paramètres de la chaîne de requête et définissez-les comme valeurs pour les variables locales, comme dans l'exemple de code ci-dessous.

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

    Remarque

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

  10. Récupérez l'objet ReportViewRepositoryHelper, qui permet d'appeler le référentiel, comme le montre l'exemple de code suivant.

    reportviewRepositoryHelper = new ReportViewRepositoryHelper();
    
  11. Définissez l'emplacement du rapport en fonction du paramètre de chaîne de requête, comme dans l'exemple de code suivant.

    RepositoryLocation repositoryReportViewLocation = RepositoryLocation.CreateFromUriString(itemLocation);
    
  12. Extrayez l'opération à effectuer ( OpenItem ou CreateItem) de la chaîne de requête, puis récupérer ou créer le rapport personnalisé.

    • Pour récupérer le rapport personnalisé, utilisez la méthode ReportViewRepositoryHelper.Get.
    • Pour créer le rapport personnalisé, utilisez le constructeur ReportView(), puis définissez les propriétés Name , RendererClassName et SubTypeId du rapport.

    SubTypeId est l'identificateur unique pour le rapport, et elle doit correspondre à l'attribut subType que vous spécifiez pour votre rapport personnalisé dans le fichier web.config PerformancePoint Services. RendererClassName est le nom qualifié complet de la classe qui définit le contrôle de serveur web convertisseur. Si non défini dans l'éditeur, la valeur par défaut pour la classe de convertisseur spécifiée dans le fichier web.config.

    if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
    {
      // Use the repository-helper object to retrieve the report.
      reportview = reportviewRepositoryHelper.Get(repositoryReportViewLocation);
      if (reportview == null)
      {
        displayError("Could not retrieve the report view for editing.");
        return;
      }
    }
    else if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase))
    {
      reportview = new ReportView
      {
        RendererClassName = typeof(SampleReportRenderer).AssemblyQualifiedName,
        SubTypeId = "SampleReportView"
      };
    }
    else
    {
      displayError("Invalid Action.");
      return;
    }
    

    Remarque

    [!REMARQUE] By default, users can create custom objects from PerformancePoint Dashboard Designer only. 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 requête CreateItem à votre éditeur à partir du type de contenu dans le référentiel. For more information, see Éditeurs pour les objets personnalisés des services PerformancePoint Services.

  13. Définissez le point de terminaison du rapport, qui permet au rapport de recevoir des données issues des filtres et des cartes de performance. L'exemple d'éditeur de rapport définit les propriétés requises pour le point de terminaison, comme dans l'exemple de code suivant.

    if (0 == reportview.EndPoints.Count)
    {
      EndPoint endpoint = new EndPoint
      {
        Category = EndPointCategory.None,
        UniqueName = "SampleReportView_EndPoint",
    
        // The display name is shown to users in Dashboard Designer.
        // It represents the endpoint that can be connected
        // to a filter or scorecard.
        DisplayName = "Sample Report View EndPoint"
      };
    
      reportview.EndPoints.Add(endpoint);
    }
    

    L'exemple d'éditeur définit le point de terminaison dans la méthode VerifyReportView. Il utilise également la méthode VerifyReportView pour vérifier que les propriétés requises sont définies et pour définir la propriété facultative CustomData , que vous pouvez utiliser pour stocker des informations destinées à votre rapport.

  14. Mettez à jour le rapport pour prendre en compte les modifications définies par l'utilisateur. La méthode buttonOK_Click de l'exemple d'éditeur de rapport appelle la méthode ReportViewRepositoryHelper.Update pour mettre à jour les propriétés Name et Description dans le référentiel. La méthode buttonOK_Click est également utilisée pour valider le contenu des contrôles et récupérer les informations d'état du rapport personnalisé et de l'objet d'assistance.

    Remarque

    Les utilisateurs peuvent modifier les propriétés Name, Description et Owner (Personne responsable) d’un objet personnalisé et supprimer des objets personnalisés directement à partir du concepteur de tableau de bord et du référentiel PerformancePoint Services.

Exemple de code : Créer, récupérer et mettre à jour des rapports PerformancePoint Services personnalisés dans SharePoint

L'exemple de code suivant crée, extrait et met à jour des rapports personnalisés. Ce code provient de la classe code-behind de l'éditeur, qui fournit la logique de programmation pour les contrôles qui sont définis dans une page ASPX.

Avant de pouvoir compiler cet exemple de code, vous devez configurer votre environnement de développement comme décrit dans Créer des éditeurs pour des rapports PerformancePoint Services personnalisés.

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.PerformancePoint.Scorecards;
using Microsoft.PerformancePoint.Scorecards.ServerCommon;

namespace Microsoft.PerformancePoint.SDK.Samples.SampleReport
{

    // Represents the class that defines the sample report editor.
    public class SampleReportViewEditor : Page
    {

        // Declare private variables for the ASP.NET controls defined in the user interface.
        // The sample's user interface is an ASPX page that defines the controls in HTML.
        private TextBox textboxName;
        private TextBox textboxDescription;
        private Label labelErrorMessage;
        private Button buttonOK;

        // Make the controls available to this class.
        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            if (null == textboxName)
                textboxName = FindControl("textboxName") as TextBox;
            if (null == textboxDescription)
                textboxDescription = FindControl("textboxDescription") 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)
        {

            // Required to enable custom report and filter editors to
            // write data to the repository.
            ServerUtils.AllowUnsafeUpdates = true;

            // Initialize controls the first time the page loads only.
            if (!IsPostBack)
            {
                EnsureChildControls();
                ReportViewRepositoryHelper reportviewRepositoryHelper = 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.
                    reportviewRepositoryHelper =
                        new ReportViewRepositoryHelper();

                    // Set the report location by using the location from the query string.
                    RepositoryLocation repositoryReportViewLocation = RepositoryLocation.CreateFromUriString(itemLocation);

                    ReportView reportview;

                    // Retrieve or create the report object, depending on the operation
                    // passed in the query string (OpenItem or CreateItem).
                    if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                    {

                        // Retrieve the report object by using the repository-helper object.
                        reportview = reportviewRepositoryHelper.Get(repositoryReportViewLocation);
                        if (reportview == null)
                        {
                            displayError("Could not retrieve the report view for editing.");
                            return;
                        }
                    }
                    else if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                    {

                        // Create a report view.
                        // CreateItem requests can be sent from a SharePoint list, but
                        // you must create a custom menu item to send the request.
                        // Dashboard Designer can send edit requests only.
                        reportview = new ReportView
                        {
                            RendererClassName = typeof(SampleReportRenderer).AssemblyQualifiedName,
                            SubTypeId = "SampleReportView"
                        };
                    }
                    else
                    {
                        displayError("Invalid Action.");
                        return;
                    }

                    VerifyReportView(reportview);

                    // Save the original report and helper objects across page postbacks.
                    ViewState["action"] = action;
                    ViewState["reportview"] = reportview;
                    ViewState["reportviewrepositoryhelper"] = reportviewRepositoryHelper;
                    ViewState["itemlocation"] = itemLocation;

                    // Populate the child controls.
                    textboxName.Text = reportview.Name.ToString();
                    textboxDescription.Text = reportview.Description.ToString();
                }
                catch (Exception ex)
                {
                    displayError("An error has occurred. Please contact your administrator for more information.");
                    if (reportviewRepositoryHelper != null)
                    {

                        // Add the exception detail to the server event log.
                        reportviewRepositoryHelper.HandleException(ex);
                    }
                }
            }
        }

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

            // Verify that the textboxName control contains a value.
            if (string.IsNullOrEmpty(textboxName.Text))
            {
                labelErrorMessage.Text = "A report view name is required.";
                return;
            }

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

            // Retrieve the report and helper objects from view state.
            string action = (string)ViewState["action"];
            string itemLocation = (string) ViewState["itemlocation"];
            ReportView reportview = (ReportView)ViewState["reportview"];
            ReportViewRepositoryHelper reportviewRepositoryHelper = (ReportViewRepositoryHelper)ViewState["reportviewrepositoryhelper"];

            // Update the report object with form changes.
            reportview.Name.Text = textboxName.Text;
            reportview.Description.Text = textboxDescription.Text;

            // Save the report object to the PerformancePoint Services repository.
            try
            {
                reportview.Validate();
                if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                {
                    reportview.CreatedDate = DateTime.Now;
                    ReportView newReportView = reportviewRepositoryHelper.Create(
                        string.IsNullOrEmpty(reportview.Location.ItemUrl) ? itemLocation : reportview.Location.ItemUrl,
                        reportview);
                    ViewState["reportview"] = newReportView;
                    ViewState["action"] = ClickOnceLaunchValues.OpenItem;
                }
                else
                {
                    reportviewRepositoryHelper.Update(reportview);
                }
            }
            catch (Exception ex)
            {
                displayError("An error has occurred. Please contact your administrator for more information.");
                if (reportviewRepositoryHelper != null)
                {
                    // Add the exception detail to the server event log.
                    reportviewRepositoryHelper.HandleException(ex);
                }
            }
        }

        // Displays 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;
        }

        // Verifies that the properties for the report object are set.
        static void VerifyReportView(ReportView reportview)
        {

            // Verify that all required properties are set.
            if (string.IsNullOrEmpty(reportview.SubTypeId))
            {

                // This value must match the subType attribute specified
                // in the web.config file.
                reportview.SubTypeId = "SampleReportView";
            }

            if (string.IsNullOrEmpty(reportview.RendererClassName))
            {
                reportview.RendererClassName = typeof (SampleReportRenderer).AssemblyQualifiedName;
            }

            // Reports are consumers and do not use provider endpoints.
           reportview.BeginPoints.Clear();

            // If there are no consumer endpoints, create one so we can connect a filter or a scorecard to the report.
            if (0 == reportview.EndPoints.Count)
            {
                EndPoint endpoint = new EndPoint
                {
                    Category = EndPointCategory.None,
                    UniqueName = "SampleReportView_EndPoint",

                    // The display name is shown to users in Dashboard
                    // Designer to represent the endpoint that can be
                    // connected to a filter or scorecard.
                    DisplayName = "Sample Report View EndPoint"
                };

                reportview.EndPoints.Add(endpoint);
            }

            // Set optional properties for reports.
            reportview.CustomData = "You can use this property to store custom information for this filter as a string or a serialized object.";
        }
    }
}

Étapes suivantes

Après avoir créé un éditeur de rapport (y compris son interface utilisateur, si nécessaire) et un renderer de rapport, déployez l’extension comme décrit dans Guide pratique pour inscrire manuellement PerformancePoint Services extensions.

Voir aussi