Report drucken per Script und Filter

Guten Morgen,

ich habe ein Script erstellt, welches Daten mit einem Filter herausfiltert und diese als Druckvorschau anzeigt. Das Filtern funktioniert und die Daten werden in Combit auch richtig angezeigt. In der Druckvorschau werden leider andere Daten angezeigt, als die die auf dem Bildschirm in Combit zu sehen sind. Irgendwas mache ich noch falsch. Vielleicht findet ihr ja den Fehler:

                            //Lieferscheine ohne Rechnung herausfiltern
                            filterOK = oRecordSet.SetFilterDirectSQL("SELECT \"ID\" FROM \"SalesDocuments\" WHERE (dbo.cmbt_fct_UnformatGUID(\"SalesDocuments\".\"ID\") = '0000')" + filterLieferscheineOhneRechnung);
                            //Wenn der Filter erfolgreich ausgeführt werden konnte...
                            if (filterOK == true)
                            {
                                //Überprüfe, ob auf den ersten Datensatz des RecordSets gesprungen werden kann...
                                if (oRecordSet.MoveFirst())
                                {
                                    //Bericht erstellen als PDF
                                    if (oRecordSet.PrintReport("PRV", PrintTemplate, true, true, sFile))
                                    {
                                    }
                                    else
                                    {
                                        MessageBox.Show("Vorschau konnte nicht erstellt werden!");
                                    }
                                    filterOK = oRecordSet.SetFilterDirectSQL("SELECT \"ID\" FROM \"SalesDocuments\" WHERE (dbo.cmbt_fct_UnformatGUID(\"SalesDocuments\".\"ID\") = '0000')" + filterLieferscheineOhneRechnung);
                                }

                                else
                                {
                                   oRecord = null;
                                  MessageBox.Show("Keine Lieferscheine ohne Rechnung vorhanden!");
                                }
                            }

Viele Grüße

Thomas

Den SQL-Ausdruck verstehe ich nicht. SalesDocument-ID ist eine GUID, was ist Ihr Ziel bzgl. des '0000' Teils? Und welcher Wert steht in filterLiefercheineOhneRechnung?

Ich denke in dem Konstrukt liegt der „Hase im Pfeffer“. Wenn Sie sagen, dass die Anzeige „des Filters“ in der Oberfläche visuell stimmt, dann schlussfolgere ich, dass DIESER oRecordSet aber nicht der visuelle, in der Ansicht gerade angezeigte RecordSet ist. Oder doch? Ich kann da (fast) ausschließend, dass diese Filter-Abfrage funktioniert. Sie passt ziemlich sicher auch nicht zum Kommentar „//Lieferscheine ohne Rechnung herausfiltern“. Dazu würde es eine ganz andere Abfrage benötigen.

Stellen Sie doch mal auch die vorangehenden Zeilen des Scripts hier rein: wie wird der oRecordSet erzeugt und wie bekommt filterLiefercheineOhneRechnung seinen Inhalt (und welchen)?

ergibt

//Lieferscheine ohne Rechnung herausfiltern
filterOK = oRecordSet.SetFilterDirectSQL("SELECT \"ID\" FROM \"SalesDocuments\" WHERE ((\"SalesDocuments\".\"Type\" = 4) and (select count(1) from \"SalesDocuments\" as \"cmbtAlias1\" where \"SalesDocuments\".\"TransactionNumber\"=\"cmbtAlias1\".\"TransactionNumber\" and (\"cmbtAlias1\".\"RecycleBinID\" IS NULL) and ((\"cmbtAlias1\".\"Type\" = 3)))=0) AND (\"SalesDocuments\".\"RecycleBinID\" IS NULL)");

(Basierend auf dem Script-Kommentar und der Large-Solution - für mehr Hilfe müsste man mehr wissen.)

Hallo,

das Script macht folgendes:

  1. Alle Lieferscheine nach einem bestimmten Datum filtern
  2. Für jeden Lieferschein prüfen, ob es eine Rechnung mit derselben Vorgangsnummer gibt
  3. Gibt es keine, wird sich die ID gemerkt
  4. Alle Datensätze ohne Rechnung anhand ihrer ID filtern und anzeigen

Hier das komplette Script. Ich hoffe es erschlägt Sie nicht…

// <!--#include ref="System.Windows.Forms"-->
// <!--#include using="System.Windows.Forms"-->

#region Visual Studio only
using System.Windows.Forms;
using combit.cRM.COM;
using System;

namespace CombitProvisionsabrechnung
{
    class LieferscheineOhneRechnung
    {
        static cRMApplication cRM = new cRMApplication(EApplicationStartType.GetActiveobject);
        #endregion Visual Studio only
        //-------------------------------------------------------------------------------------------------------
        //>> C# Script Code ab hier:

        /*public static void ButtonOK(string jahr)
        {
            MessageBox.Show("Jahr: "+jahr);
        }*/
        public static void Main()
        {
            Project oProject = cRM.CurrentProject;

            //Objekte für die aktuelle Ansicht
            combit.cRM.COM.View oActiveView = oProject.ActiveViews.ActiveView;
            RecordSet oRecordSet = oActiveView.CurrentRecordSet;
            Record oRecord = oRecordSet.CurrentRecord;

            //Objekte für die Ansicht Belege, um nach Rechnungen zu filtern
            String View = "Belege";
            ListViewConfigs oListViewConfigsRechnungen = oProject.ViewConfigs;
            ViewConfig oViewConfigRechnungen = oListViewConfigsRechnungen.ItemByName(View);
            RecordSet oRecordSetRechnungen = oViewConfigRechnungen.CreateRecordSet();
            //Record oRecordRechnungen;

            //Objekte für die Ansicht Belege, um nach Lieferscheinen zu filtern
            View = "Belege";
            ListViewConfigs oListViewConfigsLieferscheine = oProject.ViewConfigs;
            ViewConfig oViewConfigLieferscheine = oListViewConfigsLieferscheine.ItemByName(View);
            RecordSet oRecordSetLieferscheine = oViewConfigLieferscheine.CreateRecordSet();
            Record oRecordLieferscheine;

            //Objekte zum drucken
            RecordSet Druck;

            //Filter nur erstellen, wenn man sich in der Ansicht "Belege" befindet
            if (cRM.CurrentProject.ActiveViews.ActiveView.Name != "Belege")
            {
                //Beende das Script und informiere den Nutzer
                MessageBox.Show("Das Script kann nur in der Ansicht Belege ausgeführt werden. Das Script wird nun beendet.", "Achtung");
            }

            else
            {
                //Datensatz sperren und pruefen, ob gesperrt wurde
                oRecord.Lock();
                if (oRecord.Lock() == true)
                {

                    //Pruefen, ob etwas null ist
                    try
                    {
                        //Eingabeformular initialisieren und das Jahr einlesen
                        String jahrString;
                        int jahr;
                        DialogForm eingabejahr = cRM.DialogForm; //Dialogobjekt erstellen
                        eingabejahr.DialogTitle = "Datumseingabe"; //Titel des Dialogs

                        eingabejahr.DefineVariableStart(); //Beginn Variablen zu definieren
                        eingabejahr.DefineVariable("Jahr", 0, "C", 4, 0, "2024"); //Variable "Jahr", ID 0, Text, 4 Zeichen, 0 Nachkommastellen, Default Text

                        eingabejahr.DefineFctStart(); //Beginn Buttons definieren
                        eingabejahr.DefineFct("OK", "Bestätigen", true, false, 1); //Button "OK", Hilfetext, beenden nach klick, ExecuteFct wird aufgerufen nach klick, Rückgabewert
                                                                                   //eingabejahr.BindFctHandler("OK", ButtonOK); //Methode "ButtonOK" an den Button "OK" binden

                        eingabejahr.DLIPath = @"%PRJDIR%\jahr.dli"; //Datei, wo das Formular gespeichert wird
                        eingabejahr.Sizable = true;
                        eingabejahr.SizeToContent = true;
                        eingabejahr.WidthInPixel = 640;
                        eingabejahr.HeightInPixel = 480;
                        eingabejahr.Show();

                        object contents = null;
                        eingabejahr.GetVariableContentsVariant("Jahr", ref contents);
                        jahrString = contents.ToString();

                        //Probieren, ob das eingegebene Jahr in eine Zahl umgewandelt werden kann.
                        try
                        {
                            jahr=Convert.ToInt16(jahrString);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Fehlerhafte Eingabe der Jahreszahl\n\nBitte nur Zahlen eingeben\n\nSkript wird beendet");
                            jahr = 0;
                            return;
                        }

                        //Testen, ob das eingegebene Jahr in einem realistischen Zeitraum liegt
                        if(jahr < 2015)
                        {
                            MessageBox.Show("Bitte ein Jahr nach 2015 wählen\n\n Skript wird nun beendet");
                            return;
                        }


                        //Wartedialog starten
                        cRM.StartWaitDlg("Daten werden analysiert...",false);

                        //Variablen deklarieren
                        String vorgangLieferschein, filterLieferscheineOhneRechnung, ID;
                        bool filterOK, weitererDatensatz;
                        DateTime datumLieferscheine = new DateTime(jahr, 1, 1);
                        const string FileLocationPath = @"%PRJDIR%\Dokumente\Auswertungen\Lieferscheine ohne Rechnung\"; //Speicherort für die PDF-Dateien    
                        const string PrintTemplate = @"%PRJDIR%\Druckvorlagen\Belege - 3S - Lieferschein ohne Rechnung.lst"; // Druckvorlage definieren für den Anhang
                        string sFile;
         

                        //Variablen mit Werten belegen
                        ID = "";
                        filterLieferscheineOhneRechnung = "";
                        sFile = FileLocationPath + "Lieferscheine ohne Rechnung ab " + datumLieferscheine.ToShortDateString() + ".pdf";

                        //Daten berechnen

                        //Filter anwenden
                        //Filter erstellen für alle Lieferscheine, die nach einem bestimmten Datum erstellt wurden (datumLieferscheine)
                        filterOK = oRecordSetLieferscheine.SetFilterDirectSQL("SELECT \"ID\" FROM \"SalesDocuments\" WHERE (select count(1) from \"SalesDocumentTypes\" as \"cmbtAlias1\" where \"SalesDocuments\".\"Type\"=\"cmbtAlias1\".\"ID\" and ((LEFT(\"cmbtAlias1\".\"Description_DE\",12) = N'Lieferschein')))>=1 and (CONVERT(date, \"SalesDocuments\".\"Date\") >= CONVERT(date, '"+jahr+"-01-01 00:00:00', 120))");

                        //Wenn der Filter erfolgreich ausgeführt werden konnte...
                        if (filterOK == true)
                        {
                            //Überprüfe, ob auf den ersten Datensatz des RecordSets gesprungen werden kann...
                            if (oRecordSetLieferscheine.MoveFirst())
                            {
                                do
                                {
                                    oRecordLieferscheine = oRecordSetLieferscheine.CurrentRecord; //ersten Datensatz holen
                                    vorgangLieferschein = Convert.ToString(oRecordLieferscheine.GetContentsValueByName("TransactionNumber")); //Vorgansnummer des Lieferscheins holen

                                    //Vergleichen, ob es zu diesem eine Rechnung gibt
                                    //Dazu müssen die Datensaetze nach Rechnungen gefiltert werden, die die gleiche Vorgangsnummer haben
                                    filterOK = oRecordSetRechnungen.SetFilterDirectSQL("SELECT \"ID\" FROM \"SalesDocuments\" WHERE (select count(1) from \"SalesDocumentTypes\" as \"cmbtAlias1\" where \"SalesDocuments\".\"Type\"=\"cmbtAlias1\".\"ID\" and ((LEFT(\"cmbtAlias1\".\"Description_DE\",8) = N'Rechnung')))>=1 and (\"SalesDocuments\".\"TransactionNumber\" = N'" + vorgangLieferschein + "')");
                                    if (filterOK == true)
                                    {
                                        if (oRecordSetRechnungen.MoveFirst()) //kann auf den ersten Datensatz gesprungen werden, gibt es eine Rechnung
                                        {
                                        }

                                        else //ansonsten ID der nicht vorhandenen Rechnung merken
                                        {
                                            //ID der Lieferscheine zum einem neuen Filter hinzufügen
                                            //ID auslesen
                                            try
                                            {
                                                ID = Convert.ToString(oRecordLieferscheine.GetContentsValueByName("ID"));
                                            }
                                            catch
                                            {
                                                ID = "";
                                            }
                                            //ID dem Filterausdruck hinzufügen
                                            filterLieferscheineOhneRechnung += " or (dbo.cmbt_fct_UnformatGUID(\"SalesDocuments\".\"ID\") = '" + ID + "')";
                                        }
                                    }

                                    //nächsten Datensatz wählen
                                    weitererDatensatz = oRecordSetLieferscheine.MoveNext();
                                } while (weitererDatensatz == true);
                            }
                            else
                            {
                                oRecord = null;
                            }

                            //Lieferscheine ohne Rechnung herausfiltern
                            filterOK = oRecordSet.SetFilterDirectSQL("SELECT \"ID\" FROM \"SalesDocuments\" WHERE (dbo.cmbt_fct_UnformatGUID(\"SalesDocuments\".\"ID\") = '0000')" + filterLieferscheineOhneRechnung);
                            //Wenn der Filter erfolgreich ausgeführt werden konnte...
                            if (filterOK == true)
                            {
                                //Überprüfe, ob auf den ersten Datensatz des RecordSets gesprungen werden kann...
                                if (oRecordSet.MoveFirst())
                                {
                                    //Bericht erstellen als PDF
                                    if (oRecordSet.PrintReport("PRV", PrintTemplate, true, true, sFile))
                                    {
                                    }
                                    else
                                    {
                                       MessageBox.Show("Vorschau konnte nicht erstellt werden!");
                                    }
                                    //Filter erneut ausführen, damit nicht nur der Datensatz angezeigt wird auf den zuerst gesprungen wurde
                                    filterOK = oRecordSet.SetFilterDirectSQL("SELECT \"ID\" FROM \"SalesDocuments\" WHERE (dbo.cmbt_fct_UnformatGUID(\"SalesDocuments\".\"ID\") = '0000')" + filterLieferscheineOhneRechnung);
                                }

                                else
                                {
                                   oRecord = null;
                                  MessageBox.Show("Keine Lieferscheine ohne Rechnung vorhanden!");
                                }
                            }
                        }
                        cRM.EndWaitDlg();


                        //Daten zurückschreiben in das Formular
                        /*
                        Beispiel:
                        oRecord.SetContentsValueByName("ProvisionlblProvisionleadGeber", provisionleadGeber.ToString());
                        */

                        //Datensatz speichern und Schreibvorgang prüfen
                        /*oRecord.Save();
                        if (oRecord.Save() == true)
                        {
                        }
                        else
                        {
                            MessageBox.Show("Datensatz konnte nicht geschrieben werden!");
                        }
                        */

                        //Datensatz entsperren
                        oRecord.Unlock();

                        
                        // DE: Aktive Ansicht aktualisieren und pruefen, ob sie aktualisiert wurde
                        oActiveView.Update();
                        if (oActiveView.Update() == true)
                        {
                        }
                        else
                        {
                            //MessageBox.Show("Ansicht konnte nicht aktualisiert werden.");
                        }
                        
                    }
                    catch (Exception ex)
                    {
                     MessageBox.Show("Unbekannter Fehler:\n\n"+ex.Message);
                    }
                }
                else
                {
                    MessageBox.Show("Datensatz konnte nicht gesperrt werden! Skript wird beendet.");
                }

            }
        }
        //<< C# Script Code bis hier
        //-------------------------------------------------------------------------------------------------------
        #region Visual Studio only
    }
}
#endregion Visual Studio only

Das Script liefert zumindest die richtigen Daten. Wenn ich den Druck des Reports manuell aus Combit heraus starte, dann ist dieser auch korrekt. Nur aus dem Script heraus kommen beim Druck falsche Werte raus. Angezeigt werden in Combit wiederum die richtigen Werte.

Können Sie einmal das Script ohne den Druckaufruf laufen lassen - dann müsste ja eben visuell in der Ansicht der (richtige) Filter angezeigt werden.

Könnten Sie dann bitte testhalber einfach nur ein Script starten, das lediglich die Druckzeile á la

cRM.CurrentProject.ActiveViews.ActiveView.CurrentRecordSet.PrintReport("PRV", PrintTemplate, true, true, "")

ausführt? (Wird auf der bereits durch das andere Script „vorbereiteten“ Ansicht dann gestartet.)

Ich verstehe Sie so als wären da dann die falschen Datensätze drin, richtig?

=> Ja: Passiert das auch in der Variante mit

cRM.CurrentProject.ActiveViews.ActiveView.CurrentRecordSet.PrintReport("PRV", PrintTemplate, true, true, "", false)`

(Beachten Sie den neuen, letzte Parameter false - der regelt dass der Report in der Berichtsansicht der Ansicht dargestellt wird, anstatt in einem eigenen Popup-Fenster)

Dann gucken wir uns das mal in der Entwicklungsabteilung genauer an, was da evtl. los ist. Ggf. schwenken wir dann um auf einen Support-Case - sehen wir dann. :nerd_face:

1 „Gefällt mir“

Off-topic Unabhängig von dem Report: Im Script gibt es noch ein konzeptionelles Problem:

Sie sperren den aktuell dargestellten Datensatz. Anschließend machen Sie aber in dieser Ansicht einen Filter. Das macht das Record-Objekt ungültig, denn der Filter zieht dem Record seinen zugrundeliegenden RecordSet hinterrücks weg. Und Sie stehen danach auch auf dem ersten Datensatz des neuen Filters. Sie können/dürfen nach einem Filter mit diesem Record-Objekt (der eventuell ja nicht einmal Bestandteil des Filter ist) nichts mehr anfangen (aktuell oRecord.Unlock, später aber evtl auch der auskommentierte Teil mit .SetContentsValueByName und .Save).

Das müssen Sie noch umbauen bzw. ausbauen - das kann sonst noch zum Problem werden.

Sie sollten idealerweise Record-Objekte mit .Dispose explizit freigeben (ohne auf den GarbageCollector zu warten) bevor Sie mit SetFilter (u. ä.) den übergeordneten RecordSet verändern.

On-topic: mit einem rudimentär „ähnlichem“ Script (Filter auf aktueller View und danach PrintReport) ist bei uns der Effekt nicht reproduzierbar.

1 „Gefällt mir“

Erst einmal vielen Dank für die gut gemeinten und nützlichen Tipps! Da freue ich mich immer drüber. Falls jemand ein Tutorial kennt, wo man sich Grundlagen und best practices zum scripten mit Combit aneignen kann, dann bitte melden. Ich gebe mein Bestes mit der Programmierer Referenz (SDK) irgendwie alles zurecht zu fummeln.

sowohl

cRM.CurrentProject.ActiveViews.ActiveView.CurrentRecordSet.PrintReport("PRV", PrintTemplate, true, true, "")

als auch

cRM.CurrentProject.ActiveViews.ActiveView.CurrentRecordSet.PrintReport("PRV", PrintTemplate, true, true, "", false)`

haben einwandfrei funktioniert. Ich verstehe aber nicht, warum andere Daten angezeigt werden, wenn ich einen Dateinamen inklusive Pfad zum speichern angebe. Was habe ich denn da vergurkt?

Auf alle Fälle ein großes Lob und vielen Dank, dass mir hier am Freitag noch so schnell geholfen wurde. Das häte ich nicht gedacht und bin immer wieder positiv überrascht von diesem Forum.

1 „Gefällt mir“

Dankeschön. Es ist schlichtweg Herzblut. :heart: Meine Frau findet es nicht immer gut. :grimacing::face_with_peeking_eye:

Ich habe keine Idee, was das Problem ist, es „riecht“ nach einem Fehl…ähh undokumentierten Spezialverhalten.:crazy_face: Wir würden es uns gerne ansehen. Dürften wir am Montag einen Case anlegen und dann bilateral kommunizieren? Wir lösen es am allerschnellsten mit Ihrer Solution.

Falls es ein public learning gibt, würden wir das hier dann zum Nutzen aller updaten.

Das können Sie gerne machen. Ich habe das Skript noch ein bisschen aufgeräumt. Man kann den Fehler reproduzieren, sobald man den Befehl ändert. Dafür habe ich alle drei Befehle mit in das Skript genommen. Sie können dann abwechselnd auskommentiert werden.

Ich wünsche Ihnen ein schönes Wochenende!

// <!--#include ref="System.Windows.Forms"-->
// <!--#include using="System.Windows.Forms"-->

#region Visual Studio only
using System.Windows.Forms;
using combit.cRM.COM;
using System;

namespace CombitProvisionsabrechnung
{
    class LieferscheineOhneRechnung
    {
        static cRMApplication cRM = new cRMApplication(EApplicationStartType.GetActiveobject);
        #endregion Visual Studio only
        //-------------------------------------------------------------------------------------------------------
        //>> C# Script Code ab hier:
        public static void Main()
        {
            Project oProject = cRM.CurrentProject;

            //Objekte für die aktuelle Ansicht
            combit.cRM.COM.View oActiveView = oProject.ActiveViews.ActiveView;
            RecordSet oRecordSet = oActiveView.CurrentRecordSet;
            Record oRecord = oRecordSet.CurrentRecord;

            //Objekte für die Ansicht Belege, um nach Rechnungen zu filtern
            String View = "Belege";
            ListViewConfigs oListViewConfigsRechnungen = oProject.ViewConfigs;
            ViewConfig oViewConfigRechnungen = oListViewConfigsRechnungen.ItemByName(View);
            RecordSet oRecordSetRechnungen = oViewConfigRechnungen.CreateRecordSet();
            //Record oRecordRechnungen;

            //Objekte für die Ansicht Belege, um nach Lieferscheinen zu filtern
            View = "Belege";
            ListViewConfigs oListViewConfigsLieferscheine = oProject.ViewConfigs;
            ViewConfig oViewConfigLieferscheine = oListViewConfigsLieferscheine.ItemByName(View);
            RecordSet oRecordSetLieferscheine = oViewConfigLieferscheine.CreateRecordSet();
            Record oRecordLieferscheine;

            //Filter nur erstellen, wenn man sich in der Ansicht "Belege" befindet
            if (cRM.CurrentProject.ActiveViews.ActiveView.Name != "Belege")
            {
                //Beende das Script und informiere den Nutzer
                MessageBox.Show("Das Script kann nur in der Ansicht Belege ausgeführt werden. Das Script wird nun beendet.", "Achtung");
            }

            else
            {
                    //Pruefen, ob etwas null ist
                    try
                    {
                        //Eingabeformular initialisieren und das Jahr einlesen
                        String jahrString;
                        int jahr;
                        DialogForm eingabejahr = cRM.DialogForm; //Dialogobjekt erstellen
                        eingabejahr.DialogTitle = "Datumseingabe"; //Titel des Dialogs

                        eingabejahr.DefineVariableStart(); //Beginn Variablen zu definieren
                        eingabejahr.DefineVariable("Jahr", 0, "C", 4, 0, "2024"); //Variable "Jahr", ID 0, Text, 4 Zeichen, 0 Nachkommastellen, Default Text

                        eingabejahr.DefineFctStart(); //Beginn Buttons definieren
                        eingabejahr.DefineFct("OK", "Bestätigen", true, false, 1); //Button "OK", Hilfetext, beenden nach klick, ExecuteFct wird aufgerufen nach klick, Rückgabewert
                        
                        eingabejahr.DLIPath = @"%PRJDIR%\jahr.dli"; //Datei, wo das Formular gespeichert wird
                        eingabejahr.Sizable = true;
                        eingabejahr.SizeToContent = true;
                        eingabejahr.WidthInPixel = 640;
                        eingabejahr.HeightInPixel = 480;
                        eingabejahr.Show();

                        object contents = null;
                        eingabejahr.GetVariableContentsVariant("Jahr", ref contents);
                        jahrString = contents.ToString();

                        //Probieren, ob das eingegebene Jahr in eine Zahl umgewandelt werden kann.
                        try
                        {
                            jahr=Convert.ToInt16(jahrString);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Fehlerhafte Eingabe der Jahreszahl\n\nBitte nur Zahlen eingeben\n\nSkript wird beendet");
                            jahr = 0;
                            return;
                        }

                        //Testen, ob das eingegebene Jahr in einem realistischen Zeitraum liegt
                        if(jahr < 2015)
                        {
                            MessageBox.Show("Bitte ein Jahr nach 2015 wählen\n\n Skript wird nun beendet");
                            return;
                        }

                        //Wartedialog starten
                        cRM.StartWaitDlg("Daten werden analysiert...",false);

                        //Variablen deklarieren
                        String vorgangLieferschein, filterLieferscheineOhneRechnung, ID;
                        bool filterOK, weitererDatensatz;
                        DateTime datumLieferscheine = new DateTime(jahr, 1, 1);
                        const string FileLocationPath = @"%PRJDIR%\Dokumente\Auswertungen\Lieferscheine ohne Rechnung\"; //Speicherort für die PDF-Dateien    
                        const string PrintTemplate = @"%PRJDIR%\Druckvorlagen\Belege - 3S - Lieferschein ohne Rechnung.lst"; // Druckvorlage definieren für den Anhang
                        string sFile;
         
                        //Variablen mit Werten belegen
                        ID = "";
                        filterLieferscheineOhneRechnung = "";
                        sFile = FileLocationPath + "Lieferscheine ohne Rechnung ab " + datumLieferscheine.ToShortDateString() + ".pdf";

                        //Filter anwenden
                        //Filter erstellen für alle Lieferscheine, die nach einem bestimmten Datum erstellt wurden (datumLieferscheine)
                        filterOK = oRecordSetLieferscheine.SetFilterDirectSQL("SELECT \"ID\" FROM \"SalesDocuments\" WHERE (select count(1) from \"SalesDocumentTypes\" as \"cmbtAlias1\" where \"SalesDocuments\".\"Type\"=\"cmbtAlias1\".\"ID\" and ((LEFT(\"cmbtAlias1\".\"Description_DE\",12) = N'Lieferschein')))>=1 and (CONVERT(date, \"SalesDocuments\".\"Date\") >= CONVERT(date, '"+jahr+"-01-01 00:00:00', 120))");

                    //Wenn der Filter erfolgreich ausgeführt werden konnte...
                    if (filterOK == true)
                    {
                        //Überprüfe, ob auf den ersten Datensatz des RecordSets gesprungen werden kann...
                        if (oRecordSetLieferscheine.MoveFirst())
                        {
                            do
                            {
                                oRecordLieferscheine = oRecordSetLieferscheine.CurrentRecord; //ersten Datensatz holen
                                vorgangLieferschein = Convert.ToString(oRecordLieferscheine.GetContentsValueByName("TransactionNumber")); //Vorgansnummer des Lieferscheins holen

                                //Vergleichen, ob es zu diesem eine Rechnung gibt
                                //Dazu müssen die Datensaetze nach Rechnungen gefiltert werden, die die gleiche Vorgangsnummer haben
                                filterOK = oRecordSetRechnungen.SetFilterDirectSQL("SELECT \"ID\" FROM \"SalesDocuments\" WHERE (select count(1) from \"SalesDocumentTypes\" as \"cmbtAlias1\" where \"SalesDocuments\".\"Type\"=\"cmbtAlias1\".\"ID\" and ((LEFT(\"cmbtAlias1\".\"Description_DE\",8) = N'Rechnung')))>=1 and (\"SalesDocuments\".\"TransactionNumber\" = N'" + vorgangLieferschein + "')");
                                if (filterOK == true)
                                {
                                    if (oRecordSetRechnungen.MoveFirst()) //kann auf den ersten Datensatz gesprungen werden, gibt es eine Rechnung
                                    {
                                    }

                                    else //ansonsten ID der nicht vorhandenen Rechnung merken
                                    {
                                        //ID der Lieferscheine zum einem neuen Filter hinzufügen
                                        //ID auslesen
                                        try
                                        {
                                            ID = Convert.ToString(oRecordLieferscheine.GetContentsValueByName("ID"));
                                        }
                                        catch
                                        {
                                            ID = "";
                                        }
                                        //ID dem Filterausdruck hinzufügen
                                        filterLieferscheineOhneRechnung += " or (dbo.cmbt_fct_UnformatGUID(\"SalesDocuments\".\"ID\") = '" + ID + "')";
                                    }
                                }

                                //nächsten Datensatz wählen
                                weitererDatensatz = oRecordSetLieferscheine.MoveNext();
                            } while (weitererDatensatz == true);
                        }
                    }
                    else
                    {
                        oRecordLieferscheine = null;
                    }

                            //Lieferscheine ohne Rechnung herausfiltern
                            filterOK = oRecordSet.SetFilterDirectSQL("SELECT \"ID\" FROM \"SalesDocuments\" WHERE (dbo.cmbt_fct_UnformatGUID(\"SalesDocuments\".\"ID\") = '0000')" + filterLieferscheineOhneRechnung);
                            //Wenn der Filter erfolgreich ausgeführt werden konnte...
                            if (filterOK == true)
                            {

                        //Bericht erstellen als PDF

                        //Fehler
                        //if (oRecordSetLieferscheine.PrintReport("PRV", PrintTemplate, true, true, sFile))

                        //Fehlerfrei
                        if (oRecordSet.PrintReport("PRV", PrintTemplate, true, true,""))
                        
                        //Fehlerfrei
                        //if (oRecordSet.PrintReport("PRV", PrintTemplate, true, true, "", false))
                        {
                        }
                        else
                        {
                           MessageBox.Show("Vorschau konnte nicht erstellt werden!");
                        }
                        

                            }
                            else
                            {
                            MessageBox.Show("Keine Lieferscheine ohne Rechnung vorhanden");    
                            }
                        oRecord = null;
                    
                        cRM.EndWaitDlg();
                                                
                        // DE: Aktive Ansicht aktualisieren und pruefen, ob sie aktualisiert wurde
                        oActiveView.Update();
                        if (oActiveView.Update() == true)
                        {
                        }
                        else
                        {
                            //MessageBox.Show("Ansicht konnte nicht aktualisiert werden.");
                        }
                        
                    }
                    catch (Exception ex)
                    {
                     MessageBox.Show("Unbekannter Fehler:\n\n"+ex.Message);
                    }

            }
        }
        //<< C# Script Code bis hier
        //-------------------------------------------------------------------------------------------------------
        #region Visual Studio only
    }
}
#endregion Visual Studio only