octobre 2006 - Messages
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.
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
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.
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
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
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