De hier geïllustreerde code heeft betrekking op geneste acties. Het laat zien hoe, wanneer een "child"-actie wordt gevalideerd, er automatisch een alias wordt aangemaakt in de SQL bestandsverkenner van de "parent"-actie. Dit maakt het gemakkelijk om alle bestanden van alle "child"-acties te bekijken vanaf de "parent"-actie.
De customizer waarvan de code hieronder wordt getoond, moet worden gekoppeld aan de "child"-actie.
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);
}
}
}
}
}
}
Opmerkingen:
- Als de "parent"-actie is geopend wanneer de "child"-actie wordt opgeslagen, wordt de bestandsverkenner voor de "parent"-actie niet overeenkomstig bijgewerkt.
- Als de "parent"-actie is geopend en wordt gewijzigd, zal het opslaan de effecten van deze customizer annuleren.
- Met het oog op de bovenstaande twee punten, is het aan te raden om de "parent"-actie te sluiten wanneer je een "child"-actie opslaat.
- De ID van de "child"-actie verschijnt in de aliasnaam. Dit lijkt misschien niet erg comfortabel, maar het is de enige manier om de "child"-actie met zekerheid te identificeren, zodat de alias kan worden bijgewerkt, zelfs al het object van de "child"-actie wordt gewijzigd.
- Deze code wordt gebruikt in AfterSave, omdat CommandForFinalTransaction of DuringSave plaatsvinden voordat de SQL-bestanden worden opgeslagen.