Cette programmation montre comment intervenir sur le processus de sauvegarde d'une écriture comptable en vue de modifier les données sauvegardées dans la base de données. Elle permet simplement de placer dans le champ "référence" le nombre de comptes généraux utilisés dans l'écriture. Ce customizer est fait pour l'exemple et sera le point de départ de programmations plus ambitieuses.
Le code doit être placé dans un customizer Booking créé à partir de la séquence comptable correspondante. Il implémente l'interface suivante : MercatorUi.ICustomizers.ISqlCommandUpdater
Notons que ce customizer ne va pas pouvoir agir par ce moyen sur l'ensemble des requêtes correspondant à la sauvegarde de l'écriture. Il pourra juste modifier la requête effectuant la sauvegarde en tant que telle, çàd celle basculant les tables temporaires SQL vers les tables permanentes :
- #pieds_c_tmp -> pieds_c
- #lignes_c_tmp -> lignes_c
- #lignes_c_ana_tmp -> lignes_c_ana
Dans notre exemple, le code SQL supplémentaire est exécuté avant le script SQL standard. De la sorte, à ce moment, comme les tables permanentes ne contiennent pas encore l'écriture en cours de sauvegarde, il faut intervenir sur les tables temporaires. Notons que les tables temporaires ont la même structure que la table permanente correspondante.
Le code s'établit comme suit :
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using MercatorApi;
using MercatorUi;
namespace Booking
{
public class Customizer : MercatorUi.ICustomizers.ISqlCommandUpdater
{
public void SqlCommandUpdate(System.Data.SqlClient.SqlCommand SqlCommandToModify, System.Windows.Forms.Form WindowsForm)
{
SqlCommandToModify.CommandText = "declare @n integer \r\n"
+ "select @n=count(distinct id_gen) from #lignes_c_tmp \r\n"
+ "update #pieds_c_tmp set reference='Nombre de compte(s) généraux utilisés : '+ltrim(str(@n)) \r\n\r\n"
+ SqlCommandToModify.CommandText;
}
}
}
Remarques :
- Il est vivement déconseillé de mettre à cet endroit du programme des éléments d'interface interagissant avec l'utilisateur (boîte de dialogue, ...) En effet, ce code s'exécute pendant la transaction SQL et sa durée d'exécution doit être dès lors la plus brève possible.
- Il est plus performant d'agir, comme dans cet exemple, en amont de la sauvegarde et dans les tables temporaires, qu'en aval dans les tables permanentes. En effet, par exemple, #pieds_c_tmp ne contient qu'un seul record alors que pieds_c peut en contenir un très grand nombre.