U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Communiceer met de gebruiker tijdens het opslaan

0000003000     -      23-02-2021

Het proces van het opslaan van wijzigbare gegevens (bestanden, CRM-acties, documenten van het Commercieel beheer, inventarissen, tranfers van depots) wordt voornamelijk afgehandeld door MercatorPenguinServer. Hierdoor kunnen customizers worden uitgevoerd die code bevatten om dit opslagproces aan te passen. Gezien deze architectuur is het niet onbelangrijk om tijdens dit proces te communiceren met de gebruiker (die voor zijn mobiele applicatie staat). Dit is echter mogelijk sinds MercatorPenguin 2.9.5.

Voor de bestanden moet dit worden gedaan via specifieke code in het event PenguinServerBeforeValidateData, terwijl dit voor andere wijzigbare gegevens via het event BeforeSave van de overeenkomstige engine zal zijn. Het mechanisme is gebaseerd op een onderbreking van het opslagproces op de server, gelijktijdig met het versturen van een vraag in de mobiele applicatie. Dit mechanisme kan meerdere keren worden gebruikt om meerdere vragen aan de gebruiker te stellen. Elke keer dat de gebruiker een antwoord valideert, wordt het opslagproces automatisch opnieuw gestart om naar de volgende vraag te leiden of naar de definitieve validatie als alle vragen zijn beantwoord.

Elke vraag moet worden genummerd met een uniek nummer. Elk antwoord op de vragen wordt "geaccumuleerd" in e.BeforeSaveAnswers, hetgeen een Dictionnary<int,object> is, waarbij de sleutel het nummer van de vraag is en de waarde de inhoud van het antwoord. De customizer moet daarom een logica implementeren die bepaalt welke vragen zijn beantwoord en die ook de gegeven antwoorden exploiteert. Deze logica moet het feit integreren dat de customizer zo vaak als nodig zal worden aangeroepen, zodat alle vragen aan de gebruiker kunnen worden voorgelegd. (dus n vragen -> n + 1 opslag)

Een vraag wordt gesteld door dit te specificeren in de eventArgs van de gebeurtenis :

e.PenguinQuestion = new MercatorPenguin.Question();

Bij deze vraag moeten minimaal deze eigenschappen ingevuld zijn:

  • Id : nummer van de vraag (zie hierboven)
  • Text : bericht dat aan de gebruiker wordt getoond
  • Type : het type vraag.

De type vragen zijn :

  • YesNo : "Ja / Nee" dialoogvenster. Booleaans resultaat: Ja = Waar / Nee = Onwaar
  • OkCancel : "OK / Annuleren" dialoogvenster. Booleaans resultaat: OK = Waar / Annuleren = Onwaar
  • String : dialoogvenster dat de invoer van een reeks karakters mogelijk maakt (null bij annulering)
    • De standaard waarde kan worden ingesteld in AskStringDefaultText
    • AskStringUpperCase maakt het mogelijk om te bepalen of de invoer alleen in hoofdletters moet zijn of niet
  • Decimal : dialoogvenster waarmee u een getal kunt invoeren (decimaal.MinValue bij annulering)
    • De standaardwaarde kan worden ingesteld in AskDecimalDefaultValue
    • Met AskDecimalDecimals kunt u het gewenste aantal decimalen instellen
  • Date : dialoogvenster waarin u een datum kunt invoeren (DateTime.MinValueDateTime.MinValue bij annulering)
    •  De standaardwaarde kan worden ingesteld in AskDateTimeDefaultValue
  • DateTime : dialoogvenster voor het invoeren van een datum en een tijd (DateTime.MinValueDateTime.MinValue bij annulering)
    • De standaardwaarde kan worden ingesteld in AskDateTimeDefaultValue
  • ListStrings : dialoogvenster met een lijst met tekenreeksen (null indien geannuleerd)
    • De eigenschap AskListStringsItemsSource moet een reeks [] bevatten en is vereist.
    • De eigenschap AskListStringsDefaultValue kan de standaardwaarde bevatten.
  • ListItemStrings : dialoogvenster met een lijst van MercatorPenguin.Question.ItemStrings
    • De eigenschap AskListItemStringsItemsSource moet een MercatorPenguin.Question.ItemString[] bevatten en is vereist. De eigenschap Lib wordt in de lijst weergegeven en de geretourneerde waarde is Id (string).
    • De eigenschap AskListItemStringsDefaultValue kan standaard de id van de ItemString bevatten.
  • ListItemInts: dialoogvenster met een lijst van MercatorPenguin.Question.ItemInts
    • De eigenschap AskListItemIntsItemsSource moet een MercatorPenguin.Question.ItemInt[] bevatten en is vereist. De eigenschap Lib wordt in de lijst weergegeven en de geretourneerde waarde is Id (int).
    • De eigenschap AskListItemIntsDefaultValue kan de id van de standaard ItemInt bevatten.

 

De eigenschap AbortIfCancel wordt gebruikt om te bepalen of een reactie van de gebruiker "Annuleren / Nee" het opslagproces onmiddellijk moet onderbreken zonder MercatorPenguinServer verder te vragen. Deze eigenschap zal over het algemeen True zijn, tenzij de customizer rekening moet houden met zowel "positieve" als "negatieve" reacties.

De onderstaande code laat zien hoe u twee vragen kunt stellen bij het opslaan van een klantenfiche. De eerste vraag heeft de vorm van een "Ja / Nee" dialoogvenster. Bij de tweede vraag kan een tekenreeks worden ingevoerd die door de customizer wordt gebruikt.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
using System.Windows.Forms;

// <CompileWithRoslyn />

namespace SigCli
{
    public class Customizer : MercatorUi.ICustomizers.ISigCreated
    {
        public void SigCreated(MercatorUi.Sig.Sig Sig)
        {
            Sig.PenguinServerBeforeValidateData += Sig_PenguinServerBeforeValidateData;
        }

        void Sig_PenguinServerBeforeValidateData(object sender, MercatorUi.Sig.Sig.PenguinServerBeforeValidateDataEventArgs e)
        {
            if (!e.BeforeSaveAnswers.ContainsKey(1))
            {
                e.PenguinQuestion = new MercatorPenguin.Question
                {
                    Id = 1,
                    Text = "Bevestigen in customizer ?",
                    Type = MercatorPenguin.Question.QuestionTypeEnum.YesNo,
                    AbortIfCancel = true
                };
                return;
            }
            if (!e.BeforeSaveAnswers.ContainsKey(2))
            {
                e.PenguinQuestion = new MercatorPenguin.Question
                {
                    Id = 2,
                    Text = "Naam van contact ?",
                    Type = MercatorPenguin.Question.QuestionTypeEnum.String,
                    AbortIfCancel = true
                };
                return;
            }
            else
            {
                e.Data.AddOrUpdate("C_CONTACT", e.BeforeSaveAnswers[2].ToString());
            }
        }
    }
}

 

Deze tweede code laat zien hoe vergelijkbaar gedrag kan worden geïmplementeerd in een document van het Commercieel beheer (BillingEngine). Hetzelfde proces kan worden geïmplementeerd in een ActionEngine, InventoryEngine of TransferEngine.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;

namespace Billing
{
    public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
    {
        public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.BeforeSave += BillingEngine_BeforeSave;
        }

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine BillingEngine)
        {
            BillingEngine.BeforeSave -= BillingEngine_BeforeSave;
        }

        void BillingEngine_BeforeSave(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeforeSaveEventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            if (MercatorUi.Globals.IsMercatorPenguinServer)
            {
                if (!billingEngine.PenguinBeforeSaveAnswers.ContainsKey(1))
                {
                    e.PenguinQuestion = new MercatorPenguin.Question
                    {
                        Id = 1,
                        Text = "Bevestigen in customizer ?",
                        Type = MercatorPenguin.Question.QuestionTypeEnum.YesNo,
                        AbortIfCancel = true
                    };
                    return;
                }
                if (!billingEngine.PenguinBeforeSaveAnswers.ContainsKey(2))
                {
                    e.PenguinQuestion = new MercatorPenguin.Question
                    {
                        Id = 2,
                        Text = "Vrije string voor note 1 ?",
                        Type = MercatorPenguin.Question.QuestionTypeEnum.String,
                        AskStringDefaultText = billingEngine.PiedsVRecord.NOTE1,
                        AbortIfCancel = true
                    };
                    return;
                }
                else
                {
                    billingEngine.PiedsVRecord.NOTE1 = billingEngine.PenguinBeforeSaveAnswers[2].ToString();
                }
            }
        }
    }
}

 

Dit tweede voorbeeld zal de gebruiker achtereenvolgens deze twee dialoogvensters presenteren :

beforeSaveDialog1_nl      beforeSaveDialog2_nl