Cette programmation montre comment empêcher la modification et la suppression d'une ligne déjà encodée dans une vente de la gestion commerciale. Ce paramétrage est spécialement destiné à l'environnement "point de ventes" dans lequel les annulations/corrections se font habituellement par l'ajout d'une ligne avec quantité négative. Le code repris ci-dessous effectue ceci :
- dans la grille du LinesEditor, si un article a été saisi, il n'est plus possible de modifier cet article ou de le remettre à blanc. Les autres colonnes restent toutefois éditables.
- lors de la suppression d'une ou plusieurs lignes, cette suppression est remplacée par l'insertion de la même ligne, avec la quantité en négatif.
Cette programmation est un bon point de départ pour réaliser des variantes sur le même thème :
- figer d'autres colonnes,
- n'empêcher le retrait ou la modification que de certains articles,
- ...
Cette version ne tient pas compte de la suppression automatique des articles liés éventuels.
Le code exploite notamment l'événement BeforeDeleteLine du BillingEngine, qui requiert une version 10.2 ou ultérieure de Mercator.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using MercatorApi;
using MercatorUi;
using MercatorExtensions;
using MercatorDatabase;
namespace Billing
{
public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
{
public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
{
billingEngine.BillingFormLoaded += billingEngine_BillingFormLoaded;
billingEngine.BeforeDeleteLine += BillingEngine_BeforeDeleteLine;
}
public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
{
billingEngine.BillingFormLoaded -= billingEngine_BillingFormLoaded;
billingEngine.BeforeDeleteLine -= BillingEngine_BeforeDeleteLine;
}
void billingEngine_BillingFormLoaded(object sender, EventArgs e)
{
MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
if (!billingEngine.ReadOnly)
{
billingEngine.BillingForm.FormClosed += billingEngineBillingForm_FormClosed;
MercatorUi.GridPro.DataGridViewXPro grid = ((MercatorUi.Forms.Billing.BillingObjects.LinesEditor)billingEngine.BillingForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Billing.BillingObjects.LinesEditor))[0]).Grid;
grid.CellEnter += grid_CellEnter;
}
}
void billingEngineBillingForm_FormClosed(object sender, EventArgs e)
{
MercatorUi.Forms.Billing.BillingForm billingForm = (MercatorUi.Forms.Billing.BillingForm)sender;
if (!billingForm.BillingEngine.ReadOnly)
{
billingForm.FormClosed -= billingEngineBillingForm_FormClosed;
MercatorUi.GridPro.DataGridViewXPro grid = ((MercatorUi.Forms.Billing.BillingObjects.LinesEditor)billingForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Billing.BillingObjects.LinesEditor))[0]).Grid;
grid.CellEnter -= grid_CellEnter;
}
}
// EMPÊCHER DE MODIFIER UN ID_ARTICLE DÉJÀ ENCODÉ
void grid_CellEnter(object sender, DataGridViewCellEventArgs e)
{
MercatorUi.GridPro.DataGridViewXPro grid = (MercatorUi.GridPro.DataGridViewXPro)sender;
if ((e.RowIndex > -1) && (e.ColumnIndex > -1) && (grid.Columns[e.ColumnIndex].Name == "id_article"))
grid.Columns[e.ColumnIndex].ReadOnly = (grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value is string) && !string.IsNullOrWhiteSpace(grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
}
// INTERCEPTER LA SUPPRESSION DE LIGNE ET AJOUTER UNE LIGNE NÉGATIVE
void BillingEngine_BeforeDeleteLine(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeDeleteLineEventArgs e)
{
MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
if (e.LignesVRecord.ID_ARTICLE != "")
{
var lv_new = new MercatorDatabase.LIGNES_V(billingEngine.LIGNES.NewRow());
Api.DataRowMerge(lv_new.DataRow, e.DataRow);
lv_new.DL_ID = Api.Ident();
lv_new.QorQ_UNITE = -lv_new.QorQ_UNITE;
int i = Api.DataRowIndexInDataTable(e.DataRow);
if (i == billingEngine.LIGNES.Rows.Count - 1)
billingEngine.LIGNES.Rows.Add(lv_new.DataRow);
else
billingEngine.LIGNES.Rows.InsertAt(lv_new.DataRow, i + 1);
billingEngine.UpdateAmounts();
e.Cancel = true; // empêcher la suppression de la ligne
}
}
}
}
Voir également :
Comment empêcher d'effacer un document de gestion commerciale ?