Xlate Date Calculation

Clovertech Forums Read Only Archives Cloverleaf Product Enhancements Xlate Date Calculation

  • Creator
    Topic
  • #55624
    Lina Patel
    Participant

      I have a request to update VXU (OBX field) for adult immunizations.

      Is there a way to add logic in Xlate utilizing PID-7 (DOB)?

      Also – I was not able to identify Adult vs Children in VXU field.

      Thank you!

    Viewing 7 reply threads
    • Author
      Replies
      • #85945
        Steve Williams
        Participant

          Lina,

            There are two general ways to add Logic to Xlates. The first is to use code snippets (scripts) in TCL (or Java, if you must) as an Xlate statement Pre-Proc. The other is to write it as a series of Xlate statements using the various Xlate command statements.

          ‘IF’ statements and simple MATH statements are pretty straight forward to perform basic logic points, even if the syntax is a bit bizarre. More complicated logic should be done in TCL as it can be well contained and commented with a single Xlate ‘COPY’ statement.

          Regarding your question, you can have multiple source elements in a COPY statement, such as PID:7 and OBX:5. Then use TCL ‘lindex’ commands to pull out the values from the $xlateInVals variable list and perform your logic. At the end, you’d put the resulting value(s) into the $xlateOutVals variable list.

          Hope this helps.

        • #85946
          Lina Patel
          Participant

            I need to calculate age 18 as adult and younger as children’s for vaccines using PID-7.

            Is there any existing logic that would be useful to calculate age?

            Thank you for your response.

          • #85947
            Steve Williams
            Participant

              Sorry, I don’t have a script for this task.

              There are a half dozen or so CloverTech articles on this subject that have some basic code to get you in the ball park. Try searching “calculate age” while checking the “all” box on the CloverTech search screen.

              You will find that age calculations using CLOCK SCAN can be difficult and inaccurate do to leap years, 32 bit variables, etc.

              If you want to get some longer starter code on the subject, take a look at this web page:

              http://wiki.tcl.tk/3189.html

              For even more, do a Google search for TCL calculate age…

            • #85948
              Steve Williams
              Participant

                John Bass posted some code in this article that might be what you can use.

                https://usspvlclovertch2.infor.com/viewtopic.php?t=5946

              • #85949
                Paul Bishop
                Participant

                  We’ve done something similar for some of our interfaces where they didn’t want a patient younger than X number of years.  What I did was take the date of birth from PID-7, pull out only the date portion (in case your source system sends the time portion), and compare it with a calculated value of the current date – X years, formatted the same way.  I would then set a flag as the output and use flag in the Xlate (if @underage_flag eq =Y, do something for young patients, else do something else).  This code was put in the pre proc of the copy.  

                  Code:

                  lassign $xlateInVals dob_date
                  # get yr, m and day only
                  set temp_date [string range $dob_date 0 7]
                  # todays date minus 11 years
                  set calc_date [clock format [clock scan ” – 11 years”] -format “%Y%m%d”]
                  # compare dates – if birthdate less than calculated date, use patient
                  if {$dob_date < $calc_date} {   set out_flag N } else {   set out_flag Y } set xlateOutVals [list $out_flag]

                  Paul Bishop
                  Carle Foundation Hospital
                  Urbana, IL

                • #85950
                  Jim Kosloskey
                  Participant

                    I have a proc we used which allows you to add (or subtract) a time period from a date/time.

                    So what we did is to condition the DOB properly to submit to the proc (some systems do not build that correctly). Depending on your Cloverleaf release you may or may not need some Tcl to do the conditioning.

                    Then we invoked the proc to add 18 Yrs to the DOB (the offset is an argument so one could add virtually any time period) giving a resultant date. The proc allows specifying how the result date should be formatted.

                    Then as I recall a simple Xlate IF Action will determine the relationship of today’s date to the DOB vis-

                    email: jim.kosloskey@jim-kosloskey.com 29+ years Cloverleaf, 59 years IT - old fart.

                  • #85951
                    Brenda Carpenter
                    Participant

                      Hi Lina,

                      We also submit VXU for 19 yr olds and under (unless Rabies – then all Rabies vaccines must be sent to DOH) and it seems to be working fine for us, has been in place quite some time.  You would just have to adjust your days to be 18 yr old.

                      Pre proc filter calls another proc below:

                         if {[getAgeDays $birthdate $admitdate] > 6935} {

                             lappend dispList “KILL $mh”

                             if {$debug} {echo “$module KILL msg ecd $ecd age greater than 19”}

                         } else {

                              continue

                      ###############################################

                      # Name:      getAgeDays

                      # Purpose:   Get number of days old at time of admission

                      # UPoC type:   upoc

                      # Args:      none

                      #

                      proc getAgeDays {dob admitdate} {

                        set admitdays [expr [clock scan [string range $admitdate 0 7]] / 60 / 60 / 24]

                        set dobdays [expr [clock scan $dob] / 60 / 60 / 24]

                        set ageDays [expr $admitdays – $dobdays]

                        return $ageDays

                      }

                    • #85952
                      Jeff Dinsmore
                      Participant

                        For age in years, can’t you do something like this?

                        Calculate the average number of seconds in a year – taking leap years into account.

                        Scan DOB

                        Scan Admit date (or whatever date is of interest)

                        Subtract DOB seconds from admit seconds, divide by average seconds per year and cast it as an integer.

                        Code:

                        set avgYearSec [expr 365.25 * 24 * 60 * 60]

                        set birthDate 20000229
                        set birthSec [clock scan $birthDate]

                        set admitDate 20180228
                        set admitSec [clock scan $admitDate]

                        set yrsOld [expr int(($admitSec – $birthSec) / $avgYearSec)]

                        The above calculation produces “17”.

                        If we roll the admit date forward to 20180301, it produces “18”.

                        We, of course, need to massage dates from messages into a form that clock scan likes.

                        Feel free to poke holes in this algorithm.  I haven’t calculated age like this before, but it seems like it should work.

                        Jeff Dinsmore
                        Chesapeake Regional Healthcare

                    Viewing 7 reply threads
                    • The forum ‘Product Enhancements’ is closed to new topics and replies.