notebook vb
This commit is contained in:
108
MedicusWithClaude/s04_presun_externi_db.py
Normal file
108
MedicusWithClaude/s04_presun_externi_db.py
Normal 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()
|
||||
Reference in New Issue
Block a user