BEDINGTE Freigabe der macOS Version Sequoia für tomedo®
Alle Hinweise und Informationen finden Sie unter folgendem Link.
Ich möchte eine Aktionskette erstellen, bei der nur 2 Dinge passieren:
1.) Apple Script wird ausgeführt mit Businesslogik. Am Schluss ist in der Variable "retval" ein String.
2.) ein Karteieintrag mit ANA wird erstellt, und das was in der variable "retval" drinen steht wird als vorbefüllung genommen.

Wie wäre das umsetzbar? Ich kann zwar im Apple Script auf Briefkommandos zugreifen und diese dann im weiteren Script verwenden, aber ich weiß jetzt nicht wie ich ein Ergebnis aus dem Apple Script zur weiteren Verwendung in der Aktionskette verfügbar mache. Gibt es die Möglichkeiten gewisse Briefkommandos aus Apple Script heraus zu befüllen? Ich könnte das ergebnis auch in die zwischenablage speichern, aber es gibt ja kein Briefkommando um einen Wert aus der Zwischenablage zu bekommen.

Das ganze ist nur ein Versuch für ein größeres Projekt. Also ein Workaround mittels Command+K und dann Tastatureingaben zu machen ist hier nicht zielführend.

ich danke schon vorab für input und hilfe :)
Gefragt in Frage von (150 Punkte)
–1 Punkt

1 Antwort

Guten Abend,

an diesem Problem knabbere ich auch immer wieder. Leider gibt es (meines Wissens nach) keine Möglichkeit, Inhalte aus einem AppleScript auf regulärem Weg wieder in tomedo direkt nutzbar zu machen.

Bisher habe ich für meine Zwecke auch nur die Variante der Befüllung der Zwischenablage in AppleScript mit dem zu transferierenden Inhalt und dann mit der Tastatursteuerung per AppleScript und dem Übertragen der Zwischenablage per CMD-V z.B. in einen neu angelegten Karteieintrag nutzen können. Auf diese Weise können ja auch sehr große Textabschnitte übertragen werden, es ist aber eine programmiertechnische "Krücke". 

Anders als von Ihnen vorgesehen, wird also der Karteieintrag nicht durch die Aktionskette angelegt, sondern noch im AppleScript. Ihr 2. Schritt ist also Teil des AppleScripts.

-- hier wird Ihre Variable retval per Business-Logik (was ist das?) gefüllt
set retval to "Das ist der Inhalt der Variable retval.“

-- Befüllen der Zwischenablage mit dem Inhalt der Variable retval
set the clipboard to retval as text

-- um sicherzustellen, dass das richtige Patientenfenster geöffnet ist, wird tomedo mit der gewünschten Patienten-ID aufgerufen
open location "tomedo://patient#$[pid]$"

-- CMD + K (zum Öffnen des Karteifensters des Patienten
tell application "System Events"
    keystroke "k" using command down
end tell

-- ANA als Tastatureingabe
tell application "System Events"
    keystroke "ANA"
end tell

-- Enter Taste eingeben
tell application "System Events"
    key code 36 -- Enter-Taste
end tell

-- 0,5 Sekunden warten / kann evtl. abgekürzt werden
delay 0.5

-- CMD + V (Einfügen)
tell application "System Events"
    keystroke "v" using command down
end tell

Wenn Sie Daten in tomedo abspeichern wollen, die nicht auf einen einzelnen Patienten bezogen sind, könnten Sie auch einen "Dummy"-Patienten als Speicher / Stack nutzen. Je nach Anwendungsfall könnte hier dann die Information in passenden Karteieinträgen abgelegt werden, die dann ein Auslesen per Briefkommando erlauben würde. 

Alternativ wäre ein Generieren einer Datei per AppleScript oder Python mit den gewünschten Inhalten und Ablage in einen von tomedo überwachten Lauschordner möglich. Auf diese Weise könnten auch Inhalte in definierte Karteieinträge eingelesen werden, ohne die Tastaturtricks mit CMD-V einsetzen zu müssen. 

Beantwortet von (7.2k Punkte)
Bearbeitet von
0 Punkte

Vielen Dank für die ausführliche Antwort. Ich habe durchaus schon sehr komplexe skripte so umgesetzt. Aber das ist umso komplexer das wird sehr fehleranfällig. Denn wenn ein Popup genau aufgeht wenn man gerade dabei ist tastatureingaben zu machen ist das problematisch. Die Idee mit dem Dummy-Patient gefällt mir, allerdings weiß ich dann eigentlich nicht wie ich auf Variablen des Dummypatienten sowohl mit Briefkommandos als auch per Apple Script zugreifen kann wenn ich in einer ganz anderen Kartei bin.

Aufgrund meiner komplexen Probleme, habe ich diese "einfache" Frage gestellt, um nicht auf andere Punkte abzulenken. Folgend ein paar Beispiele.

Hier ist ein Beispiel meines COVID Scriptes. Das ist eher ein schlechteres Beispiel, weil es sehr statisch ist und daher eigentlich auch als aktionskette alleine Umgesetzt werden kann. ich hätte halt gerne die funktion set_therapie und set_anamnese gerne nur als Variable übergeben.

-- Beispiel-Diagnose, Leistung, Therapie und Anamnese
set diagnoseText to "ÖIP Covid"
set leistungText to "COVIA"
set therapieText to "Covidimpfung i.m. verabreicht"
set anamneseText to "Charge: LN0604"

-- Funktion, um das Fenster zu fokussieren, das mit "Kartei" beginnt
on focusKarteiWindow()
    tell application "System Events"
        tell application process "tomedo"
            -- Schleife durch alle Fenster und finde das erste, das mit "Kartei" beginnt
            repeat with w in windows
                if (name of w) starts with "Kartei" then
                    -- Fokussiere das Fenster
                    perform action "AXRaise" of w
                    exit repeat -- Beende die Schleife nach dem ersten Treffer
                end if
            end repeat
        end tell
    end tell
end focusKarteiWindow

-- Rufe die Funktion zum Fokussieren des "Kartei"-Fensters auf
focusKarteiWindow()

-- Diagnose setzen
set_diagnose(diagnoseText)

-- Leistung setzen
set_leistung(leistungText)

-- Therapie setzen
set_therapie(therapieText)

-- Anamnese setzen
set_anamnese(anamneseText)

-- Funktion "set_diagnose"
on set_diagnose(diagnoseText)
    tell application "System Events"
        -- Command + K drücken
        keystroke "k" using command down
        delay 0.2
        -- Punkt eingeben
        keystroke "."
        delay 0.4
        -- Tabulator-Taste drücken
        keystroke tab
        delay 0.2
        -- Diagnose-Text eingeben
        keystroke diagnoseText
        delay 0.2
        -- Tabulator-Taste drücken
        keystroke tab
        delay 0.2
        -- Enter-Taste drücken
        keystroke return
        delay 0.2
    end tell
end set_diagnose

-- Funktion "set_leistung"
on set_leistung(leistungText)
    tell application "System Events"
        -- Command + K drücken
        keystroke "k" using command down
        delay 0.2
        -- Raute eingeben
        keystroke "#"
        delay 0.2
        -- Leistungstext eingeben
        keystroke leistungText
        delay 0.2
        -- Enter-Taste drücken
        keystroke return
        delay 0.2
    end tell
end set_leistung

-- Funktion "set_therapie"
on set_therapie(therapieText)
    tell application "System Events"
        -- Command + K drücken
        keystroke "k" using command down
        delay 0.2
        -- "THE " eingeben
        keystroke "THE "
        delay 0.2
        -- Therapie-Text eingeben
        keystroke therapieText
        delay 0.2
        -- Enter-Taste drücken
        keystroke return
        delay 0.2
    end tell
end set_therapie

-- Funktion "set_anamnese"
on set_anamnese(anamneseText)
    tell application "System Events"
        -- Command + K drücken
        keystroke "k" using command down
        delay 0.2
        -- "ANA " eingeben
        keystroke "ANA "
        delay 0.2
        -- Anamnese-Text eingeben
        keystroke anamneseText
        delay 0.2
        -- Enter-Taste drücken
        keystroke return
        delay 0.2
    end tell
end set_anamnese

damit wissen dann meine assistentinnen dass sie noch nach der Impfung das in den elektronischen Impfpass eintragen müssen, den ich ja nicht per Aktionskette ansteuern kann. Erst dann wird das Todo Dokumentation beendet.

Aber ich habe auch scripte bei denen zuvor eine Unterscheidung nach jeweiliger Kasse stattfindet. Zum Beispiel in diesem Script. Hier muss ein "Ordinations-Zähler" auf den Schein übertragen werden. Das ist sehr spezifisch und betrifft nur die Ordinationen in Wien, nicht mal im restlichen Österreich. Dabei ist es z.b. bei der ÖGK notwendig dass folgendes passiert: 8a, bei erstbesuch 8b bei zweitbesuch usw. bei den anderen kassen ist es bei ersten Besuch immer A1 und dann A2. Dafür hat tomedo aktuell keine logik und es gibt auch noch keine Möglichkeiten von aktionsketten zum schreiben auf den schein. Aber Wenn der Schein einmal beschreibbar wäre, dann könnte ich das auch nicht umsetzten, weil ich ja die kalkulierte Leistung nicht als Kommando übertragen kann.

(ich habe das Zeichenlimit überschritten - daher musste ich das codebeispiel vorerst löschen)

Daher limitiert mich aktuell die Tatsache, dass ich zwischen Apple Script und aktionsketten keine Variablen übertragen kann. Cool wäre es zum Beispiel gewesen, wenn ich $[&besuch.stringCol2]$ aus Apple Script beschreiben hätte können. Denn diese kann sogar von der Aktionskette rückgeschrieben werden.

Ich hatte ja gehofft ich habe was übersehen wäre aber cool wenn man ein &api bekommen könnte, das über $[&api.var]$ ausgelesen und beschrieben werden könnte. oder eben irgend eine andere Lösung wo man von außen Werte in die Software bekommt ohne Lauscher.

Und weil meine Ansätze sehr komplex sind, würde ich gerne nur das obere Beispiel irgendwie gelöst wissen um dann weiter arbeiten zu können :) Denn ich würde gerne nach komplexer Businesslogik auch Todos setzten oder eben auch Marker setzten wollen.

Oha, da sind Sie ja schon sehr tief eingetaucht. Respekt!

Eine Idee hätte ich noch für Sie:

Für die Zählfunktion kennen Sie vielleicht den Zähler innerhalb eines CKE, oder? Ich könnte mir vorstellen, dass man die Wiener Spezialitäten nicht auf dem Schein, wohl aber in einem CKE abbilden kann. Das Übertragen auf den Schein wäre dann noch händisch notwendig.

Für sehr viele Probleme wäre eine Vorbefüllungsvariable $[Zwischenablage]$ hilfreich.

Wir hoffen / warten also auf die API.

Schöne Grüße nach Wien.

klingt gut, aber da das schon so gut funktioniert, habe ich mich entschlossen es mit tastatureingaben zu lassen. Vielleicht hilft da auch was für sie:

-- Copyright Dr. Helmut M. Steinbrecher MSc. BSc. - office@praxis23.at
-- Alle Rechte vorbehalten - Verwenden nur auf eigene Gefahr und erst nach Erlaubnis durch den Autor

-- Variablen aus tomedo
set patname to "$[patient_id]$" --patientenid
set tagdatum to "$[d K MN]$" -- datum der kartei unten
set gkk to "$[kasse_name]$" -- Kassenname
set leistungen to "$[l %d;%nr]$" --Liste der Leistungen
set patalter to $[palter]$ -- Alter Patient

-- Liste der relevanten Leistungsnummern für "ÖGK"
set relevanteLeistungenOEGK to {"8a", "8b", "8c", "8d", "8e", "8f", "8g", "8h", "8i", "3", "4", "6", "9", "37", "58"}

-- Liste der relevanten Leistungsnummern für andere Kassen
set relevanteLeistungenAndere to {"A1", "B1", "A2", "B2"}

-- Hauptlogik
if gkk starts with "ÖGK" then
    -- Logik für ÖGK
    if leistungenAmTagdatumVorhanden(tagdatum, leistungen, relevanteLeistungenOEGK) then
        display dialog "P23 Tally: erledigt"
    else
        set naechsteLeistung to findeNaechsteLeistungOEGK(leistungen, relevanteLeistungenOEGK)
        if naechsteLeistung = "8a" then
            display dialog "P23 Tally: Achtung - Es wird 17 und bei Kindern <6 auch 84 gesetzt. Bei Vertretungen dann bitte 17 löschen."
            set_leistung("17", 1)
            if patalter < 6 then
                set_leistung("84", 1)
            end if
        end if
        set_leistung(naechsteLeistung, 1)
    end if
else
    -- Logik für andere Kassen
    if leistungenAmTagdatumVorhanden(tagdatum, leistungen, relevanteLeistungenAndere) then
        display dialog "P23 Tally: erledigt"
    else
        set naechsteLeistung to findeNaechsteLeistungAndere(leistungen, relevanteLeistungenAndere)
        set_leistung(naechsteLeistung, 1)
    end if
end if

-- Funktion zum Überprüfen, ob eine relevante Leistung am Tagdatum vorhanden ist
on leistungenAmTagdatumVorhanden(tagdatum, leistungen, relevanteLeistungen)
    set leistungenListe to paragraphs of leistungen
    set vorhanden to false
    repeat with einLeistung in leistungenListe
        set {leistungsDatum, leistungsCode} to my splitLeistung(einLeistung)
        if leistungsDatum is tagdatum and (leistungsCode is in relevanteLeistungen) then
            set vorhanden to true
            exit repeat
        end if
    end repeat
    return vorhanden
end leistungenAmTagdatumVorhanden

-- Funktion zur Ermittlung der nächsten verfügbaren Leistung für ÖGK
on findeNaechsteLeistungOEGK(leistungen, relevanteLeistungen)
    set vorhandeneBuchstaben to {}
    set leistungenListe to paragraphs of leistungen
    repeat with einLeistung in leistungenListe
        set {leistungsDatum, leistungsCode} to my splitLeistung(einLeistung)
        if leistungsCode is in relevanteLeistungen then
            if leistungsCode starts with "8" then
                try
                    set endeBuchstabe to character 2 of leistungsCode
                    set endeBuchstabe to my toLowerCase(endeBuchstabe)
                    if endeBuchstabe is in {"a", "b", "c", "d", "e", "f", "g", "h", "i"} then
                        set end of vorhandeneBuchstaben to endeBuchstabe
                    end if
                end try
            end if
        end if
    end repeat

    set alleBuchstaben to {"a", "b", "c", "d", "e", "f", "g", "h", "i"}
    repeat with buchstabe in alleBuchstaben
        if buchstabe is not in vorhandeneBuchstaben then
            return "8" & buchstabe
        end if
    end repeat
    return "8i"
end findeNaechsteLeistungOEGK

-- Funktion zur Ermittlung der nächsten verfügbaren Leistung für andere Kassen
on findeNaechsteLeistungAndere(leistungen, relevanteLeistungen)
    set vorhandenA1B1 to false
    set leistungenListe to paragraphs of leistungen
    repeat with einLeistung in leistungenListe
        set {leistungsDatum, leistungsCode} to my splitLeistung(einLeistung)
        if leistungsCode is "A1" or leistungsCode is "B1" then
            set vorhandenA1B1 to true
        end if
    end repeat

    if vorhandenA1B1 then
        return "A2"
    else
        return "A1"
    end if
end findeNaechsteLeistungAndere

-- Funktion zum Splitten einer Leistung in Datum und Code
on splitLeistung(leistung)
    set AppleScript's text item delimiters to ";"
    set leistungList to text items of leistung
    set AppleScript's text item delimiters to ""
    if (count of leistungList) ≥ 2 then
        set leistungsDatum to my trimWhitespace(item 1 of leistungList)
        set leistungsCode to my trimWhitespace(item 2 of leistungList)
        set leistungsCode to my toLowerCase(leistungsCode)
    else
        set leistungsDatum to ""
        set leistungsCode to ""
    end if
    return {leistungsDatum, leistungsCode}
end splitLeistung

-- Funktion zum Entfernen von führenden und nachfolgenden Leerzeichen
on trimWhitespace(s)
    set s to s as string
    repeat while s begins with " " or s begins with tab
        set s to text 2 thru -1 of s
        if s is "" then exit repeat
    end repeat
    repeat while s ends with " " or s ends with tab
        set s to text 1 thru -2 of s
        if s is "" then exit repeat
    end repeat
    return s
end trimWhitespace

-- Funktion zum Umwandeln eines Zeichens in Kleinbuchstaben
on toLowerCase(textToConvert)
    return do shell script "echo " & quoted form of textToConvert & " | tr '[:upper:]' '[:lower:]'"
end toLowerCase

-- Funktion zum Fokussieren des Fensters mit "Kartei"
on focusKarteiWindow()
    tell application "System Events"
        tell application process "tomedo"
            repeat with w in windows
                if (name of w) starts with "Kartei" then
                    perform action "AXRaise" of w
                    exit repeat
                end if
            end repeat
        end tell
    end tell
end focusKarteiWindow

-- Angepasste set_leistung Funktion mit zwei Parametern
on set_leistung(leistungsnummer, anzahl)
    focusKarteiWindow()
    tell application "System Events"
        -- Command + K drücken
        keystroke "k" using command down
        delay 0.2
        
        -- Raute eingeben
        keystroke "#"
        delay 0.2
        -- Leistungstext eingeben
        keystroke leistungsnummer
        delay 0.2
        
        if anzahl > 1 then
            -- Tab-Taste drücken, um zum Anzahlenfeld zu gelangen
            keystroke tab
            delay 0.2
            -- Anzahl eingeben
            keystroke (anzahl as string)
            delay 0.2
        end if
        
        -- Enter-Taste drücken
        keystroke return
        delay 0.2
    end tell
end set_leistung

-- Fokussiere das "Kartei"-Fenster
focusKarteiWindow()

-- Zum Abschluss Command+K und dann Escape drücken
tell application "System Events"
    keystroke "k" using command down
    delay 0.2
    key code 53 -- Escape-Taste
end tell

 

Toller Ansatz

Das Skript automatisiert einen Teil des Dokumentations- und Abrechnungsprozesses in tomedo. Es minimiert menschliche Fehler, beschleunigt die Leistungserfassung und stellt sicher, dass die relevanten Vorgaben für verschiedene Krankenkassen eingehalten werden.

Ich habe es anders gelöst, indem ich mit der Dokumentation die Leistungen eintrage. Das ist allerdings extrem aufwändig zu konfigurieren, aber zu Beginn wußte ich nicht, welches Potential Tomedo in Verbindung mit den Skripten hat.
Hi,

spannend! Ich habe es der Verknüpfung Dokumentation (also Anlage eines Karteieintrages) und Leistungsziffer gelöst. Komplexer Probleme mache ich mit den automatisierten Markern, die entsprechende Leistungseinträge via AK auslösen.

Ich habe mir zwischendrin mal Keyboard Maestro angesehen, aber mir fehlt die Zeit, um mich genau damit zu  beschäftigen. Damit wird ein Teil der Programmierarbeit durch Zusammenklicken übernommen - Herr Steinbrecher scheint ja knietief in Applescript zu stecken :-)

 

-js
Ich habe Lösungen für meine Probleme gesucht und sie in AppleScript gefunden :) Aber leider scheitere ich an der Kommunikation zwischen den Aktionsketten und den AppleScripts... Etwas das essentiell für weitere Umsetzungen für mich ist.

Interessant wie ihr die Probleme gelöst habt. man kommt immer wieder auf neue Ideen :)
Also ich weiß ja nicht, ob das hilft, aber tomedo ist ja auch direkt skriptbar. Ich hab eben mal über den Scripteditor in das Funktionsverzeichnis reingeschaut, da ist immerhin u.a. eine Patientensuche initiierbar mit den Parametern Name, Geb.dat, Adresse, Tel.nr., etc.

Je nach dem wie tomedo auf diese Scriptaufforderung reagiert, könnte das ja ein Übergabepukt sein?
da gibt es genau 3 Funktionen. Die Möglichkeit Aktionsketten von außen aufzurufen ist dabei sehr genial, aber solange man keine Kommunikation zwischen den Apple Scripts und den Aktionsketten herstellen kann ist das leider problematisch. Denn ich kann zwar eine Aktionskette aufrufen, aber ich kann dieser keine Parameter übergeben. Damit kann ich zwar was auslösen, aber es passiert immer das gleiche. Dennoch die Möglichkeit mit tomedo://patient#ID bietet die möglichkeit aus Excel heraus direkt eine Kartei zu öffnen. oder aus dem browser mit <a href="tomedo://patient#ID">Kartei ID</a>
Vielleicht bringt die geplante API von tomedo da was?

 

-js
Das Aufrufen der von Aktionsketten per AppleScript stößt leider auch recht schnell an Grenzen, da dies nur funktioniert, wenn nicht schon eine andere AK läuft. Der Weg AK ruft AppleScript auf > macht dort magische Dinge > ruft AK auf, geht daher leider nicht.

Die Funktion ist wohl eher für zeitgesteuerte Aktionskettenaufrufe sinnvoll nutzbar.
18,383 Beiträge
26,651 Antworten
47,787 Kommentare
29,042 Nutzer