Ajouter une colonne venant de la gestion commerciale dans l'écran de saisie des lettrages

0000002222     -      21/02/2014

Ce module permet d'ajouter une colonne dans l'écran des lettrages. Dans cet exemple, la colonne supplémentaire contiendra la valeur de la réduction en pied du document d'origine dans la gestion commerciale (PIEDS_V.RED_GEN_PC). Cette colonne contiendra donc une valeur pour les documents clients créés en comptabilité par le processus de centralisation.

La base de la programmation est un customizer Main et l'évènement BaseFormCreating de l'objet MercatorUi.Globals.Main qui donne la possibilité de prendre la main sur toute fenêtre publique de Mercator Aruba. (Cet évènement s'exécute lors de l'instanciation de la fenêtre.)

La fenêtre des lettrages est du type MercatorUi.Forms.Booking.BookingMatchingForm. Il faut y intercepter ces évènements :

  • Shown : pour ajouter la colonne supplémentaire dans la grille. Ceci ne doit être fait qu'une seule fois. Ce qui est le cas puisque l'évènement Shown d'une fenêtre n'est levé qu'une fois.
  • ReqSqlCreated : pour modifier la requête SQL qui est générée par Mercator chaque fois que l'utilisateur change des critères de sélection dans l'écran. L'eventArgs de cet évènement contient une propriété StringBuilder dont le nom est ReqSql. C'est en manipulant ce stringBuilder qu'il est possible de modifier la requête SQL.
  • FormClosed est uniquement utilisé pour désinscrire tous les évènements et ainsi éviter de maintenir des références ouvertes vers des objets qui ne sont plus utilisés.

attention La modification de requête permet de changer le comportement standard de Mercator. Cette programmation est réalisée sous l'entière responsabilité de celui qui la réalise. Il est absolument déconseillé de modifier la clause where de cette requête. En effet, il serait ainsi par exemple possible d'afficher des écritures comptables du client Y quand on effectue un lettrage pour le client X.

Le code s'établit comme suit :

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorUi;

namespace Main
{
     public class Customizer : MercatorUi.ICustomizers. IExec
    {

         public void Main(MercatorUi.ICustomizers. ExecAction Action)
        {
             if (Action == MercatorUi.ICustomizers. ExecAction .DossierOpen)
            {
                 Globals .Main.BaseFormCreating += new MercatorUi. Main . BaseFormCreatingEventHandler (Main_BaseFormCreating);
            }
             else if (Action == MercatorUi.ICustomizers. ExecAction .DossierClose)
            {
                 Globals .Main.BaseFormCreating -= new MercatorUi. Main . BaseFormCreatingEventHandler (Main_BaseFormCreating);
            }
        }

         void Main_BaseFormCreating( object sender, MercatorUi. Main . BaseFormCreatingEventArgs e)
        {
             if (e.Form is MercatorUi.Forms.Booking. BookingMatchingForm ) // est-on dans la fenêtre des lettrages ?
            {
                MercatorUi.Forms.Booking. BookingMatchingForm bookingMatchingForm = (MercatorUi.Forms.Booking. BookingMatchingForm )e.Form;
                bookingMatchingForm.FormClosed += new System.Windows.Forms. FormClosedEventHandler (bookingMatchingForm_FormClosed);
                bookingMatchingForm.Shown += new EventHandler (bookingMatchingForm_Shown);
                bookingMatchingForm.ReqSqlCreated += new MercatorUi.Forms.Booking. BookingMatchingForm . ReqSqlCreatedHandler (bookingMatchingForm_ReqSqlCreated);
            }
        }

         void bookingMatchingForm_FormClosed( object sender, System.Windows.Forms. FormClosedEventArgs e) // cet évènement sert seulement à désinscrire tous les évènements quand on ferme la fenêtre
        {
            MercatorUi.Forms.Booking. BookingMatchingForm bookingMatchingForm = (MercatorUi.Forms.Booking. BookingMatchingForm )sender;
            bookingMatchingForm.FormClosed -= new System.Windows.Forms. FormClosedEventHandler (bookingMatchingForm_FormClosed);
            bookingMatchingForm.Shown -= new EventHandler (bookingMatchingForm_Shown);
            bookingMatchingForm.ReqSqlCreated -= new MercatorUi.Forms.Booking. BookingMatchingForm . ReqSqlCreatedHandler (bookingMatchingForm_ReqSqlCreated);
        }

         void bookingMatchingForm_Shown( object sender, EventArgs e) // on va ici ajouter la colonne supplémentaire (cet évènement n'est exécuté qu'une seule fois)
        {
            MercatorUi.Forms.Booking. BookingMatchingForm bookingMatchingForm = (MercatorUi.Forms.Booking. BookingMatchingForm )sender;
            bookingMatchingForm.Grid.Columns.Add( "red_gen_pc" , "% Gescom" );
            bookingMatchingForm.Grid.Columns[ "red_gen_pc" ].Width = 60;
            bookingMatchingForm.Grid.Columns[ "red_gen_pc" ].DataPropertyName = "red_gen_pc" ;
            bookingMatchingForm.Grid.Columns[ "red_gen_pc" ].DefaultCellStyle.Alignment = System.Windows.Forms. DataGridViewContentAlignment .MiddleRight;
            bookingMatchingForm.Grid.Columns[ "red_gen_pc" ].DefaultCellStyle.Format = "##0.00" ;
        }

         void bookingMatchingForm_ReqSqlCreated( object sender, MercatorUi.Forms.Booking. BookingMatchingForm . ReqSqlCreatedEventArgs e)
        {
            MercatorUi.Forms.Booking. BookingMatchingForm bookingMatchingForm = (MercatorUi.Forms.Booking. BookingMatchingForm )sender;
             if (bookingMatchingForm.Sig.Module == MercatorUi.Sig. _SigEnum .CLI) // on modifie la requête uniquement si on lettre des clients
            {
                e.ReqSql.Replace( ",cast(0 as bit) as auto_sel" , ",cast(0 as bit) as auto_sel,pieds_v.red_gen_pc" ); // ajouter le champ souhaité dans la table pieds_v
                e.ReqSql.Replace( "inner join pieds_c" , "left join pieds_v on (lignes_c.id_gescom=pieds_v.journal+str(pieds_v.piece,10))    inner join pieds_c" ); // ajouter la jointure sur la table pieds_v
                bookingMatchingForm.Grid.Columns[ "red_gen_pc" ].Visible = true ;
            }
             else
            {
                e.ReqSql.Replace( ",cast(0 as bit) as auto_sel" , ",cast(0 as bit) as auto_sel,0 as red_gen_pc" ); // ajouter quand même le champ puisque la grille l'attend
                bookingMatchingForm.Grid.Columns[ "red_gen_pc" ].Visible = false ;
            }
        }
    }
}