Automatisch aanmaken van alias-bestandsmappen van SQL-bestanden in een "parent"-actie

0000003255     -      29-10-2024

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.

Zoom
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.


Functionele cookies: Cookies die nodig zijn voor het gebruik van de website en voorkeurscookies. Ze bevatten geen persoonsgegevens. (Meer informatie)

Analytische cookies: Verzamelen van statistieken met betrekking tot het gedrag van internetgebruikers. (Meer informatie)

Marketingcookies: Om bezoekers op verschillende websites te volgen voor advertentiedoeleinden. (Meer informatie)