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

Taken uitvoeren in Mercator in de consolemodus

0000003239     -      07-08-2024

Mercator 11.0 kan taken uitvoeren in consolemodus. Deze taken kunnen bijvoorbeeld worden geactiveerd door de Windows Taakplanner. Deze uitvoering van Mercator gebeurt zonder enige interface. Er is een loggingsysteem beschikbaar. De logs worden geplaatst in de submap LogFiles van Mercator. Deze map wordt automatisch aangemaakt.

Deze gebruiksmodus van Mercator vereist de installatie van een SSL-certificaat dat de wachtwoorden hieronder genoemd gaat versleutelen.

Om Mercator in consolemodus te starten, moet Mercator.exe een parameter/argument (altijd de eerste) doorgegeven worden die aangeeft waar een ini-bestand te vinden is met de parameters van de taak.

C:\Mercator\Mercator.exe C:\Mercator\MercatorTasks.ini

Een voorbeeld van een ini-bestand is beschikbaar in de onderstaande zip. Dit ini-bestand bevat de volgende parameters:

  • IdDossier : leeg of het id van het dossier in een multi-dossier configuratie.
  • UserLogin : de naam van een Mercator-gebruiker die zal worden gebruikt om Mercator te starten.
  • Password : zijn wachtwoord. Dit zal automatisch worden versleuteld tijdens de eerste uitvoering van de taak.
  • InitReporting : 1 als de rapportgenerator zal worden gebruikt in de taak (bijvoorbeeld voor het genereren van PDF-bestanden), anders 0.
  • SendLog : verstuurt de logs per e-mail aan een of meerdere beheerders aan het einde van de taak
    • 0 : nooit
    • 1 : altijd
    • 2 : alleen in geval van fouten

 

Deze uitvoeringsmodus van Mercator "verbruikt" een gebruikerslicentie gedurende de gehele duur van de taak. Als er geen licentie beschikbaar is, zal een foutmelding worden gegenereerd omdat Mercator dan niet kan starten.

 

Instellingen voor verzenden per e-mail

Als het verzenden van logs per e-mail wordt gebruikt, moeten de verbindingsparameters voor de mailserver worden ingevuld. Voor een klassieke mailserver:

  • SmtpHost : naam van de mailserver.
  • StmpPort : te gebruiken TCP-poort.
  • SmtpSsl : 1 als SSL moet worden ingeschakeld, 0 anders.
  • SmtpLogin : login voor geauthenticeerde verbinding, leeg anders.
  • SmtpPassword : wachtwoord voor een geauthenticeerde verbinding. Dit wordt automatisch versleuteld tijdens de eerste uitvoering van de taak.
  • SmtpSenderMail : e-mailadres van de afzender.
  • SmtpSenderName : naam van de afzender.

Voor verzending via Office365 - Api Graph moeten de parameters ClientId, ClientSecret, Tenant en UserId worden geplaatst in de SQL-tabel free_table_secrets, zoals uitgelegd op deze pagina. Het ini-bestand moet als volgt worden ingevuld:

  • SmtpOffice365Graph : 1
  • SmtpSenderMail : e-mailadres van de afzender
  • SmtpSenderName : naam van de afzender

Daarna, in beide gevallen :

  • SmtpRecipients : e-mailadressen van de ontvangers, gescheiden door ;
  • SmtpCc : e-mailadressen in CC gescheiden door ;

Het is mogelijk om het verzenden van e-mails te testen zonder uitvoering van de taak door testmail als tweede parameter/argument aan Mercator.exe door te geven.

C:\Mercator\Mercator.exe C:\Mercator\MercatorTasks.ini testmail

 

Taakinstellingen

Mercator in consolemodus kan een onbeperkt aantal taken uitvoeren. Elke taak moet overeenkomen met een openbare methode zonder parameters, geplaatst in de Main customizer. Elke methode naam moet in het ini-bestand worden vermeld, op een aparte regel 

  • Task1
  • Task2
  • ...

De nummering van de taken moet beginnen bij 1, oplopend en onafgebroken zijn.

Bijvoorbeeld, als het ini-bestand het volgende bevat 

Task1 = MethodForMercatorTasks1
Task2 = MethodForMercatorTasks2

Dan ziet de Main customizer er als volgt uit:

Zoom
namespace Main
{
    public class Customizer
    {
        public void MethodForMercatorTasks1()
        {
            // taak 1
        }

        public void MethodForMercatorTasks2()
        {
            // taak 2
        }
    }
}

 

Net als bij een klassieke customizer is het mogelijk om een externe DLL te refereren om zijn functionaliteiten te gebruiken.

De C#-code van deze methoden kan MercatorUi.Globals.MercatorTasksToMain gebruiken om:

1. Een optie (bestaand of aangepast) in het ini-bestand te lezen

Zoom
string myValue = MercatorUi.Globals.MercatorTasksToMain.IniFile.IniReadValue("MercatorTasks", "MyOption");

2. Naar het logboek te schrijven

Zoom
MercatorUi.Globals.MercatorTasksToMain.Log("Schrijf naar het logboek!");

Belangrijke opmerking: als de logverzendmodus 2 is (alleen in geval van fouten), is het belangrijk om onderscheid te maken tussen foutlogs en gewone activiteitenlogs. Standaard wordt elke invoer in het log niet als een fout beschouwd. Om dit te veranderen, moet de methode Log de extra parameter isError: true krijgen.

3. Een e-mail te verzenden volgens de in het ini-bestand gedefinieerde parameters

Zoom
IneoSmtp.Smtp mail = MercatorUi.Globals.MercatorTasksToMain.GetNewStmp();
mail.Subject = "Mijn onderwerp";
mail.Message = "Mijn bericht";
if (!mail.SendMail())
    MercatorUi.Globals.MercatorTasksToMain.Log("Fout bij verzenden e-mail: " + mail.Error, isError: true);
else
    MercatorUi.Globals.MercatorTasksToMain.Log("E-mail correct verzonden naar " + mail.Recipient);

4. Een bericht bovenaan het log plaatsen, dat in de e-mail zal worden opgenomen

Zoom
MercatorUi.Globals.MercatorTasksToMain.CurrentLog.Insert(0, "Zie hieronder het log van de Mercator-taak die zojuist is uitgevoerd in consolemodus.\r\n\r\n");

5. Code uitvoeren wanneer alle taken zijn voltooid

Zoom
MercatorUi.Globals.MercatorTasksToMain.AllTasksFinished += (s, e) =>
{
    if (MercatorUi.Globals.MercatorTasksToMain.CurrentLogContainsErrors)
        MercatorUi.Globals.MercatorTasksToMain.CurrentLog.Append("\r\n\r\nWAARSCHUWING: dit logboek bevat fouten!");
};

 

Belangrijke opmerkingen over plannen

Een taak die in de Windows Taakplanner is aangemaakt, moet worden uitgevoerd onder de referenties van een gebruiker die Mercator in "normale" modus (niet console) zonder fouten of beperkingen kan gebruiker.

Het SSL-certificaat moet in de certificatenopslag van deze gebruiker zijn geïnstalleerd.

Het is mogelijk om verschillende taken te maken met bijvoorbeeld verschillende ini-bestanden, of hetzelfde ini-bestand.

Als er meerdere taken zijn, is het belangrijk dat ze niet allemaal op hetzelfde moment beginnen.

Wanneer er meerdere acties moeten worden uitgevoerd, is het aan te raden om ze te groeperen in hetzelfde ini-bestand (Task1, Task2, ...) in plaats van afzonderlijke ini-bestanden te maken en deze taken opeenvolgend uit te voeren. De aanbevolen modus zorgt ervoor dat dezelfde instantie van Mercator wordt gebruikt voor deze verschillende taken.

 


Voorbeeld van een taak: centralisatie in boekhouding van de documenten van de dag

 

public  void PostIntoAccounting()
{
    MercatorUi.Forms.Accounting.AccountingProcedures.Procedures.PostIntoAccountingParams p = new MercatorUi.Forms.Accounting.AccountingProcedures.Procedures.PostIntoAccountingParams(
        DateTime.Today, // date1
        DateTime.Today, // date2
        new string[3] { "VEN", "NCV", "FactF" }, // gecentraliseerde journalen
        true, // postPayments
        true, // performMatching
        "001" // dossier indien meerdere
        );

    MercatorUi.Forms.Accounting.AccountingProcedures.Procedures.PostIntoAccounting(p, true);

    if (!string.IsNullOrEmpty(p.LastError))
        MercatorUi.Globals.MercatorTasksToMain.Log(p.LastError);

    MercatorUi.Globals.MercatorTasksToMain.Log("VERKOPEN & AANKOPEN");
    MercatorUi.Globals.MercatorTasksToMain.Log(p.ResultPostSalesPurchases);
    if (p.LogErrorsPostSalesPurchases != null)
        MercatorUi.Globals.MercatorTasksToMain.Log(p.LogErrorsPostSalesPurchases.ToString(), isError: true);

    MercatorUi.Globals.MercatorTasksToMain.Log("PAIEMENTS");
    MercatorUi.Globals.MercatorTasksToMain.Log(p.ResultPostPayments);
    if (p.LogErrorsPostPayments != null)
        MercatorUi.Globals.MercatorTasksToMain.Log(p.LogErrorsPostPayments.ToString(), isError: true);

    MercatorUi.Globals.MercatorTasksToMain.Log("LETTRAGE");
    MercatorUi.Globals.MercatorTasksToMain.Log(p.ResultMatching, isError: p.ResultMatching != Api.Iif_langue(Globals.Langue, 47));

}

In het ini-bestand:

Task1 = PostIntoAccounting

 


Voorbeeld van een taak: automatische facturering van de leveringen van de dag

 

public void DeliveriesInvoicing()
{
    doDeliveriesInvoicing("1Bliv", "1Fact");
    doDeliveriesInvoicing("2Bliv", "2Fact");
    doDeliveriesInvoicing("3Bliv", "3Fact");
}
private  void doDeliveriesInvoicing(string seqLivr, string seqFactu)
{
    MercatorUi.Globals.MercatorTasksToMain.Log($"Facturering van {seqLivr} naar {seqFactu}");
    DataSet dsSequenc = Api.Zselect(Globals.RepData, "select * from SEQUENC where journal = @seqLivr \r\n"
                                                   + "select * from SEQUENC where journal = @seqFactu",
                                    new MercatorSqlParam("@seqLivr", seqLivr, SqlDbType.Char),
                                    new MercatorSqlParam("@seqFactu", seqFactu, SqlDbType.Char));
    if (dsSequenc == null)
    {
        MercatorUi.Globals.MercatorTasksToMain.Log("Sequenc select : " + Api.LastError, isError: true);
        return;
    }
    if (dsSequenc.Tables[0].Rows.Count == 0)
    {
        MercatorUi.Globals.MercatorTasksToMain.Log($"De sequentie {seqLivr} bestaat niet!", isError: true);
        return;
    }
    if (dsSequenc.Tables[1].Rows.Count == 0)
    {
        MercatorUi.Globals.MercatorTasksToMain.Log($"De sequentie {seqFactu} bestaat niet!", isError: true);
        return;
    }
    MercatorUi.Forms.Gescom.GescomDialogs.GescomAskDeliveriesInvoicing.GescomAskDeliveriesInvoicingRet askRet =
        new MercatorUi.Forms.Gescom.GescomDialogs.GescomAskDeliveriesInvoicing.GescomAskDeliveriesInvoicingRet(
            dsSequenc.Tables[0].Rows[0], // sequencOrig
            dsSequenc.Tables[1].Rows[0], // sequencDest
            ($"(pieds_v.date = '{DateTime.Today.ToString("yyyyMMdd")}')"), // whereClause
            false, // groupLines
            false, // groupCustNoVat
            false, // invoiceAccount
            false, // withQZero
            false, // dateAllLines
            false, // noComment
            -99999);  // minimum
    Api.LastError = "";
    int generatedInvoicesCount = MercatorUi.Forms.Gescom.GescomProcedures.Procedures.DeliveriesInvoicing(MercatorUi.Engine.Gescom.Billing.TypeVAEnum.V, askRet, true);
    if (string.IsNullOrEmpty(Api.LastError))
        MercatorUi.Globals.MercatorTasksToMain.Log($"Document(en) {seqFactu} gegenereerd: {generatedInvoicesCount}.");
   
else
        MercatorUi.Globals.MercatorTasksToMain.Log($"Document(en) {seqFactu} gegenereerd: {generatedInvoicesCount}.\r\n" + Api.LastError, isError: true);
}

In het ini-bestand:

Task1 = DeliveriesInvoicing

 


Voorbeeld van een taak: verzenden van een PDF-rapport per e-mail (Lijst van klanten voor de huidige maand)

 

Zoom
public void SendPdfReport()
{
    List<MercatorSqlParam> lp = new List<MercatorSqlParam>
    {
        new MercatorSqlParam("@DATE_1", new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1)),
        new MercatorSqlParam("@DATE_2", DateTime.Today)
    };

    MercatorUi.Reporting.OutputDescriptorExport outputDescriptorExport = new MercatorUi.Reporting.OutputDescriptorExport(MercatorUi.Reporting.ExportReportEnum.PDF, null, MercatorUi.Reporting.ExportOpenAfterEnum.No) { ExportToBytes = true };

    Api.LastError = "";
    MercatorUi.Reporting.ReportingStatic.RunReportFromDocum("H2ZP118RW1", new List<MercatorUi.Reporting.OutputDescriptor> { outputDescriptorExport }, lp);
    if (outputDescriptorExport.FileContent == null)
    {
        MercatorUi.Globals.MercatorTasksToMain.Log("PDF genereren: " + (!string.IsNullOrEmpty(Api.LastError) ? Api.LastError : "onbekende fout"), isError: true);
    }
    else
    {
        IneoSmtp.Smtp mail = MercatorUi.Globals.MercatorTasksToMain.GetNewStmp();
        mail.Subject = "Klantenlijst";
        mail.Message = "Bijgevoegd is de klantenlijst.";
        mail.BytesAttachments = new Dictionary<string, byte[]> { { "Klantenlijst.pdf", outputDescriptorExport.FileContent } };
        if (!mail.SendMail())
            MercatorUi.Globals.MercatorTasksToMain.Log("Fout bij verzenden e-mail: " + mail.Error, isError: true);
        else
            MercatorUi.Globals.MercatorTasksToMain.Log("E-mail correct verzonden naar " + mail.Recipient);
    }
}

In het ini-bestand:

Task1 = SendPdfReport

 



Te laden : 0000003239.zip (0 Kb - 05-08-2024)