Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Découvrez comment créer le composant éditeur d’une extension de source de données tabulaire personnalisée pour PerformancePoint Services.
Quelles sont les éditeurs de source de données personnalisés pour PerformancePoint Services ?
In PerformancePoint Services, custom data source editors enable users to set properties on custom tabular data sources. For more information about editor requirements and functionality, see Éditeurs pour les objets personnalisés des services PerformancePoint Services.
Les procédures suivantes et les exemples de code sont basées sur la classe SampleDataSourceEditor à 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 la source de données, entrez les symboles boursiers et spécifier un emplacement de fichier proxy server adresse et le cache. Pour obtenir le code complet de la classe, consultez Exemple de code : Récupérer et mettre à jour des sources de données tabulaires personnalisées.
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 sources de données tabulaires éditeurs pour personnalisé PerformancePoint Services
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.
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.
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.
Ajoutez les classes suivantes à partir de l'échantillon au projet. Votre éditeur utilise ces classes d'assistance pour interagir avec le référentiel PerformancePoint Services et le fichier de cache :
- ExtensionRepositoryHelper.cs
- DataSourceRepositoryHelper.cs
- SampleDSCacheHandler.cs
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.
Héritez de la classe de base qui prend en charge votre implémentation d'éditeur. Étant donné que l’exemple d’éditeur de source de données 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 .
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, 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 code source de données exemple effectue les étapes 8 à 11 dans la méthode Page_Load. Page_Load est également utilisé pour 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 la source de données personnalisées.
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 data source 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.
Récupérez l'objet DataSourceRepositoryHelper qui est utilisée pour passer des appels au référentiel, comme illustré dans l'exemple de code suivant.
DataSourceRepositoryHelper = new DataSourceRepositoryHelper();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);Extrayez l'opération à effectuer ( OpenItem ou CreateItem) de la chaîne de requête, puis récupérer ou créer la source de données personnalisée.
- Pour extraire la source de données personnalisée, utilisez la méthode DataSourceRepositoryHelper.Get.
- Pour créer la source de données personnalisée, utilisez le constructeur DataSource(), puis définissez les propriétés Name et SubTypeId de la source de données. SubTypeId est l'identificateur unique de la source de données, et elle doit correspondre à l'attribut subType que vous spécifiez pour votre source de données personnalisées dans le fichier web.config PerformancePoint Services.
Remarque
L’exemple d’éditeur de source de données n’inclut pas la logique de création d’objet de source de données. Pour obtenir des exemples de création d’un objet personnalisé, voir How to: Create report editors for PerformancePoint Services in SharePoint ou How to: Create filter editors for PerformancePoint Services in SharePoint.
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; }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.
L'éditeur de code source de données exemple effectue les étapes 12 et 13 dans les méthodes buttonOK_Click et CreateCacheFile. buttonOK_Click est également utilisé pour appeler la méthode AreAllInputsValid pour valider le contenu des contrôles et permet de récupérer les informations d'état de la source de données personnalisée et de l'objet application d'assistance.
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.
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.
Appelez le fournisseur de source de données pour définir les mappages de colonnes, s’ils ne le sont pas encore.
Exemple de code : Récupérer et mettre à jour des sources de données tabulaires PerformancePoint Services personnalisées dans SharePoint
L'exemple de code suivant extrait et met à jour des sources de données tabulaires personnalisées. 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 et configurer la classe d’éditeur pour un éditeur de source de données tabulaires dans PerformancePoint Services.
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
}
}
Étapes suivantes
Après avoir créé un éditeur de source de données (y compris son interface utilisateur, si nécessaire) et un fournisseur de source de données, vous déployez l’extension comme décrit dans Guide pratique pour inscrire manuellement PerformancePoint Services extensions.