Initial commit
This commit is contained in:
36
examples/adhoc_report.py
Normal file
36
examples/adhoc_report.py
Normal file
@ -0,0 +1,36 @@
|
||||
# Copyright (c) 2023 Thomas Tuerk (kontakt@thomas-tuerk.de)
|
||||
#
|
||||
# This file is part of PyAPplus64 (see https://www.thomas-tuerk.de/de/pyapplus64).
|
||||
#
|
||||
# Use of this source code is governed by an MIT-style
|
||||
# license that can be found in the LICENSE file or at
|
||||
# https://opensource.org/licenses/MIT.
|
||||
|
||||
import PyAPplus64
|
||||
import applus_configs
|
||||
import pathlib
|
||||
|
||||
def main(confFile : pathlib.Path, outfile : str) -> None:
|
||||
server = PyAPplus64.applus.applusFromConfigFile(confFile)
|
||||
|
||||
# Einfache SQL-Anfrage
|
||||
sql1 = ("select Material, count(*) as Anzahl from ARTIKEL "
|
||||
"group by MATERIAL having MATERIAL is not null "
|
||||
"order by Anzahl desc")
|
||||
df1 = PyAPplus64.pandas.pandasReadSql(server, sql1)
|
||||
|
||||
# Sql Select-Statements können auch über SqlStatementSelect zusammengebaut
|
||||
# werden. Die ist bei vielen, komplizierten Bedingungen teilweise hilfreich.
|
||||
sql2 = PyAPplus64.SqlStatementSelect("ARTIKEL")
|
||||
sql2.addFields("Material", "count(*) as Anzahl")
|
||||
sql2.addGroupBy("MATERIAL")
|
||||
sql2.having.addConditionFieldIsNotNull("MATERIAL")
|
||||
sql2.order = "Anzahl desc"
|
||||
df2 = PyAPplus64.pandas.pandasReadSql(server, sql2)
|
||||
|
||||
# Ausgabe als Excel mit 2 Blättern
|
||||
PyAPplus64.pandas.exportToExcel(outfile, [(df1, "Materialien"), (df2, "Materialien 2")], addTable=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(applus_configs.serverConfYamlTest, "myout.xlsx")
|
26
examples/applus-server.yaml
Normal file
26
examples/applus-server.yaml
Normal file
@ -0,0 +1,26 @@
|
||||
# Copyright (c) 2023 Thomas Tuerk (kontakt@thomas-tuerk.de)
|
||||
#
|
||||
# This file is part of PyAPplus64 (see https://www.thomas-tuerk.de/de/pyapplus64).
|
||||
#
|
||||
# Use of this source code is governed by an MIT-style
|
||||
# license that can be found in the LICENSE file or at
|
||||
# https://opensource.org/licenses/MIT.
|
||||
|
||||
# Einstellung für die Verbindung mit dem APP-, Web- und DB-Server.
|
||||
# Viele der Einstellungen sind im APplus Manager zu finden
|
||||
|
||||
appserver : {
|
||||
server : "some-server",
|
||||
port : 2037,
|
||||
user : "asol.projects",
|
||||
env : "default-umgebung" # hier wirklich Umgebung, nicht Mandant verwenden
|
||||
}
|
||||
webserver : {
|
||||
baseurl : "http://some-server/APplusProd6/"
|
||||
}
|
||||
dbserver : {
|
||||
server : "some-server",
|
||||
db : "APplusProd6",
|
||||
user : "SA",
|
||||
password : "your-db-password"
|
||||
}
|
17
examples/applus_configs.py
Normal file
17
examples/applus_configs.py
Normal file
@ -0,0 +1,17 @@
|
||||
# Copyright (c) 2023 Thomas Tuerk (kontakt@thomas-tuerk.de)
|
||||
#
|
||||
# This file is part of PyAPplus64 (see https://www.thomas-tuerk.de/de/pyapplus64).
|
||||
#
|
||||
# Use of this source code is governed by an MIT-style
|
||||
# license that can be found in the LICENSE file or at
|
||||
# https://opensource.org/licenses/MIT.
|
||||
|
||||
import pathlib
|
||||
|
||||
basedir = pathlib.Path(__file__)
|
||||
configdir = basedir.joinpath("config")
|
||||
|
||||
serverConfYamlDeploy = configdir.joinpath("applus-server-deploy.yaml")
|
||||
serverConfYamlTest = configdir.joinpath("applus-server-test.yaml")
|
||||
serverConfYamlProd = configdir.joinpath("applus-server-prod.yaml")
|
||||
|
31
examples/check_dokumente.py
Normal file
31
examples/check_dokumente.py
Normal file
@ -0,0 +1,31 @@
|
||||
# Copyright (c) 2023 Thomas Tuerk (kontakt@thomas-tuerk.de)
|
||||
#
|
||||
# This file is part of PyAPplus64 (see https://www.thomas-tuerk.de/de/pyapplus64).
|
||||
#
|
||||
# Use of this source code is governed by an MIT-style
|
||||
# license that can be found in the LICENSE file or at
|
||||
# https://opensource.org/licenses/MIT.
|
||||
|
||||
import pathlib
|
||||
import PyAPplus64
|
||||
import applus_configs
|
||||
|
||||
def main(confFile : pathlib.Path, docDir:str, updateDB:bool) -> None:
|
||||
server = PyAPplus64.applus.applusFromConfigFile(confFile)
|
||||
|
||||
sql = PyAPplus64.sql_utils.SqlStatementSelect("ARTIKEL");
|
||||
sql.addFields("ID", "ARTIKEL", "DOCUMENTS");
|
||||
sql.where.addConditionFieldStringNotEmpty("DOCUMENTS");
|
||||
|
||||
for row in server.dbQueryAll(sql):
|
||||
doc = pathlib.Path(docDir + row.DOCUMENTS);
|
||||
if not doc.exists():
|
||||
print("Bild '{}' für Artikel '{}' nicht gefunden".format(doc, row.ARTIKEL))
|
||||
|
||||
if updateDB:
|
||||
upd = server.mkUseXMLRowUpdate("ARTIKEL", row.ID);
|
||||
upd.addField("DOCUMENTS", None);
|
||||
upd.update();
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(applus_configs.serverConfYamlTest, "somedir\\WebServer\\DocLib", False)
|
59
examples/copy_artikel.py
Normal file
59
examples/copy_artikel.py
Normal file
@ -0,0 +1,59 @@
|
||||
# Copyright (c) 2023 Thomas Tuerk (kontakt@thomas-tuerk.de)
|
||||
#
|
||||
# This file is part of PyAPplus64 (see https://www.thomas-tuerk.de/de/pyapplus64).
|
||||
#
|
||||
# Use of this source code is governed by an MIT-style
|
||||
# license that can be found in the LICENSE file or at
|
||||
# https://opensource.org/licenses/MIT.
|
||||
|
||||
# Dieses Script demonstriert, wie mit Hilfe PyAPplus64.duplicate
|
||||
# BusinessObjekte dupliziert werden können.
|
||||
# Dies ist sowohl in der gleichen DB als auch in anderen DBs möglich.
|
||||
# So kann z.B. ein einzelner Artikel aus Test in Prod kopiert werden.
|
||||
# Ebenso ist es möglich, die Daten in einer Datei zwischenzuspeichern und
|
||||
# später irgendwo anders einzuspielen.
|
||||
#
|
||||
# Dies ist für Administrationszwecke gedacht. Anwendungsbeispiel wäre,
|
||||
# dass ein Artikel mit langem Arbeitsplan und Stückliste im Test-System erstellt wird.
|
||||
# Viele der Positionen enthalten Nachauflöse-Scripte, die im Test-System
|
||||
# getestet werden. Diese vielen Scripte per Hand zu kopieren ist aufwändig
|
||||
# und Fehleranfällig und kann mit solchen Admin-Scripten automatisiert werden.
|
||||
|
||||
import pathlib
|
||||
import PyAPplus64
|
||||
import applus_configs
|
||||
import logging
|
||||
import yaml
|
||||
|
||||
|
||||
def main(confFile:pathlib.Path, artikel:str, artikelNeu:str|None=None) -> None:
|
||||
# Server verbinden
|
||||
server = PyAPplus64.applus.applusFromConfigFile(confFile)
|
||||
|
||||
# DuplicateBusinessObject für Artikel erstellen
|
||||
dArt = PyAPplus64.duplicate.loadDBDuplicateArtikel(server, artikel);
|
||||
|
||||
# DuplicateBusinessObject zur Demonstration in YAML konvertieren und zurück
|
||||
dArtYaml = yaml.dump(dArt);
|
||||
print(dArtYaml);
|
||||
dArt2 = yaml.load(dArtYaml, Loader=yaml.UnsafeLoader)
|
||||
|
||||
# Neue Artikel-Nummer bestimmen und DuplicateBusinessObject in DB schreiben
|
||||
# Man könnte hier genauso gut einen anderen Server verwenden
|
||||
if (artikelNeu is None):
|
||||
artikelNeu = server.nextNumber("Artikel")
|
||||
|
||||
if not (dArt is None):
|
||||
dArt.setFields({"artikel" : artikelNeu})
|
||||
res = dArt.insert(server);
|
||||
print(res);
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Logger Einrichten
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
# logger = logging.getLogger("PyAPplus64.applus_db");
|
||||
# logger.setLevel(logging.ERROR)
|
||||
|
||||
main(applus_configs.serverConfYamlTest, "my-artikel", artikelNeu="my-artikel-copy")
|
||||
|
182
examples/mengenabweichung.py
Normal file
182
examples/mengenabweichung.py
Normal file
@ -0,0 +1,182 @@
|
||||
# Copyright (c) 2023 Thomas Tuerk (kontakt@thomas-tuerk.de)
|
||||
#
|
||||
# This file is part of PyAPplus64 (see https://www.thomas-tuerk.de/de/pyapplus64).
|
||||
#
|
||||
# Use of this source code is governed by an MIT-style
|
||||
# license that can be found in the LICENSE file or at
|
||||
# https://opensource.org/licenses/MIT.
|
||||
|
||||
# Erzeugt Excel-Tabellen mit Werkstattaufträgen und Werkstattauftragspositionen mit Mengenabweichungen
|
||||
|
||||
import datetime
|
||||
import PyAPplus64
|
||||
import applus_configs
|
||||
import pandas as pd # type: ignore
|
||||
import pathlib
|
||||
from typing import *
|
||||
|
||||
def ladeAlleWerkstattauftragMengenabweichungen(
|
||||
server:PyAPplus64.APplusServer,
|
||||
cond:PyAPplus64.SqlCondition|str|None=None) -> pd.DataFrame:
|
||||
sql = PyAPplus64.sql_utils.SqlStatementSelect("WAUFTRAG w");
|
||||
sql.addLeftJoin("personal p", "w.UPDUSER = p.PERSONAL")
|
||||
|
||||
sql.addFieldsTable("w", "ID", "BAUFTRAG", "POSITION")
|
||||
sql.addFields("(w.MENGE-w.MENGE_IST) as MENGENABWEICHUNG")
|
||||
sql.addFieldsTable("w", "MENGE", "MENGE_IST",
|
||||
"APLAN as ARTIKEL", "NAME as ARTIKELNAME")
|
||||
sql.addFields("w.UPDDATE", "p.NAME as UPDNAME")
|
||||
|
||||
sql.where.addConditionFieldGe("w.STATUS", 5)
|
||||
sql.where.addCondition("abs(w.MENGE-w.MENGE_IST) > 0.001")
|
||||
sql.where.addCondition(cond)
|
||||
sql.order="w.UPDDATE"
|
||||
dfOrg = PyAPplus64.pandas.pandasReadSql(server, sql);
|
||||
|
||||
# Add Links
|
||||
df = dfOrg.copy();
|
||||
df = df.drop(columns=["ID"]);
|
||||
# df = df[['POSITION', 'BAUFTRAG', 'MENGE']] # reorder / filter columns
|
||||
|
||||
df['POSITION'] = PyAPplus64.pandas.mkHyperlinkDataframeColumn(dfOrg,
|
||||
lambda r: r.POSITION,
|
||||
lambda r: server.makeWebLinkWauftrag(
|
||||
bauftrag=r.BAUFTRAG, accessid=r.ID))
|
||||
df['BAUFTRAG'] = PyAPplus64.pandas.mkHyperlinkDataframeColumn(dfOrg,
|
||||
lambda r: r.BAUFTRAG,
|
||||
lambda r: server.makeWebLinkBauftrag(bauftrag=r.BAUFTRAG))
|
||||
|
||||
colNames = {
|
||||
"BAUFTRAG" : "Betriebsauftrag",
|
||||
"POSITION" : "Pos",
|
||||
"MENGENABWEICHUNG" : "Mengenabweichung",
|
||||
"MENGE" : "Menge",
|
||||
"MENGE_IST" : "Menge-Ist",
|
||||
"ARTIKEL" : "Artikel",
|
||||
"ARTIKELNAME" : "Artikel-Name",
|
||||
"UPDDATE" : "geändert am",
|
||||
"UPDNAME" : "geändert von"
|
||||
}
|
||||
df.rename(columns=colNames, inplace=True);
|
||||
|
||||
return df
|
||||
|
||||
|
||||
def ladeAlleWerkstattauftragPosMengenabweichungen(
|
||||
server : PyAPplus64.APplusServer,
|
||||
cond:PyAPplus64.SqlCondition|str|None=None) -> pd.DataFrame:
|
||||
sql = PyAPplus64.sql_utils.SqlStatementSelect("WAUFTRAGPOS w");
|
||||
sql.addLeftJoin("personal p", "w.UPDUSER = p.PERSONAL")
|
||||
|
||||
sql.addFieldsTable("w", "ID", "BAUFTRAG", "POSITION", "AG")
|
||||
sql.addFields("(w.MENGE-w.MENGE_IST) as MENGENABWEICHUNG")
|
||||
sql.addFieldsTable("w", "MENGE", "MENGE_IST", "APLAN as ARTIKEL")
|
||||
sql.addFields("w.UPDDATE", "p.NAME as UPDNAME")
|
||||
|
||||
sql.where.addConditionFieldEq("w.STATUS", 4)
|
||||
sql.where.addCondition("abs(w.MENGE-w.MENGE_IST) > 0.001")
|
||||
sql.where.addCondition(cond)
|
||||
sql.order="w.UPDDATE"
|
||||
|
||||
dfOrg = PyAPplus64.pandas.pandasReadSql(server, sql);
|
||||
|
||||
# Add Links
|
||||
df = dfOrg.copy();
|
||||
df = df.drop(columns=["ID"]);
|
||||
df['POSITION'] = PyAPplus64.pandas.mkHyperlinkDataframeColumn(dfOrg,
|
||||
lambda r: r.POSITION,
|
||||
lambda r: server.makeWebLinkWauftrag(
|
||||
bauftrag=r.BAUFTRAG, accessid=r.ID))
|
||||
df['BAUFTRAG'] = PyAPplus64.pandas.mkHyperlinkDataframeColumn(dfOrg,
|
||||
lambda r: r.BAUFTRAG,
|
||||
lambda r: server.makeWebLinkBauftrag(bauftrag=r.BAUFTRAG))
|
||||
df['AG'] = PyAPplus64.pandas.mkHyperlinkDataframeColumn(dfOrg,
|
||||
lambda r: r.AG,
|
||||
lambda r: server.makeWebLinkWauftragPos(
|
||||
bauftrag=r.BAUFTRAG, position=r.POSITION, accessid=r.ID))
|
||||
|
||||
# Demo zum Hinzufügen einer berechneten Spalte
|
||||
# df['BAUFPOSAG'] = PyAPplus64.pandas.mkDataframeColumn(dfOrg,
|
||||
# lambda r: "{}.{} AG {}".format(r.BAUFTRAG, r.POSITION, r.AG))
|
||||
|
||||
# Rename Columns
|
||||
colNames = {
|
||||
"BAUFTRAG" : "Betriebsauftrag",
|
||||
"POSITION" : "Pos",
|
||||
"AG" : "AG",
|
||||
"MENGENABWEICHUNG" : "Mengenabweichung",
|
||||
"MENGE" : "Menge",
|
||||
"MENGE_IST" : "Menge-Ist",
|
||||
"ARTIKEL" : "Artikel",
|
||||
"UPDDATE" : "geändert am",
|
||||
"UPDNAME" : "geändert von"
|
||||
}
|
||||
df.rename(columns=colNames, inplace=True);
|
||||
return df
|
||||
|
||||
def computeInYearMonthCond(field : str, year:int|None=None,
|
||||
month:int|None=None) -> PyAPplus64.SqlCondition | None:
|
||||
if not (year is None):
|
||||
if month is None:
|
||||
return PyAPplus64.sql_utils.SqlConditionDateTimeFieldInYear(field, year)
|
||||
else:
|
||||
return PyAPplus64.sql_utils.SqlConditionDateTimeFieldInMonth(field, year, month)
|
||||
else:
|
||||
return None
|
||||
|
||||
def computeFileName(year:int|None=None, month:int|None=None) -> str:
|
||||
if year is None:
|
||||
return 'mengenabweichungen-all.xlsx';
|
||||
else:
|
||||
if month is None:
|
||||
return 'mengenabweichungen-{:04d}.xlsx'.format(year);
|
||||
else:
|
||||
return 'mengenabweichungen-{:04d}-{:02d}.xlsx'.format(year, month);
|
||||
|
||||
def _exportInternal(server: PyAPplus64.APplusServer, fn:str,
|
||||
cond:Union[PyAPplus64.SqlCondition, str, None]) -> int:
|
||||
df1 = ladeAlleWerkstattauftragMengenabweichungen(server, cond)
|
||||
df2 = ladeAlleWerkstattauftragPosMengenabweichungen(server, cond)
|
||||
print ("erzeuge " + fn);
|
||||
PyAPplus64.pandas.exportToExcel(fn, [(df1, "WAuftrag"), (df2, "WAuftrag-Pos")], addTable=True)
|
||||
return len(df1.index) + len(df2.index)
|
||||
|
||||
def exportVonBis(server: PyAPplus64.APplusServer, fn:str,
|
||||
von:datetime.datetime|None, bis:datetime.datetime|None) -> int:
|
||||
cond = PyAPplus64.sql_utils.SqlConditionDateTimeFieldInRange("w.UPDDATE", von, bis)
|
||||
return _exportInternal(server, fn, cond)
|
||||
|
||||
def exportYearMonth(server: PyAPplus64.APplusServer,
|
||||
year:int|None=None, month:int|None=None) -> int:
|
||||
cond=computeInYearMonthCond("w.UPDDATE", year=year, month=month)
|
||||
fn = computeFileName(year=year, month=month)
|
||||
return _exportInternal(server, fn, cond)
|
||||
|
||||
def computePreviousMonthYear(cyear : int, cmonth :int) -> Tuple[int, int]:
|
||||
if cmonth == 1:
|
||||
return (cyear-1, 12)
|
||||
else:
|
||||
return (cyear, cmonth-1);
|
||||
|
||||
def computeNextMonthYear(cyear : int, cmonth :int) -> Tuple[int, int]:
|
||||
if cmonth == 12:
|
||||
return (cyear+1, 1)
|
||||
else:
|
||||
return (cyear, cmonth+1);
|
||||
|
||||
def main(confFile : str|pathlib.Path, user:str|None=None, env:str|None=None) -> None:
|
||||
server = PyAPplus64.applusFromConfigFile(confFile, user=user, env=env)
|
||||
|
||||
now = datetime.date.today()
|
||||
(cmonth, cyear) = (now.month, now.year)
|
||||
(pyear, pmonth) = computePreviousMonthYear(cyear, cmonth);
|
||||
|
||||
# Ausgaben
|
||||
exportYearMonth(server, cyear, cmonth) # Aktueller Monat
|
||||
exportYearMonth(server, pyear, pmonth) # Vorheriger Monat
|
||||
# export(cyear) # aktuelles Jahr
|
||||
# export(cyear-1) # letztes Jahr
|
||||
# export() # alles
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(applus_configs.serverConfYamlTest)
|
98
examples/mengenabweichung_gui.pyw
Normal file
98
examples/mengenabweichung_gui.pyw
Normal file
@ -0,0 +1,98 @@
|
||||
# Copyright (c) 2023 Thomas Tuerk (kontakt@thomas-tuerk.de)
|
||||
#
|
||||
# This file is part of PyAPplus64 (see https://www.thomas-tuerk.de/de/pyapplus64).
|
||||
#
|
||||
# Use of this source code is governed by an MIT-style
|
||||
# license that can be found in the LICENSE file or at
|
||||
# https://opensource.org/licenses/MIT.
|
||||
|
||||
import PySimpleGUI as sg # type: ignore
|
||||
import mengenabweichung
|
||||
import datetime
|
||||
import PyAPplus64
|
||||
import applus_configs
|
||||
import pathlib
|
||||
from typing import *
|
||||
|
||||
def parseDate (dateS:str) -> Tuple[datetime.datetime|None, bool]:
|
||||
if dateS is None or dateS == '':
|
||||
return (None, True)
|
||||
else:
|
||||
try:
|
||||
return (datetime.datetime.strptime(dateS, '%d.%m.%Y'), True)
|
||||
except:
|
||||
sg.popup_error("Fehler beim Parsen des Datums '{}'".format(dateS))
|
||||
return (None, False)
|
||||
|
||||
def createFile(server:PyAPplus64.APplusServer, fileS:str, vonS:str, bisS:str)->None:
|
||||
(von, vonOK) = parseDate(vonS)
|
||||
if not vonOK: return
|
||||
|
||||
(bis, bisOK) = parseDate(bisS)
|
||||
if not bisOK: return
|
||||
|
||||
if (fileS is None) or fileS == '':
|
||||
sg.popup_error("Es wurde keine Ausgabedatei ausgewählt.")
|
||||
return
|
||||
else:
|
||||
file = pathlib.Path(fileS)
|
||||
|
||||
c = mengenabweichung.exportVonBis(server, file.as_posix(), von, bis)
|
||||
sg.popup_ok("{} Datensätze erfolgreich in Datei '{}' geschrieben.".format(c, file))
|
||||
|
||||
|
||||
def main(confFile : str|pathlib.Path, user:str|None=None, env:str|None=None) -> None:
|
||||
server = PyAPplus64.applusFromConfigFile(confFile, user=user, env=env)
|
||||
|
||||
layout = [
|
||||
[sg.Text(('Bitte geben Sie an, für welchen Zeitraum die '
|
||||
'Mengenabweichungen ausgegeben werden sollen:'))],
|
||||
[sg.Text('Von (einschließlich)', size=(15,1)), sg.InputText(key='Von'),
|
||||
sg.CalendarButton("Kalender", close_when_date_chosen=True,
|
||||
target="Von", format='%d.%m.%Y')],
|
||||
[sg.Text('Bis (ausschließlich)', size=(15,1)), sg.InputText(key='Bis'),
|
||||
sg.CalendarButton("Kalender", close_when_date_chosen=True,
|
||||
target="Bis", format='%d.%m.%Y')],
|
||||
[sg.Text('Ausgabedatei', size=(15,1)), sg.InputText(key='File'),
|
||||
sg.FileSaveAs(button_text="wählen", target="File",
|
||||
file_types = (('Excel Files', '*.xlsx'),),
|
||||
default_extension = ".xlsx")],
|
||||
[sg.Button("Aktueller Monat"), sg.Button("Letzter Monat"),
|
||||
sg.Button("Aktuelles Jahr"), sg.Button("Letztes Jahr")],
|
||||
[sg.Button("Speichern"), sg.Button("Beenden")]
|
||||
]
|
||||
|
||||
systemName = server.scripttool.getSystemName() + "/" + server.scripttool.getMandant()
|
||||
window = sg.Window("Mengenabweichung " + systemName, layout)
|
||||
now = datetime.date.today()
|
||||
(cmonth, cyear) = (now.month, now.year)
|
||||
(pyear, pmonth) = mengenabweichung.computePreviousMonthYear(cyear, cmonth);
|
||||
(nyear, nmonth) = mengenabweichung.computeNextMonthYear(cyear, cmonth);
|
||||
|
||||
while True:
|
||||
event, values = window.read()
|
||||
if event == sg.WIN_CLOSED or event == 'Beenden':
|
||||
break
|
||||
if event == 'Aktueller Monat':
|
||||
window['Von'].update(value="01.{:02d}.{:04d}".format(cmonth, cyear));
|
||||
window['Bis'].update(value="01.{:02d}.{:04d}".format(nmonth, nyear));
|
||||
if event == 'Letzter Monat':
|
||||
window['Von'].update(value="01.{:02d}.{:04d}".format(pmonth, pyear));
|
||||
window['Bis'].update(value="01.{:02d}.{:04d}".format(cmonth, cyear));
|
||||
if event == 'Aktuelles Jahr':
|
||||
window['Von'].update(value="01.01.{:04d}".format(cyear));
|
||||
window['Bis'].update(value="01.01.{:04d}".format(cyear+1));
|
||||
if event == 'Letztes Jahr':
|
||||
window['Von'].update(value="01.01.{:04d}".format(cyear-1));
|
||||
window['Bis'].update(value="01.01.{:04d}".format(cyear));
|
||||
if event == 'Speichern':
|
||||
try:
|
||||
createFile(server, values.get('File', None),
|
||||
values.get('Von', None), values.get('Bis', None))
|
||||
except Exception as e:
|
||||
sg.popup_error_with_traceback("Beim Erzeugen der Excel-Datei trat ein Fehler auf:", e);
|
||||
|
||||
window.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(applus_configs.serverConfYamlProd)
|
Reference in New Issue
Block a user