Wie kann ich einen Bericht über C# öffnen?

devin

Neues Mitglied
Guten Tag,

ich habe im AppDesigner eine Lösung in welcher ich ein Bericht angelegt habe, wie ist es möglich einen bericht:


1684166638080.png

von c# aus zu öffnen?

versucht habe ich es bisher mit dem using:
Code:
using Stimulsoft.Report;

und dann so die xml datei von dem bericht zu laden und dann zu drucken:

Code:
StiReport report = new StiReport();
report.Load(@"path\zum\bericht.xml");
report.Print(true);

jedoch druckt er damit nur einen leeren bericht
 
Zuletzt bearbeitet:
Guten Tag,

was genau meinen Sie denn mit „Bericht öffnen“? Sie haben die Möglichkeit den Bericht als PDF zu speichern, meinen Sie das?

Im SDK findet sich ein Beispiel „Externe Nutzung der Report Engine“ in C#.

Beste Grüße
Marcel @ web2perform
 
Hallo @devin,

so einfach geht das leider nicht. Wie @web2perform schon mitgeteilt hat, dafür wird die Report Engine (ReportViewerViewModel) benötigt, außer es wird mit dem DMS gearbeitet und der Beleg wurde schon irgendwann einmal gedruckt und muss zum Öffnen nur lokalisiert werden.

Schauen Sie sich am besten das Beispiel Kapitel_11_ReportingEngineExt im SDK an. Wenn Sie zum Beispiel fragen haben, gerne melden.
Das gesamte Beispiel zu erläutern, würde den Umfang innerhalb dieses Forums aus meiner Sicht sprengen.

Innerhalb der Initialisierung der TaskFactory geben Sie dann für die Methode PrintReport des ReportViewerViewModel den ReportName als Key mit.
Also in Ihrem Falle:

Code:
reportViewerViewModel.ReportName = "rptArtikel";


Beste Grüße Rouven
 
Hallo @R.Ziemer,

ich habe mir mal das Kapitel 11 angeschaut und habe diesen code zu nutze gemacht:
C#:
var vm = CreateViewModel();

            try
            {
                if (vm == null) return;


                vm.ReportName = "rptArtikel";
                vm.WaitForPrintCommand = true; //Bei Druck und Export immer true!

                // <summary>
                // Druckt einen Bericht
                // </summary>
                // <param name="endpoint">Endpunktdes Applikations-Servers</param>
                // <param name="user">Benutzer</param>
                // <param name="password">Kennwort</param>
                // <param name="applicationId">Applikation-Token: Abf, Rewe, AppDesigner</param>
                // <param name="key">Name des Berichts mit Partnerkennung und Lösung</param>
                // <param name="namedParameters">Parameter zur Ausführung des Berichts</param>
                // <param name="language">Strache für fremdsprachige Office Line, nicht Kunden/Lieferanten spezifische Sprache</param>
                // <param name="isAsync">true = "Der Berichtsdruck erfolgt asynchron"</param>
                // <param name="isInitial">true = initialer Aufruf, für externe Aufrufe immer null</param>
                // <param name="trackingId">Tracking-Id zur Nachverfolgung, für externe Aufrufe immer leer. Bei leer wird sie automatisch vergeben.</param>
                //vm.PrintReport(_endpoint, Properties.Settings.Default.UserName, Global.SecurePassword,
                //                Properties.Settings.Default.ApplicationId, vm.ReportName, vm.ReportNamedParameters,
                //                Properties.Settings.Default.Language, true, true, string.Empty);
                //Alternativ:
                
                var factory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);
                factory.StartNew(() => vm.PrintReport(_endpoint, Properties.Settings.Default.UserName, Global.SecurePassword,
                                Properties.Settings.Default.ApplicationId, vm.ReportName, vm.ReportNamedParameters,
                                Properties.Settings.Default.Language, true, true, string.Empty));
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

jedoch frage ich mich ob das der richtige ansatz ist und wie ich hier:
C#:
    factory.StartNew(() => vm.PrintReport(_endpoint, Properties.Settings.Default.UserName, Global.SecurePassword,

                                Properties.Settings.Default.ApplicationId, vm.ReportName, vm.ReportNamedParameters,

                                Properties.Settings.Default.Language, true, true, string.Empty));

_endpoint,Properties.Settings.Default.UserName, Global.SecurePassword,
Properties.Settings.Default.ApplicationId und Properties.Settings.Default.Language, definieren muss
 
Hallo @devin,

ob es der richtige Ansatz ist, kann ich anhand der mir vorliegenden Informationen über die Anforderungen des Kunden nicht beurteilen.
Das Beispiel im SDK veranschaulicht ledig nur sehr gut, wie man EXTERN Zugriff auf die Report Engine der Sage100 erlangen kann.
im Prinzip das man von c# aus per button click z.B den Bericht direkt drucken kann.
Wenn der Zugriff aus einer abgeleiteten Klasse wie zum Beispiel MacroProcessBase, AppLibaryCall etc. stattfindet, ist es natürlich deutlich einfacher, weil ja bereits auf ein Zugriffsobjekt im Sage 100 Kontext zurückgegriffen werden kann.

Bleiben wir vorerst bei unserem Externen Beispiel aus Kapitel 11:
_endpoint,Properties.Settings.Default.UserName, Global.SecurePassword,
Properties.Settings.Default.ApplicationId und Properties.Settings.Default.Language, definieren muss
Hier wird lediglich auf die global gesetzten Eigenschaften und Properties zurückgegriffen. Einfach mal im Projektexplorer auf Settings klicken, dann solltest du nicht mehr im dunkeln tappen was sich dahinter verbirgt.

1684244394856.png

factory.StartNew(() => vm.PrintReport(_endpoint, Properties.Settings.Default.UserName, Global.SecurePassword,

Properties.Settings.Default.ApplicationId, vm.ReportName, vm.ReportNamedParameters,

Properties.Settings.Default.Language, true, true, string.Empty));
Noch einmal eine kurze Erklärung hierzu: Wie du schon erkennen kannst, wird hier ein SData Endpunkt angesprochen, den du auch genauso gut in Java Skript etc. ansprechen könntest. Es wird der Endpunkt, Anmeldeinformationen, Reportname, Reportparameter und Einstellungen für den Druck übergeben. Im genaueren wird über ServerConfigurationProxy.GetSDataHttpsEndpoint der ControlCenterData Endpunkt angesprochen.

Eventuell hast du ja einen Kollegen, der dich intensiver in die c# Entwicklung einführen und dir die Zusammenhänge zu den zur Verfügung stehenden Klassen von Sage verdeutlichen kann. Alternativ bietet Sage auch im Developer Bereich C# Crash Kurse an oder man bedient sich einer der vielen Möglichkeiten im WWW. Viel Erfolg !

Beste Grüße Rouven
 
Zuletzt bearbeitet:
Hallo,

ich möchte das Thema nochmal aufgreifen, da ich gerade hier auch ein Problem habe...

Ich möchte gerne eine Auftragsbestätigung drucken, die im Code vorher gerade erst erzeugt wurde. Mit dem Druck möchte ich sicherstellen, dass das Dokument auch im DMS landet, der Drucker selbt hat den Anschluss 'nul:'.

Ich habe mich an dem Beispiel aus der SDK gehalten und kann mit ViewModel.OpenReport(...) den Beleg anzeigen lassen. Rufe ich jedoch PrintReport() aus, löst das ViewModel.OnPrinting-Event auch aus, jedoch warte ich vergeblich auf einen tatsächlichen Druck! Schließe ich nun meine Wpf-Anwendung wieder, erhalte ich im TraceLog-Manager noch folgende Info:1695642229527.png

Habe mich strikt an das Sample-Project gehalten, auch sind alle NamedParameters gesetzt wie im Beispiel!
C#:
IEndpoint _endpoint;
string _endpointComplete;
_endpoint = ServerConfigurationProxy.GetSDataHttpsEndpoint(false, 0, 0);
_endpointComplete = String.Join("/", _endpoint.Address, "ol", "ControlCenterData", "OLReweAbf;1");

var ViewModel = new Sagede.Shared.ReportViewerControl.ReportViewerViewModel();

ViewModel.ReportNamedParameters = LoadNamedParameters();

ViewModel.ReportName = "rptVKRechnung.Sage.Wawi";
ViewModel.WaitForPrintCommand = true;

ViewModel.OnClose += (s, e) => Output.Text+=("Close");
ViewModel.OnError += (s, e) => Output.Text += ("Error");
ViewModel.OnInitialized += (s, e) => Output.Text += ("Init");
ViewModel.OnPreviewAvailable += (s, e) => Output.Text += ("Preview");
ViewModel.OnPrinting += (s, e) => Output.Text += ("PrintStart");
ViewModel.OnPrintComplete += (s, e) => Output.Text += ("PrintEnd");
ViewModel.OnSendDms += (s, e) => Output.Text += ("DMS");
ViewModel.OnSendEmail += (s, e) => Output.Text += ("Email");
ViewModel.OnViewComplete += (s, e) => Output.Text += ("Complete");

System.Security.SecureString pw = new System.Security.SecureString();
pw.AppendChar('P');
pw.AppendChar('a');
pw.AppendChar('s');
pw.AppendChar('s');
pw.AppendChar('w');
pw.AppendChar('o');
pw.AppendChar('r');
pw.AppendChar('t');

ViewModel.PrintReport(_endpointComplete, "sa", pw, "Abf", "rptVKRechnung.Sage.Wawi", ViewModel.ReportNamedParameters, "de");


MfG Paul@GEKKO
 
Moin @Paul@GEKKO ,

das Fehlerbild kommt mit bekannt vor, hatte irgendetwas mit dem Initialisieren des Viewmodel und den NamedParametern zu tun (sehe jetzt aber keinen Fehler in dem Code von dir). Kann dir gerne mein vereinfachtes Beispiel für den externen Zugriff auf die PrintEngine schicken. Schreib mir einfach kurz bei Bedarf.

Beste Grüße Rouven
 
Zurück
Oben