L'objet de cette programmation est de répercuter le prix du fournisseur principal dans un champ de la fiche article. Le système permet donc de détecter les changements dans la grille ArtFou afin de les répercuter immédiatement dans l'interface utilisateur. Elle est réalisée sur base d'un customizer SigStock qui implémente les interfaces suivantes :
et elle exploite l'évènement PrincipalChanged de ArtFou qui permet de lancer un code quand la notion de fournisseur principal est modifiée (case à cocher cochée ou décochée, ainsi que suppression de la ligne du fournisseur principal).
L'exemple est fait ici de façon simple. Il servira de point de départ pour une programmation plus ambitieuse :
- tenir compte des devises
- tenir compte des remises
- transférer d'autres champs données de ArtFou vers la fiche
Pour faire fonctionner cet exemple, il faut ajouter un champ S_PRIX_FOU N(15,5) dans STOCK. Ce champ recevra la valeur de PRIX de ARTFOU.
La programmation décrite ici fonctionne uniquement via le déclenchement d'évènements dans l'interface utilisateur. Dès lors, il peut être utile d'initialiser S_PRIX_FOU pour toutes les fiches. Cela peut se faire via cette requête SQL :
update stock set s_prix_fou=isnull(artfou.prix, 0) from artfou where (stock.s_id=artfou.id_art) and (principal=1)
à exécuter une seule fois.
Le code du customizer s'entend comme suit :
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorUi;
using System.Windows.Forms;
namespace SigStock
{
public class Customizer : MercatorUi.ICustomizers.IFormLoadCustomizer, MercatorUi.ICustomizers.IFormClosedCustomizer
{
public void FormLoadCustomize(System.Windows.Forms.Form WindowsForm)
{
MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)WindowsForm;
if (sigForm.Mode != MercatorUi.Forms.Sig.SigClasses.SigFormMode.Normal) // on n'exécute pas si on est en valeur par défaut, en recherche multicritères, ...
return;
List<Control> l = sigForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Sig.SigGrids.ArtFou));
if (l.Count == 0)
return;
MercatorUi.Forms.Sig.SigGrids.ArtFou artFou = (MercatorUi.Forms.Sig.SigGrids.ArtFou)l[0];
artFou.PrincipalChanged += new MercatorUi.Forms.Sig.SigGrids.ArtFou.PrincipalChangedHandler(artFou_PrincipalChanged);
}
public void FormClosedCustomize(System.Windows.Forms.Form WindowsForm)
{
MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)WindowsForm;
if (sigForm.Mode != MercatorUi.Forms.Sig.SigClasses.SigFormMode.Normal)
return;
List<Control> l = sigForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Sig.SigGrids.ArtFou));
if (l.Count == 0)
return;
MercatorUi.Forms.Sig.SigGrids.ArtFou artFou = (MercatorUi.Forms.Sig.SigGrids.ArtFou)l[0];
artFou.PrincipalChanged -= new MercatorUi.Forms.Sig.SigGrids.ArtFou.PrincipalChangedHandler(artFou_PrincipalChanged);
}
void artFou_PrincipalChanged(object sender, MercatorUi.Forms.Sig.SigGrids.ArtFou.PrincipalChangedEventArgs e)
{
MercatorUi.Forms.Sig.SigGrids.ArtFou artFou = (MercatorUi.Forms.Sig.SigGrids.ArtFou)sender;
MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)artFou.Form;
if (!sigForm.IsFiltring) // s'assurer que la grille n'est pas en mode "Filtrage"
{
if (e.DataRowPrincipal == null) // aucune ligne cochée "Principal"
sigForm.DataSourceRow["S_PRIX_FOU"] = 0;
else
sigForm.DataSourceRow["S_PRIX_FOU"] = e.DataRowPrincipal["prix"];
}
}
}
}