Rechnungsproblem C# -> Python Verknüpfung?
Hallo,
ich habe folgendes Problem:
Ich habe ein ERP-Programm in C# geschrieben. Dieses funktioniert auch einwandfrei. In der Auftragsverwaltungsübersicht habe ich zwei Buttons hinzugefügt: Einmal Rechnung erstellen und einmal Angebot erstellen.
Wenn ich den Knopf Rechnung erstellen klicke, wird ein Python-Code aufgerufen, welcher die Rechnung mit den Daten automatisch erstellt.
Er zeigt immer an, Rechnung erfolgreich erstellt, allerdings erstellt er keine Rechnung bzw. er speichert keine Rechnung ab. Woran könnte das Problem denn liegen?
Hier die Methode, welche aufgerufen wird, wenn ich auf Rechnung erstellen klicke:
private void CreateInvoice(DataGridViewRow row)
{
try
{
var invoiceData = new
{
provider_name = "Media Soft",
provider_address = "Bahnhofstraße 40, 66639 Beispiel",
provider_mobile = "0174 | 623 655 9",
provider_email = "klasenjulian@web.de",
customer_name = $"{row.Cells["Vorname"].Value} {row.Cells["Nachname"].Value}",
customer_address_line1 = $"{row.Cells["Adresse"].Value}",
customer_address_line2 = $"{row.Cells["PLZ"].Value} {row.Cells["Ort"].Value}",
customer_mobile = "",
date = DateTime.Now.ToString("dd.MM.yyyy"),
invoice_number = row.Cells["AuftragID"].Value.ToString(),
customer_number = "Ihre Kundennummer",
items = new[] {
new {
title = row.Cells["Artikelname"].Value.ToString(),
description = "",
price = Convert.ToDouble(row.Cells["Einzelpreis"].Value),
total = Convert.ToDouble(row.Cells["Gesamtpreis"].Value)
}
},
total = Convert.ToDouble(row.Cells["Gesamtpreis"].Value)
};
string json = JsonConvert.SerializeObject(invoiceData);
File.WriteAllText(@"C:\Projekte\rechnung\invoice_data.json", json);
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "python.exe";
start.Arguments = string.Format("{0} {1}", @"C:\Projekte\rechnung\rechnung.py", @"C:\Projekte\rechnung\invoice_data.json");
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
using (Process process = Process.Start(start))
{
using (StreamReader reader = process.StandardOutput)
{
string stderr = process.StandardError.ReadToEnd();
string result = reader.ReadToEnd();
if (string.IsNullOrEmpty(stderr))
{
MessageBox.Show("Rechnung erfolgreich erstellt!");
}
else
{
MessageBox.Show("Fehler beim Erstellen der Rechnung:\n" + stderr);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Fehler beim Erstellung der Rechung: " + ex.Message);
}
}
Hier der Python-Code:
Hier die Python-Daten:
- Daten zur Projektmappe
- Name: rechnung
- Pfad: C:\Projekte\rechnung\rechnung.sln
- Startprojekt: rechnung
Daten zur Projekteigenschaft:
Allgemein:
- Arbeitsverzeichnis: .
- Startdatei: C:\Projekte\rechnung\rechnung.py
Sonstiges:
- Projektdatei: rechnung.pyproj
- Projektordner: C:\Projekte\rechnung
- Projektstartseite: C:\Projekte\rechnung
1 Antwort
So auf den ersten Blick ignoriert das Python Script einfach die Argumente, die du beim Aufruf aus dem C# Programm übergibst und erstellt die pdf mit den Daten, die fest in invoice_data im Python Script stehen. Dadurch erstellt es immer nur dieselbe pdf und es sieht aus, als würde nichts passieren.
Wenn die json-Datei immer in C:\Projekte\rechnung\invoice_data.json liegt, brauchst du die Argumente aus der Kommandozeile nicht unbedingt auslesen, aber irgendwo müsstest du halt die json einlesen, damit du daraus die Rechnungsdaten erzeugen kannst.
Ja, damit müsste es klappen. Ich musste jetzt beim Test noch sagen, dass die Datei in utf-8 ist, damit die Umlaute richtig erkannt werden, aber die json wird eingelesen und kann mit print auch in der Console ausgegeben werden.
with open(json_file_path, 'r', encoding='utf-8') as file:
Kleiner Tipp noch: Falls du bei Dateipfaden nicht die ganzen Backslashes in doppelte Backslashes ändern willst, kannst du vor dem Anführungszeichen einfach ein r schreiben, dann erkennt python den Backslash nicht mehr als Escape-Sequenz und du kannst den Pfad einfach reinkopieren.
json_file_path = r'C:\Projekte\rechnung\invoice_data.json'
Vielen Dank, Du hast mir sehr geholfen !
Wenn ich jetzt im dgv in irgendeinem Auftrag Rechnung erstellen klicke, dann steht dort wie eben Rechnung erfolgreich erstellt, allerdings wird sie nicht erstellt.
Wenn ich allerdings dann den python code seperat nochmal ausführe, dann wird die Rechnung richtig gespeichert mit den Daten aus der Auftragsverwaltung.
Das heißt, der Python code wird nicht von meinem c# programm ausgeführt. Hättest du da auch eine Ahnung ?
Da sehe ich leider keinen offensichtlichen Fehler. Das Einzige, was mir jetzt beim durchschauen noch aufgefallen ist: process.Start() wartet nicht darauf, dass das Python-Script durchgelaufen ist. Das heißt, das C# Programm prüft den Fehlerkanal wahrscheinlich schon bevor Python überhaupt die Chance hat, einen Fehler zu generieren.
Probier mal, ob dir was anderes angezeigt wird, wenn du nach dem process.Start() noch ein process.WaitForExit() einbaust.
Sorry für die späte Rückmeldung.
Leider zeigt er mit dieser Funktion nichts anderes an, ich muss den python code immer manuell starten, damit die Rechnug gespeichert wird. Die Funktion in C# gibt nur die Werte ab, führt allerdings nicht den python code aus. Komisch...
Habe das Problem gelöst, es lag an python.exe . Trotzdem vielen Dank!
Erstmal danke, würde sowas zum beispiel gehen ;