Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Mise à disposition des données des articles utilisés dans le BillingEngine

0000002928     -      06/11/2019

Depuis la version 10.5 de Mercator, le BillingEngine contient une propriété STOCK (DataTable) qui reprend toutes les informations de tous les articles utilisés dans le document de la gestion commerciale en cours d'édition. Mercator complète cette DataTable au fur et à mesure de la saisie des articles.

Les données de cette DataTable peuvent être aisément consultées via la propriété BillingEngine.StockRecords, qui est une collection de MercatorDatabase.STOCK. Ceci facilite l'usage des syntaxes Linq.

Comme indiqué ci-dessus, les articles sont copiés vers BillingEngine.STOCK pendant chaque BillingEngine.InsertItem. Lors de l'appel d'un article déjà présent dans le document en cours, cet article est mis à jour.

Si a un moment donné, on souhaite rafraîchir toutes les données présentes dans BillingEngine.STOCK, il faut utiliser la méthode BillingEngine.RefreshStock().

Ces nouvelles propriétés remplacent avantageusement :

  • l'ajout d'un champ de même nom (S_...) dans la table LIGNES_V/A. Ce qui présente l'inconvénient de dupliquer de l'information qui n'est jamais rafraîchie. (Mais l'avantage d'avoir l'information au moment de l'appel de l'article - c'est parfois nécessaire)
  • un xLookup vers la table STOCK, qui est toujours pénalisant en termes de programmation client-server.

Exemples de code :

Dans une colonne de LIGNES_V, stocker une concaténation de certaines valeurs de données articles.

Zoom
billingEngine.RefreshStock(); // si nécessaire parce qu'on veut actualiser les données articles
foreach (MercatorDatabase.LIGNES_V lignes_v in billingEngine.LignesVRecords.Where(l => l.ID_ARTICLE != ""))
{
    MercatorDatabase.STOCK stock = billingEngine.StockRecords[lignes_v.ID_ARTICLE];
    lignes_v.CONCAT_CLE1_UNITE = stock.S_CLE1 + " " + stock.S_UNITE + ...;
}

Notez la présence de l'indexeur [string s_id] sur billingEngine.StockRecords (en jaune ci-dessus) qui permet d'obtenir directement l'article sur base de son identifiant.


Un bouton placé dans une BillingForm permet d'afficher le prix de revient total du document en cours.

Zoom
public static void Exec(MercatorUi.MovableControls.MovableButton clickedButton)
{
    MercatorUi.Forms.Billing.BillingForm billingForm = (MercatorUi.Forms.Billing.BillingForm)clickedButton.Form;

    billingForm.BillingEngine.RefreshStock(); // si nécessaire parce qu'on veut actualiser les données articles
    double prixRevTotal = billingForm.BillingEngine.LignesVRecords.Where(l => l.ID_ARTICLE != "")
                                                   .Sum(l => l.Q * billingForm.BillingEngine.StockRecords[l.ID_ARTICLE].S_PRIX_REV);
    Api.Stop(string.Format("Le prix de revient de ce document est {0:### ### ##0.00} EUR.", Math.Round(prixRevTotal, 2)));
}

Dans l'éditeur de rapports, une relation est automatiquement créée : celle-ci installe la DataTable STOCK en tant que table "parent" et la DataTable LIGNES_V/A en tant qu'enfant. En conséquence, il est possible d'utiliser toutes les informations articles, qui seront chaque fois associées correctement à la ligne en cours d'impression.

  


Note : Les champs binaires de la table STOCK sont toujours ignorés. Ceci afin de limiter la consommation de mémoire RAM.