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