Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Current »

There are a couple helpful strategies for dealing with optional and repeating segments.

  • For optional segments or fields: Use node:isNULL() to determine if the specified node is not present or not (null).

  • For repeating segments: Use the # Operator on Userdata Objects to loop through the total number of segments.

Here’s an example HL7 message:

 HL7 sample message containing repeating NK1 segments
MSH|^~\&|AcmeMed|E\T\R|Main HIS|St. Micheals|20110213145956||ADT^A07|9B38584DCB03B0577D55CF66983BA79B39022ABD61F9E0188DD9BD03B2C99446|P|2.6|
EVN||20110213144818||||20110213144552|
PID|||2495499^^^ADT1||Meade^Sabrina||20001005|F||Martian|207 Miller Lane^^Toronto^ON^16200|||||||7-264-942|365-5-488|
NK1|1|Garland^Sabrina|Second Cousin|
NK1|2|Smith^Fred|Grandchild|
NK1|3|WHITE^Tracy|Grandchild|
NK1|4|Fitzgerald^John|Grandchild|
NK1|5|Adams^Mary|Parent|
PV1||E||||||5101^WHITE^Tracy^F^^DR|||||||||||602131^^^ADT1|||||||||||||||||||||||||20110213150128|

If we take a look at a VMD for an ADT message, we’ll see that the NK1 segment can be both optional and repeating.

How would we map this message to a database containing two tables, a Patient and Kin table?

 Let's breakdown this example script:

If you’d like to try this out in the Translator, create a custom component and use the following files:

function main(Data)
   local msg, name = hl7.parse{vmd='adt.vmd', data=Data}
   local outboundTable = db.tables{vdb='patients.vdb'}

   if name == 'ADT' then 
      processADT(outboundTable, msg)
   end 
end

function mapPatient(T, PID) 
   T.id        = PID[3][1]
   T.firstName = PID[5][2]
   T.lastName  = PID[5][1][1]
   T.birthdate = PID[7]
end 

function mapKin(T, NK1) 
   if not NK1:isNull() then
      T.firstName = NK1[2][2]
      T.lastName = NK1[2][1][1]
      T.relationship = NK1[3][1]
   end
end 

function processADT(T, msg) 
   for i=1, #msg.NK1 do
      mapPatient(T.Patients[1], msg.PID)
      mapKin(T.Kin[i], msg.NK1[i])
   end 
   trace(T)
end 
 1) Use the annotation window to view the parsed HL7

See the repeated segments captured in the parsed HL7 message.

 2) Look at processADT to see how we are counting the NK1 segments and looping to pass each one to mapKin

Using a for loop and the # Operator on Userdata Objects, we can count the NK1 segments and loop through each segment, starting at the first, to pass each segment to mapKin to be mapped to our database Kin table.

 3) Look at mapKin, notice we are checking if the optional NK1 segment exists before mapping

Using if statements and node:isNull(), we can add logic to say “if NK1 exists, (is not nulll), then map the following fields into the table.”

You can confirm the mappings by clicking on trace(T) in the annotations to see the resulting database Patient and Kin tables.

  • No labels