Toutoune DevZone

.NET (C#)

octobre 2006 - Messages

Obtenir les promotions d'un produit dans Microsoft Commerce Server 2007

Voici un petit article qui n'intéressera sûrement pas le plus grand nombre...
Etant donné le mal que j'ai eu à rassembler ces informations, je les partage avec vous.

Commerce Server 2007 (et ses précédents) ne prévoit pas de fournir les promotions d'un produit avant que celui-ci ne soit ajouté à un caddie. Voici comment obtenir toutes les promos d'un produit donné sans passer par le panier :

1) Le Web.Config :

Ajoutez ou décommentez la section :

<CommerceServer>
  <caches>
    <cache name="Discounts" type="Discounts" refreshInterval="0" retryInterval="30" />
  </caches>
</CommerceServer>

Le cache loader de base est le composant de pipeline CSFLoadDiscounts. Si vous avez besoin de le changer, modifier l'attribut loaderprogid de l'élément <cache /> qui par défaut est positionné à "Commerce.CSFLoadDiscounts".

<cache loaderprogid="MonLoader" ... />

2) Parcourir les promotions d'un produit spécifique (C#) :

// Chargement des promos depuis le cache
//
"Discounts" est le nom du cache dans le Web.config
DiscountItemCollection allDiscounts =
DiscountItemCollection.CreateFromCache("Discounts");

// Création d'un filtre
DiscountCriteriaFilter filter = new DiscountCriteriaFilter();

// Application du filtre sur les promotions
DiscountItemCollection applicableDiscounts =
allDiscounts.ApplyProductFilter(filter, CatalogName, ProductID);

foreach(DiscountItem item in applicableDiscounts)
{
  // Accéder au propriété de la promotion : comme la valeur de la promo 
  // item["offer_type"] == 1 si promo en montant, 2 si promo en pourcentage
  // item["offer_value"] == valeur de la promotion. Attention si remise en pourcentage, cette valeur est comprise entre 0 et 100.
  // etc...

}

Vous trouverez un tableau récapitulatif des propriétés de l'objet DiscountItem dans la documentation du cache loader :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/CS07Default/html/0bffcd15-24f3-4730-8c67-84a92c7519c6.asp

En espérant que tout ça vous soit autant utile qu'à moi.

Requêtes SQL récursives

Voici une nouvelle fonctionnalité qu'offre Microsoft SQL 2005 et que je viens de découvrir : les requêtes récursives grâce aux  "Common Table Expressions" (CTE).

Ces requêtes permettent de manipuler des hierarchies de données (Parent => Enfants) comme des catégories > sous-catégories > ... > sous-catégories.
La syntaxe est la suivante :

WITH cte_name ( column_name [,...n] )
AS
(

Requête de définition

UNION ALL

Requête récursive

)

Requête utilisant cte_name

La requête de définition reprend les colonnes spécifiées en argument de la CTE et décrit l'élément parent, l'élément de départ de la requête.

La requête récursive permet de définir la manière d'accéder aux enfants. Pour la construire, il suffit de faire référence à la CTE comme s'il sagissait d'une table ou d'une vue. Voici un exemple tiré de la MSDN :

WITH DirectReports (ManagerID, EmployeeID, Title, DeptID, Level)
AS
(
    -- Anchor member definition
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID,
           0 AS Level
      FROM HumanResources.Employee AS e
     INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.EmployeeID = edh.EmployeeID AND edh.EndDate IS NULL
     WHERE ManagerID IS NULL

    UNION ALL

    -- Recursive member definition
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID,
           Level + 1
      FROM HumanResources.Employee AS e
     INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.EmployeeID = edh.EmployeeID AND edh.EndDate IS NULL
     INNER JOIN DirectReports AS d
        ON e.ManagerID = d.EmployeeID
)

-- Statement that executes the CTE
SELECT ManagerID, EmployeeID, Title, Level
  FROM DirectReports
 INNER JOIN HumanResources.Department AS dp
    ON DirectReports.DeptID = dp.DepartmentID
 WHERE dp.GroupName = N'Research and Development' OR Level = 0;
GO

Pour plus de détails, voici la référence dans la MSDN :
Source : http://msdn2.microsoft.com/en-us/library/ms186243.aspx

Posted: oct. 16 2006, 11:20 par Toutoune_31 | avec 5 comment(s)
Classé sous :
Remplacement de chaîne dans un fichier

Actuellement je travaille sur des fichiers XML de 8-10 Mo. Je remplace des chaînes de caractères par-ci par-là. Mon souci est simple, comment faire pour remplacer un bout de texte sans perdre trois jours ?

  • Visual Studio prend des ressources astronomiques et un temps fou à cause de toute la mise en page graphique du fichier XML et de sa gestion du retour à l'état précédent... Autrement dit, remplacer une chaîne selon une expression régulière me laisse à chaque fois le temps de faire une petite sieste et occupe jusqu'à 550 Mo de ma RAM, si j'ai le malheur d'avoir 2 de ces fichiers ouverts.
  • Mon fidèle notepad croule sous la tâche avec un simple remplacement de chaîne.

Du coup, j'ai fait une petite appli en C# (Framework 2.0) qui permet de remplacer du texte en ligne de commande selon une chaîne classique de caractères ou une expression régulière. Sur mes fichiers de 8-10Mo, le résultat est quasi instantanné.

StrReplace.exe ExpressionATrouver Remplacement FichierSource [FichierDestination]

Voici le code :

using System;
using System.IO;
using System.Text.RegularExpressions;

namespace StrReplace
{
    public class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 3)
            {
                Console.WriteLine("\nStrReplace.exe OldExpr NewExpr FileSrc [FileDest]");
                return;
            }


            string oldExpr     = args[0];       // String or RegEx pattern to find
            string newExpr     = args[1];       // Replacement
            string strFileSrc  = args[2];       // Source filename
            string content     = string.Empty;  // Source file content
            string strFileDest = string.Empty;  // Destination filename if different


            // Reading of the Source
            using(StreamReader FileSrc = new StreamReader(strFileSrc))
            {
                content = FileSrc.ReadToEnd();
                FileSrc.Close();
            }


            Regex ex = new Regex(oldExpr);
            content = ex.Replace(content, newExpr);

           
            // Check of the destination file
            if (args.Length > 3)
                strFileDest = args[3];
            else
                strFileDest = strFileSrc;


            // Creation/replacement of the destination file.
            using (StreamWriter FileDest = new StreamWriter(strFileDest))
            {
                FileDest.Write(content);
                FileDest.Close();
            }
        }
    }
}

En espérant que ça vous serve. Si vous avez des commentaires, n'hésitez pas.

Posted: oct. 09 2006, 01:55 par Toutoune_31 | avec no comments
Classé sous :
Google Code Search

Je viens de découvrir le Google Code Search, ça a l'air assez puissant et bien foutu. Le moteur de recherche permet de trouver des exemples de codes dans des fichiers sources publiés sur le net.

http://www.google.com/codesearch

Posted: oct. 05 2006, 11:12 par Toutoune_31 | avec no comments
Classé sous :
Mettre en cache un objet dans le contexte d'une requête HTTP

Voici une snippet Visual Studio 2005 qui permet de mettre en cache un objet dans le contexte d'une requête HTTP. En clair, l'objet est en cache tant que la requête n'a pas finie d'être traitée.

Le fichier PropCache.snippet est à copier dans votre répertoire :
...\Mes documents\Visual Studio 2005\Code Snippets\Visual C#\My Code Snippets

Plus de snippets : http://www.coldwire.net/forums/thread/21489.aspx

Expression régulières ou rationnelles dans Visual Studio 2005

Besoin de changer le format de certaines dates dans un gros fichier xml par exemple ? Vous voulez passer d'un format de date française "jj/mm/aaaa" à un format DateTime déserializable du type "aaaa-mm-jjThh:min:sec".

Ex: "05/03/2006" en "2006-03-05T00:00:00"

Utilisez les expressions régulières ! Attention, dans Visual Studio les habituelles parenthèses pour identifier des segments d'expressions régulières ont été remplacées par des accolades.

Dans Rechercher, saisissez "{[0-9]+}/{[0-9]+}/{[0-9]+}".
Dans Remplacer par, "\3-\2-\1T00:00:00".
Dans Utiliser sélectionnez Expressions régulières.

Pour plus d'infos sur ces expressions régulières : http://msdn2.microsoft.com/fr-fr/library/2k3te2cs.aspx

Posted: oct. 02 2006, 07:20 par Toutoune_31 | avec 1 comment(s)
Classé sous :