Welcome on Business Intelligence Blog !!!
This blog is dedicated to Business Intelligence technologies under SAS9 and SQL Server 2005.
| Novembre 2009 | ||||||||||
| L | M | M | J | V | S | D | ||||
| 1 | ||||||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||||
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | ||||
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | ||||
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | ||||
| 30 | ||||||||||
|
||||||||||
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 :
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();
}
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….