Drucken eines Belegs aus DLL

WMSeidel

Neues Mitglied
Hallo,
folgender Aufgabenstellung sehe ich mich gegenüber:
- Beim Ausdruck eines Lieferscheins soll ein neuer Beleg "Frachtauftrag" (EKBeleg) erstellt und per EMail an den Spediteur gesandt werden und zwar ohne das der User in den Ablauf eingreift.
Folgende Schritte habe ich bisher realisiert:
1. Beim Speichern des Lieferscheins wird der Frachtauftrag erstellt.
2. Es wird geprüft, ob für diesen Lieferschein schon ein Frachtauftrag erstellt wurde. Falls ja wird der vorhandene Frachtauftrag storniert und ein neuer Frachtauftrag mit den geänderten Lieferscheindaten erstellt.

Diese Abläufe funktionieren auch tadellos. Im Moment hänge ich an der Anforderung den Frachtauftrag zu drucken (als PDF) und per EMail zu verschicken. Die EMail-Adresse lese ich aus den Lieferscheindaten aus. Diese liegt also vor.

Aber wie übergebe ich das Belegobjekt an den Stimulsoft-Report? Im Objektkatalog finde ich dazu keine geeignete Methode!

Ein anderer Ansatz wäre es, den Report über ein Makro aus dem AppDesigner zu generieren und per EMail zu versenden. Allerdings fehlen mir im Moment die Ideen, wie ich an die Werte (EMail-Adresse, BelID) herankomme.

Hat jemand so etwas schon gemacht? Ich wäre für jeden Anstoss dankbar!

Schöne Grüße aus Bielefeld
Wolf-Michael
 
Guten Morgen,

so benutzt man die Stimulsoft-Komponente zum exportieren von PDF-Dateien, hoffe das bringt dich ein Stück weiter:

//Parameter auslesen
var belId = ConversionHelper.ToInt32(parameters.FromName("BelegHandle").Value);
var erfassungsArt = ConversionHelper.ToInt32(parameters.FromName("Erfassungsart").Value);


//Wenn Infodruck, dann gehe raus
var Infodruck = ConversionHelper.ToInt32(parameters.FromName("Infodruck").Value);
if (Infodruck == -1)
return;

//PDF Export
var fileName = $"{reportContextAfterRender.ReportKey}.pdf";

if (parameters != null)
{
var captionParameter = parameters.FromName("$AccessCaption");
if (captionParameter != null)
{
if (!string.IsNullOrEmpty(captionParameter.Value))
{
fileName = $"{captionParameter.Value}_{pdf.Version}.pdf";
}
}
}

//Wenn das Verzeichnis nicht existiert, dann erstelle einen
if (!Directory.Exists(_tempFilePath))
Directory.CreateDirectory(_tempFilePath);

//Wenn bereits eine Datei mit diesem Namen existiert, dann löschen
fileName = Path.Combine(_tempFilePath, fileName);
if (File.Exists(fileName))
{
File.Delete(fileName);
}

//Dokument exportieren
report.ExportDocument(StiExportFormat.Pdf, fileName);
 
Hallo,

na da hänge ich mich doch gleich mal dran und frage:

PDF erzeugen ist klar, aber wie/wo erkenne ich das es das Original ist und nicht die Kopie?

Danke schonmal und VG
 
Hallo,

wird zB der Lieferschein mit einer Kopie gedruckt (also Original-Druck und anschließend Kopie) dann will man ja normalerweise nur das original des Beleges als PDF haben und nicht auch die Kopie.

Erzeuge ich gem. oben eine PDF, dann werden 2 PDF erzeugt.

Daher die Frage:
An der Stelle "Wenn Infodruck, dann gehe raus" würde ich gerne auch prüfen "Ist-Kopie, dann gehe raus"

VG
 
Gerne, hier nochmal die Funktion als Ganzes. Aufruf erfolgt in meinem Fall in der DCM: DcmContextReportAfterRender:

public void ExportBeleg(IDcmContext context)
{
var reportContextAfterRender = (DcmContextReportAfterRender)context;
var parameters = (NamedParameters)reportContextAfterRender.Parameters;

//Parameter auslesen
var belId = ConversionHelper.ToInt32(parameters.FromName("BelegHandle").Value);
var erfassungsArt = ConversionHelper.ToInt32(parameters.FromName("Erfassungsart").Value);

//Wenn Infodruck, dann gehe raus
var Infodruck = ConversionHelper.ToInt32(parameters.FromName("Infodruck").Value);
if (Infodruck == -1)
return;

//Wenn Kopie, dann gehe raus
var copy = ConversionHelper.ToInt32(parameters.FromName("$OutputCopyText").Value);
if (copy == -1)
return;

if (reportContextAfterRender == null)
{
return;
}

var report = (StiReport)reportContextAfterRender.Report;

if (report != null)
{
var settings = new StiPdfExportSettings
{
EmbeddedFonts = true,
ImageQuality = 1,
ImageResolution = 300,
PdfACompliance = true
};
}

try
{
var fileName = reportContextAfterRender.ReportKey + ".pdf";

if (parameters != null)
{
var captionParameter = parameters.FromName("$AccessCaption");
if (captionParameter != null)
{
if (!string.IsNullOrEmpty(captionParameter.Value))
{
fileName = captionParameter.Value + "_" + 0815 + ".pdf";
}
}
}

if (!Directory.Exists(_tempFilePath))
Directory.CreateDirectory(_tempFilePath);

fileName = Path.Combine(_tempFilePath, fileName);
if (File.Exists(fileName))
{
File.Delete(fileName);
}

report.ExportDocument(StiExportFormat.Pdf, fileName);

}
catch (Exception ex)
{
throw ex;
}
}
 
Zuletzt bearbeitet:
Hallo,

leider muss ich diesen Thread nochmal aufmachen. :-(

Nachdem es eine Zeitlang super geklappt hat, gibt es seit einiger Zeit eine "Unschärfe".

Druckt man einen Beleg als Original dann ist die Vorschau OK.
Im parallel mit "rep.ExportDocument(StiExportFormat.Pdf, Dateiname)" abgelegte PDF wird aber immer "Kopie" mit ausgegeben.

Hat da jemand eine Idee?
 
Hallo, ich habe auch das Problem das beim ablegen der PDF Belege direkt über die StiReport immer Kopie drauf steht. Bisher kein Problem weil es auch tatsächlich in ELO als kopie abgelegt werden sollte.
Aber jetzt haben wir einen Sonderfall, da ist das gänzlich unerwünscht.
Gibt es dafür eine Lösung?
 
Hallo zusammen,

dass beim Export eines Druckbelegs per DCM das Kopie-Label sichtbar wird, hängt m.W. damit
zusammen, dass Parameter nicht in Variablen der Stimulsoft Reportengine übergeben. Das Variabelcollection am Report ist in den DCM ReportBeforeRender und ReportAfterRender leer. Unter Umständen bereitet hier eine Racecondition Probleme. Der Parameter "rpKopieText" steuert die Sichtbarkeit die Kopiefelds, doch auch wenn man ihn explizit auf false setzt, hat das keine Auswirkung, weil die Scripte im Report bereits mit Eintritt in die DCM offenbar ausgeführt wurden.

Ich würde es so lösen, dass ich das Label losgelöst von den Scripten der Reportengine in der DCM ReportBeforeRender ausblende.

Hier mal ein Snippet als Gist, wie das geht:

https://gist.github.com/ThomasFalkner/15aa02eed058f76410e267af9ea3e0e3

Gegebenenfalls müsst ihr schauen, dass ihr in gewünschten Szenarien das Label nicht ausblendet.

In Bezug auf ein ELO-Projekt habe ich übrigens aus ähnliche Gründen Abstand vom ad hoc Export über eine DCM genommen, sondern exportiere die Belege innerhalb eines Intervalls über einen Service. Vorteil von der Lösung ist, dass ich dabei Druckprozesse usw. frei konfigurieren kann und auch bestehende Belege archivieren kann.

Viele Grüße
Thomas
 
Das Konzept des Kopiendrucks hat sich etwas vor einiger Zeit (Einführung der erweiterten Druckersteuerung) geändert. Der Kopientext ist immer im gerenderten Bericht vorhanden. "Alte" Parameter zur Steuerung werden ignoriert. Grund dafür ist, dass auf dem AppServer nur einmal für beliebig viele Client-Ausdrucke eines Druckprozesses gerendert wird. Der Text wird erst Client-seitig beim wirklichen Ausdruck gemäß der Parameter des Druckprozesses belassen oder entfernt. Wenn Sie Server-seitig etwas tun möchten, wie einen PDF-Export, müssen Sie den Text selbst kurzzeitig auf Enabled=false und zurück auf true setzen. Einen Parameter, wie "rpKopie", kann man nicht generell verwenden. Der Parameter "$OutputCopyText" kann für jeden Ausdruck definiert sein und enthält für nachfolgende Drucke eine laufende Nummer. "$OutputCopyText[<n>]" signalisiert dem Client, ob er den Kopientext disablen soll. Was man auch Server-seitig in einer DCM auswerten und dann Enabled=false setzen kann.
 
Zurück
Oben