Denkanstoß gesucht

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Denkanstoß gesucht

    Moin Moin zusammen,

    ich habe mir ein Patienten-Aufrufsystem für das Wartezimmer geschrieben.
    Funktioniert auch einwandfrei, naja, fast.

    Ich würde gerne mal Eure Meinung hören, wie ich folgendes Problem am einfachsten lösen kann...

    Es ist eine Server - Client Lösung über TCP-IP mit Variablem Port

    Folgendes Scenario...

    Eine Arztpraxis, 2 oder mehr Ärzte, viele PCs, 1 Wartezimmer.
    Patienten sitzen im Wartezimmer...

    nun rufen 2 Ärzte aus Ihren Sprechzimmern einen Patienten auf,... es funktioniert aber nur eine Anfrage...
    wie würdet Ihr das Queeing realisieren, das die Animation mit dem Patientenaufruf nacheinander abläuft?
    Datenbank? oder eine Tabelle auf dem Server wo die Daten die per TCP kommen eingetragen werden?

    Würde mich über konstruktive Vorschläge und Denkanstöße freuen.

    Grüße Stefan alias SaMsOn
    Nein! Doch! OHH!
    Ich würde Vorschlag B nehmen. Das ist m.E. einfacher. Mit einer Datenbank wäre es das gleiche, nur aufwendiger. Im Serverprogramm gibt es eine FIFO-Liste, die mit den Anfragen der Clients gefüllt werden und der Server arbeitet diese mit Verzögerung zwischen den Anfragen ab.

    Hab ich schon richtig verstanden, oder:
    Clientprog schickt ne Nachricht an Serverprog: »Client X meldet: Der Nächste bitte!«, Server nimmt das alles zur Kenntnis, und wenn Nachrichten/Aufrufe in der Schlange sind, nimmt das Serverprog die zuerst eingegangene Nachricht aus der Schlange raus, arbeitet diese ab, will heißen: zeigt irgendwo an: »Patient Nr. Y darf jetzt in Sprechzimmer X.«
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi,
    ich würde eine Tabelle "Patienten" pflegen.
    Jeder Patient bekommt einen Status und ggf. eine Position.
    z.B.

    PatientStatusPositionAnmeldung
    Mustermann, MaxwartetWartezimmer03.08.2017 10:05
    Tester, ToniBehandlungBehandlungszimmer 203.08.2017 09:27

    Dann können beim Aufrufen die Status- und Positionsdaten aktualisiert und der Eintrag danach gelöscht / archiviert werden. Eventuell die Statusänderungen in eine andere Tabelle schreiben für spätere Auswertungen. (Wie lange warten die Leute im Schnitt, wann kommen die meisten Patienten, usw.)
    Vielen Dank für Eure Antworten,...
    @VaporiZed du hast das genau richtig verstanden.
    Über eine so genannte GDT Schnittstelle wird der Client am Computer gestartet.
    Dabei werden diverse Feldkennungen in einer Textdatei übergeben.
    Diese liest der Client aus und hat damit Name, Vorname, Geschlecht, Geburtsdatum, Patientennummer vom Arztinformationssystem.
    dieses wird mit dem ausgewählten Raum dann per verschlüsseltem TCP Stream übertragen.
    Client sieht so aus


    Das Serverprogramm empfängt den TCP Stream, entschlüsselt diesen wieder und zerlegt Ihn anhand vorgegebener Trennzeichen wieder in die Einzelteile.
    Hier läuft die ganze Zeit eine simple Diashow über 2 Pictureboxen, mehr eigentlich nicht. Keine Blendeffekte garnichts (bis jetzt zumindest)



    Aktuell wird der String nach zerlegen direkt an eine weiter Form übergeben die sofort die Ausgabe übernimmt.
    Alles einfach gehalten, wenn man es so nimmt.

    Die Frage die ich mir aktuell stelle, was nehme ich am besten für ein Element in die Server.exe auf und wie fang ich das dazwischen ab?!

    Die Überlegung mit einer Textdatei war auch schon da,... nur muss diese dann immer eine Zeile auslesen, ausgeben und dann entfernen.

    @7081 Danke für deine Idee. Leider passt das so nicht ganz. Die Verwaltung des Wartezimmers übernimmt ja schon die Arztsoftware.

    Grüße SaMsOn
    Nein! Doch! OHH!
    Ich würde per Dataset eine kleine Tabellenstruktur aufbauen und das ganze als XML speichern.
    Gibt einige Tutorials hier im Forum dazu, brauchst keine extra Software und kannst damit genauso gut arbeiten wie mit einem SQL-Server.

    Und du hast nicht das Gefrickel mit irgendwelchen Textdateien und Lines usw.

    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Ok, da sind mehr Daten als gedacht, aber das Prinzip bleibt m.E. das gleiche. Du hast in der Server.exe eine List(Of String), in der die wieder entschlüsselten Daten ankommen. Bisher wird der String sofort weitergereicht. Wie hast Du es bewerkstelligt, dass die Anzeige sofort übermittelt wird? Per Polling? Per Event-Raising? Wie auch immer. Sobald eine Anzeige verarbeitet wurde, baust Du eine festlegbare Idle-Phase von z.B. 10 Sekunden ein, bevor der nächste Aufruf verarbeitet und in die Anzeige transferiert wird.

    @Acr0most: Wieso was abspeichern? Was willst Du speichern? DIe Daten kommen doch (bestimmt) aus der Arztpraxissoftware, sonst hätte man doch Datenredundanz, die man dauernd pflegen müsste. Es geht doch (m.E.) nur um ein »Patient X, kommt Sie in Sprechzimmer Y.«
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    samson schrieb:

    übernimmt ja schon die Arztsoftware
    Dann müsste aber irgendwer tatsächlich zwei Mal eine Patienteninfo eingeben, davon (mindestens) einmal händisch, wenn Dein Programm bestückt wird.
    Vielleicht klärst Du zunächst das Handlings-Szenario, bevor Du das Format der Daten festlegst:
    Wer gibt wo was ein, damit die Statii up to date sind?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VaporiZed schrieb:

    DIe Daten kommen doch (bestimmt) aus der Arztpraxissoftware, sonst hätte man doch Datenredundanz, die man dauernd pflegen müsste.


    Ok - Stimmt. Dann kann man aber genauso gut das DS erstellen ohne ein XML zu erstellen. Da hat man zur Laufzeit die Daten im Dataset, und kann

    samson schrieb:

    eine Zeile auslesen, ausgeben und dann entfernen.


    Macht m.M.n. den Zugriff auf die Daten sauberer.
    Das Xml wäre nur dafür da, dass man bei Abbruch des Programms die noch nicht verarbeiteten Daten noch hat - ist ja bei einem Textfile genauso.

    LG
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    WoW, so viele Antworten auf einmal... Vielen Dank,...
    (Dabei war ich nur eine rauchen xD )

    Also,... um das ganze mal etwas zu entwirren...
    für alle die sich fragen, woher die Daten kommen...

    GDT ist eine "Gerätedatei Schnittstelle"
    (qms-standards.de/standards/gdt-schnittstelle/)

    Hier wird aus dem Arztinformationssystem eine Datei erzeugt, die an einen festgelegten Pfad abgelegt wird.
    Der Dateiname und der Pfad ist im AIS (Arztinformationssystem) frei wählbar.

    Nachdem die Datei angelegt und gefüllt wurde mit Informationen (siehe Spoiler) über den Patienten, startet das AIS ein externes Programm.
    Beispielsweise eine EKG Software, oder Lungenfunktionssoftware.

    In meinem Fall meine Client.exe


    Die externe Software schaut in dem definierten Pfad nach der Datei und liest diese aus.

    Ich hab Euch mal den Inhalt einer solchen Datei hier im Spoiler eingepackt...

    Spoiler anzeigen
    Die Daten sind Fiktiv und haben keinerlei Bedeutung!
    01380006302
    014810000182
    014921801.00
    0123000792
    0173101Freibier
    0133102Hugo
    017310301031929
    022310617438 Wolgast
    0263107Wilhelmstraße 217
    01031101
    014410400000
    01041213


    Ausgelesen wird die Datei so:
    Spoiler anzeigen

    Quellcode

    1. Public Sub ExecuteParams()
    2. Try
    3. Dim args As String()
    4. Dim anrede As Integer
    5. args = Environment.GetCommandLineArgs()
    6. For i As Integer = 1 To args.Length - 1
    7. Select Case args(i).ToLower
    8. Case "gdt"
    9. Dim objReader As New StreamReader(My.Settings.pfad_gdt & "\" & My.Settings.gdt_file, System.Text.UTF8Encoding.Default)
    10. Dim sLine As String = ""
    11. Dim arrText As New ArrayList()
    12. Do
    13. sLine = objReader.ReadLine()
    14. If Not sLine Is Nothing Then
    15. arrText.Add(sLine)
    16. End If
    17. Loop Until sLine Is Nothing
    18. objReader.Close()
    19. For Each sLine In arrText
    20. If sLine.Contains("3000") Then
    21. lbpatnr.Text = sLine.Remove(0, 7)
    22. End If
    23. If sLine.Contains("3110") Then
    24. anrede = CInt(sLine.Remove(0, 7))
    25. If CDbl(anrede) = 1 Then
    26. lbanrede.SelectedItem = "Herr"
    27. Else
    28. lbanrede.SelectedItem = "Frau"
    29. End If
    30. End If
    31. If sLine.Contains("3101") Then
    32. lbnachname.Text = sLine.Remove(0, 7)
    33. End If
    34. If sLine.Contains("3102") Then
    35. lbvorname.Text = sLine.Remove(0, 7)
    36. End If
    37. Next
    38. Console.ReadLine()
    39. If My.Settings.gdt_autodel = True Then
    40. Try
    41. File.Delete(My.Settings.pfad_gdt & "\" & My.Settings.gdt_file)
    42. Catch
    43. MsgBox("Kann die GDT-Datei nicht löschen!" & My.Settings.pfad_gdt + My.Settings.gdt_file)
    44. End Try
    45. End If
    46. End Select
    47. Next
    48. Catch ex As Exception
    49. End Try
    50. End Sub

    Nein! Doch! OHH!
    Dafür gibt es einen FileSystemWatcher, der Dir bei Änderungen an einer Datei ein Event feuert. Wird also automatisiert was in die Datei reingeschrieben, meldet sich der FileSystemWatcher und Du kannst den Datensatz in die von mir erwähnte List(Of String) übernehmen. Datei löschen/leeren, Daten abarbeiten, ggf. weitere Daten in der Server.exe aufsammeln, wenn wieder was in der Datei steht, und zwischen 2 Anzeigen n bisken warten. Mein Vorschlag.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Oh, bitte nicht falsch verstehen... Das auslesen der Datei und anschließende Löschen ist kein Problem. Das System wird auch schon Produktiv eingesetzt.
    Jedoch wenn 2 Anfragen von 2 PCs gleichzeitig kommen, funktioniert es nicht richtig. Daher brauch ich einen Puffer am Server, der nach und nach ausgelesen wird

    Meine Idee ist es, den Empfang so wie es als string kommt, mit trennzeichen etc in eine, nennen wir es Tabelle zu schreiben,...
    wenn also 2 Anfragen nacheinander kommen, beide eintragen,...
    und dann abzuarbeiten...
    aktuell hab ich nur noch keinen Ansatz, wie ich die Daten zwischenspreichere am Server

    Ergänzung:
    Der Server läuft permanent im Hintergrund und gibt den kompetten decodierten String an eine zweite Form weiter,
    wo er dann via

    Quellcode

    1. Dim pat_aufruf As String() = Form1.pat_aufruf.Split(CChar("#"))
    zerlegt und in Labels ausgegeben wird.



    Nein! Doch! OHH!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „samson“ ()

    Erstmal Danke an alle für den Gedankenaustausch.
    Habe es nun mit einem ListBox Item gelöst. (Teilweise)



    Einfügen der Daten geht schon ganz gut. Entfernen der Zeile mit dem Inhalt beim Ausblenden des Patientenaufrufs klappt auch schon...

    nur mit der Schleife ... irgendwie häng ich grad an der Schleife...
    Wäre es sinnvoll mit einem Timer zu lösen?

    Im Timer dann zu sagen wenn ListBox.Items.Count > 0 ist Einblendung starten?

    Oder bekomm ich dann Irgendwann Performanceprobleme?
    Nein! Doch! OHH!
    mir ist noch unklar, warum man da mit TCP rumfuchteln muss.
    Ich täte denken, die Anzeige im Wartezimmer ist im selben lokalen Rechnernetz wie die Ärzte-Rechner.
    Also könnte die Anzeige einfach mittm FilesystemWatcher watchen, ob die Datei sich geändert hat.
    Oder mw. auch alle 5s pollen - ist immer noch einfacher und stabiler als wasweißich da durchs Internet zu schicken.



    Zweiter Punkt - die Anzeige: Ich bin ja immer für möglichst dröge.
    Und da würde ich schlicht pro Arzt (oder pro BehandlungsRaum oder so) ein Label hinmachen, wo draufsteht, wer grade von wem wohin eingeladen ist.
    Ist ja blöd, wenn eine Einladung kommt, und nur 0,5s angezeigt wird, weil dann gleich die nächste.

    Richtig patientenfreundlich fände ich, wenn die Ärzte da sogar beim Namen genannt würden, und wenn auch angezeigt würde, welcher Arzt grad busy ist, oder Away From Keyboard etc.

    Edit: Ja, oder besser als Label ist Listbox, noch besser Datagridview - da stehen Spalten zur Verfügung, und man kann enorm viel gestalten, und muss sich v.a. nicht ums Label-Aufräumen kümmern.
    @ErfinderDesRades Danke für den Konstruktiven Vorschlag. Ich weiß ja seit langem das Du ein verfechter des DataGridView bist, jedoch geht es hier um eine schnelle Lösung.
    TCP hat eine einfache Bewandnis...
    Im Heutigen Zeitalter der ganzen Verschlüsselgstrojaner hat sich gezeigt, je weniger Verzeichnisse man freigeben muss, je weniger Schreibrechte ein System hat, desto weniger ist es angreifbar.
    Zudem geht es hier um eine flexible Lösung. Es gibt Arztprogramme die unter Linux, IOS oder Windows laufen. mit einem TCP Stream bleib ich sicherer und Systemunabhängiger.
    Zudem würde es mit dem FilesystemWatcher wieder die Daten in einer Datei zwischenspeichern,... womit die Patientendaten "Sichtbar" sind.
    In dem Bruchteil der GDT Übergabe ist ein auslesen der Daten schwer möglich. Und wird vom BSI tatsächlich akzeptiert. Solage die Daten anderweitig nur verschlüsselt sind.
    Nein! Doch! OHH!

    samson schrieb:

    VB.NET-Quellcode

    1. Form1.pat_aufruf.Split(CChar("#"))
    Falls pat_aufruf keine Shared Variable ist, und davon gehe ich mal aus, Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Falls pat_aufruf keine Shared Variable ist, und davon gehe ich mal aus, Gugst Du hier.

    Irgendwie kann ich Dir an der Stelle nicht folgen.
    Wenn die Variable nicht Shared wäre, würde es ja nicht Formübergreifend funktionieren, oder sehe ich da was falsch?
    Nein! Doch! OHH!

    samson schrieb:

    oder sehe ich da was falsch?
    Du greifst auf die Variable Form1.pat_aufruf zu und verwendest den impliziten nistigen sch... ranz müll VB6-Kompatibilitäts-Modus zum Zugriff auf andere Instanzen in Deinem Programm.
    Von außen auf im MainForm deklarierte Variablen zuzugreifen ist schon mal ein Design-Fehler.
    Pack die Variable gleich in die andere Klasse und ruf dann die entsprechende Prozedur von der MainForm aus auf, allerdings über die korrekte Instanz.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @samson: Weil ich grad sehe, dass Du auf dem CCD-Pfad bist: CChar("#") => "#"c (KISS)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    hmm - KISS würde ich das nicht nennen - man sollte halt die Syntax der Sprache kennen, inklusive ihrer Literale für Char, Date, Boolean, String, sowie der gebräuchlichsten Zahlen-typen.
    VB.Net-Literale
    Aber die Literal-Schreibweise für Char ist wirklich sehr unbekannt - da sieht man immer wieder so eiglich üflüssige Typ-Umwandlungen.
    Übrigens noch unbekannter ist die Literal-Schreibweise für Date.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()