Gelöst 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
 
Super, vielen vielen Dank, das hat mir sehr weitergeholfen, v.a. auch bei einem anderen Problem.

Da wir pro Beleg eine neue Instanz von ReportViewerViewModel erzeugen kann es eigentlich keinen weiteren Export auf dem selben viewModel geben aber die Umstellung auf OnPrinting war trotzdem hilfreich - auch was die Geschwindigkeit angeht :-).

Wo im SDK-Beispiel ist denn das setzen der file:-URL als $StandardPrinter zu sehen? Ich bin wohl mit Blindheit geschlagen o_O
 
Zurück
Oben