notebook vb

This commit is contained in:
2026-03-18 07:13:47 +01:00
parent a599b6741b
commit f2dc33a05e
23 changed files with 9102 additions and 13 deletions

View File

@@ -0,0 +1,108 @@
"""s04_presun_externi_db.py Přesun externích DB souborů z u:\ do u:\externi\
Spustit na Windows s ZAVŘENÝM Medicusem!
Co dělá:
1. Připojí se k hlavní medicus.fdb
2. Načte všechny záznamy z EXTERNI_DB
3. Pro každý záznam zkopíruje FDB soubor z původní lokace do u:\externi\
4. Aktualizuje EXTERNI_DB.PATH na novou lokaci
5. Vytiskne přehled výsledků
Po spuštění zkus v Medicusu otevřít přílohu pacienta mělo by to fungovat.
Pokud ne, zálohuj si databázi a spusť znovu (skript je idempotentní).
"""
import os
import shutil
import fdb
# ── Konfigurace ──────────────────────────────────────────────────────────────
MAIN_DB = r'c:\medicus 3\data\medicus.fdb'
CÍL_SLOŽKA = r'u:\externi'
# ─────────────────────────────────────────────────────────────────────────────
def main():
os.makedirs(CÍL_SLOŽKA, exist_ok=True)
print(f"Cílová složka: {CÍL_SLOŽKA}")
print()
print("Připojuji se k hlavní DB...")
conn = fdb.connect(
dsn=f'localhost:{MAIN_DB}',
user='SYSDBA',
password='masterkey',
charset='WIN1250'
)
cur = conn.cursor()
# Načti všechny záznamy z EXTERNI_DB
cur.execute("SELECT DBNAME, SERVER, PATH, HESLO FROM EXTERNI_DB ORDER BY DBNAME")
zaznamy = cur.fetchall()
print(f"Nalezeno {len(zaznamy)} záznamů v EXTERNI_DB:")
print()
ok = 0
preskoceno = 0
chyba = 0
for dbname, server, path_puvodni, heslo in zaznamy:
print(f" [{dbname}] {path_puvodni}")
# Název souboru (jen basename, bez cesty)
basename = os.path.basename(path_puvodni)
# Normalize: Medicus někdy ukládá s malým .fdb, někdy velkým .FDB
path_cil = os.path.join(CÍL_SLOŽKA, basename)
# Zkontroluj, jestli zdrojový soubor existuje
# (zkus obě varianty přípony)
path_src = None
for kandidat in [path_puvodni,
path_puvodni.replace('.fdb', '.FDB'),
path_puvodni.replace('.FDB', '.fdb')]:
if os.path.isfile(kandidat):
path_src = kandidat
break
if path_src is None:
print(f" ⚠ ZDROJOVÝ SOUBOR NENALEZEN: {path_puvodni} přeskakuji")
chyba += 1
continue
# Pokud je soubor už v cíli, přeskoč kopírování
if os.path.isfile(path_cil):
velikost = os.path.getsize(path_cil)
print(f" → Soubor již existuje v cíli ({velikost:,} B), přeskakuji kopírování")
else:
velikost = os.path.getsize(path_src)
print(f" → Kopíruji ({velikost:,} B)...", end=' ', flush=True)
shutil.copy2(path_src, path_cil)
print("OK")
# Aktualizuj PATH v EXTERNI_DB pokud se liší
if path_puvodni != path_cil:
cur.execute(
"UPDATE EXTERNI_DB SET PATH = ? WHERE DBNAME = ?",
(path_cil, dbname)
)
print(f" → EXTERNI_DB.PATH aktualizováno: {path_cil}")
else:
print(f" → PATH již ukazuje na cíl, není třeba měnit")
preskoceno += 1
ok += 1
conn.commit()
conn.close()
print()
print("=" * 60)
print(f"Hotovo! Zpracováno: {ok}, přeskočeno: {preskoceno}, chyb: {chyba}")
print()
if chyba > 0:
print("⚠ Některé soubory nebyly nalezeny viz výpis výše.")
print(" Pokud jsou to staré DB které již neexistují, nevadí to.")
print("Nyní spusť Medicus a zkus otevřít přílohu pacienta.")
if __name__ == '__main__':
main()