Data Types

Data Type Description
ST String Data:
String data is left justified with trailing blanks optional. Any displayable (printable) ACSII characters (hexadecimal values between 20 and 7E, inclusive).
|almost any data|
TX Text data:

String data meant for user display (on a terminal or printer). Such data would not necessarily be left justified since leading spaces may contribute greatly to the clarity of the presentation to the user. Because this type of data is intended for display, it may contain certain escape character sequences designed to control the display. Escape sequence formatting is defined later in this chapter in Section 2.4.6. Leading spaces should be included. Trailing spaces should be removed.
Since TX data is intended for display purposes, the repeat delimiter, when used with a TX data field, implies a series of repeating lines to be displayed on a printer or terminal. Therefore, the repeat delimiters are regarded as paragraph terminators or hard carriage returns (e.g., they would display as though a CR/LF were inserted in the text).
A receiving system would word-wrap the text between repeat delimiters in order to fit it into an arbitrarily sized display window but start any line beginning with a repeat delimiter on a new line.
| leading spaces are allowed.|

FT Formatted text data:
This data type is derived from the string data type by allowing the addition of embedded formatting instructions. These instructions are limited to those that are intrinsic and independent of the circumstances under which the field is being used. The actual instructions and their representation are described later in this chapter. The differences from a string data field and an FT field is of arbitrary length (up to 65k) and may contain formatting commands enclosed in escape characters.
|\.sp\(skip one vertical line)|
NM Numeric data:

A number represented as a series of ASCII numeric characters consisting of an optional leading sign (+ or -), the digits and an optional decimal point. In the absence of a sign, the number is assumed to be positive. If there is no decimal point the number is assumed to be an integer.

Leading zeros, or trailing zeros after a decimal point, are not significant. The two values 01.20 and 1.2 are identical. Except for the optional leading sign (+ or -) and the optional decimal point (.), no non-numeric ASCII characters are allowed. Thus, the value <12 should be encoded as a string data type.

|999|
|-123.792|

DT Date data:
Always in the format YYYYMMDD.
|19880704|
TM

Time data:

Always in the format HHMM[SS[.SSSS]][+/-ZZZZ] using a 24 hour clock notation. The seconds designation (SS) is optional. If not present it will be interpreted as 00. The fractional seconds designation is likewise optional. If not present it will be interpreted as .0000. The fractional seconds could be sent by a transmitter who requires greater precision than whole seconds. Fractional representations of minutes, hours or other higher orders units of time are not permitted. The time zone of the sender may be sent optionally as an offset from the coordinated universal time (previously known as Greenwich Mean Time.) Where the time zone is not present in a particular TM field but is included as part of the date/time field in the MSH segment, the MSH value will be used as the default time zone. Otherwise, the time is understood to refer to the local time of the sender. Midnight is represented as 0000. 

|235959+1130| 1 second before midnight in a time zone eleven and half hours ahead of Universal Coordinated Time (i.e., east of Greenwich).

|0800| Eight AM, local time of the sender.

|093544.2312| 44.2312 seconds after Nine thirty-five AM, local time of sender.

TS

Time Stamp data:

Contains the exact time of an event, including the date and time. Time stamp fields are always in the format:

YYYYMMDD[HHMM[SS[.SSSS]]][+/-ZZZZ]^<degree of precision>

The date portion of a time stamp follows the rules of a date field and the time portion follows the rules of a time field. When used as a birthdate, the HHMM portion is optional. If not present the HHMM portion will default to 0000, i.e., midnight of the day just beginning. The specific data representations used in the HL7 encoding rules are compatible with ISO 8824-1987(E). An optional second component indicates the degree of precision of the date (Y = year, L = month, D = day, H = hour, M = minute, S = second). (Maximum length of field is 26).

The HL7 Standard strongly recommends that all systems routinely send the time zone offset but does not require it. All HL7 systems are required to accept the time zone offset, but its implementation is application specific. For many applications the time of interest is the local time of the sender. For example, an application in the Eastern Standard Time zone receiving notification of an admission that takes place at 11:00 PM in San Francisco on December 11 would prefer to treat the admission as having occurred on December 11 rather than advancing the date to December 12.

One exception to this rule would be a clinical system that processed patient data collected in a clinic and a nearby hospital that happens to be in a different time zone. Such applications may choose to convert the data to a common representation. Similar concerns apply to the transitions to and from daylight saving time. HL7 supports such requirements by requiring that the time zone information be present when the information is sent. It does not, however, specify which of the treatments discussed here will be applied by the receiving system.

|17760704010159-0600| 1:01:59 on July 4, 1776 in the Eastern Standard Time zone.

|17760704010159-0500| 1:01:59 on July 4, 1776 in the Eastern Daylight Saving Time zone.

|198807050000| Midnight of the night extending from July 4 to July 5, 1988 in the local time zone of the sender.

|198807050000^D| Same as prior example, but precision extends only to the day. Could be used for a birth date.

PN

Person Name data:

<family name> ^ <given name> ^ <middle initial or name> ^ <suffix (e.g., JR or III)> ^ <prefix (e.g., DR)> ^ <degree (e.g., MD)>

A name includes multiple free text components as listed above. The maximum length of a PN field is 48 characters including component separators. The sending system may send upper- and lowercase or all uppercase. The receiving system may convert to all uppercase if required.

|SMITH^JOHN^J^III^DR^PHD|

TN Telephone Number data:

For use in the United States and conforming countries, the telephone number is always in the form:

[NN] [(999)]999-9999[X99999][B99999][C any text]

The optional first two digits are the country code. The optional X portion gives an extension. The optional B portion gives a beeper code. The optional C portion may be used for comments like, After 6:00. While no explicit limit is placed on the text field, receiving systems may be expected to truncate values that are more than 10 characters long. To accommodate the variability of institutional phone systems, the length of the extension and beeper numbers may be extended by local agreement.

|(415)925-0121X305|
|234-4532CWEEKENDS|

AD

Address data:

<street address> ^ < other designation> ^ <city> ^ <state or province> ^ <zip or postal code >^ <country >^ <type> ^ <other geographic designation>

All components are ST data type. The street or mailing address of a person or institution. For use within North America:

  1. state or province should be represented by the official US Postal service two-letter codes
  2. zip takes the form 99999[-9999], Canadian postal code is 6 alpha-numeric characters
  3. the country code is assumed to be USA if null
  4. other geographic designation includes county, bioregion, SMSA, etc.

Type is optional and defined by table 0190 - address type.

|10 ASH LN^#3^LIMA^OH^48132^""^|

Address Type:

C=Current or Temporary
P=Permanent
M=Mailing
B=Business
O=Office
H=Home

ID ID coded value:
The value of such a field follows the formatting rules for an ST field except that it is drawn from a table of legal values. Examples of ID fields include religion and sex.
SI Sequence ID value:
A positive integer in the form of an NM field. The uses of this field are defined in the chapters defining the segments and messages in which it appears.
CM Composite data:

A field that is a combination of other meaningful data fields. Each portion is called a component. The specific components of CM fields are defined within the field descriptions. Certain other composites have been separately identified and are described below. The use of this data type will be slowly phased out and new unique data types will be created.

Wherever a component of an HL7 field is itself an HL7 data type which contains components, its delimiters are demoted by one. Thus a component designated as a CE data type should be encoded as . Note that since HL7 delimiters are not recursive, an HL7 data type containing components cannot be a sub-component. When this level of detail is needed, each component of the HL7 data type can be encoded as a separate subcomponent.

CK Composite ID with check digit:

<ID number (NM)> ^ <check digit (NM)> ^ <code identifying the check digit scheme employed (ID)> ^ <assigning facility ID (ST)>

This data type is used for certain fields that commonly contain check digits, e.g., PID-3-Patient ID (Internal ID). If a site is not using check-digits for a particular CK field, the second and third components are not valued.

The check digit in this data type is not an add-on produced by the message processor. It is the check digit that is part of the identifying number used in the sending application. If the sending application does not include a self-generated check digit in the indentifying number, this component should be valued null.

The assigning facility ID is a unique name (up to six characters in length) of the system that stores the data. It is an ST data type. It is equivalent to the application ID of the placer or filler order number .Assigning facility ID's are unique across a given HL7 implementation.

Check digit scheme

M10=Mod 10 algorithm
M11=Mod 11 algorithm

The algorithm for calculating a Mod10 check digit is as follows:

Assume you have an identifier = 12345. Take the odd digit positions, counting from the right, i.e., 531, multiply this number by 2 to get 1062. Take the even digit positions, starting from the right (i.e., 42), prepend these to the 1062 to get 421062. Add all of these six digits together to get 15. Subtract this number from the next highest multiple of 10, i.e., 20 - 15 to get 5. The Mod10 check digit is 5. The Mod10 check digit for 401 is 0; for 9999, it's 4; for 99999999, it's 7.

The algorithm for calculating a Mod11 check digit is as follows:

Terms

d = digit of number starting from units digit, followed by 10's position, followed by 100's position, etc.
w = weight of digit position starting with the units position, followed by 10's position, followed by 100's position etc. Values for w = 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, etc. (repeats for each group of 6 digits)
c = check digit

Calculation

(Step 1) m = sum of (d * w) for positions 1, 2, etc. starting with units digit
for d = digit value starting with units position to highest order
for w = weight value from 2 to 7 for every six positions starting with units digit
(Step 2) c1 = m mod 11
(Step 3) if c1 = 0 then reset c1 = 1
(Step 4) c = (11 - c1) mod 10
Example:

if the number is 1234567, then the mod 11 check digit = 6

The calculations are:

         M  = (7*2)+(6*3)+(5*4)+(4*5)+(3*6)+(2*7)+(1*2)
            = 14 + 18 + 20 + 20 + 18 + 14 + 2
            = 106
         c1 = 106 mod 11
            = 7
         c  = (11-c1) mod 10
            =  4 mod 10
            =  4
       
Other variants of these check digit algorithms exist and may be used by local bilateral site agreement.

 

|128952^6^M11^ADT01|

CN Composite ID number and name:

<ID Number >^ <family name> ^ <given name> ^ <middle initial or name> ^ <suffix (e.g., JR or III) >^ p<refix (e.g., DR)> ^ <degree (e.g., MD)> ^ <source table>

All components are ST data type. A field identifying a person both as a coded value and with a text name. The first component is the coded ID according to a site-specific table. The second through the seventh components are the person's name as a PN field. The eighth component specifies the source table used for the first component. For specific fields, individual sites may elect to omit the ID or the name.

|12372^RIGGINS^JOHN^""^""^""^MD^ADT1|
|12372|
|^RIGGINS^JOHN^""^""^""^MD|

CQ Composite Quantity with units:

<quantity> ^ <units>

The first component is a quantity and the second is the units in which the quantity is expressed. Field by field, default units may be defined within the specifications. When the observation is measured in the default units, the units need not be transmitted. If the measure is recorded in units different from the default, the measurement units must be transmitted as the second component. If the units are ISO+ units, then units should be recorded as lowercase abbreviations as specified in Chapter 7. If the units are ANSI or local, the units and the source table must be recorded as specified in Chapter 7. But in these cases the component separator should be replaced by the subcomponent delimiter.

|123.7^kg| kilograms is an ISO unit
|150^lb&&ANS+|weight in pounds is a customary US unit
defined within ANSI+.

CE Coded Element:

This data type transmits codes and the text associated with the code. This type has six components arranged in two groups as follows:

<identifier >^ <text >^ <name of coding system> ^ <alternate identifier> ^ <alternate text> ^ <name of alternate coding system>

To allow all six components of a CE data type to be valued, the minimum length of this data type is 60.

identifier: Sequence of characters (the code) that uniquely identifies the item being referenced by the . Different coding schemes will have different elements here.
text: Name or description of the item in question. E.g., myocardial infarction or x-ray impression. Its data type is string (ST).
name of coding system: Each coding system will be assigned a unique identifier. This component will serve to identify the coding scheme being used in the identifier component. The combination of the identifier and name of coding system components will be a unique code for a data item. For backward compatibility, if this component is absent, it will be taken to mean the CPT-4 with ASTM extensions, i.e., AS4. Other coding systems that might appear here are ICD-9, ICD-10, SNOMED, etc. Each system will be given a unique identifying string. The current ASTM 1238-88 diagnostic/procedure/observation/drug ID/health outcomes coding systems are identified in the tables below. Others may be added as needed.

alternate components: these three components are defined analogously to the above for the alternate or local coding system. If the Alternate Text component is absent, and the Alternate Identifier is present, the Alternate Text will be taken to be the same as the Text component. If the Alternate Coding System component is absent, it will be taken to mean the locally defined system.

Note: The presence of two sets of equivalent codes in this data type is semantically different from a repetition of a CE-type field. With repetition, several distinct codes (with distinct meanings) may be transmitted.

|54.21^Laparoscopy^I9^42112^^AS4|
CF Coded element with formatted values:

This data type transmits codes and the formatted text associated with the code. This data type can be used to transmit for the first time the formatted text for the canned text portion of a report, for example, a standard radiologic description for a normal chest x-ray. The receiving system can store this information and in subsequent messages only the identifier need be sent. Another potential use of this data type is transmitting master file records that contain formatted text.

This data type has six components arranged in two groups as follows:

<identifier>^ <formatted text> ^ <name of coding system>^ <alternate identifier> ^ <alternate formatted text> ^ <name of alternate coding system>

The components, primary and alternate are defined exactly as in the CE data type with the exception of the second and fifth components which are of the formatted text data type.

OBX||CF|71020^CXR^CPMC||79989^
\H\Description:\N\\.sp\\ti+4\Heart is not enlarged.
There is no evidence of
pneumonia, effusion, pneumothorax or any mass
es.\.sp+3\\H\Impression:
\N\\.sp\\.ti+4\Negative chest.^CPMC
RP Reference Pointer:

This data type transmits information about data stored on another system. It contains a reference pointer that uniquely identifies the data on the other system, the identity of the other system, and the type of data. This information is transmitted in three components arranged as follows:

<pointer> ^ <application ID >^ <type of data>

pointer: A unique key assigned by the system that stores the data. The key, which is an ST data type, is used to identify and access the data.

application ID: A unique name (up to 6 characters in length) of the system that stores the data. It is an ST data type. It is equivalent to the application ID of the placer or filler order number (see Chapter 4). Application ID's must be unique across a given HL7 implementation.

type of data: A code that represents the type of data being stored. It is an ID data type.

SI=FT Scanned image

NS=Non-scanned image

SD=Scanned document

TX=Machine readable text document

FT=Formatted text

TQ Timing Quantity:
Describes when a service should be performed and how frequently.
MO

<quantity> ^ %lt;denomenation%gt;

The first component is a quantity and the second is the denomination in which the quantity is expressed. The values for the denomination component are those specified in ISO- 4217. If the denomination is not specified, MSH-17-country code is used to determine the default.

|99.50^USD| where USD is the ISO 4217 code for the U.S. American dollar.

Delimiter Values

Delimiter

Suggested Value

Encoding Character Position

Usage

Field Terminator

<CR>
hex 0D

  Terminates a segment record.
Field Separator

|

(0)

Separates two adjacent data fields within a segment.
Component Separator

^

1

Separates adjacent components of data fields where allowed.
Repetition Separator

~

2

Separates multiple occurrences of a field where allowed.
Escape Character

\

3

Escape character for TX and FT fields.
Sub-Component Separator

&

4

Separates adjacent subcomponents of data fields.

No connection could be made because the target machine actively refused it

Event Type: Error
Event Source: BizTalk Accelerator for HL7
Event Category: None
Event ID: 8706
Date:  20/08/2008
Time:  12:55:30
User:  N/A
Computer: IN12620
Description:
Unable to log message "An empty batch was received with fr..." to the event log due to exception:
"No connection could be made because the target machine actively refused it 127.0.0.1:4000".

Username: IN12620\BizTalk
Time: 20/08/2008 12:55:30

The issue, is obvious: The HL7 Logging Service is not running:

HL7LoggingService

FHS/FTS with no BHS/BTS segments

A friend recently asked if it was ABSOLUTELY necessary to have the BHS/BTS segments if batching was enabled.

I asked some friends and the HL7 DASM demands those segments:

[FHS] (file header segment)

{ [BHS] (batch header segment)

{ [MSH (zero or more HL7 messages)

....

....

....

] }

[BTS] (batch trailer segment)

}

[FTS] (file trailer segment)

The FHS segment is used to head a file (group of batches), that is why HL7 DASM always expect BHS segment after FHS segment.

The only way is to create a pipeline component that would live in the Decode stage that inserts those segments into the batched message.

Security Measures in relation to PHI with BTAHL7

Microsoft has put a lot of effort into making your environment secure, however, that still does not absolve you of some things that you still have to configure.

Here is an example (using the examples in the SDK) of showing PHI:

fragmentationError

Notice that you can essentially see EVERYTHING in that message, including that ever-so-important PHI.

There are a few things that you can to to remove/restrict access to that PHI.

Because there is the ability to see PHI in non secure places, Microsoft has a couple of places that you use to secure that data, based on your security policy. In some instances, the security stops at the firewall, if an intruder gets past the firewall, they have the keys to the kingdom. This security policy is fine for most instances, (thank goodness)! In my case, the last thing I want to do is have to peel off the layers of security to simply figure out that an element is missing from the HL7 message. At 2:00 am I simply want to log in and find out what is going on, what the error is, and fix it.

However, there are some out there that either do not trust their network admins, want to make troubleshooting harder, don’t trust their co workers, or were forced to implement additional security around PHI. For those, here are a few things that are available to increase security around PHI>

The first would be to turn off Event Logging and possibly choose SQL where more restrictions can be managed.

TurnEventLogOff

(Remember to restart the Audit and Logging Service)

Another would be to simply restrict who can have access to the event log in the first place, this can be done by changing the following key in the registry (did you see my disclaimer on the right side of this blog?)

Hive: HKEY_LOCAL_MACHINE
Key: SYSTEM\CurrentControlSet\Services\EventLog\Application
Name: RestrictGuestAccess
Type: REG_DWORD
Value: 1 Restrict access to Application log

But if you really want to get fancy, you can simply add the following entry into the BizTalk Server Operators group in Active Directory and restrict everyone else: (click to enlarge)

EventLogRestrictions

Preserve Order while mapping

There is the issue of the behavior of the mapping process creates invalid XML.

The input instance looks like this:

<xml> <loopA /> <loopB /> <loopA /> <loopB /> </xml>

However, when using the mapper, you create your output and it ends up looking like this:

<xml> <loopA /> <loopA /> <loopB /> <loopB /> </xml>

How to get this to work (only in R2) is to open up the btm file and change the following attribute from its default value of No to Yes in the mapsource element

PreserveSequenceOrder="No"

<mapsource Name="BizTalk Map" BizTalkServerMapperTool_Version="2.0" Version="2" XRange="100" YRange="420" OmitXmlDeclaration="Yes" TreatElementsAsRecords="No" OptimizeValueMapping="No" GenerateDefaultFixedNodes="Yes" PreserveSequenceOrder="No" CopyPIs="No" method="xml" xmlVersion="1.0" IgnoreNamespacesForLinks="Yes">

Here is the new code:

<mapsource Name="BizTalk Map" BizTalkServerMapperTool_Version="2.0" Version="2" XRange="100" YRange="420" OmitXmlDeclaration="Yes" TreatElementsAsRecords="No" OptimizeValueMapping="No" GenerateDefaultFixedNodes="Yes" PreserveSequenceOrder="Yes" CopyPIs="No" method="xml" xmlVersion="1.0" IgnoreNamespacesForLinks="Yes">

Online Support

I have just installed an online support link on the right of the blog. Seeing how it works. Try it out!

Online Support

I have just installed an online support link on the left of the blog. Seeing how it works. Try it out!

HL7 Message Encoding

To extend what I wrote about for the Encoding for HL7 messages post. There are two values that are used for the Message Encoding context properties. It isn't obvious but follow the logic:

According to Extended Encoding Support page in the Note section of step 5 you can only choose Western European or UTF8, so if I look at the Encoding Class documentation, the table below are the values you can use:

Value To Set Name Display
65001 utf-8 Unicode (UTF-8)
850 ibm850

Western European (DOS)

Event ID 5720, BTAHL7Schemas.MessageEncoding

In a follow up to my initial discovery of the new context property (largely undocumented as far as I can tell) called BTAHL7Schemas.MessageEncoding we were converting a working process from 2004 to 2006 R2 and we started getting this error:

Event Type: Error
Event Source: BizTalk Server 2006
Event Category: BizTalk Server 2006
Event ID: 5720
Date: Date
Time: Time
User: N/A
Computer: ComputerName
Description:
There was a failure executing the send pipeline: "BTAHL72XPipelines.BTAHL72XSendPipeline, BTAHL72XPipelines, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Source: "BTAHL7 2.X Assembler" Send Port: "MLLPSendPort" URI: "localhost:11000" Reason: Object reference not set to an instance of an object.

So we put the MessageEncoding in and then started getting the following error:

Event Type: Error
Event Source: BizTalk Server 2006
Event Category: BizTalk Server 2006
Event ID: 5720
Date: Date
Time: Time
User: N/A
Computer: ComputerName
Description:
There was a failure executing the send pipeline: "BTAHL72XPipelines.BTAHL72XSendPipeline, BTAHL72XPipelines, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Source: "BTAHL7 2.X Assembler" Send Port: "HL7_SP" URI: "C:\Labs\HL7_Outbound\%MessageID%.txt" Reason: Specified cast is not valid.

Low and behold, hot fix 947261 that deals with these two error message. If you check version the following file Microsoft.solutions.btahl7.hl72fasm.dll, ours was at 2.0.302.0

Acknowledgment Event ID: 5778 - The published message message could not be routed because no subscribers were found

Another one of the gotchas (yes, my blog seems to be full of them) is the 'association' of the acknowledgment with the original message that  is generated from the BTAHL7 receive pipeline. In the BTAHL7 Configuration explorer, by default the Acknowledgment settings are as follows:

partnerdefaultsetup

Notice that the MSH15 and MSH16 overrides are set to AL- Always generate the System and Application Acknowledgment, and that below the Route ACK to send pipeline on request-response receive port is checked. This means that the default behavior of the pipeline is to generate two acknowledgments, and route one of them back along the receive location's send pipeline. What is it supposed to do with the second acknowledgment that it created?

That is where the error message is generated: Event ID 5778: The Messaging engine failed to process a message submitted by adapter: MLLP Source URL:{whaver server:port} Details: The published message could not be routed because no subscribers were found. This error occurs if the subscribing orchestration or send port has not been enlisted, or if some of the message properties necessary for subscription evaluation have not been promoted.

ackeventerror

The resolution: a simple solution is to create a send port for this data and drop it off as a file.

Not quite the elegant solution that I want to deal with, as now there is a maintenance aspect of making sure that this folder is purged.

Let's just not create the application acknowledgment. You do this by changing the parties definition from Original to Enhanced mode and turning the application acknowledgment to NE (never).

newpartnersetup

MS-HUG August 26-27

MicrosoftHUG_GoldenTicket_only

Is anyone going there this year?

Let me know.

Encoding for HL7 messages

I was helping a friend with a HL7 question about how to change the MSH1, and I decided to make sure that my syntax was correct so I looked at the help and

BAM

I noticed that there is a new context property

DoorbellFinalMessage(BTAHL7Schemas.MessageEncoding) = 65001;

Using BTAHL7 pipelines in multiple applications

A question was recently posted on the forums on how you can use the default pipelines in multiple applications.

I actually was stumped when I started testing the beta of BizTalk 2006 also.

The steps are pretty easy:

In your new application, right click the application and in the context menu click properties

context menu

In the properties click on references and Add BizTalk Application 1 (which is where the pipeline is installed to)

references

Now you can access the pipeline within your own application.

BizTalk Guru Newsletter - BAM Uninstall

Stephen Thomas hit me up to write an article for his newsletter (if you aren't automatically getting it, you should sign up for it here).

I wrote about how to automatically uninstall a BAM definition as part of the MSI uninstall. You can read about it here: http://www.biztalkgurus.com/newsletter/TheBizTalker-Volume-11.html

The one dilemma I have is that I cannot seem to figure out how to get a batch script to resolve the installation path by using this code in a batch script:

for /f "skip=2 tokens=2,*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\BizTalk Server\3.0" /v "InstallPath"') do SET BTSbm="%%~bTracking\bm.exe remove-all -DefinitionFile:"

I am looking into it and will update this blog entry when I finally do figure it out.

HL7 Accelerator installation on a 64 bit machine

If you are installing the HL7 accelerator on a 64 bit development environment, make sure that you install both BizTalk 2006 R2 and the HL7 components in the \Program Files (x86)\ folder.

If you don't the HL7 projects (BTAHL72X Common, ...) will not show up as available as BizTalk projects. You will still be able to create HL7 schemas using the new button'd dialog box, but the underlying projects are not available.

HL7 accelerator 1.3 versus 2.0

One of the most noticeable differences between the 2006 and the 2006 R2  is the dialog on creating new schemas. Here is what it looks like in 2006

oldHL7Dialog

I never quite got that pressing Finish created the schema, and Cancel closed the dialog box. In my meetings with the developers, I asked if that could be changed.

Viola!

newHL7Dialog

Custom Trigger Message Update

I have updated my custom trigger message entry here since a friend tried unsuccessfully to follow my instructions.

I have added a few more pictures and have noted some gotcha's.

RHIO's, HIE's, and Healthcare IT

If you are interested in learning about the RHIO HIE space, my business partner Mark Singh keeps an active blog about the things that are going on in the physician's world.

The company site is here and his blog is here.

Go take a look and let me know what you think!

Making modifications to the HL7 schemas

Again, what I know, I think everyone else knows. In this case, a question on the forum raised my level of awareness  of things that I take for granted.

A question was asked how to change table values, where to look at what is there, and how to change them.

I will start by looking at the ORM_O01 message and we are going to be looking at the Gender element (yes I could use the real word, but I don't want to end up on a blocked site list!)

image

By clicking on the PID_8 in the properties you see the information you need in the Base Data Type

image

So we go to the tablevalues_{version}.xsd and look for that table (fortunately we only have to look at the first one!) and click on Enumeration:

image

Now you can add/remove the values that you need.

Note: The thing you need to make sure is that you will need to redeploy all of the schemas to make it work again.

HL7 v.Next

This is what I would like to see in HL7 v.Next. This entry I hope serves to be launch pad for other entries. I have spent a great deal of time thinking over the following guideline in the HL7 standards, which are not followed in the BTAHL7 accelerator. 

Ignore segments, fields, components, subcomponents, and extra repetitions of a field that are present but were not expected.

Let's take a look at the current situation. You have all of these fields that are defined in the schema as required, and they are at various levels in the schema.

image

Here there is a obviously wrong implementation of the standard. If I don't care about this, why is this element required, and why might it have to match a pattern and possibly have an enumeration that it needs to match against?

What I would like to do is four things initially:

  1. When I start up a new project where I am going to need to create a new trigger message for a data source, I don't want to have to hack into the schemas to change the target namespace for the base schemas (datatypes, segments, and tablevalues). Why can't there be a way from within the schema to define a party that this message is defined to, and it have it derive a new definition off of the base schemas for that party? In the BTAHL7 Configuration explorer, it will automatically make the targetnamespace coincide with the party name. Something that looks like this:
    image
    which would automatically change the Target Namespace to this when I choose the Partner URI in the schema
    image
  2. I would like to open up the schema and be able to do a 'Select All' and then with the CTRL button go and de-select the fields I care about, and with the right click make all of the fields optional and override the data type to ST or TX with no enumeration or patterns.
    image
  3. I would like to be able to see the enumeration lists for the base schemas even though I am looking at an inherited schema. When I click on PID 2.5.0 in the ORM^O01 schema, because it has imported that definition, I don't see the enumeration. I have to go and open up the tablevalues schema and search thru it to change those values to have to recompile and redeploy. Why can't I first see the values and second override the existing values with values I know are going to come in, sometimes less, sometimes more values.
    image 
    image
  4. The last thing is that every segment, sub element should have the optional Trailer to consume additional data that might be there:
    image

It should be pretty easy to accomplish, shouldn't it?

This is just something that I thought of this week while at MS-HUG. I do not doubt that there are many issues with my theory, but those three things would make implementing HL7 with BizTalk SO MUCH easier and bring Microsoft's HL7 component much closer to the standard.

Send me an email thru my contacts page if you have more ideas.

MS-HUG Day 2

Well, unlike day 1, I was unable to dedicate a whole lot of time to the convention.

The only thing that I can attest to is that my discussion with Mark Singh brought some interesting ideas for the components of SEMRHIO

I also met with Eric Battalio again where I was grilled for more about an hour and a half. "Hands around my neck squeezing hard and forcing me to tell how documentation can be better." Or something like that :)

Actually it was a great discussion, we discussed things that I did not like about the documentation, above and beyond my Documentation Rant. Hopefully something will come out of that, maybe some enhancements to the core product, some changes to the core MSDN site, and other things. I hope that documentation will no longer be a second rate citizen in the eyes of Microsoft. My feelings that if there is better documentation (some documentation is better than others granted), but how we, the unenlightened, actually interact with the documentation that more resources of MS could be dedicated to making better software and not so many resources dedicated to supporting it.

I once again brought up that I use Google almost exclusively compared to Live Search because of the hit ratio.

MS-HUG Day 1

Wanted to recap the list of things I walked away with today from the conference at MS-HUG:

Keynote address

Bill Crounse, MD, Director Worldwide Health Microsoft Corporation

Well, I got to listen to Bill (no not that Bill) and it was interesting, I learned today that CMS will significantly curtail the payments of procedures for in hospital infections. This will have rippling effects for the providers, and will spurn the pay for performance initiatives and quality of care initiatives as hospitals will now have to foot the bill for those issues.

Winning Trust, Minimizing IT Resources: Key to Forming RHIOs

Mark Singh President Clinicore Solutions

Kathleen Sullivan CEO Salient Health Solutions/SEMRHIO Consultant

Being the architect I am very much aware of what is going on (I had better!), however it was interesting because most of the questions were focused on the business model, the revenue generation process. This is the next phase in our process, but having a working process in place I feel is the key to success as we now have 3 hospitals up with minimal IT resources.

Reference Implementations for Healthcare: HCE and iHE XDS.b (sorry the link does not work as of yet)

Roberto Ruggeri Senior Technical Strategist for Microsoft Worldwide Health Microsoft Corporation

Randy Fusco Technical Strategist for Microsoft US Health Providers Microsoft Corporation

This was a great presentation where I learned about how much Microsoft is looking for us to help. For those who write blogs and to those who read blogs (you know who you are) it was a call to action! Yes you!

On http://solshare.net you can download the code and start to try it out and using their forum, you can submit bugs, ask for enhancements, etc.

I asked if there was a list of known issues, in which Roberto told me that no, this was a feature, that we get to start our own list and he will see if we really know what we are doing! (j/k) Seriously, he said that there is no existing list of issues, so I would assume that you can post those known issues/fixes directly on the solshare.net site.

Lunch

I went out to eat with Eric Battalio, Muhammad, and Liza from the documentation team, and wow, I learned a lot! The first and most important thing I learned is that those comments that you can leave on the documentation site actually go to someone. My suggestion is that if you want to start a dialog with the documentation team (which by the way, they would LOVE), it would be nice to have some type of post submission question asking if you (the feedbacker) would like to be contacted by Microsoft and what email they can contact you.

In the interim, just put your email address in the comments so they can contact you directly, I assume that there will be something in the works addressing this issue. Below is an example of something I have had on the back of my mind recently. 

image

Improving Patient Safety Using the Microsoft Common User Interface (MS-CUI)

Andrew Kirby Director of Solutions Development Center Microsoft Corporation, UK

Like the CHF, this is very much a work in progress and since it is very early on in the development, it is more of a guideline and they need as much feedback as possible. However there are no immediate plans for a reference implementation to build off of other than the first implementation in England.

What’s New in BizTalk Server 2006 R2

Stuart Landrum Program Manager, BizTalk, Microsoft Corporation

Well, it was the first time I had met Stuart face to face, had been on some conference calls with him, so it was good to meet him. He explained the new features with the HL7 accelerator (now officially branded 2.0). There was very little pictures of the product so the discussion went rather quickly and ended early with few questions, I had to ask a few questions to get people in the asking mood, but it did not go much further than that.

Closing Keynote: Using IT to affect efficiency and safety changes in the erioperative process

Conclusion 

Paul St. Jacques, MD Associate professor and Director of Perioperative informatics Vanderbilt University

This doctor was actually kind of funny. I am not sure if he meant to be, but if it was not for his phones (yes plural) that added a little static to his voice, or his low ranking on the pay for performance ratings that he refuse to show on the list of many doctors ranked (it was too small to see), it was a good presentation that ended on a high note, even though he essentially had to ask us to laugh, even though there wasn't really anything funny about his presentation. He did use one of my all time favorite phrases, while describing the hospital system that he works in, he described it as a level 1 trauma facility that is "soup-to-nuts" - where did that come from and should we be saying that phrase as professionals?

The interesting thing that I thought that he was going to joke about was his workflow from a patient pre-registration process through surgery completion. look closely for anything wrong with this picture

image

 

nope, not the fact that they are using SQL Server 2003 (must be a special version of SQL Server that I am not aware of) 

 

The real problem with this picture is that there is a little girl that starts the surgery process, and when the workflow is complete, the girl is actually Henry Kissinger! Either that process took a really long time (and something major wrong happened), or this is a plastic surgeon's billing dream come true!

Talk to you all tomorrow!

HL7 Dynamic Data Validation

In the documentation for HL7 there is an interesting chapter called Using Dynamic Data Validation and it is located here. To explain how this is to be done you first have to go into the HL7 configuration explorer and disable the data validation.

image

 

This will allow data to arrive without being checked against its Enumeration:

image

This however will not disable the structure validation that is the pain point of most HL7 implementations.

Once data is structurally validated, then the message arrives into the orchestration you then start to use the Business Rules engine to validate the data

image

image

 

This is the starting point of how you enable Dynamic Data Validation using the HL7 accelerator

Is anyone excited about this movie

 

Let me know...

«July»
SunMonTueWedThuFriSat
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678