Uitvoeren van aangepaste code in de Mercator-omgeving vanuit een CustomPage

0000003243     -      16-10-2024

Het is mogelijk om aangepaste code uit te voeren in de Mercator-omgeving via MercatorPenguinServer vanuit een CustomPage. Dit gebeurt door middel van een assembly die aangepaste programmering bevat. Net als bij de CustomPages gaat het hier om 100% op maat gemaakte programmering, uitgevoerd in een zelfstandig project in Visual Studio.

1. Voorbereiding van het project

De code moet worden geplaatst in een klassebibliotheek (class library), maar gericht op het Windows-platform. Dit komt omdat de Mercator ERP-instantie die werkt in MercatorPenguinServer een applicatie is voor dat platform. (De hier ontwikkelde code is dus niet direct gerelateerd aan MAUI).

Conventioneel wordt dit nieuwe project

  • toegevoegd aan de oplossing die de bijhorende CustomPage bevat,
  • genoemd met dezelfde naam, gevolgd door de Server.

In het project vinden we het volgende:

  <PropertyGroup>
    <TargetFramework>net8.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

Dit project ten minste verwijzen naar MercatorTunnel.dll en MercatorUi.dll van de Mercator gelinkt via MercatorPenguinServer. (Dus de Windows versies van deze assemblies, niet de Android of iOS versies).

  <ItemGroup>
    <Reference Include="MercatorTunnel">
      <HintPath>C:\...\MercatorTunnel.dll</HintPath>
    </Reference>
    <Reference Include="MercatorUi">
      <HintPath>C:\...\MercatorUi.dll</HintPath>
    </Reference>
  </ItemGroup>

2. Creatie van aangepaste code

De klassenbibliotheek moet een publieke klasse bevatten met een publieke methode die een parameter van het type string accepteert en een resultaat van het type string retourneert. De naam van deze methode is vrij te kiezen.

Het string-type is gekozen voor de communicatie met de CustomPage van MercatorPenguin omdat het een json-representatie van een object kan bevatten.

Het is belangrijk om te begrijpen dat deze code zal draaien binnen de Mercator-instantie die wordt gehost door MercatorPenguinServer. Daarom zijn alle gebruikelijke tools beschikbaar, zoals verbinding met de SQL-server en toegang tot statische eigenschappen van MercatorUi.Globals, etc. De programmeerstijl is dus vergelijkbaar met die voor het schrijven van customizers die direct in Mercator draaien.


3. Beschikbaar maken van de assembly voor MercatorPenguinServer 

De compilatie van het bovengenoemde project zal een DLL produceren. Conventioneel wordt deze DLL geplaatst in SQL Bestanden > Anderen, in een submap Server binnen de map die overeenkomt met de CustomPage. (Deze DLL moet niet worden geplaatst in SQL Bestanden > Assemblies, omdat het geen assembly is die in de hoofdmap van Mercator ERP moet worden gedistribueerd).


4. Aanroepen van de methode vermeld in punt 2 vanuit de CustomPage

We illustreren dit punt met twee klassen die respectievelijk worden gebruikt voor de parameter die wordt verzonden en het resultaat dat wordt ontvangen. Deze klassen zijn aangepast aan de functionele vereisten van de aangeroepen methode.

Zoom
public class DoInMercatorInstanceRequest
{
    public Int16 Type { get; set; }
    public string Id { get; set; }
    public string Journal { get; set; }
    public Int64 Piece { get; set; }
}

public class DoInMercatorInstanceResponse
{
    public string Result { get; set; }
    public string Error { get; set; }
}

 

De code van de CustomPage die communiceert met de aangepaste methode in MercatorPenguinServer komt overeen met de gemarkeerde regel:

Zoom
private bool isDoInMercatorInstanceBusy = false;

private async void Button_Clicked(object sender, EventArgs e)
{
    if (isDoInMercatorInstanceBusy)
        return;

    Button button = (Button)sender;
    HistoDescriptor histoDescriptor = (HistoDescriptor)button.CommandParameter;
    button.IsEnabled = false;
    isDoInMercatorInstanceBusy = true;

    DoInMercatorInstanceRequest doInMercatorInstanceRequest = new DoInMercatorInstanceRequest
    {
        Type = histoDescriptor.Type,
        Id = histoDescriptor.Id,
        Journal = histoDescriptor.Journal,
        Piece = histoDescriptor.Piece
    };

    MercatorPenguin.DoInMercatorInstanceDescriptor doInMercatorInstanceDescriptor = new MercatorPenguin.DoInMercatorInstanceDescriptor
    {
        Assembly = "<Other\\TestPenguinCustomServer\\Server\\TestPenguinCustomServer.dll",
        ClassName = "TestPenguinCustomServer.TestClass",
        MethodName = "DoubleQuantities",
        Parameter = Api.JsonConvertSerializeObject(doInMercatorInstanceRequest)
    };

    activityIndicator.SetActive(true);
    var r = await MercatorPenguin.BaseCustomPage.DoInMercatorInstance(doInMercatorInstanceDescriptor);
    activityIndicator.SetActive(false);
    if (r.Error != null)
    {
        _ = MercatorPenguin.Dialogs.Stop(this, r.Error);
    }
    else
    {
        DoInMercatorInstanceResponse doInMercatorInstanceResponse = Api.JsonConvertDeserializeObject<DoInMercatorInstanceResponse>(r.Result);
        if (doInMercatorInstanceResponse.Error != null)
            _ = MercatorPenguin.Dialogs.Stop(this, doInMercatorInstanceResponse.Error);
        else
            _ = MercatorPenguin.Dialogs.Stop(this, doInMercatorInstanceResponse.Result);
    }

    button.IsEnabled = true;
    isDoInMercatorInstanceBusy = false;
}

 

In de DoInMercatorInstanceDescriptor herkennen we de volgende parameters:

  • het volledige SQL-pad naar de assembly,
  • de volledige naam van de klasse, in de vorm van namespace, gevolgd door een punt en vervolgens de naam van de klasse,
  • de naam van de methode,
  • de string-parameter die naar deze methode wordt doorgegeven. Dit komt overeen met de json-representatie van het object doInMercatorInstanceRequest.

 

Het project in de zip op deze pagina bevat een compileerbaar voorbeeld van bovenstaande illustratie.



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)