Paul Bishop

Forum Replies Created

Viewing 15 replies – 1 through 15 (of 116 total)
  • Author
    Replies
  • in reply to: Strip units in OBX-5 #122386
    Paul Bishop
    Participant

      Will the value in OBX-5 always be in “<measurement> <unit>” with space between the two?  Will there ever be a measurement with an embedded space?  What about a unit with an embedded space?  This is easily done if there are no spaces in the measurement.  use the lindex command to pull parts out.  TCL snippet:

      lassign xlateInVals in_obx_5
      set out_obx_5 [lindex $in_obx_5 0]
      set out_obx_6 [lindex $in_obx_5 1]
      set xlateOutVals

        Your source would be the OBX-5.0 field and your destination would be both the OBX-5.0 field and OBX-6.0 field (or variables if you’d like) – just make sure both are listed since you’re outputting two values.

        If there are spaces in the units value, the second lindex would be changed to a lrange: “lrange $in_obx_5 1 end”

        This is just one way to do it – I’m sure others will come up with different solutions.

        Paul Bishop
        Carle Foundation Hospital
        Urbana, IL

        in reply to: Cloverleaf site design for Epic #122341
        Paul Bishop
        Participant

          Hi Gina,

          We have a similar setup to Grace.  We have eight hospitals and multiple clinics.

          We have three ADT interfaces out of Epic.
          – One is strictly for clinical use so doesn’t have the hospital admissions, transfers, and discharges – just the registration and patient level updates.  The messages come in on one site and then route to 4 other sites to downstream systems.
          – The second one has everything the clinical one has, plus all the hospital admissions, transfer and discharges.  The messages come in on one site and then are routed to three “hub” sites, which then distribute the messages out over 13 other sites.  We did it this way because Epic LOVES its ADT messages – about an average of 310K a day.
          – The third one is a scaled down version of the second ADT interface by using different profile variables to eliminate some of the messages

          For Cupid interfaces (Cardiology) we have the Orders/Results out of Epic come into one site and then Orders are routed to a Cupid orders site and results are routed to a Cupid results site and from there are routed to the downstream systems.  Incoming results to Epic are in the same initial site.

          For Radiant interfaces (Radiology), it is similar to Cupid: Orders/Results out of Epic into one site and then split into separate Radiant orders and Radiant results to then be routed to downstream systems.  Incoming results to Epic are in the same initial site.

          Lab orders (we are currently NOT on Beaker) come in on one site and most are routed within that site.  The exception is the lab orders which are routed to a site that strictly handles both orders to the lab system and results from the lab system.  A lot of the smaller Epic interfaces are connected in this same site (Optime, Diet orders, Education orders, Provider updates, Supplies, etc).  We really need to split this up more because that site currently has 30+ processes.  We are also in the starting stages of switching to Beaker (2-year plan) so this will be changing for us.

          Outgoing Cadence messages (SIU) are sent into one site and then routed into six other sites which then route to downstream systems.  Incoming appointments are also sent from this site.

          Device interfaces (four of them) into Epic are split between four different sites because of the sheer volume of messages.  We also configured Epic to NOT send acknowledgements for these interfaces.

          For the bigger downstream systems that have multiple interfaces, we created separate sites and routed the messages to the appropriate interface.  This was mainly done to make it easier for maintenance on those systems and for when those systems have downtimes.

          You probably already know this, but build an HL7 variant specifically for each Epic interface and store them in a master site.  An order/result message out of Epic for Cupid can be defined vastly different from one for Radiant.  This also allows you to create the custom Z-segments as you need for each interface.

          We currently run on a AIX Power-10 server.

          Hope this helps.  If you want to talk in more detail, let me know and we can connect.

          Paul Bishop
          Carle Foundation Hospital
          Urbana, IL

          in reply to: Cloverleaf Cloud Customers? #122315
          Paul Bishop
          Participant

            @Robert Kersemakers – interesting.  I wonder what is considered “too big” for the Infor Cloud?  Management here keeps talking about moving our system to the cloud.  We have about 80 sites in our production system, probably averaging 20 processes per site.

            I keep telling them I’ll move up my retirement if they switch to the cloud – right now that’s about three years away. 😉

            Paul Bishop
            Carle Foundation Hospital
            Urbana, IL

            in reply to: SFTPing PDFs #122229
            Paul Bishop
            Participant

              Do you also have the “Style” set to “eof” in the Protocol Properties?  That is another thing that can mess up the PDF file.  We have processes that pick up PDF files using threads with no issues (version 19.1), although we are just delivering the files to a different cloverleaf server via TCP/IP.  Also, make sure that all threads that the PDF goes through are set to “binary” Encoding.

              Paul Bishop
              Carle Foundation Hospital
              Urbana, IL

              in reply to: PROTOCOL:fileset-local save file after processing #122050
              Paul Bishop
              Participant

                What David said is correct.  Here is a little more information.  In the Properties window for fileset-local in the TPS, there is a place to put a tcl proc for parsing the directory and for deleting the files.    For the parsing proc, it is a list of all the files that were found in the folder that is in the Directories field.  For the deleting proc, it is a list of files that were processed by the engine.  This is a proc that I use to move (rename) files to an archive folder after they have been processed.  I have a log file and echoes in the proc that you don’t necessarily need – I just had them there in case I had to do some research at a later point.

                proc move2archive_argument { args } {
                keylget args MODE mode ;# Fetch mode

                switch -exact — $mode {
                start {
                return “”
                }

                run {
                # Get message handle
                keylget args MSGID mh

                # get the user arguments
                set uargs {} ; keylget args ARGS uargs ;# fetch user-supplied arguments
                set arg_dest_dir “” ; keylget args ARGS.DESTDIR arg_dest_dir

                # Check for correct context
                keylget args CONTEXT ctx

                if {$ctx ne “fileset_ibdel”} {
                echo \nERROR proc used in wrong context
                echo Context should be fileset_ibdel
                echo Proc called in: $ctx\n
                return “{CONTINUE $mh}”
                }

                # In this context the message handed to this proc
                # by the driver in not a data message. Rather
                # it is a list of file names from the directory
                # the fileset driver is configured to read.
                #
                # The list of files to process is accessed
                # in the same way data messages in other contexts
                # are accessed.
                #
                # The list is manipulated and returned
                #
                # The fileset driver now processes the files in
                # order they appear in the returned message list.

                set msg_list [msgget $mh]
                set file_time_stamp [clock format [file mtime $msg_list] -format %Y%m%d%H%M%S]
                set current_date [clock format [clock seconds] -format %Y%m%d%H%M%S]
                set ofileid [open file_process.log a]
                puts $ofileid “$msg_list\t$file_time_stamp\t$current_date”
                close $ofileid
                echo \nmove2archive_argument: msg_list: $msg_list\n
                set destination_file $arg_dest_dir
                # echo \ndestination_file $destination_file\n

                file rename -force $msg_list $destination_file

                # Put modified list in the message handle
                msgset $mh $msg_list
                return {}
                }
                }
                }

                Paul Bishop
                Carle Foundation Hospital
                Urbana, IL

                in reply to: TCL function to get todays day minus 5 #122045
                Paul Bishop
                Participant

                  you can use the clock command for something like that.  there are other ways too, but this is the way I usually do it:

                  #current date minus 5 years

                  set todays_date_minus_5 [clock format [clock scan ” – 5 years”] -format “%Y%m%d”]

                  there is also a clock add command:

                  set todays_date_minus_5 [clock format [clock add [clock seconds] -5 years] -format “%Y%m%d”]

                   

                  Paul Bishop
                  Carle Foundation Hospital
                  Urbana, IL

                  Paul Bishop
                  Participant

                    It can be done in a translate.  You would use a temp variable to save the information before moving it to the OBR field.  Make sure the temp variable is initialized first (move @null into it at the top of the Xlate), then in the loop for the NTE segments, you would have the NTE field and the temp variable as the source, use the CONCAT action, and the temp variable as the destination.  If you want to have something between the fields, use the “Separator” field on the CONCAT properties.

                    Paul Bishop
                    Carle Foundation Hospital
                    Urbana, IL

                    in reply to: Help with xlateStrTrimLeft/Right #121854
                    Paul Bishop
                    Participant

                      if you used string commands before, it would most likely have been the string range command.  The format is

                      string range <string> <first> <last>

                      where <string> is the value you are pulling from, either a variable or in quotes

                      <first> is the position of the first character to pull (zero based index)

                      <last> is the position of the last character to pull (zero based index)

                      you can also use “end” as the index values and add adjustments to them if you want such as “end-2” which is the index for the third to last position.

                      Paul Bishop
                      Carle Foundation Hospital
                      Urbana, IL

                      in reply to: Enhancement Request: Option to wrap testing tool output #121697
                      Paul Bishop
                      Participant

                        You just need to upgrade your monitor to a 72″ widescreen Jim!  ;-p

                        Paul Bishop
                        Carle Foundation Hospital
                        Urbana, IL

                        Paul Bishop
                        Participant

                          There are multiple ways to do it.  Off the top of my head, if you know that the input will ALWAYS be in that format (YYYYMMDDHHMMSS), then you can use the clock command (copy pre-proc):
                          <pre>lassign $xlateInVals in_obx_5
                          set out_obx_5 [clock format [clock scan $in_obx_5 -format “%Y%m%d%H%M%S”] -format “%m/%d/%Y %H:%M”]
                          set xlateOutVals

                            </pre>
                            The problem with using the clock command is that if it doesn’t match the input format on the scan portion, it will fail.

                            Another way of doing it is to use string range commands to pull out each element of the date and time, and then set the output variable to what you need it to be.

                            There is also the format command, but I always have to look up all the options for it.  Those are the first ones I thought of off the top of my head, but I’m sure there are many other ways as well.

                            I would put coding before it to verify it matches the input format you are expecting (length, all numeric, etc).

                            Hope this helps!

                            Paul Bishop
                            Carle Foundation Hospital
                            Urbana, IL

                            in reply to: reset number of error in thread status #120821
                            Paul Bishop
                            Participant

                              Through the GUI (version 19 and above I believe?), you can double click on the thread in Network Monitor (or right click –> Control –> Full) and on the bottom right column is a “reset statistics” option.  This will reset ALL  statistics except times, not just the error count.

                              Or through a command line, use the hcimsiutil command.  Options are:

                              -X will zero all threads on the site and keep the times
                              -xt <thread> will zero the specific thread and keep the times
                              -xp <process> will zero the threads in the specific process and keep the times
                              -Z will zero all threads on the site including the times
                              -zt <thread> will zero the specific thread including the times
                              -zp <process> will zero the threads in the specific process including the times
                              -E will zero error counts on all threads in the site
                              -ep <proc> will zero error counts on all threads for the specific process
                              -et <thread> will zero error counts for the specific thread

                              I don’t know what version the -E/-e options became available.  entering hcimsiutil without arguments will display the options available in your version.

                              Paul Bishop
                              Carle Foundation Hospital
                              Urbana, IL

                              in reply to: Need to remove leading character #120816
                              Paul Bishop
                              Participant

                                As Jim says, if you are prior to 6.0, the translate string action isn’t available.  This code snippet will do the trick using the copy action in a translate and will remove the first character regardless of what it is.  If your original value happens to be only one character long, it will return a null value.

                                lassign $xlateInVals in_val
                                set out_val [string range $in_val 1 end]
                                set xlateOutVals

                                  Source will be the field the data is coming from, and Destination will be where you want it to go.

                                  Paul Bishop
                                  Carle Foundation Hospital
                                  Urbana, IL

                                  Paul Bishop
                                  Participant

                                    What is the “Error:” setting set to on the copy or if command?  If it is set to “Skip”, then you’re correct, it won’t stop with an error.  If it is set to “Error”, you will get a “Fetch failure on ‘<variable name’” error and the process will stop.

                                    • This reply was modified 2 years, 6 months ago by Paul Bishop.

                                    Paul Bishop
                                    Carle Foundation Hospital
                                    Urbana, IL

                                    in reply to: Unable to bind tcp/ip socket: Address already in use #120785
                                    Paul Bishop
                                    Participant

                                      We have run into this also and it is because of the ephemeral ports (on AIX and same ranges as James’).

                                      For AIX you can find what is using that port by using a couple of commands.

                                      This returns the PID that is using the port:

                                      lsof -i:<port>

                                      This will then show what the process is:

                                      ps -ef|grep <pid>

                                      You can then top the process using the port, start the thread that needs the port, and then restart the process that you just stopped.  Again, this is AIX – not sure what Radhat would use.

                                      Paul Bishop
                                      Carle Foundation Hospital
                                      Urbana, IL

                                      in reply to: reset stats for status thread #120758
                                      Paul Bishop
                                      Participant

                                        Look at the hcimsiutil command.  It has options to zero just the counts or the counts and the times, and you can do it by thread, process or the whole site.

                                        Paul Bishop
                                        Carle Foundation Hospital
                                        Urbana, IL

                                      Viewing 15 replies – 1 through 15 (of 116 total)