Mercator permet de (re)calculer les prix (ou tout autre valeur numérique) selon la nomenclature définie dans les articles liés. Cela se fait via ces méthodes qui sont disponibles dans MercatorUi.Sig.SigStock.
public bool RecomputeNomenclature(string column, int decimals, out int modifiedItems, out string error, string whereClauseOnStock = null, string whereClauseOnArtLiens = null)
public bool RecomputeNomenclature(string[] columns, int decimals, out int modifiedItems, out string error, string whereClauseOnStock = null, string whereClauseOnArtLiens = null)
public void RecomputeNomenclature(Forms.Sig.SigForm sigForm, string column, int decimals, string whereClauseOnArtLiens = null)
public void RecomputeNomenclature(Forms.Sig.SigForm sigForm, string[] columns, int decimals, string whereClauseOnArtLiens = null)
Les deux premières signatures de la méthode sont générales et peuvent être utilisées à tout endroit de Mercator. Les deux autres permettent d'effectuer le recalcul au départ d'une fiche d'un article au sommet de la nomenclature.
Les paramètres sont :
- column : le nom de la colonne de la table STOCK qu'il faut totaliser selon les quantités trouvées dans ARTLIENS. (Exemples : S_DPA, S_PMPA, S_PRIX_REV, ...)
- columns : idem mais possibilité de passer plusieurs noms de colonnes. Par ex. : new string[3] { "S_DPA", "S_PMPA", "S_PRIX_REV" }
- decimals : le nombre de décimales pour les arrondis
- whereClauseOnStock (optionnel) : une clause SQL where valide sur la table STOCK qui permet de déterminer les articles pour lesquels on souhaite effectuer ce calcul.
- whereClauseOnArtLiens (optionnel) : une clause SQL where valide sur la table ARTLIENS qui permet de déterminer les composants à prendre en considération pour le recalcul. Ce paramètre, s'il est présent, doit obligatoirement contenir artliens. (case sensitive) Par exemple, pour prendre uniquement les composants de production :
artliens.prod=1
Si des formules de prix sont associées aux articles modifiés, celles-ci sont automatiquement réappliquées. (Cette réapplication de ces scripts C# étant généralement nécessaire, cela justifie le fait que ce recalcul n'est pas effectué sur la base de données SQL.)
Depuis un bouton dans le signalétique des articles
Il suffit de placer ce code dans un bouton ajouté dans le signalétique des articles.
public static void Exec(MercatorUi.MovableControls.MovableButton clickedButton)
{
// enter your customized code here
MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)clickedButton.Form;
((MercatorUi.Sig.SigStock)sigForm.Sig).RecomputeNomenclature(sigForm, "S_DPA", 2, whereClauseOnArtLiens: "artliens.mycondition = 1");
}
Si le recalcul modifie plusieurs fiches (dans des composants sur des niveaux inférieurs, eux-mêmes composés), alors Mercator proposera le filtrage de ces fiches afin de pouvoir visualiser les modifications apportées.
Notez que ce recalcul se fait toujours au départ d'un article qui est au sommet de la nomenclature, càd qui n'est pas lui-même utilisé comme composant. Si tel n'est pas le cas, Mercator indiquera "Aucun article modifié !".
Depuis tout endroit de Mercator
Ce code permet le recalcul d'une sélection d'articles.
MercatorUi.Sig.SigStock sigStock = MercatorUi.Sig._SigsStatic.SigByModule<MercatorUi.Sig.SigStock>();
if (sigStock.RecomputeNomenclature("S_DPA", 2, out int modifiedItems, out string error, whereClauseOnStock: "s_produitfini = 1", whereClauseOnArtLiens: "artliens.mycondition=1"))
MercatorUi.Dialogs.Stop("Articles modifiés : " + modifiedItems);
else
MercatorUi.Dialogs.Stop(error);
Ce code peut être avantageusement exécuté de façon automatique par une tâche en mode console.
namespace Main
{
public class Customizer
{
public void RecomputeNomenclature()
{
MercatorUi.Sig.SigStock sigStock = MercatorUi.Sig._SigsStatic.SigByModule<MercatorUi.Sig.SigStock>();
if (sigStock.RecomputeNomenclature("S_DPA", 2, out int modifiedItems, out string error, whereClauseOnStock: "s_produitfini = 1", whereClauseOnArtLiens: "artliens.mycondition=1"))
MercatorUi.Globals.MercatorTasksToMain.Log("Articles modifiés : " + modifiedItems);
else
MercatorUi.Globals.MercatorTasksToMain.Log(error, isError: true);
}
}
}
Dans le fichier ini :
Task1 = RecomputeNomenclature