Nous avons donc rajouté notre source vers la table FactInternetSales, ainsi qu'un multicast après celle-ci. La boite multicast a
pour objet de dupliquer les flux.
Dans un premier temps nous allons lui attacher un tri afin de faire une jointure avec les produits liés.
Et passer de :
Au dataflow suivant :
Ajout de la source de données Produit.
La première étape est logiquement le rajout de la source au produit. Quelques commentaires :
Tout comme la source OLE des faits, nous rajoutons dynamiquement un OLEDB source. Nous le lions au même ConnectionManager que la source de faits attendu qu'il
s'agit de la même base de donnée (c'est 'utilité du CM).
La requête de cette source portera sur les produits :
Select * from DimProduct
Je ne reviens pas dans le détail car nous avons dé jà vu comment ajouter une source dans un dataflow.
private void addPdtSource()
{
_pdtDatasource = _mainpipe.ComponentMetaDataCollection.New();
//_oledbDatasource.ComponentClassID =
"DTSAdapter.OleDbSource";
_pdtDatasource.ComponentClassID = "DTSAdapter.OLEDBSource";
// Instanciate an OleDB source Instance
for design time based on OleDB Source
_pdtSourceInstance = _pdtDatasource.Instantiate();
// ProvideComponentProperties acts as a
kind of constructor and build input, output ...
_pdtSourceInstance.ProvideComponentProperties();
// Relink runtime oledb component with the
package connection manager defined before
_pdtDatasource.RuntimeConnectionCollection[0].ConnectionManagerID =
_sourceCM.ID;
_pdtDatasource.RuntimeConnectionCollection[0].ConnectionManager
=
runtime.DtsConvert.GetExtendedInterface(_sourceCM);
/* Each dataflow component has properties
:
*
ms-help://MS.VSCC.v90/MS.VSIPCC.v90/MS.SQLSVR.v10.en/s10is_5techref/html/065a337e-9a0d-4a5e-aa45-87da58fa37c3.htm
* 1 - Common Properties :
*
ms-help://MS.VSCC.v90/MS.VSIPCC.v90/MS.SQLSVR.v10.en/s10is_5techref/html/51973502-5cc6-4125-9fce-e60fa1b7b796.htm
* 2 - Custom Properties for oledb source :
*
ms-help://MS.VSCC.v90/MS.VSIPCC.v90/MS.SQLSVR.v10.en/s10is_5techref/html/1361a37f-d647-416b-bb96-542b5258f38d.htm#oledb
*/
_pdtSourceInstance.SetComponentProperty("AccessMode", 2);
_pdtSourceInstance.SetComponentProperty("SqlCommand", "Select * from DimProduct");
_pdtDatasource.Name = "OLE select
Product";
_pdtDatasource.Description = "OLE select
Product";
_pdtSourceInstance.AcquireConnections(null);
_pdtSourceInstance.ReinitializeMetaData();
_pdtSourceInstance.ReleaseConnections();
}
Ajout des tris :
Petite nouveauté dans notre dataflow, les SORT Component. Nous en ajoutons 2 instances au sein de la méthode AddSort.
private void addSort()
{
//
First sort
_firstSort =
_mainpipe.ComponentMetaDataCollection.New();
_firstSort.ComponentClassID =
"DTSTransform.Sort";
wrapper.CManagedComponentWrapper firstSortInstance = _firstSort.Instantiate();
firstSortInstance.ProvideComponentProperties();
_firstSort.Name = "SRT First Sort";
Tout l'ajout d'une source OLEDB, l'ajout d'un tri se fait par l'ajout d'un ComponentMetadata (par la collection ad hoc).
Ce tri sera alors relatif à la table de fait via le multicast, une fois lié comme suit :
_mainpipe.PathCollection.New().AttachPathAndPropagateNotifications(
_multicast1.OutputCollection[0], _firstSort.InputCollection[0]);
Le fait de rajouter ce lien crée dynamiquement un OutputCollection sur le multicast.
Il faut enfin spécifier sur quelle colonne nous trions notre flux :
wrapper.IDTSVirtualInput100 vInput = _firstSort.InputCollection[0].GetVirtualInput();
wrapper.IDTSVirtualInputColumn100 vColumn = vInput.VirtualInputColumnCollection["ProductKey"];
wrapper.IDTSInputColumn100 col = firstSortInstance.SetUsageType(_firstSort.InputCollection[0].ID, vInput, vColumn.LineageID, wrapper.DTSUsageType.UT_READONLY);
// As sort component has custom properties, Column has also custom properties for
sort
// see
ms-help://MS.VSCC.v90/MS.VSIPCC.v90/MS.SQLSVR.v10.en/s10is_5techref/html/56f5df6a-56f6-43df-bca9-08476a3bd931.htm#sort
firstSortInstance.SetInputColumnProperty(_firstSort.InputCollection[0].ID, col.ID,
"NewSortKeyPosition", 1);
Quelques commentaires sur ce qui précède :
Nous ne pouvons pas accéder directement aux listes de colonnes etc.… Nous le ferons via la Notion de VirtualInput qui donne une vue sur la collection. De même, nous
retrouvons la clef « Productkey » par la collection VirtualInputcollection[object].
Nous faisons cela car nous souhaitons positionner un tri sur cette colonne. Tout comme nous avons vu que les composants avaient des propriétés communes, des
propriétés spécifiques, telles que des propriétés sur les colonnes. Dans notre cas il s'agit de la propriété « NewSortKetPosition », qui va nous permettre d'indiquer que la colonne
pointée par col.ID, sera la première clef de tri.
Pour finir, nous ajoutons dans le corps de cette méthode la création du deuxième sort en relation avec la source créées ci-dessus :
// 2nd sort
_secondSort = _mainpipe.ComponentMetaDataCollection.New();
_secondSort.ComponentClassID = "DTSTransform.Sort";
wrapper.CManagedComponentWrapper
secondSortInstance = _secondSort.Instantiate();
secondSortInstance.ProvideComponentProperties();
_secondSort.Name = "SRT Second
Sort";
_mainpipe.PathCollection.New().AttachPathAndPropagateNotifications(
_pdtDatasource.OutputCollection[0], _secondSort.InputCollection[0]);
wrapper.IDTSVirtualInput100
vInput2 = _secondSort.InputCollection[0].GetVirtualInput();
wrapper.IDTSVirtualInputColumn100
vColumn2 = vInput2.VirtualInputColumnCollection["ProductKey"];
wrapper.IDTSInputColumn100
col2 = secondSortInstance.SetUsageType(_secondSort.InputCollection[0].ID, vInput2, vColumn2.LineageID, wrapper.DTSUsageType.UT_READONLY);
// As sort component has custom properties,
Column has also custom properties for sort
// see
ms-help://MS.VSCC.v90/MS.VSIPCC.v90/MS.SQLSVR.v10.en/s10is_5techref/html/56f5df6a-56f6-43df-bca9-08476a3bd931.htm#sort
secondSortInstance.SetInputColumnProperty(_secondSort.InputCollection[0].ID,
col2.ID, "NewSortKeyPosition", 1);
}
Le tour est complet. Reste à lier les deux flux sortant des tris sur un « Merge Join », dans le prochain post….