Procédure : créer des fournisseurs pour les sources de données tabulaires des services PerformancePoint Services
Dernière modification : mardi 30 août 2011
Les fournisseurs de sources de données se connectent à une source de données, accèdent à ses données, puis retournent les résultats de la requête. Services PerformancePoint dans Microsoft SharePoint Server 2010 utilise des fournisseurs de sources de données tabulaires pour accéder aux données à partir de feuilles de calcul Microsoft Excel et Excel Services, de listes SharePoint et de tables Microsoft SQL Server.
S’applique à : SharePoint Server 2010
Vous pouvez créer un fournisseur de source de données personnalisé afin d’utiliser les données d’une source de données tabulaires qui ne sont pas prises en charge par PerformancePoint Services. La fonction principale d’un fournisseur de source de données tabulaires est de créer une table de données et de la remplir avec les données de la source de données. Il crée également des mappages de colonnes pour définir le type de données contenu dans chaque colonne (fait, dimension ou dimension de temps). Une structure multidimensionnelle de base est ainsi appliquée aux données tabulaires.
Les procédures et les exemples de code figurant dans cette rubrique sont basés sur la classe WSTabularDataSourceProvider de l’exemple d’objets personnalisés. Le fournisseur récupère les cotations boursières d’un service Web externe pour des symboles boursiers spécifiés. Il stocke les données historiques des cotations boursières dans un fichier cache, ce qui permet de découper les données par tranches de temps. Le code complet de la classe est fourni dans la section « Exemple » de cette rubrique.
Notes
Nous vous recommandons d’utiliser l’exemple de fournisseur de source de données comme modèle. Cet exemple montre comment appeler des objets dans l’API PerformancePoint Services et répertorie les meilleures pratiques pour le développement de PerformancePoint Services.
La création d’un fournisseur de source de données passe par les deux procédures de base suivantes :
Création et configuration de la classe de fournisseur
Définition de la fonctionnalité de fournisseur
Pour créer un fournisseur personnalisé, commencez par créer la classe de fournisseur.
Pour créer et configurer la classe de fournisseur
Installez PerformancePoint Services ou copiez les DLL que votre extension utilise (répertoriées à l’étape 3) sur votre ordinateur. Pour les instructions à suivre, voir DLL PerformancePoint Services utilisées dans les scénarios de développement.
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#.
Ajoutez les DLL PerformancePoint Services suivantes en tant que références d’assembly au projet :
Microsoft.PerformancePoint.Scorecards.Client.dll
Microsoft.PerformancePoint.Scorecards.DataSourceProviders.Standard.dll
L’exemple de fournisseur de source de données contient également des références d’assembly à System.Core.dll, System.ServiceModel.dll, System.Web.dll, System.Web.Services.dll et System.Xml.Linq.dll. Selon la fonctionnalité de votre extension, d’autres références de projet peuvent être requises.
Ajoutez une référence de service nommée StockQuotes qui référence le service Web situé à l’adresse http://www.webservicex.net/stockquote.asmx. Il s’agit du service Web qui fournit les cotations boursières pour l’exemple de source de données.
Ajoutez les classes BasicTabularDataSourceProvider et SampleDSCacheHandler de l’exemple à votre projet. BasicTabularDataSourceProvider hérite de la classe TabularDataSourceProvider, qui est la classe de base pour les fournisseurs de sources de données tabulaires.
L’exemple de source de données utilise également la classe comme conteneur pour les méthodes abstraites substituées qui ne sont pas implémentées par TabularDataSourceProvider (GetDatabaseNames(), GetCubeNames(), GetCubeNameInfos(), GetCubeMetaData et Validate()).
Dans votre classe de fournisseur, ajoutez des directives using pour les espaces de noms PerformancePoint Services suivants :
Microsoft.PerformancePoint.SDK.Samples.StockQuotes (représente la référence de service StockQuotes créée à l’étape 4)
Selon la fonctionnalité de votre extension, il se peut que d’autres directives using soient requises.
Hériter de la classe BasicTabularDataSourceProvider.
Après avoir créé et configuré la classe de fournisseur, vous devez définir la fonctionnalité de votre fournisseur.
Pour définir la fonctionnalité du fournisseur
Déclarez les variables et définissez les propriétés utilisées pour l’analyse, le stockage et la récupération des symboles boursiers, l’emplacement du fichier cache et l’URI du serveur proxy.
Substituez la propriété IsConnectionStringSecure. Cette propriété n’est pas utilisée par PerformancePoint Services, mais elle est conçue pour être utilisée de manière facultative par les applications personnalisées afin d’identifier si une chaîne de connexion expose des informations pouvant présenter un risque pour la sécurité.
Retournez true si votre extension stocke des informations sensibles, comme un nom d’utilisateur ou un mot de passe, dans la chaîne de connexion pour votre source de données. Retournez false si elle ne stocke pas d’informations sensibles ou si votre source de données n’utilise pas de chaîne de connexion.
Substituez la méthode GetId() pour retourner l’identificateur unique pour votre fournisseur. GetId() doit retourner la même chaîne que l’attribut key qui est inscrit dans le fichier web.config PerformancePoint Services pour le fournisseur de source de données personnalisé.
Substituez la méthode SetDataSource pour définir des mappages de colonnes. SetDataSource appelle la méthode CreateDataColumnMappings pour définir les colonnes de source de données en tant que types Fact, Dimension et TimeDimension.
SetDataSource récupère également les symboles boursiers, l’emplacement du fichier cache et l’adresse du serveur proxy à partir de la propriété CustomData de l’objet source de données personnalisé. Ces valeurs sont définies par les auteurs du tableau de bord dans l’exemple d’éditeur de source de données.
Substituez la méthode GetDataSet() pour créer un objet DataSet afin de stocker les données de la source de données. L’exemple de fournisseur de source de données utilise les méthodes FillResultsTable et GetLiveQuote pour remplir une table de données avec les données d’un service Web.
Étape suivante : après avoir créé un fournisseur de source de données et un éditeur de source de données (y compris son interface utilisateur, le cas échéant), 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
La classe dans l’exemple de code suivant crée un fournisseur de source de données tabulaires qui récupère les cotations boursières d’un service Web externe, puis transforme les données au format tabulaire.
Notes
Avant de 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 de fournisseur.
using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using Microsoft.PerformancePoint.Scorecards;
using Microsoft.PerformancePoint.Scorecards.ServerCommon;
using Microsoft.PerformancePoint.SDK.Samples.StockQuotes;
using System.ServiceModel;
namespace Microsoft.PerformancePoint.SDK.Samples.SampleDataSource
{
// Represents the class that defines the sample data source provider.
// It inherits from the BasicTabularDataSourceProvider class, which
// contains overridden abstract methods that are not implemented.
public class WSTabularDataSourceProvider : BasicTabularDataSourceProvider
{
#region Constants
private const int StockSymbolsIndex = 0;
private const int CacheFileLocationIndex = 1;
private const int ProxyAddressIndex = 2;
#endregion
#region Properties
// This property stores the stock symbols that are used
// to query the Web service.
// Its value is obtained by parsing the CustomData property
// of the data source object.
private string[] StockSymbols
{
get;
set;
}
// The address of the proxy server.
private Uri ProxyAddress
{
get;
set;
}
// This property is not used by PerformancePoint Services.
// Its intended use is for custom applications to indicate
// whether a provider stores sensitive information in the
// connection string, such as user name and password.
// This sample does not, so it returns false.
public override bool IsConnectionStringSecure
{
get { return false; }
}
#endregion
#region Overridden methods
// The source name for your data source. This value must match the key
// attribute that is registered in the web.config file.
public override string GetId()
{
return "WSTabularDataSource";
}
// Add column mappings for the sample columns if they do not exist.
// Column mappings may be missing if the custom data source has never
// been edited or if the workspace was not refreshed, which saves
// changes to the server.
public override void SetDataSource(DataSource dataSource)
{
base.SetDataSource(dataSource);
// Check for symbols stored in the CustomData
// property of the data source.
if (null == dataSource ||
string.IsNullOrEmpty(dataSource.CustomData))
{
// Create a symbol for testing purposes.
StockSymbols = new[] { "MSFT" };
}
else
{
string[] splitCustomData = dataSource.CustomData.Split('&');
if (splitCustomData.Length > 2)
{
StockSymbols = splitCustomData[StockSymbolsIndex].ToUpper().Split(',');
for (int iLoop = 0; iLoop < StockSymbols.Length; iLoop++)
{
StockSymbols[iLoop] = StockSymbols[iLoop].Trim();
}
SampleDSCacheHandler.CacheFileLocation = splitCustomData[CacheFileLocationIndex];
ProxyAddress = new Uri(splitCustomData[ProxyAddressIndex]);
}
}
// Check whether column mappings exist. Do not overwrite them.
if (dataSource.DataTableMapping.ColumnMappings.Count == 0)
{
dataSource.DataTableMapping = CreateDataColumnMappings();
}
}
// Get the data from the data source.
// GetDataSet contains the core logic for the provider.
public override DataSet GetDataSet()
{
// Create a dataset and a data table to store the data.
DataSet resultSet = new DataSet();
DataTable resultTable = resultSet.Tables.Add();
// Define column names and the type of data that they contain.
resultTable.Columns.Add("Symbol", typeof(string));
resultTable.Columns.Add("Value", typeof(float));
resultTable.Columns.Add("P-E Ratio", typeof(float));
resultTable.Columns.Add("Percentage Change", typeof(float));
resultTable.Columns.Add("Date", typeof(DateTime));
FillResultTable(ref resultTable);
return resultSet;
}
#endregion
#region Internal methods
// Fill the data table with the stock quote values from
// the Web service and local cache file.
protected void FillResultTable(ref DataTable resultsTable)
{
// Check the sematic validity of symbols (out of scope for this sample).
if (null != StockSymbols &&
StockSymbols.Length > 0 &&
!string.IsNullOrEmpty(SampleDSCacheHandler.CacheFileLocation))
{
try
{
if (!File.Exists(SampleDSCacheHandler.CacheFileLocation))
{
// Create the cache file.
XDocument doc = SampleDSCacheHandler.DefaultCacheFileContent;
doc.Save(@SampleDSCacheHandler.CacheFileLocation);
}
// Get real-time quotes and update cache file.
string wsResult = GetLiveQuote();
SampleDSCacheHandler.UpdateXMLCacheFile(wsResult);
// Check if a valid cache file location exists.
if (SampleDSCacheHandler.CacheFileContent != null)
{
var query = from c in SampleDSCacheHandler.CacheFileContent.Elements("StockQuotes").Elements("StockQuote")
where StockSymbols.Contains(c.Attribute("Symbol").Value)
select c;
foreach (var stockQuote in query)
{
DataRow row = resultsTable.NewRow();
row["Symbol"] = stockQuote.Attribute("Symbol").Value;
row["Value"] = stockQuote.Element("Value").Value;
row["Percentage Change"] = stockQuote.Element("PercentageChange").Value;
row["Date"] = stockQuote.Element("Date").Value;
decimal peRatio;
// Handle symbols that return 'N/A' for this field.
if (decimal.TryParse(stockQuote.Element("PERatio").Value, out peRatio))
{
row["P-E Ratio"] = peRatio;
}
resultsTable.Rows.Add(row);
}
}
}
catch (Exception ex)
{
ServerUtils.HandleException(ex);
}
}
}
// Get real-time quotes from the Web service.
protected string GetLiveQuote()
{
EndpointAddress endpoint = new EndpointAddress("http://www.webservicex.net/stockquote.asmx");
BasicHttpBinding binding = new BasicHttpBinding();
binding.ReceiveTimeout = new TimeSpan(0, 0, 120);
binding.ProxyAddress = ProxyAddress;
binding.UseDefaultWebProxy = false;
StockQuotes.StockQuoteSoapClient wsStockQuoteService = new StockQuoteSoapClient(binding, endpoint);
// Check the sematic validity of symbols (out of scope for this sample).
if (null != StockSymbols &&
StockSymbols.Length > 0)
{
try
{
string quoteRequest = StockSymbols[0];
for (int iLoop = 1; iLoop < StockSymbols.Length; iLoop++)
{
quoteRequest = string.Format("{0}, {1}", quoteRequest, StockSymbols[iLoop]);
}
string wsResult = wsStockQuoteService.GetQuote(quoteRequest);
return wsResult;
}
catch (Exception ex)
{
ServerUtils.HandleException(ex);
}
}
return string.Empty;
}
// Create the column mappings.
internal static DataTableMapping CreateDataColumnMappings()
{
DataTableMapping dtTableMapping = new DataTableMapping();
// Define the data in the Symbol column as dimension data.
dtTableMapping.ColumnMappings.Add(new DataColumnMapping
{
SourceColumnName = "Symbol",
FriendlyColumnName = "Symbol",
UniqueName = "Symbol",
ColumnType = MappedColumnTypes.Dimension,
FactAggregation = FactAggregations.None,
ColumnDataType = MappedColumnDataTypes.String
});
// Define the data in the Value column as fact data.
dtTableMapping.ColumnMappings.Add(new DataColumnMapping
{
SourceColumnName = "Value",
FriendlyColumnName = "Value",
UniqueName = "Value",
ColumnType = MappedColumnTypes.Fact,
FactAggregation = FactAggregations.Average,
ColumnDataType = MappedColumnDataTypes.Number
});
// Define the data in the P-E Ratio column as fact data.
dtTableMapping.ColumnMappings.Add(new DataColumnMapping
{
SourceColumnName = "P-E Ratio",
FriendlyColumnName = "P-E Ratio",
UniqueName = "P-E Ratio",
ColumnType = MappedColumnTypes.Fact,
FactAggregation = FactAggregations.Average,
ColumnDataType = MappedColumnDataTypes.Number
});
// Define the data in the Percentage Change column as fact data.
dtTableMapping.ColumnMappings.Add(new DataColumnMapping
{
SourceColumnName = "Percentage Change",
FriendlyColumnName = "Percentage Change",
UniqueName = "Percentage Change",
ColumnType = MappedColumnTypes.Fact,
FactAggregation = FactAggregations.Average,
ColumnDataType = MappedColumnDataTypes.Number
});
// Define the Date column as a time dimension.
dtTableMapping.ColumnMappings.Add(new DataColumnMapping
{
SourceColumnName = "Date",
FriendlyColumnName = "Date",
UniqueName = "Date",
ColumnType = MappedColumnTypes.TimeDimension,
FactAggregation = FactAggregations.None,
ColumnDataType = MappedColumnDataTypes.DateTime
});
// Increase the granularity of the time dimension.
dtTableMapping.DateAggregationType |= DateAggregationTypes.Quarter;
dtTableMapping.DateAggregationType |= DateAggregationTypes.Month;
dtTableMapping.DateAggregationType |= DateAggregationTypes.Week;
dtTableMapping.DateAggregationType |= DateAggregationTypes.Day;
return dtTableMapping;
}
#endregion
}
}
Compilation du code
Avant de 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 de fournisseur.
Sécurité
Vous devez signer votre DLL avec 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 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
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