Comment fusionner les données en relation avec deux fiches dans un signalétique ?

0000002424     -      24/08/2016

Mercator permet de fusionner facilement deux fiches dans un signalétique. Ceci concerne tous les signalétiques de Mercator, hormis les comptes généraux, qui dispose déjà de la fonctionnalité de changement de plan comptable, qui doit dès lors être utilisée à cette fin.

Pour effectuer cette fusion, il faut utiliser la méthode MergeCode de la classe MercatorUi.Sig.Sig, qui présente ces différentes signatures :

Zoom
public void MergeCode()

public void MergeCode(string sourceCode)

public void MergeCode(string sourceCode, string targetCode)

public void MergeCode(string sourceCode, string targetCode, Delegates.GenericDelegateString1String stringUpdate)

Les paramètres sont :

  • SourceCode : ID de la fiche qui va être "absorbée" lors de la fusion (et qui va donc être détruite)
  • TargetCode : ID de la fiche qui va "recevoir" les éléments de bases de données en relation en SourceCode.

Si cette méthode est appelée sans que sourceCode et targetCode soient définis, alors une boîte de dialogue permet la saisie de ces valeurs.

Cette méthode prend en compte les particularités de la base de données Mercator dans laquelle elle s'exécute :

  • identification des foreign keys en place, en ce compris pour des relations avec des tables ajoutées
  • prise en compte des champs optionnels, des liaisons croisées entre signalétiques, des liaisons de pieds de documents vers les signalétiques, ...

Elle prend aussi en charge le transfert des fichiers tant "disque" que SQL. 

La requête SQL est modifiable via un StringUpdate dans le customizer de ce signalétique, sur cette requête, dont l'ID est MERGECODE_XXX, où XXX est le signalétique concerné (CLI, FOU, STOCK, ...)

Afin de rassembler le code, à la fois l'appel de MergeCode et la modification de requête, il est possible de passer un délégué comme dans l'exemple repris ci-dessous (bouton dans la fiche client) :

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorController;
using System.Windows.Forms;

namespace MercatorUi.MovableControls.ButtonsCodes
{
    public static class Script
    {

        public static void Exec(MercatorUi.MovableControls.MovableButton clickedButton)
        {
            // enter your customized code here
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)clickedButton.Form;
            string c_id = sigForm.DataSourceRow["c_id"].ToString().Trim();
            if (c_id == "") // nouvelle fiche non encore sauvegardée
                return;

            string c_id2 = Dialogs.AskTargetSig("Fusionner avec quel client ?", Sig._SigEnum.CLI);
            if (string.IsNullOrEmpty(c_id2))
                return;

            if (!MercatorUi.Dialogs.AnswerYesNo(string.Format("Réellement fusionner les clients \"{0}\" et \"{1}\" ? La fiche de \"{1}\" sera définitivement détruite.", c_id, c_id2)))
                return;

            sigForm.Sig.MergeCode(c_id2, c_id, new Delegates.GenericDelegateString1String(stringUpdate));
        }

        private static string stringUpdate(string reqSql)
        {
            return reqSql + "\r\n\r\n"
                          + "update table_perso_sans_fk set id_cli=@new_code where id_cli=@old_code";
        }
    }
}