From a8d5f654383db08b587749f0c7832fd140700205 Mon Sep 17 00:00:00 2001 From: Sven Riwoldt Date: Fri, 25 Oct 2024 19:35:37 +0200 Subject: [PATCH] Bei einigen Dateien kann ich den Montageort nicht bearbeiten, da sie auf einmal Zahlen sind --- Aufbaumaster2CSV.ui | 29 +++- CMDB2CSV_Aufbaumaster.py | 279 +++++++++++++++++++-------------------- Fehler.ui | 42 ++++++ 3 files changed, 203 insertions(+), 147 deletions(-) create mode 100644 Fehler.ui diff --git a/Aufbaumaster2CSV.ui b/Aufbaumaster2CSV.ui index 515a5571..880e1651 100755 --- a/Aufbaumaster2CSV.ui +++ b/Aufbaumaster2CSV.ui @@ -17,13 +17,14 @@ 450 - 10 - 250 + 0 + 171 31 + Arial Unicode MS 18 @@ -40,6 +41,11 @@ 28 + + + Arial Unicode MS + + Speichern unter @@ -50,9 +56,15 @@ 300 60 331 - 16 + 21 + + + Arial Unicode MS + 10 + + Qt::RightToLeft @@ -77,6 +89,7 @@ + Arial Unicode MS 12 @@ -90,12 +103,17 @@ - 160 + 150 30 - 85 + 121 28 + + + Arial Unicode MS + + Öffnen @@ -111,6 +129,7 @@ + Arial Unicode MS 13 diff --git a/CMDB2CSV_Aufbaumaster.py b/CMDB2CSV_Aufbaumaster.py index 4210484b..6993c27d 100755 --- a/CMDB2CSV_Aufbaumaster.py +++ b/CMDB2CSV_Aufbaumaster.py @@ -5,13 +5,15 @@ from pathlib import Path import pandas as pd from icecream import ic import numpy as np -class MainUI(QDialog): # erbt von QDialog + + +class MainUI(QDialog): # erbt von QDialog def __init__(self): - #super (MainUI, self).__init__() #Aufrufen des Konstruktors von QDialog + # super (MainUI, self).__init__() #Aufrufen des Konstruktors von QDialog super().__init__() - loadUi ("Aufbaumaster2CSV.ui", self) + loadUi("Aufbaumaster2CSV.ui", self) self.filename = None - self.path = None + self.path = None self.df_vte = None self.df_cmdb = None self.dfb = None @@ -21,13 +23,6 @@ class MainUI(QDialog): # erbt von QDialog self.group = None self.typ = None - def changegroup(self): - self.group = self.gruppierung.currentText() - # ic("Gruppen: ", self.group) - - def changegtyp(self): - self.typ = self.geraetetyp.currentText() - # ic("Typ: ", self.typ) def open_file_dialog(self): self.filename, _ = QFileDialog.getOpenFileName( @@ -42,33 +37,33 @@ class MainUI(QDialog): # erbt von QDialog if self.filename: self.path = Path(self.filename) - #self.changetable() - self.collectdata() + self.collect_grundgeraete() + +# self.collect_erweiterung() def onClicked(self): pass - - def collectdata(self): - + def collect_grundgeraete(self): # Einlesen der Sheets - self.df_vte = pd.read_excel(self.filename,header=7,na_filter=False,sheet_name="VTE-Input",engine='pyxlsb',usecols=['Hostname','Gruppierung','CONFIG-ID','CMDB Status']) - #print(self.df_vte.head) - self.df_cmdb = pd.read_excel(self.filename,header=2,sheet_name="CMDB", engine='pyxlsb') - #self.df_sw_asset = pd.read_excel(self.filename,sheet_name="SW-Asset", engine='pyxlsb') - + self.df_vte = pd.read_excel(self.filename, header=7, na_filter=False, sheet_name="VTE-Input", engine='pyxlsb', + usecols=['Hostname', 'Gruppierung', 'CONFIG-ID', 'CMDB Status']) + # print(self.df_vte.head) + self.df_cmdb = pd.read_excel(self.filename, header=2, sheet_name="CMDB", engine='pyxlsb') + # self.df_sw_asset = pd.read_excel(self.filename,sheet_name="SW-Asset", engine='pyxlsb') # Nach relevanten Spalten filtern - self.df_vte = self.df_vte[self.df_vte['Gruppierung']=='Grundgerät'] - #self.df_vte = self.df_vte.drop(columns=['RAM','Bestelldatum','Hersteller','Lieferant','SAP-Nr.','Lieferdatum','Lieferschein-Nr.','WV-Start','WV-Ende','Aufgaben Schritt','Verkehrsart','Anz.\nHE ']) - self.df_cmdb = self.df_cmdb[self.df_cmdb['Filter'].isin(['Grundgerät','Erweiterung'])] - - self.df_cmdb = self.df_cmdb.drop(columns=['WV-Start','WV-Ende','CMDB-Status','Aufgabe Schritt','Filter','Waermeabgabe [BTU/h]','kalk. Strom [A]']) + self.df_vte = self.df_vte[self.df_vte['Gruppierung'] == 'Grundgerät'] + # self.df_vte = self.df_vte.drop(columns=['RAM','Bestelldatum','Hersteller','Lieferant','SAP-Nr.','Lieferdatum','Lieferschein-Nr.','WV-Start','WV-Ende','Aufgaben Schritt','Verkehrsart','Anz.\nHE ']) + self.df_cmdb = self.df_cmdb[self.df_cmdb['Filter'].isin(['Grundgerät', 'Erweiterung'])] + self.df_cmdb = self.df_cmdb.drop( + columns=['WV-Start', 'WV-Ende', 'CMDB-Status', 'Aufgabe Schritt', 'Filter', 'Waermeabgabe [BTU/h]', + 'kalk. Strom [A]']) # Einfügen von Spalten in die CMDB-Tabelle self.dfb = self.df_vte.merge(self.df_cmdb, on=['Hostname'], how='left') - + # Spalte für Mandanten Kontaktzuweisung self.dfb.insert(loc=7, column='Mandanten Kontaktzuweisung', value='Mandant') @@ -80,72 +75,83 @@ class MainUI(QDialog): # erbt von QDialog # Spalte einfügen für HE self.dfb.insert(loc=14, column='HE', value='') - + # Einschub self.dfb.insert(loc=15, column='Einschub', value='') - + # Montage --> nur horizontal self.dfb.insert(loc=16, column='Montage', value='horizontal') - + # Formfaktor self.dfb.insert(loc=17, column='Formfaktor', value='19"') - + # Masseinheit self.dfb.insert(loc=18, column='Masseinheit', value='Zoll') # Führende Leerzeichen in allen Spalten entfernen self.dfb = self.dfb.apply(lambda x: x.str.lstrip() if x.dtype == "object" else x) + self.dfb = self.dfb.apply(self.suche_Einschub, axis=1) + self.dfb = self.dfb.apply(self.montageort, axis=1) self.dfb = self.dfb.apply(self.prüfe_und_setze_wert, axis=1) # Setzen von int für HE und Anz. HE self.dfb['HE'] = self.dfb['HE'].apply(lambda x: x if pd.isnull(x) else str(int(x))) self.dfb['belegte\nHE'] = self.dfb['belegte\nHE'].apply(lambda x: x if pd.isnull(x) else str(int(x))) - + + +############################################################################################## + #def collect_erweiterung(self): + + def suche_Einschub(self, einschub): + if einschub['Montageort'][-1] in ('v' 'h'): + print (einschub['Montageort']) + einschub['Einschub'] = einschub['Montageort'][-1] + return einschub + + def montageort(self, montage): + # Fehlerbereinigung + if montage['ID\nStandort'] not in ("Ber-PS", "Bon-BTW"): + print("Kein Standort P40 oder BTW") + sys.exit(0) + else: + if len((montage['Montageort'][8:13])) != 2: + montage['HE'] = montage['Montageort'][8:10] + montage['Montageort'] = montage['Montageort'][0:7] + else: + montage['HE'] = montage['Montageort'][8:10] + montage['Montageort'] = montage['Montageort'][0:7] + + return montage + + def korrektur_hersteller(self, hersteller): + if hersteller['Hersteller'].lower() == "cisco": + hersteller['Hersteller'] = "Cisco Systems" + elif hersteller['Hersteller'].lower() == "genua": + hersteller['Hersteller'] = "genua GmbH" + elif hersteller['Hersteller'].lower() == "digi": + hersteller['Hersteller'] = "Digi International Inc." + + return hersteller def prüfe_und_setze_wert(self, zeile): - ic(zeile) - - # Fehlerbereinigung - if zeile['ID\nStandort'] not in ("Ber-PS","Bon-BTW"): - print("Kein Standort P40 oder BTW") - sys.exit(0) - else: - if len((zeile['Montageort'][8:13])) !=2: - zeile['HE'] = zeile['Montageort'][8:10] - zeile['Montageort'] = zeile['Montageort'][0:7] - else: - zeile['HE'] = zeile['Montageort'][8:10] - zeile['Montageort'] = zeile['Montageort'][0:7] - # TODO: - # Einschub vorn/hinten einbauen - - - if zeile['Hersteller'].lower() == "cisco": - zeile['Hersteller'] = "Cisco Systems" - elif zeile['Hersteller'].lower() == "genua": - zeile['Hersteller'] = "genua GmbH" - elif zeile['Hersteller'].lower() == "digi": - zeile['Hersteller'] = "Digi International Inc." - else: - pass - + #ic(zeile) ################################################################ if zeile['Hostname'][4:6] == "10": zeile['ID\nMandanten'] = 'm10 CMP Plattform / iM.0 / iM.4 / PAP sIMCP' if zeile['Hostname'][4:8] == "1011": zeile['Domain'] = 'im0.t-cmp.de' elif zeile['Hostname'][4:8] == "1015": - zeile['Domain'] = 'im4.t-cmp.de' + zeile['Domain'] = 'im4.t-cmp.de' else: zeile['Domain'] = 'mgmt.t-cmp.de' elif zeile['Hostname'][4:6] == "19": zeile['ID\nMandanten'] = 'm19 Testumgebung' - if zeile['Hostname'][4:8].isin("1920","1921"): + if zeile['Hostname'][4:8].isin("1920", "1921"): zeile['Domain'] = 'm19.t-cmp.de' else: zeile['Domain'] = 'm193.t-cmp.de' @@ -153,23 +159,23 @@ class MainUI(QDialog): # erbt von QDialog zeile['ID\nMandanten'] = 'm20 iM.1 Interner Mandant (Schutzbedarf sehr hoch)' zeile['Domain'] = 'im1.t-cmp.de' elif zeile['Hostname'][4:6] == "21": - zeile['ID\nMandanten'] = 'm21 iM.2 Interner Mandant (Schutzbedarf normal)' + zeile['ID\nMandanten'] = 'm21 iM.2 Interner Mandant (Schutzbedarf normal)' zeile['Domain'] = 'im2.t-cmp.de' elif zeile['Hostname'][4:6] == "22": zeile['ID\nMandanten'] = 'm22 iM.3 Interner Mandant (Schutzbedarf hoch)' - zeile['Domain'] = 'im3.t-cmp.de' + zeile['Domain'] = 'im3.t-cmp.de' elif zeile['Hostname'][4:6] == "50": zeile['ID\nMandanten'] = 'm50 sEMCP.Instanz-1 (CMP Zentral)' - zeile['Domain'] = 'm50.t-cmp.de' + zeile['Domain'] = 'm50.t-cmp.de' elif zeile['Hostname'][4:6] == "51": zeile['ID\nMandanten'] = 'm51 Classified OPS' zeile['Domain'] = 'm51.t-cmp.de' elif zeile['Hostname'][4:6] == "73": zeile['ID\nMandanten'] = 'm73 FWP Lüftersteuerung' - zeile['Domain'] = 'm73.t-cmp.de' + zeile['Domain'] = 'm73.t-cmp.de' elif zeile['Hostname'][4:6] == "75": zeile['ID\nMandanten'] = 'm75 Fawkes' - zeile['Domain'] = 'm75.t-cmp.de' + zeile['Domain'] = 'm75.t-cmp.de' elif zeile['Hostname'][4:6] == "76": zeile['ID\nMandanten'] = 'm76 Demo' zeile['Domain'] = 'm76.t-cmp.de' @@ -193,118 +199,118 @@ class MainUI(QDialog): # erbt von QDialog if zeile['Hostname'][6:8] == "00": zeile['Segment'] = 'm10 mgmt CMP Core' elif zeile['Hostname'][6:8] == "01": - zeile['Segment'] = 'm10 mgmt Infrastructure' + zeile['Segment'] = 'm10 mgmt Infrastructure' elif zeile['Hostname'][6:8] == "02": - zeile['Segment'] = 'm10 mgmt Administration' + zeile['Segment'] = 'm10 mgmt Administration' elif zeile['Hostname'][6:8] == "03": - zeile['Segment'] = 'm10 mgmt zLightsOut' + zeile['Segment'] = 'm10 mgmt zLightsOut' elif zeile['Hostname'][6:8] == "04": - zeile['Segment'] = 'm10 CTS' + zeile['Segment'] = 'm10 CTS' elif zeile['Hostname'][6:8] == "05": - zeile['Segment'] = 'm10-OSS' + zeile['Segment'] = 'm10-OSS' elif zeile['Hostname'][6:8] == "10": - zeile['Segment'] = 'm10 CMP2sIM' + zeile['Segment'] = 'm10 CMP2sIM' elif zeile['Hostname'][6:8] == "11": - zeile['Segment'] = 'm10 Intern-CMP iM0' + zeile['Segment'] = 'm10 Intern-CMP iM0' elif zeile['Hostname'][6:8] == "12": - zeile['Segment'] = 'm20 iM.1 Interner Mandant 1 (SB sehr hoch)' + zeile['Segment'] = 'm20 iM.1 Interner Mandant 1 (SB sehr hoch)' elif zeile['Hostname'][6:8] == "13": - zeile['Segment'] = 'm21 iM.2 Interner Mandant 2 (SB normal)' + zeile['Segment'] = 'm21 iM.2 Interner Mandant 2 (SB normal)' elif zeile['Hostname'][6:8] == "14": - zeile['Segment'] = 'm22 iM.3 Interner Mandant 3 (SB hoch)' + zeile['Segment'] = 'm22 iM.3 Interner Mandant 3 (SB hoch)' elif zeile['Hostname'][6:8] == "15": - zeile['Segment'] = 'm10 iM.4 Interner Mandant 4 (CNMS2CMP)' + zeile['Segment'] = 'm10 iM.4 Interner Mandant 4 (CNMS2CMP)' elif zeile['Hostname'][6:8] == "20": - zeile['Segment'] = 'VRD-Plattform (PAP-Anbindung)' + zeile['Segment'] = 'VRD-Plattform (PAP-Anbindung)' elif zeile['Hostname'][6:8] == "21": - zeile['Segment'] = 'VRD-Plattform (LightsOut + Basisinfrastruktur + Cache)' + zeile['Segment'] = 'VRD-Plattform (LightsOut + Basisinfrastruktur + Cache)' elif zeile['Hostname'][6:8] == "22": - zeile['Segment'] = 'VRD-Plattform (Admin)' + zeile['Segment'] = 'VRD-Plattform (Admin)' elif zeile['Hostname'][6:8] == "23": - zeile['Segment'] = 'VRD-Plattform (Basisinfrastruktur Mandant zentral)' + zeile['Segment'] = 'VRD-Plattform (Basisinfrastruktur Mandant zentral)' elif zeile['Hostname'][6:8] == "24": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "25": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "26": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "27": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "28": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "29": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "30": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "31": - zeile['Segment'] = 'VRD-Mandant (Infrastruktur)' + zeile['Segment'] = 'VRD-Mandant (Infrastruktur)' elif zeile['Hostname'][6:8] == "32": - zeile['Segment'] = 'VRD-Mandant (Admin)' + zeile['Segment'] = 'VRD-Mandant (Admin)' elif zeile['Hostname'][6:8] == "33": - zeile['Segment'] = 'VRD-Mandant (Anbindung)' + zeile['Segment'] = 'VRD-Mandant (Anbindung)' elif zeile['Hostname'][6:8] == "34": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "35": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "36": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "37": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "38": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "39": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "40": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "41": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "42": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "43": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "44": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "45": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "46": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "47": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "48": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "49": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "50": - zeile['Segment'] = 'Spare' + zeile['Segment'] = 'Spare' elif zeile['Hostname'][6:8] == "51": - zeile['Segment'] = 'VRD-Mandant (Kundensegment Infra)' + zeile['Segment'] = 'VRD-Mandant (Kundensegment Infra)' elif zeile['Hostname'][6:8] == "52": - zeile['Segment'] = 'VRD-Mandant (Kundensegment Admin)' + zeile['Segment'] = 'VRD-Mandant (Kundensegment Admin)' elif zeile['Hostname'][6:8] == "53": - zeile['Segment'] = 'VRD-Mandant (Kundensegment)' + zeile['Segment'] = 'VRD-Mandant (Kundensegment)' elif zeile['Hostname'][6:8] == "b0": - zeile['Segment'] = 'mgmt BS Übergang zum CMP Core' + zeile['Segment'] = 'mgmt BS Übergang zum CMP Core' elif zeile['Hostname'][6:8] == "ba": - zeile['Segment'] = 'mgmt BS Bon BTW' + zeile['Segment'] = 'mgmt BS Bon BTW' elif zeile['Hostname'][6:8] == "bb": - zeile['Segment'] = 'mgmt BS Bon LRS' + zeile['Segment'] = 'mgmt BS Bon LRS' elif zeile['Hostname'][6:8] == "bc": - zeile['Segment'] = 'mgmt BS Ber W55' + zeile['Segment'] = 'mgmt BS Ber W55' elif zeile['Hostname'][6:8] == "bd": - zeile['Segment'] = 'mgmt BS Ber PS' + zeile['Segment'] = 'mgmt BS Ber PS' elif zeile['Hostname'][6:8] == "be": - zeile['Segment'] = 'mgmt BS Ber NDA' + zeile['Segment'] = 'mgmt BS Ber NDA' elif zeile['Hostname'][6:8] == "bf": - zeile['Segment'] = 'mgmt BS HanTMX' + zeile['Segment'] = 'mgmt BS HanTMX' elif zeile['Hostname'][6:8] == "bg": - zeile['Segment'] = 'mgmt BS Ber DS' + zeile['Segment'] = 'mgmt BS Ber DS' elif zeile['Hostname'][6:8] == "c0": - zeile['Segment'] = 'mgmt CMP Übergang Internet' + zeile['Segment'] = 'mgmt CMP Übergang Internet' elif zeile['Hostname'][6:8] == "x1": - zeile['Segment'] = 'm10 SecA2sIM' + zeile['Segment'] = 'm10 SecA2sIM' + + ################################################################ - ################################################################ - # Genucenter - # HW Appliance - # Kryptierer - @@ -318,19 +324,18 @@ class MainUI(QDialog): # erbt von QDialog # Switch C__OBJTYPE__SWITCH - # virtuelle Maschine Objekttyp = C__OBJTYPE__VIRTUAL_SERVER # Terminalserver Objekttyp = C__OBJTYPE__TERMINALSERVER - - # wenn vho dann Objekttyp = C__OBJTYPE__VIRTUAL_HOST - + # wenn vho dann Objekttyp = C__OBJTYPE__VIRTUAL_HOST - - if zeile['Objekttyp (CMDB)'] == 'Genucenter': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__APPLIANCE' elif zeile['Objekttyp (CMDB)'] == 'HW Appliance': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__APPLIANCE' elif zeile['Objekttyp (CMDB)'] == 'Paketfilter / ALG': - zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__APPLIANCE' + zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__APPLIANCE' elif zeile['Objekttyp (CMDB)'] == 'Kryptierer': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SD_KRYPTIERER' elif zeile['Objekttyp (CMDB)'] == 'Server': - zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SERVER' + zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SERVER' elif zeile['Objekttyp (CMDB)'] == 'Switch': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SWITCH' elif zeile['Objekttyp (CMDB)'] == 'virtuelle Maschine': @@ -345,36 +350,26 @@ class MainUI(QDialog): # erbt von QDialog zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__SAN' elif zeile['Objekttyp (CMDB)'] == 'Router': zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__ROUTER' - - - + if zeile['Hostname'][1:3] == "vho": zeile['Objekttyp (CMDB)'] = 'C__OBJTYPE__VIRTUAL_HOST' - - ################################################################ - - # Einschub - if zeile['Montageort'][-1].isin('v', 'h'): - zeile['Einschub'] = zeile['Montageort'][-1] - - ################################################################ return zeile - def save_file_dialog(self): ic(self.dfb) options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog self.savefilename, _ = QFileDialog.getSaveFileName(self, - "Save File", "", "CSV(*.csv);;CSV Files(*.csv)", options = options) + "Save File", "", "CSV(*.csv);;CSV Files(*.csv)", + options=options) self.dfb.to_csv(self.savefilename, index=None, header=True, encoding='utf-8') print("Datei wurde gespeichert:", self.savefilename) - -if __name__ == "__main__" : - app = QApplication (sys.argv) + +if __name__ == "__main__": + app = QApplication(sys.argv) ui = MainUI() ui.show() app.exec_() diff --git a/Fehler.ui b/Fehler.ui new file mode 100644 index 00000000..bacc464b --- /dev/null +++ b/Fehler.ui @@ -0,0 +1,42 @@ + + + Fehler + + + + 0 + 0 + 569 + 294 + + + + Dialog + + + + + 430 + 230 + 113 + 32 + + + + OK + + + + + + 30 + 20 + 511 + 191 + + + + + + +