viewermodel.Export() wird nicht fertig

Mr. Smiss Sr.

Neues Mitglied
Hallo allerseits,

wir lösen den Druck von Belegen programmatisch nachträglich mit folgendem Aufruf erneut aus:

C#:
sageBelegDruck.PrintReport(sprache, typ, mandant, countryId, sageDb, sageUser, psPwSage, belId, berichtName, sExportFileName, steuerCodeAusweisen, variante);

//...

public void PrintReport(string pSprache,
                        int pErfassungsart,
                        int pMandantId,
                        int pMandantCountryId,
                        string pDatabaseName,
                        string pUserName,
                        string pSagePassword,
                        int pTan,
                        string pReportName,
                        string pExportPath,
                        string pPrintSc,
                        string pVariante = "")
{
    Log.Info($"PrintReport(Sprache = {pSprache}, Erfassungsart = {pErfassungsart}, Mandant ID = {pMandantId}, "
        + $"Country = {pMandantCountryId}, DB Name = {pDatabaseName}, User =  {pUserName}, BelegID = {pTan}, "
        + $"Report Name = {pReportName}, Export Path = {pExportPath}, Variante = {pVariante}");

    ErrorMessage = string.Empty;
    viewermodel.ReportName = pReportName;

    InsertReportNamedParameterValues(viewermodel.ReportNamedParameters, pMandantCountryId, pTan, pSprache, viewermodel.ReportName, Convert.ToInt16(pErfassungsart), pVariante, false, false, false, 0, false, pPrintSc);

    endpoint = ServerConfigurationProxy.GetSDataHttpsEndpoint(false, 0, 0);

    string endpointComplete = String.Join("/", endpoint.Address, "ol", "ControlCenterData", pDatabaseName + ";" + pMandantId);

    SecureString securePassword = new SecureString();
    pSagePassword.ToList().ForEach(c => securePassword.AppendChar(c));

    viewermodel.OnSendEmail += (s, e) =>
    {
        viewermodel.Export(pExportPath);
    };
    viewermodel.OnError += (s, e) =>
    {
        ErrorMessage = $"Error bei viewermodel.PrintReport: Endpoint: {endpointComplete} " + Environment.NewLine
            + $"Report Name {pReportName}, Report Variante {pVariante}, Tan {pTan}, Mandant Country ID {pMandantCountryId}, Sprache {pSprache}, Erfassungsart {pErfassungsart}:  Fehler: {e.Value}"
            + Environment.NewLine + e.ToString() + Environment.NewLine + e.Value.ToString();
        Exception innerEx = e.Value.InnerException;
        for (int i = 0; i < 100; i++)
        {
            ErrorMessage += Environment.NewLine + innerEx.ToString();
            innerEx = innerEx.InnerException;
            if (innerEx == null) break;
        }
    };
    Log.Info($"Rufe Sage Funktion ViewerModel.PrintReport auf mit key={viewermodel.ReportName}, namedParameters wie oben, language={pSprache}, isInitial=null, trackingId=\"\"");

    // Als ApplicationID muss "Abf" angegeben werden, sonst entsteht der Fehler "Unable to load Report
    viewermodel.PrintReport(endpointComplete, pUserName, securePassword, "Abf", viewermodel.ReportName, viewermodel.ReportNamedParameters, pSprache, null);
}

Bei vielen Systemen & Belegen funktioniert das wunderbar. In einem System dauert es bei bestimmten Belegen scheinbar unendlich lange, sodass wir nach 5 Min. abbrechen.

Hatte jemand schon Mal ein ähnliches Phänomen oder eine Idee?
 
Zuletzt bearbeitet:
Hallo,

du startest den Export in OnSendEmail, da würde ich zuerst ansetzen. Das Event kommt erst, wenn Sage im Druckprozess schon beim „per E-Mail senden" ist; die Anlage ist da längst fertig und steht in e.AttachementFileNames. Ein weiterer Export(pExportPath) auf demselben ViewModel hängt also einen zweiten Export mitten in den laufenden Druckprozess - gut möglich, dass sich dein System genau daran verschluckt.

Wir machen den reinen Datei-Export deshalb über $StandardPrinter als file:-URL vor PrintReport, freigegeben aus OnPrinting (so auch das SDK-Beispiel „Externe Nutzung der Report Engine"):

C#:
var fileUrl = new Uri(pExportPath).AbsoluteUri; // file:///C:/...
viewermodel.ReportNamedParameters.SetParameter("$StandardPrinter", fileUrl);

viewermodel.WaitForPrintCommand = true;
viewermodel.OnPrinting += (s, e) => ((ReportViewerViewModel)s).PrintReport();
// OnSendEmail dann nur noch fürs eigentliche Mailen

Ein Hängen hatten wir damit noch nicht. Falls es bei dir nur bestimmte Belege trifft: einfach das zuletzt erreichte Event mitloggen (OnPrinting, OnSendEmail, OnPrintComplete, OnError), dann siehst du sofort, wo es klemmt.

Beste Grüße
Marcel
 
Zurück
Oben