commit 91dcece815a3f321269eef48ec27003dc5130099 Author: Wolfgang Wiedermann Date: Wed Jan 25 10:00:02 2023 +0100 Ausgangszustand Beispiel diff --git a/database.db b/database.db new file mode 100644 index 0000000..841c50d Binary files /dev/null and b/database.db differ diff --git a/excel_file_1.xlsx b/excel_file_1.xlsx new file mode 100644 index 0000000..32fc025 Binary files /dev/null and b/excel_file_1.xlsx differ diff --git a/excel_file_2.xlsx b/excel_file_2.xlsx new file mode 100644 index 0000000..3887b6b Binary files /dev/null and b/excel_file_2.xlsx differ diff --git a/merge_sample.py b/merge_sample.py new file mode 100644 index 0000000..a1a64a1 --- /dev/null +++ b/merge_sample.py @@ -0,0 +1,60 @@ +import xlrd +import sqlite3 + +SQLITE_FILE = "database.db" +con = sqlite3.connect(SQLITE_FILE) +#con.execute("create table pruefungsergebnis (pruefung_id int not null, mtknr int not null, note decimal(3,1), primary key(pruefung_id, mtknr))") +#con.commit() + +# Hier als Konstante, da in der Praxis wahrscheinlich aus Kontext in Webanwendung abgeleitet +PRUEFUNG_ID = 2 + +def read_file(filename): + # alle Validierungsschritte zugunsten eines übersichtlichen Beispiels eingespart + xlfile = xlrd.open_workbook(filename) + xlsheet = xlfile.sheet_by_index(0) + print(f"Importiere aus {filename} - {xlsheet.name}") + + data = { + int(xlsheet.cell(rx, 0).value): xlsheet.cell(rx, 1).value + for rx in range(1, xlsheet.nrows) + } + + return data + + +def is_already_set(con, pruefung_id, mtknr): + sql = "select count(*) as anzahl from pruefungsergebnis where pruefung_id = ? and mtknr = ?" + cur = con.cursor() + cur.execute(sql, (pruefung_id, mtknr)) + result = cur.fetchone()[0] + return result >= 1 + + +def merge_data(new_data): + update_sql = "update pruefungsergebnis set note = ? where pruefung_id = ? and mtknr = ?" + insert_sql = "insert into pruefungsergebnis (pruefung_id, mtknr, note) values (?, ?, ?)" + with con: # Transaktionsscope: Fehler führt zuverlässig zum Verwerfen aller Änderungen aus einer Excel-Datei + for mtknr in new_data.keys(): + note = new_data[mtknr] + if is_already_set(con, PRUEFUNG_ID, mtknr): + print(f"Wollen Sie die Note zu {mtknr} auf {note} aktualisieren? (j/n)") + answer = input() + if answer == 'j': + con.execute(update_sql, (note, PRUEFUNG_ID, mtknr)) + print(f"angepasst") + else: + print(f"wird nicht geändert") + else: + print(f"Mtknr: {mtknr} Note: {note}") + # im Falle von HISinOne wegen bereits bestehendem Anmeldesatz auch Update, so aber + # einfacher im Beispiel darzustellen... + con.execute(insert_sql, (PRUEFUNG_ID, mtknr, note)) + + + +f1 = read_file("excel_file_1.xlsx") +merge_data(f1) + +f2 = read_file("excel_file_2.xlsx") +merge_data(f2)