L'EditAddLineButton de MercatorPenguin contient cette propriété optionnelle : DataUpdaters. Elle est disponible dans ce bouton placé dans le code XAML :
- des ventes avec lignes,
- des achats avec lignes,
- des inventaires,
- des transferts de dépôts,
- des pickings.
Un DataUpdater permet de déterminer une expression qui va forcer une valeur calculée en aval du code standard exécuté quand on clique sur ce bouton. Il est possible de mettre un nombre illimité de DataUpdaters dans cette propriété.
<m:EditAddLineButton AutoFocusEntry="LINE|ID_ARTICLE">
<m:EditAddLineButton.DataUpdaters>
<x:Array Type="{x:Type m:DataUpdater}">
<m:DataUpdater Source="Q" Expression="iif(q_carton=0,q,q*q_carton)" RoundDecimals="2" />
<m:DataUpdater Source="S_CLE1" Expression="S_CLE1+'*'" />
</x:Array>
</m:EditAddLineButton.DataUpdaters>
</m:EditAddLineButton>
Chaque ligne de DataUpdater doit reprendre ces propriétés obligatoires :
- Source : le nom de la colonne à modifier.
- Expression : la formule à calculer, sous la forme d'une expression de DataColumn calculée valide.
S'ajoutent ces propriétés optionnelles :
- RoundDecimals : pour forcer un arrondi sur un nombre de décimales. Elle s'applique uniquement aux valeurs numériques.
- LinkedItemsMode : propriété prise en compte uniquement pour les ventes et les achats. Elle permet de déterminer si le DataUpdater s'applique sur les articles liés :
- All : valeur par défaut.
- ParentsOnly : seulement sur les articles parents
- ChildrenOnly : seulement sur les articles enfants
La DataRow passée au DataUpdater correspond à celle des lignes qui a été populée lors de la recherche de l'article. Si on souhaite utiliser des données en dehors de cette DataRow mais présentes à l'écran, par exemple dans un EditEntry ou un EditPicker, il faut alors référencer sa source encadrée par le caractère $. Par exemple
Expression = q * $var1$
si un EditEntry à sa source définie sur "VAR1".
Note : la compilation et l'exécution de code compilé est impossible dans les appareils mobiles. Il n'y aura donc jamais de prise en charge complète du langage C# ou d'un autre langage compilé à cet endroit de MercatorPenguin.
Cette page donne quelques indications concernant les syntaxes possibles.
Application métier
Certains articles sont conditionnés en cartons contenant plusieurs fois le même produit, mais ce produit est stocké à la pièce. Dès lors, durant le picking, lorsqu'on scanne n cartons, la quantité effectivement prise en compte doit être n x la quantité dans un carton.
Pour mettre en place cela, la colonne Q_CARTON a été ajoutée à la LIGNES_V.
alter table LIGNES_V add Q_CARTON smallint not null default 0
Dans le customizer BillingVente associé à la séquence de destination du picking, on complète le cas échéant LIGNES_V.Q_CARTON avec la valeur souhaitée. Cette valeur peut provenir d'un décodage de code-barres ou d'un événement AfterInsertItem.
void billingEngine_AfterInsertItem(object sender, MercatorUi.Engine.Gescom.BillingEngine.AfterInsertItemEventArgs e)
{
if (MercatorUi.Globals.IsMercatorPenguinServer)
{
if (...)
e.DataRowLignes["q_carton"] = ...;
}
}
L'expression suivante permet de multiplier la quantité encodée dans MercatorPenguin par la quantité dans un carton, uniquement si cette dernière valeur est définie :
<m:DataUpdater Source="Q" Expression="iif(q_carton=0,q,q*q_carton)" RoundDecimals="2" />