""" 002_detail_NES_NP_tabulky.py ============================ Průzkum klíčových tabulek neschopenky: - NES → hlavní tabulka pracovní neschopnosti - NP → pravděpodobně neschopenka podání - SOC_NEPRITOMNOST → sociální nepřítomnost Spustit na Windows: python "002_detail_NES_NP_tabulky.py" """ import fdb import datetime conn = fdb.connect( dsn=r'localhost:c:\medicus 3\data\medicus.fdb', user='SYSDBA', password='masterkey', charset='win1250' ) cur = conn.cursor() def serialize(v): if isinstance(v, (datetime.date, datetime.datetime)): return v.isoformat() if isinstance(v, datetime.time): return v.isoformat() if isinstance(v, bytes): # Pro BLOB zkusíme dekódovat jako text try: return v.decode('cp1250')[:80] except Exception: return f'' if v is None: return 'NULL' return str(v) def inspect_table(table): print(f"\n{'=' * 70}") print(f" TABULKA: {table}") print(f"{'=' * 70}") # Sloupce cur.execute(""" SELECT TRIM(rf.rdb$field_name), f.rdb$field_type, f.rdb$field_length FROM rdb$relation_fields rf JOIN rdb$fields f ON rf.rdb$field_source = f.rdb$field_name WHERE TRIM(rf.rdb$relation_name) = ? ORDER BY rf.rdb$field_position """, (table,)) cols = cur.fetchall() type_map = { 7: 'SMALLINT', 8: 'INTEGER', 10: 'FLOAT', 12: 'DATE', 13: 'TIME', 14: 'CHAR', 16: 'BIGINT', 27: 'DOUBLE', 35: 'TIMESTAMP', 37: 'VARCHAR', 261: 'BLOB', } col_names = [c[0] for c in cols] print("\nSloupce:") for c in cols: name, ftype, flen = c type_str = type_map.get(ftype, f'type#{ftype}') if flen and ftype in (14, 37): type_str += f'({flen})' print(f" {name:<30} {type_str}") # Počet řádků cur.execute(f'SELECT COUNT(*) FROM {table}') pocet = cur.fetchone()[0] print(f"\nCelkem řádků: {pocet}") if pocet == 0: return col_names # Ukázka 5 nejnovějších (pokud má datum sloupec) date_cols = [c[0] for c in cols if c[1] in (12, 35)] # DATE nebo TIMESTAMP order = f'ORDER BY {date_cols[0]} DESC' if date_cols else '' try: cur.execute(f'SELECT FIRST 5 * FROM {table} {order}') rows = cur.fetchall() print(f"\nUkázka (5 {'nejnovějších' if order else 'prvních'}):") for row in rows: print() for name, val in zip(col_names, row): s = serialize(val) if s != 'NULL': print(f" {name:<30} {s}") except Exception as e: print(f" Ukázka selhala: {e}") return col_names # ── Prozkoumáme klíčové tabulky ─────────────────────────────────────────────── for tbl in ['NES', 'NP', 'SOC_NEPRITOMNOST']: inspect_table(tbl) # ── Speciálně: aktivní PN ───────────────────────────────────────────────────── print(f"\n\n{'=' * 70}") print(" POKUS: aktivní záznamy v NES (konec NULL nebo v budoucnosti)") print(f"{'=' * 70}") dnes = datetime.date.today() # Nejdřív zjistíme sloupce NES cur.execute(""" SELECT TRIM(rf.rdb$field_name), f.rdb$field_type FROM rdb$relation_fields rf JOIN rdb$fields f ON rf.rdb$field_source = f.rdb$field_name WHERE TRIM(rf.rdb$relation_name) = 'NES' ORDER BY rf.rdb$field_position """) nes_cols = [(r[0], r[1]) for r in cur.fetchall()] nes_col_names = [c[0] for c in nes_cols] print(f"\nVšechny sloupce NES: {', '.join(nes_col_names)}") # Hledáme sloupce s datumem konce PN date_cols_nes = [c[0] for c in nes_cols if c[1] in (12, 35)] print(f"Datumové sloupce: {date_cols_nes}") # Zkusíme různé kandidátní sloupce pro "datum do" candidates_do = [c for c in nes_col_names if 'DO' in c or 'KONEC' in c or 'END' in c.upper()] candidates_od = [c for c in nes_col_names if 'OD' in c or 'ZACATEK' in c or 'VZNIK' in c or 'START' in c.upper()] candidates_pac = [c for c in nes_col_names if 'PAC' in c or 'IDPAC' in c] print(f"Kandidáti DATUM_DO: {candidates_do}") print(f"Kandidáti DATUM_OD: {candidates_od}") print(f"Kandidáti IDPAC: {candidates_pac}") # Ukázka posledních 10 záznamů NES seřazená dle prvního datumového sloupce if date_cols_nes: try: cur.execute(f'SELECT FIRST 10 * FROM NES ORDER BY {date_cols_nes[0]} DESC') rows = cur.fetchall() print(f"\nPosledních 10 záznamů NES (dle {date_cols_nes[0]} DESC):") for row in rows: print() for name, val in zip(nes_col_names, row): s = serialize(val) if s != 'NULL': print(f" {name:<30} {s}") except Exception as e: print(f"Selhalo: {e}") # ── NP tabulka – stejný rozbor ──────────────────────────────────────────────── print(f"\n\n{'=' * 70}") print(" POKUS: aktivní záznamy v NP") print(f"{'=' * 70}") cur.execute(""" SELECT TRIM(rf.rdb$field_name), f.rdb$field_type FROM rdb$relation_fields rf JOIN rdb$fields f ON rf.rdb$field_source = f.rdb$field_name WHERE TRIM(rf.rdb$relation_name) = 'NP' ORDER BY rf.rdb$field_position """) np_cols = [(r[0], r[1]) for r in cur.fetchall()] np_col_names = [c[0] for c in np_cols] print(f"\nVšechny sloupce NP: {', '.join(np_col_names)}") date_cols_np = [c[0] for c in np_cols if c[1] in (12, 35)] print(f"Datumové sloupce: {date_cols_np}") if date_cols_np: try: cur.execute(f'SELECT FIRST 10 * FROM NP ORDER BY {date_cols_np[0]} DESC') rows = cur.fetchall() print(f"\nPosledních 10 záznamů NP (dle {date_cols_np[0]} DESC):") for row in rows: print() for name, val in zip(np_col_names, row): s = serialize(val) if s != 'NULL': print(f" {name:<30} {s}") except Exception as e: print(f"Selhalo: {e}") cur.close() conn.close() print(f"\n{'=' * 70}") print("Hotovo.")