Le code illustré ici se rapporte aux actions imbriquées. Il montre comment, lors de la validation d'une action "enfant", créer automatiquement un alias dans l'explorateur de fichiers SQL de l'action "parent". Cela permet de visualiser facilement tous les fichiers de toutes les actions "enfants" au départ de l'action "parent".
Le customizer dont le code est repris ci-dessous doit être associé à l'action "enfant".
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Windows.Forms;
using MercatorApi;
using MercatorUi;
using MercatorExtensions;
using MercatorDatabase;
// <CompileWithRoslyn />
namespace Action
{
public class Customizer : MercatorUi.ICustomizers.IActionEngineCreated, MercatorUi.ICustomizers.IActionEngineClosed
{
public void ActionEngineCreated(MercatorUi.Engine.Crm.ActionEngine actionEngine)
{
actionEngine.AfterSave += actionEngine_AfterSave;
}
public void ActionEngineClosed(MercatorUi.Engine.Crm.ActionEngine actionEngine)
{
actionEngine.AfterSave -= actionEngine_AfterSave;
}
void actionEngine_AfterSave(object sender, EventArgs e)
{
MercatorUi.Engine.Crm.ActionEngine actionEngine = (MercatorUi.Engine.Crm.ActionEngine)sender;
if ((actionEngine.ActionsRecord.PAR_ID != "") && (actionEngine.ActionsRecord.PAR_MODULE != ""))
{
object ox = Api.ZselectDirect(Globals.RepData, "select id from FILES where (filepath=@filepathchild) and (filename is null)", new MercatorSqlParam("@filepathchild", Api.AddBS(actionEngine.SqlFileViewDefaultDirectory), SqlDbType.Char));
if (ox is Guid id)
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = @"
if not exists(select * from FILES where (filepath = '<Files\Actions\'+@par_module+'\') and (filename is null))
insert into FILES (filepath) values ('<Files\Actions\'+@par_module+'\')
if not exists(select * from FILES where (filepath = '<Files\Actions\'+@par_module+'\'+@par_id+'\') and (filename is null))
insert into FILES (filepath) values ('<Files\Actions\'+@par_module+'\'+@par_id+'\')
if exists(select * from FILES where (filepath = '<Files\Actions\'+@par_module+'\'+@par_id+'\') and (filename like @idchild + '%.sqlfilealias'))
delete from FILES where (filepath = '<Files\Actions\'+@par_module+'\'+@par_id+'\') and (filename like @idchild + '%.sqlfilealias')
insert into FILES (filepath,[filename],filecontent) values ('<Files\Actions\'+@par_module+'\'+@par_id+'\', @idchild + ' - ' + @objetchild + '.sqlfilealias', @id)".UnIndent(7);
cmd.Parameters.AddWithValue("@id", id.ToByteArray()).SqlDbType = SqlDbType.VarBinary;
cmd.Parameters.AddWithValue("@idchild", actionEngine.Id).SqlDbType = SqlDbType.Char;
cmd.Parameters.AddWithValue("@objetchild", actionEngine.ActionsRecord.OBJET).SqlDbType = SqlDbType.Char;
cmd.Parameters.AddWithValue("@par_module", actionEngine.ActionsRecord.PAR_MODULE).SqlDbType = SqlDbType.Char;
cmd.Parameters.AddWithValue("@par_id", actionEngine.ActionsRecord.PAR_ID).SqlDbType = SqlDbType.Char;
Api.SqlExec(Globals.RepData, cmd);
}
}
}
}
}
}
Notes :
- Si l'action "parent" est ouverte lors de la sauvegarde de l'action "enfant", l'explorateur de fichiers de l'action "parent" n'est pas mis à jour en conséquence.
- Si l'action "parent" est ouverte et en cours de modification, la sauvegarde de celle-ci annulera les effets de ce customizer.
- Eu égard aux deux points qui précèdent, il est recommandé de fermer l'action "parent" lors de la sauvegarde d'une action "enfant".
- L'ID de l'action enfant apparaît dans le nom de l'alias. Cela peut sembler peu confortable, mais c'est le seul moyen d'identifier l'action "enfant" de façon certaine, afin de permettre une mise à jour de cet alias, même si l'objet de l'action "enfant" est modifié.
- Ce code intervient en AfterSave, car CommandForFinalTransaction ou DuringSave interviennent avant la sauvegarde des fichiers SQL.