5.4 KiB
5.4 KiB
MedicusWithClaude – poznámky pro Clauda
Stav projektu
- Zahájeno: 2026-03-13
- Cíl: průzkum Firebird DB Medicus → analýzy a reporty
- Zatím: úspěšně čteme i zapisujeme do DB, rozumíme RTF formátu
Bezpečnost
- Pracujeme na místní kopii – poškození DB nevadí, obnova = 5 minut
- Lze bez obav experimentovat, zapisovat testovací data atd.
- Testovací záznamy nemusíme mazat
Připojení k DB
import fdb
conn = fdb.connect(
dsn=r'localhost:c:\medicus 3\data\medicus.fdb',
user='SYSDBA',
password='masterkey',
charset='win1250'
)
- fdb verze 2.0.4, Python na PATH (prostý
pythonpříkaz)
O Medicusu
- Lékařský software pro praktického lékaře
- Vyvíjen od ~roku 2000, organicky rostl přidáváním funkcí
- Firebird 2.5 – nikdy nepřejdou na nový (desetitisíce instalací, 993 tabulek)
- Žádné zabezpečení DB – vše čitelné přes SYSDBA/masterkey
- Charset: win1250
DB fakta
- 993 tabulek celkem
- Charset: win1250
Klíčové tabulky
KAR – Kartotéka (základní kámen Medicusu)
- 6319 pacientů – všichni kdo kdy prošli ordinací
- Primární klíč: IDPAC (interní ID, používá se jako FK v ostatních tabulkách)
- Identifikace pacienta v ČR/pojišťovna: RODCIS (rodné číslo, bez lomítka, např. 7309208104)
- PRIJMENI, JMENO, TITUL, TITULZA, DATNAR, POHLAVI
- POJ – pojišťovna (3 znaky, např. 111 = VZP)
- Adresy: TRV* (trvalé), PRE* (přechodné)
- VYRAZEN – příznak vyřazeného pacienta
- HLAVDGN – hlavní diagnóza
DEKURS – záznamy z návštěv
- 172 068 záznamů
- IDPAC → vazba na KAR
- DATUM (date), CAS (time) – kdy
- DEKURS – text záznamu (BLOB, RTF nebo holý text)
- DGN1 – hlavní diagnóza (5 znaků, např. 'Z000 '), VDGN1-4 – vedlejší
- IDPRAC – který pracovník
- IDODD, IDUZI – oddělení/uživatel (u Buzalky = 2, 2, 6)
- IDSKUPINA, IDTYP – volitelné (NULL OK)
Základní schéma
KAR (kartotéka) ←IDPAC→ DEKURS (záznamy z návštěv)
Testovací pacient (uživatel)
- IDPAC = 9742 – Buzalka Vladimír, RC 7309208104, nar. 20.9.1973
- IDODD=2, IDPRAC=2, IDUZI=6 (použít při INSERT do DEKURS)
RTF formát v DEKURS
Základní struktura
{\rtf1\ansi\ansicpg1250\uc1\deff0\deflang1029
{\info{\bookmarks "popis","Typ:ID",číslo}} ← metadata Medicusu
{\fonttbl{\f0\fnil\fcharset238 Arial;}{\f2...Courier New;}{\f5...Symbol;}}
{\colortbl ;\red0\green0\blue255;\red255\green255\blue0;\red0\green128\blue0;\red192\green192\blue192;}
{\stylesheet{styly...}}
\uc1\pard\s10\plain... ← tělo záznamu
}
Barvy (\cfX)
\cf1= modrá (odkazy)\cf2= žlutá (highlight)\cf3= zelená\cf4= šedá (pozadí buněk tabulky\clcbpat4)
Velikost písma (\fsXX = XX/2 bodů)
\fs18= 9pt (tabulky)\fs20= 10pt (normální)\fs24= 12pt atd.
Řezy a formátování
\b= tučné,\i= kurzíva,\ul= podtržené\ql= vlevo,\qr= vpravo,\qc= střed
Styly (stylesheet)
cs15/cs16= Normálnícs20= Vkládaný textcs21= Záhlaví (italic)cs22/cs23= Odkaz (underline, modrá)s8/s10= Vlevo (paragraph styl)
Záložky (bookmarks v {\info})
- Klikatelné odkazy v Medicusu
- Formát:
"popis","Typ:ID",číslo - Typy:
Files:ID,MEDLAB:ID,Lab:ID,Ock:ID,VykA:ID
České znaky
- RTF hex escape v win1250:
\'e1=á,\'9e=ž,\'fd=ý atd.
Tabulky
- Plně funkční RTF tabulky (
\trowd,\cell,\cellx...) - Používají se např. pro laboratorní výsledky (viz ID=243082, 50KB)
Holý text (starší záznamy)
- Některé starší záznamy jsou prostý text bez RTF obálky
- Nutno detekovat: začíná na
{\\rtf= RTF, jinak plain text
Příklad minimálního RTF záznamu
{\rtf1\ansi\ansicpg1250\uc1\deff0\deflang1029
{\fonttbl{\f0\fnil\fcharset238 Arial;}}
{\colortbl ;\red0\green0\blue255;\red0\green128\blue0;\red0\green0\blue0;}
\pard\plain\f0\fs20 Text záznamu zde\par
}
INSERT do DEKURS – ověřený postup
import fdb, datetime
conn = fdb.connect(...)
cur = conn.cursor()
cur.execute('SELECT MAX(ID) FROM DEKURS')
next_id = cur.fetchone()[0] + 1
text = r'{\rtf1\ansi\ansicpg1250...\par' + '\n}' # raw string pro RTF!
cur.execute("""
INSERT INTO DEKURS (ID, IDPAC, IDODD, IDPRAC, IDUZI, DATUM, CAS, DEKURS, DGN1)
VALUES (?, ?, 2, 2, 6, ?, ?, ?, ?)
""", (next_id, idpac, datum, cas, text, dgn1))
conn.commit()
- RTF string musí být raw string (r'...') kvůli zpětným lomítkům
- DGN1 = 5 znaků s mezerou:
'Z000 ' - DATUM = datetime.date(...), CAS = datetime.time(...)
Soubory v projektu
explore_db.py– výpis všech tabulek a jejich sloupcůinspect_table.py– detailní info o konkrétní tabulce (arg: název tabulky)sample_dekurs.py– ukázky nejstarších a nejnovějších záznamůsample_dekurs2.py– celý text jednoho záznamusample_rtf.py– nejdelší záznamy pacienta (dle délky RTF)analyze_rtf.py– analýza RTF tagů v záznamuinsert_test.py– testovací INSERT do DEKURSCLAUDE_NOTES.md– tento soubor
Další postup (nápady)
- Napsat
rtf_to_text()pro extrakci čistého textu z dekurzů - Prozkoumat tabulky: LECH/LECD (léky?), POU (poukazy?), AMBULEKY (výkony?)
- První report – domluvit s uživatelem co chce vidět