Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Exemple de customizer MercatorPenguin : signalétiques

0000003449     -      13/05/2026

Cette page montre un exemple de customizer pour l'écran de modification d'une fiche de signalétique dans MercatorPenguin. Il s'applique au signalétique des clients. Le code source est fourni dans le zip disponible ci-dessous.

Ce customizer ajoute un bouton (HistoButton) dont le code est inclus dans le projet. Il hérite donc de Microsoft.Maui.Controls.Button. Il permet d'afficher une page d'historique (HistoPage). Le code de cette page HistoPage.xaml est aussi dans le projet. Ce bouton est placé via un override de la méthode OnInit.

Dans le code de HistoButton, on montre comment utiliser la méthode GetRunSqlData pour exécuter une requête SQL au travers de MercatorPenguinServer.

Zoom
var r = await BaseEditCustomizer.GetRunSqlData<HistoDescriptor>("select top 20 type,id,journal,cast(piece as bigint) as piece,date,tot_ttc_dv as tot from PIEDS_V where id_cli=@c_id order by date desc", [new MercatorPenguin.RunSqlDescriptor.Parameter("@c_id", idSig)]);
            

 

Dans le code de HistoPage.xaml.cs, on voit comment utiliser la méthode DoInMercatorInstance qui se met en place de façon identique à celle qui prévaut pour les CustomPages.

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

MercatorPenguin.DoInMercatorInstanceDescriptor doInMercatorInstanceDescriptor = new MercatorPenguin.DoInMercatorInstanceDescriptor
{
    Assembly = "<Other\\TestPenguinCustom\\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);
}

 

Le customizer montre comment effectuer une validation avant la sauvegarde via OnBeforeSave.

Zoom
public override async Task OnBeforeSaveAsync(BeforeSaveEventArgs e)
{
    IEditEntry editEntryNom = Controls.OfType<IEditEntry>().FirstOrDefault(x => x.Source == "c_nom");
    if (editEntryNom == null)
    {
        await Dialogs.Stop(Page, "L'entry associé à C_NOM est introuvable !");
        e.CancelSave = true;
        return;
    }
    IEditEntry editEntryRemise = Controls.OfType<IEditEntry>().FirstOrDefault(x => x.Source == "c_remise");
    if (editEntryRemise == null)
    {
        await Dialogs.Stop(Page, "L'entry associé à C_REMISE est introuvable !");
        e.CancelSave = true;
        return;
    }
    decimal? remise = await Dialogs.AskDecimal(Page, "Confirmez la remise pour ce client ?", 0, editEntryRemise.DecimalValue);
    if (remise == null)
    {
        e.CancelSave = true;
        return;
    }
    editEntryRemise.DecimalValue = remise.Value;

    if (!await Dialogs.AnswerYesNo(Page, $"Voulez-vous vraiment enregistrer les modifications sur le client \"{editEntryNom.Text}\" ?"))
    {
        e.CancelSave = true;
    }
}

 

Il montre aussi comment afficher un message après la sauvegarde.

Zoom
public override async Task OnAfterSaveAsync(AfterSaveEventArgs e)
{
    await Dialogs.Stop(Page, "Le fiche client a été enregistrée avec succès !");
}


A télécharger : 0000003449.zip (4 Kb - 13/05/2026)


Cookies fonctionnels : Cookies nécessaires à l'utilisation du site et cookies de préférence. Ils ne contiennent aucune donnée à caractère personnel. (En savoir plus)

Cookies statistiques : Captation de statistiques liées aux comportements des internautes. (En savoir plus)

Cookies marketing : Pour effectuer le suivi des visiteurs au travers des sites web, à des fins publicitaires. (En savoir plus)