SQL-Registry-Zugriff (Python) #
Python-Beispiele für den Zugriff auf die EULANDA SQL-Registry. Die Registry-Struktur ist unter SQL-Registry beschrieben, die vollständige Prozedurreferenz unter SQL-Registry-Prozeduren.
Alle Beispiele auf dieser Seite verwendenimport win32com.clientund setzen das Paketpywin32voraus. Installation und Einrichtung sind unter Python beschrieben.
Verbindung herstellen #
Alle Beispiele verwenden eine ADO-Verbindung:
import win32com.client
conn = win32com.client.Dispatch("ADODB.Connection")
conn.Open(
"Provider=MSOLEDBSQL.1;"
"Integrated Security=SSPI;"
"Initial Catalog=EULANDA_MeinMandant;"
"Data Source=."
)
Wert lesen (cn_RegReadString) #
def reg_read_string(conn, path, valuename):
"""Liest einen String-Wert aus der SQL-Registry."""
sql = (
f"DECLARE @v nvarchar(max); "
f"EXEC cn_RegReadString N'{path}', N'{valuename}', @v OUT; "
f"SELECT @v AS Val"
)
rs = conn.Execute(sql)[0]
value = rs.Fields("Val").Value
rs.Close()
return value
Beispiel: Moduleinstellungen lesen #
# Datev-Ausgabeordner
ordner = reg_read_string(conn, r"\MODULES\Datev", "AusgabeOrdner")
print(f"Datev-Ordner: {ordner}")
# E-Mail-Provider
provider = reg_read_string(conn, r"\SYSTEM\Devices\EMail", "Provider")
print(f"E-Mail-Provider: {provider}")
# PDF-Provider
pdf = reg_read_string(conn, r"\SYSTEM\Devices\PDF", "Provider")
print(f"PDF-Provider: {pdf}")
Integer-Wert lesen (cn_RegReadInt) #
def reg_read_int(conn, path, valuename):
"""Liest einen Integer-Wert aus der SQL-Registry."""
sql = (
f"DECLARE @v int; "
f"EXEC cn_RegReadInt N'{path}', N'{valuename}', @v OUT; "
f"SELECT @v AS Val"
)
rs = conn.Execute(sql)[0]
value = rs.Fields("Val").Value
rs.Close()
return value
Wert schreiben (cn_RegWriteString) #
def reg_write_string(conn, path, valuename, value):
"""Schreibt einen String-Wert in die SQL-Registry."""
sql = (
f"EXEC cn_RegWriteString N'{path}', N'{valuename}', N'{value}'"
)
conn.Execute(sql)
Beispiel: Plugin-Konfiguration speichern #
from datetime import datetime
reg_write_string(conn, r"\VENDOR\MeinPlugin", "Version", "1.0")
reg_write_string(conn, r"\VENDOR\MeinPlugin", "LetzterLauf",
datetime.now().strftime("%Y-%m-%dT%H:%M:%S"))
Schlüssel prüfen (cn_RegOpenPath) #
def reg_key_exists(conn, path):
"""Prueft ob ein Registry-Schluessel existiert."""
sql = (
f"DECLARE @kid int; "
f"EXEC cn_RegOpenPath NULL, N'{path}', @kid OUT, 0, 0; "
f"SELECT @kid AS KeyId"
)
rs = conn.Execute(sql)[0]
key_id = rs.Fields("KeyId").Value
rs.Close()
return key_id is not None
# Pruefen ob ein Modul installiert ist
if reg_key_exists(conn, r"\VENDOR\ESOL\MODULES\DMS"):
print("DMS-Modul ist installiert")
else:
print("DMS-Modul nicht gefunden")
Alle Werte eines Schlüssels auflisten #
def reg_list_values(conn, path):
"""Listet alle Werte eines Registry-Schluessels auf."""
sql = (
f"DECLARE @kid int; "
f"EXEC cn_RegOpenPath NULL, N'{path}', @kid OUT, 0, 0; "
f"SELECT Name, "
f" CASE ValType WHEN 3 THEN CAST(ValInt AS nvarchar(max)) "
f" WHEN 5 THEN CAST(ValFloat AS nvarchar(max)) "
f" ELSE ISNULL(ValString, ValText) END AS Wert "
f"FROM Registry WHERE ParentId = @kid AND IsKey = 0 "
f"ORDER BY Name"
)
rs = conn.Execute(sql)[0]
result = {}
while not rs.EOF:
result[rs.Fields("Name").Value] = rs.Fields("Wert").Value
rs.MoveNext()
rs.Close()
return result
# Alle Datev-Einstellungen anzeigen
for name, wert in reg_list_values(conn, r"\MODULES\Datev").items():
print(f" {name} = {wert}")
Praxisbeispiel: Plugin-Konfiguration verwalten #
Ein vollständiges Beispiel, das zeigt, wie ein Python-Plugin seine Konfiguration in der SQL-Registry verwaltet:
import win32com.client
from datetime import datetime
class EulandaRegistry:
"""Hilfklasse fuer den Zugriff auf die EULANDA SQL-Registry."""
def __init__(self, connection_string):
self.conn = win32com.client.Dispatch("ADODB.Connection")
self.conn.Open(connection_string)
def read(self, path, name, default=None):
sql = (
f"DECLARE @v nvarchar(max); "
f"EXEC cn_RegReadString N'{path}', N'{name}', @v OUT; "
f"SELECT @v AS Val"
)
rs = self.conn.Execute(sql)[0]
value = rs.Fields("Val").Value
rs.Close()
return value if value is not None else default
def write(self, path, name, value):
safe_value = str(value).replace("'", "''")
sql = f"EXEC cn_RegWriteString N'{path}', N'{name}', N'{safe_value}'"
self.conn.Execute(sql)
def key_exists(self, path):
sql = (
f"DECLARE @kid int; "
f"EXEC cn_RegOpenPath NULL, N'{path}', @kid OUT, 0, 0; "
f"SELECT @kid AS KeyId"
)
rs = self.conn.Execute(sql)[0]
result = rs.Fields("KeyId").Value is not None
rs.Close()
return result
def close(self):
if self.conn.State == 1:
self.conn.Close()
# Verwendung
reg = EulandaRegistry(
"Provider=MSOLEDBSQL.1;Integrated Security=SSPI;"
"Initial Catalog=EULANDA_MeinMandant;Data Source=."
)
# Konfiguration lesen
format_val = reg.read(r"\MODULES\Grundwerte\Xfacture", "Format", "XRechnung")
email = reg.read(r"\MODULES\Grundwerte\Xfacture", "EMail", "")
print(f"Format: {format_val}")
print(f"E-Mail: {email}")
# E-Mail-Provider pruefen
provider = reg.read(r"\SYSTEM\Devices\EMail", "Provider", "None")
if provider == "None":
print("Warnung: Kein E-Mail-Provider konfiguriert")
# Eigene Einstellungen speichern
reg.write(r"\VENDOR\MeinPythonPlugin", "Version", "1.0")
reg.write(r"\VENDOR\MeinPythonPlugin", "LetzterLauf",
datetime.now().strftime("%Y-%m-%dT%H:%M:%S"))
reg.close()
Siehe auch #
- SQL-Registry – Aufbau und Struktur
- SQL-Registry-Prozeduren – Vollständige Prozedurreferenz
- Plugins – Plugin-Registrierung
- Scripting Host – COM-Zugriff auf EULANDA