Files
medicus/PNWithClaude/002_detail_NES_NP_tabulky.py
2026-03-25 17:32:12 +01:00

185 lines
6.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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'<blob {len(v)}B>'
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.")