Mots clés
Calendrier
<<  janvier 2012  >>
lumamejevesadi
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345
Altima
 
Gold Partner
anthony, 25 juillet 2011 09:46
Pour compléter l'article de christophe sur la lecture du champ MarshalledData du Basket (http://commerceserver.altima.fr/post/Voir-le-contenu-du-MarshalledData.aspx), voici comment lire le contenu des champs MarshalledData pour les PurchaseOrders et les LineItems, via une application console.
 
Commerce Server utilise le champ MarshalledData pour ajouter de nouvelles propriétés aux PurchaseOrders et LineItems.
Ces propriétés sont sauvegardées par paires de clé / valeur.
 
Si vous utilisez Reflector pour décompiler l'assembly Microsoft.CommerceServer.Runtime (%COMMERCE_SERVER_ROOT%\Assemblies\Microsoft.CommerceServer.Runtime.dll), vous pouvez constater qu'un objet de type WeaklyTypedPropertyDictionnary est utilisé pour stocker ces nouvelles propriétés.
   
 
Ce dictionnaire d'objets WeaklyTypedProperty, hérite de la classe Hashtable.
 
A partir de cette constatation, on peut donc en déduire que le champ MarshalledData sauvegardé en base de données n'est qu'un Hashtable séréalisé.
 
Pour récupérer les clés / valeurs sauvegardées dans un PurchaseOrder, voici quelques lignes de codes :
 

Hashtable marchal = null; using (SqlConnection cnx = new SqlConnection(

ConfigurationManager.ConnectionStrings["Transactions"].ConnectionString)) { using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = cnx; cmd.CommandText = @"SELECT TOP 1 [MarshalledData]

FROM [dbo].[PurchaseOrders]"; cnx.Open(); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { SqlBinary binary = (reader.GetSqlBinary(0)); using (MemoryStream m = new MemoryStream(binary.Value)) { BinaryFormatter formatter = new BinaryFormatter(); marchal = (Hashtable)formatter.Deserialize(m); } } } } } if (marchal == null) { Console.WriteLine("No data found !"); } else { foreach (var key in marchal.Keys) { Console.WriteLine("[{0}] : {1}", key, marchal[key]); } }

 

La ConnectionString utilisée est la chaîne de connexion à la base "Transactions".

Ce qui nous donne le résultat suivant :

   
 
La lecture d'un champ MarshalledData provenant d'un LineItem est identique. Il n'y a que la requête SQL qui varie.
 

Actuellement noté 5.0 par 1 personne(s)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Si lors d'une extension du PurchaseOrder vous obtenez l'erreur suivante :   

 
Cette erreur vient du fait qu'un de vos champs possède une valeur par défaut dans la base de données SQL.
 
Pour trouver plus facilement le champ en question, executez la procédure suivante dans la base "transactions" :
 
exec SP_HELPCONSTRAINT @objname=N'PurchaseOrders',@nomsg=N'nomsg'
 
Cette procèdure vous listera les différentes contraintes d'intégrités de la table "PurchaseOrders".
 
Exemple de retour de la procédure stockée :
 
 
 
Une fois que vous avez trouvé la valeur par défaut, supprimez la et relancez votre site.

Actuellement noté 5.0 par 1 personne(s)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Mathieu, 13 juillet 2011 08:38

Si lors de vos développements, vous êtes amenés à effectuer une suppression de variants massive, voici les étapes à suivre

- 1ère étape : supprimer l'inventaire  associé aux variants

En effet, lors de mes tests, je me suis aperçu qu'à l'appel de la méthode DeleteItems de BaseCatalog, celle-ci ne supprime pas automatiquement l'inventaire associé aux variants et de ce fait, nous sommes dans l'impossibilité de récréer un variant portant le même nom dans CommerceServer.

CommerceServer nous affiche alors une erreur nous indiquant que l'élément a été modifié et nous empêche de le recréer

 -  2ème étape : supprimer la liste des variants

Voici la solution complète :

// construction de l'expression SQL permettant de retrouver la liste complète des variants à partir d'une collection d'objets String 'ChildObjects'

string searchClause, searchInventoryClause;
StringBuilder searchClauseBuilder = new StringBuilder();
ChildIdObjects.ForEach(
    delegate(string childId)
    {
        searchClauseBuilder.AppendFormat("VariantId='{0}' OR ", childId);
    }
);
searchClause = searchClauseBuilder.ToString().TrimEnd(new char[]{' ', 'R', 'O'});
searchInventoryClause = searchClause.Replace("VariantId", InventorySkusDataSetSchema.VariantId); // SkuVariantId

// suppression de l'inventaire
InventoryCatalog inventoryCatalog = CommerceServerContext.CatalogContext.InventoryContext.GetAssociatedInventoryCatalog(CatalogName);
if (inventoryCatalog.GetSkus(searchInventoryClause).Count > 0)
{
    inventoryCatalog.DeleteSkus(searchInventoryClause);
}

// suppression des variants
baseCatalog.DeleteItems(searchClause, CatalogClassTypes.ProductVariantClass);                           
baseCatalog.Save(); 

 

 

 

 

Soyez le premier à noter ce billet

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Nous avions eu besoin de rafrâichir la catalogue CommerceServer de la PREPROD avec celui de la PROD.

Pour cela, nous avions exporté le catalogue de la PROD, ce qui nous a permis de générer un flux XML d'une taille de 270Mo.

 Cependant, lors de l'import de celui-ci dans le catalogue en PREPROD, CommerceServer nous a affiché un message d'erreur suivant :

The import failed because the import file is larger than the maximum size allowed on your server.  Contact your system administrator.

Pour résoudre ce problème, il suffit d'augmenter la valeur "maxUploadFileSize" dans le Web.config du Webservice Catalogue sur votre site :

Voici un exemple :

<catalogWebService siteName="NOM_SITE" authorizationPolicyPath="CatalogAuthorizationStore_Apa.xml" debugLevel="Production" maxChunkSize="1024" maxUploadFileSize="304800" timeOutHours="24" enableInventorySystem="true" disableAuthorization="false" maxSearchResults="500">
            <cache enable="false" schemaTimeout="5" itemInformationCacheTimeout="5" itemHierarchyCacheTimeout="5" itemRelationshipsCacheTimeout="5" itemAssociationsCacheTimeout="5" catalogCollectionCacheTimeout="5"/>
</catalogWebService>

 En effet, par défaut cette valeur est définie par défaut à 200MB.

Actuellement noté 5.0 par 1 personne(s)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Quand on souhaite utiliser le client riche "Commerce Server Customer and Orders Manager", avec toutes les url des web services en http, on rencontre une erreur lors de la configuration qui nous indique qu'on doit utiliser du https pour les web services Orders et Profile.

Deux solutions possibles pour régler ce poblème :

1 - Configurer les deux web service en https (peut être long si vous n'avez pas la main sur les serveurs)
2 - Mettre à jour le fichier de configuration sur la machine où se trouve le client riche.

La deuxième solution a l'avantage d'être rapide et vous permet d'utiliser des url en http.

Voici la démarche à réaliser pour autoriser l'utilisation du http pour Orders et Profile :

- Aller dans le dossier où est installé le client riche "CustomerAndOrdersManager.exe" (exemple "C:\Program Files (x86)\Microsoft Commerce Server 2007\Business User Applications").
- Editer le fichier "CustomerAndOrdersManager.exe.config".
- Quasiment tout en bas du fichier vers la ligne 88 mettre la valeur "True" dans le setting "AllowHTTP".
- Réaliser ensuite la configuration avec les url en http, le client riche accepte désormais la configuration et se lance.

Soyez le premier à noter ce billet

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Pour s'authentifier avec un login à la place d'un email, voici la démarche à suivre (exemple avec un nouveau champ "login") :

Tout d'abords créer un champ Login (voir post sur la création d'un nouveau champ dans le profile de Commerce Server), ou alors utiliser un champ existant, il faut dans ce cas s'assurer que celui-ci est bien unique pour chaque utilisateur dans la configuration de commerce server (voir le même post pour plus de détails).

Mise à jour du web.config :

Mise à jour de de l'attribut userIdKey="GeneralInfo.login" (GeneralInfo.email_address remplacé par GeneralInfo.login)

<profiles>
<userProfile profileDefinition="UserObject" userIdProperty="GeneralInfo.user_id" organizationIdProperty="AccountInfo.org_id" catalogSetIdProperty="AccountInfo.user_catalog_set" userIdSource="ASP.NET" userIdKey="GeneralInfo.login" userIdTarget="GeneralInfo.user_id"/>
<organizationProfile profileDefintion="Organization" organizationIdProperty="GeneralInfo.org_id" catalogSetIdProperty="GeneralInfo.org_catalog_set"/>
</profiles>

Ajout de l'attribut logonNameProperty="GeneralInfo.login" dans le provider "UpmProvider"

<membership defaultProvider="UpmProvider">
<providers>
<add name="UpmProvider" applicationName="/" enablePasswordReset="true" enablePasswordRetrieval="true" maxInvalidPasswordAttempts="10" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" passwordFormat="Clear" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" logonNameProperty="GeneralInfo.login" type="Microsoft.CommerceServer.Runtime.Profiles.UpmMembershipProvider"/>
</providers>
</membership>

L'authentification se fait maintenant avec le champ "Login".

Il reste à vérifier les appels des méthodes Commerce Server pour récupérer un Profile client, il ne faut plus se baser sur le champ mail, mais sur le champ login, le login étant désormais l'identifiant du compte client.

Soyez le premier à noter ce billet

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Voici un exemple qui permet d'utiliser un nouveau champ "Login", en étendant le profile client de Commerce Server.

1 - Manipulation côté BDD :

Dans la BDD "xxx_profiles" table "UserObject", ajouter la colonne "Login" champ de type texte, avec la longueur souhaitée.

2 - Manipulation côté Serveur :

a) Sur le serveur où est installer Commerce Server, lancer le programme "Commerce Server Manager".
b) Dérouler le menu "Commerce Server Manager" > "Global Resources" > "Profiles" > "Profile Catalog" > "Data Sources" > "ProfileService_SQLSource" > "Data Objects".
c) Sélectionner "User Object".
d) Clic Droit sur "User Object", "New Data Member", indiquer un nom, sélectionner dans la liste le champ "Login" que vous avez crée précédemment, indiquer le type "String", Cocher les cases "Required" et "Indexed"
-> Ceci permet d'utiliser le nouveau champ

e) Ensuite remonter dans l'arborescence sur "Profile Catalog", aller dans "Profile Definitions", Sélectionner "User Object"
f) Cliquer sur "General Information" puis sélectionner un champ (la nouvelle propriété sera créé juste en dessous de la valeur sélectionnée)
g) Tout en bas cliquer sur "Add", cocher "Add a new property" puis sur "OK"
h) Dans la zone de droite indiquer un nom (sans espaces et caractères spéciaux),  un nom d'affichage, le type "String"
i) Cliquer sur "Advanced Attributes", cocher Active, Exported et Searchable, dans le champ "Map to Data" sélectionner le champ "Login" (le nom que vous avez donné à l'étape 1 - d).
j) Dans Key type sélectionner "Unique Key"
k) Cliquer sur "Custom attributes", éditer ou créé les champs existant comme par exemple :
     Name "DWMemberName" Value "Login"
     Name "MaxLength" Value "128" (correspondant à la longueur maximal autorisé en BDD)
     Name "MinLength" Value "1" (la longueur minimal souhaitée)
l) Sélectionner un autre item que "User Object", faîte ok sur la fenêtre qui apparaît pour enregistrer les changements.

-> Cette étape permet de mapper la propriété login avec l'objet profile de Commerce Server.


-> Désormais vous avez maintenant un nouveau champ dans l'objet profile de commerce server, pour que cette modification soit effective, veuillez redémarrer les pools d'application de Commerce Server, voir aussi faire un iisreset.
La propriété sera accessible sous la forme "monProfile["Login"].Value"

 

Soyez le premier à noter ce billet

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Nous avons rencontré un bug dans Commerce Server 2007 SP2 impactant les catégories du catalogue virtuel.

Lors du rebuild du catalogue virtuel, l’ordre des catégories (rank) se trouvant à la racine était complément perdu.

Une procédure stockée appelée lors du rebuild est en cause, la procédure [ctlg_AddParentCategoryToCatalogItem]se trouvant dans la base productcatalog.

Code original (environ Ligne 82) :

SET @Query_tmp = N'DELETE FROM '+@CatalogHierarchyTable+N' WHERE oid=-1AND child_oid=@CategoryOid INSERT '+@CatalogHierarchyTable+N'(fVirtualCatalog, CatalogName, oid,child_CatalogName, child_oid)

           Values(@fVirtualCatalog, @BCName_tmp, @ParentCategoryOID_tmp, @BCName,@CategoryOid)'

Modification:

SET @Query_tmp = N'DELETE FROM '+@CatalogHierarchyTable+N' WHERE oid=-1 ANDchild_oid=@CategoryOid AND child_CatalogName = @BCName INSERT '+@CatalogHierarchyTable+N'(fVirtualCatalog,CatalogName, oid, child_CatalogName, child_oid)

            Values(@fVirtualCatalog,@BCName_tmp, @ParentCategoryOID_tmp, @BCName, @CategoryOid)'

Sans la modification, la requête DELETE supprime toutes les catégories se trouvant à la racine du catalogue virtuel et ayant comme child_oid la valeur spécifiée.

Le problème, c’est qu’il n’y a pas de notion de catalogue source.

Cette requête va donc supprimer de la table de hiérarchie, des catégories valides d’autres catalogues (physiques ou du catalogue virtuel). A la fin du rebuild, la catégorie valide supprimée est rajoutée au catalogue virtuel mais nous avons perdu son rank.

En ajoutant la clause « ANDchild_CatalogName = @BCName"»,  la requête DELETE ne supprime donc plus les catégories valides et assure la pérennité de leurs ranks dans le catalogue virtuel J

!! ATTENTION !! Modifier cette procédure stockée de Commerce Server entraine un arrêt du support Microsoft sur votre solution CS. Seul un hotfix contenant ce correctif peut garantir le support de Microsoft.

Actuellement noté 5.0 par 1 personne(s)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Pour faire suite à une discussion sur le forum Commerce Server: How could i sort by property1 ASC and property2 DESC in a catalog search?, je me suis aperçu qu’une fonctionnalité de base de Commerce Server était mal comprise.

En effet, il n’est pas rare sur une liste de produits (ou de catégorie) de vouloir trier le résultat sur plusieurs critères et dans des sens différents tout en gardant la fonctionnalité de paging du CatalogSearch.

Ravi proposait pour solutionner cela d’utiliser un dataview. Le problème est que le dataview ne peut trier que sur le résultat de la recherche! Quid donc si vous avez plusieurs pages? Sans compter les piètres performances d’un dataview.

Pour solutionner cela, il suffit simplement de mettre le nom de votre propriété entre crochet [] puis de coller à la suite l’ordre du tri ex:

CatalogSearch catalogSearch = catalogContext.GetCatalogSearch();
catalogSearch.CatalogNames = "MyCatalog";catalogSearch.SearchOptions.ClassTypes = CatalogClassTypes.ProductFamilyClass;catalogSearch.SearchOptions.PropertiesToReturn = "ProductId, cy_list_price";catalogSearch.CategoriesClause = "CategoryName = 'CatId";catalogSearch.SqlWhereClause = "Display = 'OK'";catalogSearch.SearchOptions.SortProperty = "[ProductId]ASC, [cy_list_price]DESC";

Attention, il est important qu’il n’y ait pas d’espace entre le crochet fermant et l’ordre de tri.

Pour info, notre expert en développement Commerce Server, Anoir, avait déjà écrit un article à ce sujet: Recherche d’un produit avec plusieurs colonnes de tris différenciés sur le blog d’Altima.

Soyez le premier à noter ce billet

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Commerce Server offre dans sa version entreprise une suite analytics basée sur un Data Warehouse made by Commerce Server.

Dans ce post, je vais donc m’atteler à vous expliquer comment paramétrer tout cela et vous donner un aperçu des différents rapports.

Avant de démarrer votre installation, il vous faut avoir configurer et installer:

  • SQL Server Analysis Services (SSAS)
  • SQL Server Reporting Services (SSRS)
  • SQL Server Integration Services (SSIS)

Puis vérifié ces pré requis:

Nous allons donc maintenant “dépuper” le fichier de ressource du Data Warehouse (le fichier se trouve sur %commerce_server_root%\Pup Packages\DW.pup). Cette ressource va créer la base de données qui servira de référentiel pour notre cube.

Attention: si vous installez votre Data Warehouse dans une autre langue que l’anglais vous devez impérativement modifier le fichier %commerce_server_root%\Data\CommerceOlap.xmla à la ligne 9679, en remplaçant le texte “Everyone” par “Tout le monde” pour les francophones.

<Roles>
  <Role>
    <ID>All Users</ID>
    <Name>All Users</Name>
    <Members>
      <Member>
        <Name _loc="locData">EveryoneTout le monde</Name>
      </Member>
    </Members>
  </Role>
</Roles>

Commerce Server - Add Data Warehouse ressourece: Commerce Server Manager Commerce Server - Add Data Warehouse ressourece: Open DW.Pup Commerce Server - Add Data Warehouse ressourece: Select the Data Warehouse ressource Commerce Server - Add Data Warehouse ressourece: Use a new ressource Commerce Server - Add Data Warehouse ressourece: Confirm the parameter Commerce Server - Add Data Warehouse ressourece: rocking ;) Commerce Server - Add Data Warehouse ressourece: give a name to the ressource Commerce Server - Add Data Warehouse ressourece: still rocking Commerce Server - Add Data Warehouse ressourece: yeah Commerce Server - Add Data Warehouse ressourece: confirmation Commerce Server - Add Data Warehouse ressourece: Proof :)

Une fois la structure du Data Warehouse et les cubes mis en place, nous allons installer les rapports. Pour cela, ouvrez le Command Prompt de Commerce Server, et tapez “ReportInstaller.exe”:

Commerce Server - Import de reports: Open the shell Commerce Server - Import de reports: run the program

Sur la boite de dialogue, renseignez les champs et testez les en cliquant sur “Test Connection”. Si tout est ok, cliquez sur “Install Reports”

Commerce Server - Import de reports: set the report Commerce Server - Import de reports: report server Commerce Server - Import de reports: list of reports

Il est maintenant temps de configurer les différentes permissions pour le compte DTSImport pour nos bases de données:

  • MSDB
    • db_datareader, db_dtsadmin, db_dtsltduser , db_dtsoperator
  • <nomDuSiteCommerceServer>_DataWarehouse
    • db_datareader, db_datawriter, db_owner, db_ddladmin
  • <nomDuSiteCommerceServer>_marketing
    • db_datareader
  • <nomDuSiteCommerceServer>_marketing_lists
    • db_datareader
  • <nomDuSiteCommerceServer>_productcatalog
    • db_datareader
  • <nomDuSiteCommerceServer>_profiles
    • db_datareader, Profile_Schema_Reader
  • <nomDuSiteCommerceServer>_transactionconfig
    • db_datareader
  • <nomDuSiteCommerceServer>_transactions
    • db_datareader

Ajoutez ensuite cet utilisateur au groupe administrateur de votre serveur SSIS/SSAS.

Pour terminer l’installation, nous devons importer les DTS à la mode 2000. Pour cela, il nous faut lancer le Data Warehouse Import Wizard. Il n’est pas nécessaire de lancer l’import des données dans ce wizard car il peut-être fais ensuite.

Sauvegardez les donc dans la base de données SQL Server:

Commerce Server - Import dts wizard: Open Commerce Server - Import dts wizard Commerce Server - Import dts wizard: select a Commerce Site Commerce Server - Import dts wizard: Commerce Server - Import dts wizard Commerce Server - Import dts wizard Commerce Server - Import dts wizard Commerce Server - Import dts wizard

Pour ouvrir et exécuter le DTS, rendez-vous dans le serveur SQL: SSMS > Gestion > Existant > DTS

Commerce Server - Import the data Commerce Server - Import the data Commerce Server - Import the data

Dernière étape, la génération des cubes. Pour cela, il suffit d’ouvrir le SQL Server Business Intelligence Development Studio:

image image

Et traiter l’ensemble des cubes et dimensions:

image image image

That’s it’s that’s all! Vous pouvez maintenant contempler vos chefs d’œuvres :)

Commerce Server Report: Product Sales

Commerce Server Report: Customer Sales

Commerce Server Report: Order Events

image

Si vous souhaitez changer la zone horaire ou le jour de démarrage de la semaine dans vos rapports, il suffit de vous rendre dans les propriétés du DW des ressources globales:

Commerce Server Data Warehouse: Set the local time 

Pour aller un peu plus loin, je vous conseille la lecture de ces articles qui vous aideront à bien comprendre le pourquoi/comment de l’analytics made by Commerce Server:

 

Technorati Tags: - - -

Soyez le premier à noter ce billet

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5