Skip to main content


serial class HS.SDA3.Observation extends HS.SDA3.SuperClass

Note that Observations appear in three places in the SDA3 data model:
as a list property of Container, as a list property of Vaccination
and as a list property of SocialDeterminant.

Observations under the Container are stored as their own streamlets.
Observations that are properties of a Vaccination are stored as part of the
Vaccination streamlet. Cases where the HL7 or Streamlet processing is
different for independent Observations versus Vaccination Observations are
noted in these annotations. At present Vaccination Observations are not
stored in the Viewer Cache, so any mention of the Viewer Cache here refers
to independent Observations only. Observations that are properties of a
Social Determinant are stored as part of the Social Determinant streamlet.

Also note that the way some properties are parsed from HL7 will depend on
the value of the ObservationCompatibilityMode setting of the HL7 Inbound
Process operation of the Edge production (referred to here as Compatibility
Mode on or off).
HS.SDA3.Observation corresponds to the CDA Vital Signs section. An Observation
is exported to the Vital Signs section only when the ObservationCode indicates
a valid LOINC Vital Sign code.

Property Inventory


property ActionCode as %String;
Supported values:
D = Delete
C = Clear/Delete All
Any other value = Add or Update
See the annotation on the superclass property for more information on how
ActionCode is used.

VIEWERLIB: Not stored
Property methods: ActionCodeDisplayToLogical(), ActionCodeGet(), ActionCodeIsValid(), ActionCodeLogicalToDisplay(), ActionCodeLogicalToOdbc(), ActionCodeNormalize(), ActionCodeSet()
property ActionScope as %String;
Not used.
Property methods: ActionScopeDisplayToLogical(), ActionScopeGet(), ActionScopeIsValid(), ActionScopeLogicalToDisplay(), ActionScopeLogicalToOdbc(), ActionScopeNormalize(), ActionScopeSet()
property Clinician as HS.SDA3.CodeTableDetail.CareProvider;
Clinician who made the observation

SDATableName=CareProvider, ViewerClass=User.HS.CTCareProv
Property methods: ClinicianGet(), ClinicianGetObject(), ClinicianGetObjectId(), ClinicianGetSwizzled(), ClinicianIsEmpty(), ClinicianIsValid(), ClinicianNewObject(), ClinicianSet(), ClinicianSetObject(), ClinicianSetObjectId(), ClinicianUnSwizzle()
property Comments as %String (MAXLEN = 999);
Comments on the observation
The MAXLEN comes from the Trak property.

HL7: NTE-3 : Comment
VIEWERLIB: User.HS.MRObservations(OBSShortDesc)
Property methods: CommentsDisplayToLogical(), CommentsGet(), CommentsIsValid(), CommentsLogicalToDisplay(), CommentsLogicalToOdbc(), CommentsNormalize(), CommentsSet()
Provides a reason why the expected value for the Observation is missing. This field is not populated from HL7 v2 or CCDA. VIEWERLIB: Not stored
Property methods: DataAbsentReasonGet(), DataAbsentReasonGetObject(), DataAbsentReasonGetObjectId(), DataAbsentReasonGetSwizzled(), DataAbsentReasonIsEmpty(), DataAbsentReasonIsValid(), DataAbsentReasonNewObject(), DataAbsentReasonSet(), DataAbsentReasonSetObject(), DataAbsentReasonSetObjectId(), DataAbsentReasonUnSwizzle()
property EnteredAt as HS.SDA3.CodeTableDetail.Organization;
SDATableName=Organization, ViewerClass=User.HS.CTHospital
VIEWERLIB: User.HS.MRObservations(OBSUpdateHospitalDR)
Property methods: EnteredAtGet(), EnteredAtGetObject(), EnteredAtGetObjectId(), EnteredAtGetSwizzled(), EnteredAtIsEmpty(), EnteredAtIsValid(), EnteredAtNewObject(), EnteredAtSet(), EnteredAtSetObject(), EnteredAtSetObjectId(), EnteredAtUnSwizzle()
property EnteredBy as HS.SDA3.CodeTableDetail.User;
SDATableName=User, ViewerClass=User.HS.SSUser
VIEWERLIB: User.HS.MRObservations(OBSUserDR)
Property methods: EnteredByGet(), EnteredByGetObject(), EnteredByGetObjectId(), EnteredByGetSwizzled(), EnteredByIsEmpty(), EnteredByIsValid(), EnteredByNewObject(), EnteredBySet(), EnteredBySetObject(), EnteredBySetObjectId(), EnteredByUnSwizzle()
property EnteredOn as HS.SDA3.TimeStamp;
VIEWERLIB: User.HS.MRObservations(OBSUpdateDate) + User.HS.MRObservations(OBSUpdateTime)
Property methods: EnteredOnDisplayToLogical(), EnteredOnGet(), EnteredOnIsValid(), EnteredOnLogicalToDisplay(), EnteredOnLogicalToTimeStamp(), EnteredOnLogicalToXSD(), EnteredOnNormalize(), EnteredOnOdbcToLogical(), EnteredOnSet(), EnteredOnXSDToLogical()
property Extension as HS.Local.SDA3.ObservationExtension;
Property methods: ExtensionGet(), ExtensionGetObject(), ExtensionGetObjectId(), ExtensionGetSwizzled(), ExtensionIsEmpty(), ExtensionIsValid(), ExtensionNewObject(), ExtensionSet(), ExtensionSetObject(), ExtensionSetObjectId(), ExtensionUnSwizzle()
property GroupId as %String;
If this observation was taken as part of a group, this is the identifier of that group.
The SDA2-to-SDA3 transform populates this field with the SDA2 ExternalId property.

GroupId will only be parsed for Vaccination Observations.

HL7: OBX-4 : ObservationSubId
VIEWERLIB: User.HS.MRObservations(OBSExternalId)
Property methods: GroupIdDisplayToLogical(), GroupIdGet(), GroupIdIsValid(), GroupIdLogicalToDisplay(), GroupIdLogicalToOdbc(), GroupIdNormalize(), GroupIdSet()
property ObservationCode as HS.SDA3.CodeTableDetail.Observation;
Streamlet cache:
In the OnValidate method of the Observation Streamlet class, if the
Observation has no ObservationCode, an error will be logged and the
Streamlet will not be saved.
In the OnValidate method of the Vaccination Streamlet class, if any of the
Observations in VXUObservations has no ObservationCode, an error will be
logged and the Vaccination will not be saved.

HL7: OBX-3 : ObservationIdentifier
SDATableName=Observation, ViewerClass=User.HS.MRCObservationItem
VIEWERLIB: User.HS.MRObservations(OBSItemDR)

HL7: OBX-3.1 : ObservationIdentifier.Identifier
VIEWERLIB: User.HS.MRCObservationItem(ITMCode)
HL7: OBX-3.2 : ObservationIdentifier.Text
VIEWERLIB: User.HS.MRCObservationItem(ITMDesc)
HL7: OBX-3.3 : ObservationIdentifier.NameofCodingSystem
VIEWERLIB: Not stored
Streamlet cache:
Note that units are not used when matching Observation Streamlets, so two
SDA3 Observations with the same ObservationTime and Observation.Code and
SDACodingStandard, and different ObservationValueUnits *will* match, and
the existing value for ObservationValueUnits will be overridden.
Viewer cache:
Note that units *are* used for code table matching in the Viewer Cache, so
two CodeTableDetail Observations with the same Code, Description, and
SDACodingStandard but different ObservationValueUnits *will not* match.
HL7: OBX-6 : Units
SDATableName=UoM, ViewerClass=User.HS.CTUOM
HL7: OBX-6.1 : Units.Identifier
HL7: OBX-6.2 : Units.Text
HL7: OBX-6.3 : Units.NameofCodingSystem
VIEWERLIB: Not stored
Property methods: ObservationCodeGet(), ObservationCodeGetObject(), ObservationCodeGetObjectId(), ObservationCodeGetSwizzled(), ObservationCodeIsEmpty(), ObservationCodeIsValid(), ObservationCodeNewObject(), ObservationCodeSet(), ObservationCodeSetObject(), ObservationCodeSetObjectId(), ObservationCodeUnSwizzle()
property ObservationCodedValue as HS.SDA3.CodeTableDetail.ObservationValueCode;
Coded value of observation

ObservationCodedValue will only be parsed if Compatibility Mode is off or
the OBX is for a Vaccination Observation, and OBX-2 (Value Type) is CE,

HL7: OBX-5 : ObservationValue
VIEWERLIB: Not stored

HL7: OBX-5.1 : ObservationValue
HL7: OBX-5.2 : ObservationValue
HL7: OBX-5.3 : ObservationValue
HL7: OBX-5.7 : ObservationValue
HL7: OBX-5.9 : ObservationValue
In addition to the above condition for parsing ObservationCodedValue, if
OBX-5.4 or .5 are not null, then OBX-5.4, .5, .6, and .8 will be parsed
into a PriorCode as Code, Description, CodeSystem, and CodeSystemVersionId,
HL7: OBX-5.4 : ObservationValue
HL7: OBX-5.5 : ObservationValue
HL7: OBX-5.6 : ObservationValue
HL7: OBX-5.8 : ObservationValue
Property methods: ObservationCodedValueGet(), ObservationCodedValueGetObject(), ObservationCodedValueGetObjectId(), ObservationCodedValueGetSwizzled(), ObservationCodedValueIsEmpty(), ObservationCodedValueIsValid(), ObservationCodedValueNewObject(), ObservationCodedValueSet(), ObservationCodedValueSetObject(), ObservationCodedValueSetObjectId(), ObservationCodedValueUnSwizzle()
property ObservationGroup as %String;
Id of the observation group this observation belongs to.
Property methods: ObservationGroupDisplayToLogical(), ObservationGroupGet(), ObservationGroupIsValid(), ObservationGroupLogicalToDisplay(), ObservationGroupLogicalToOdbc(), ObservationGroupNormalize(), ObservationGroupSet()
property ObservationId as %String;
Id of a streamlet containing this obsrvation, used only for memebers of a group
Property methods: ObservationIdDisplayToLogical(), ObservationIdGet(), ObservationIdIsValid(), ObservationIdLogicalToDisplay(), ObservationIdLogicalToOdbc(), ObservationIdNormalize(), ObservationIdSet()
property ObservationMethods as list of HS.SDA3.CodeTableDetail.ObservationMethod;
OBX-17 is a repeating field. Each non-null instance will be parsed as one
ObservationMethod in this list.

HL7: OBX-17 : ObservationMethod
VIEWERLIB: Not stored

HL7: OBX-17.1 : ObservationMethod.Identifier
HL7: OBX-17.2 : ObservationMethod.Text
HL7: OBX-17.3 : ObservationMethod.NameofCodingSystem
HL7: OBX-17.7 : ObservationMethod.CodingSystemVersionID
If OBX-17.4 or .5 are not null, then OBX-17.4, .5, .6, and .8 will be
parsed to a PriorCode as Code, Description, CodeSystem, and
CodeSystemVersionId, respectively.
HL7: OBX-17.4 : ObservationMethod.AlternateIdentifier
HL7: OBX-17.5 : ObservationMethod.AlternateText
HL7: OBX-17.6 : ObservationMethod.AlternateNameofCodingSystem
HL7: OBX-17.7 : ObservationMethod.AlternateCodingSystemVersion
Property methods: ObservationMethodsBuildValueArray(), ObservationMethodsCollectionToDisplay(), ObservationMethodsCollectionToOdbc(), ObservationMethodsDisplayToCollection(), ObservationMethodsGet(), ObservationMethodsGetObject(), ObservationMethodsGetObjectId(), ObservationMethodsGetSwizzled(), ObservationMethodsIsValid(), ObservationMethodsOdbcToCollection(), ObservationMethodsSet(), ObservationMethodsSetObject(), ObservationMethodsSetObjectId()
property ObservationTime as HS.SDA3.TimeStamp;
Time of the observation

Streamlet cache:
In the OnBeforeMatch method of the Observation Streamlet class, if
ObservationTime is null, it is defaulted to EnteredOn, then to the current
In the OnBeforeMatch method of the Vaccination Streamlet class, if
ObservationTime is null, it is defaulted to the last non-null
ObservationTime in the list (that was originally non-null, not defaulted),
then to the EnteredOn of the current Observation, then to the current

HL7: OBX-14.1 : DateTimeoftheObservation.Time
VIEWERLIB: User.HS.MRObservationEntry(OBSENTRYDate) + User.HS.MRObservationEntry(OBSENTRYTime)
VIEWERLIB: User.HS.MRObservations(OBSDate) + User.HS.MRObservations(OBSTime)
Property methods: ObservationTimeDisplayToLogical(), ObservationTimeGet(), ObservationTimeIsValid(), ObservationTimeLogicalToDisplay(), ObservationTimeLogicalToTimeStamp(), ObservationTimeLogicalToXSD(), ObservationTimeNormalize(), ObservationTimeOdbcToLogical(), ObservationTimeSet(), ObservationTimeXSDToLogical()
property ObservationValue as %String (MAXLEN = 999);
Free-text value of the observation

If Compatibility Mode is on and the OBX segment is for an independent (not
Vaccination) Observation, then ObservationValue is parsed from each
instance of OBX-5.1 (OBX-5 is repeating) concatenated together with ", ".
If Compatibility Mode is off or if the OBX segment is for a Vaccination
Observation, then the behavior depends on the value of OBX-2:
-If OBX-2 is CE, CWE, or CNE, ObservationValue is populated by OBX-5.2
(ObservationValue.Text) or OBX-5.9 (ObservationValue.OriginalText) if that
is null.
-If OBX-2 is TS or DT, then OBX-5 should contain an HL7 timestamp, and
ObservationValue will be parsed as that time in YYYY-MM-DD hh:mm:ssZ
-If OBX-2 is SN, then ObservationValue will be parsed as subfields 1
through 4 of OBX-5 all concatenated together. -If OBX-2 is none of these values, then ObservationValue is parsed from
each instance of OBX-5.1 (OBX-5 is repeating) concatenated together with
", ".

HL7: OBX-5 : ObservationValue
VIEWERLIB: User.HS.MRObservations(OBSValue)
Property methods: ObservationValueDisplayToLogical(), ObservationValueGet(), ObservationValueIsValid(), ObservationValueLogicalToDisplay(), ObservationValueLogicalToOdbc(), ObservationValueNormalize(), ObservationValueSet()
property ObservationValueTime as HS.SDA3.TimeStamp;
If Compatibility Mode is off or the OBX is for a Vaccination Observation,
and if OBX-2 (Value Type) is TS or DT, the ObservationValueTime is parsed
as OBX-5.1, converted to XML timestamp format. Otherwise HL7ToSDA3 does
not set this.

HL7: OBX-5.1 : ObservationValue
VIEWERLIB: Not stored
Property methods: ObservationValueTimeDisplayToLogical(), ObservationValueTimeGet(), ObservationValueTimeIsValid(), ObservationValueTimeLogicalToDisplay(), ObservationValueTimeLogicalToTimeStamp(), ObservationValueTimeLogicalToXSD(), ObservationValueTimeNormalize(), ObservationValueTimeOdbcToLogical(), ObservationValueTimeSet(), ObservationValueTimeXSDToLogical()
property ObservationValueType as %String;
The Value Type affects how ObservationValue is parsed and whether
ObservationCodedValue or ObservationValueTime will be parsed as well. See
the annotations on those properties for more info.

HL7: OBX-2 : ValueType
VIEWERLIB: Not stored
Property methods: ObservationValueTypeDisplayToLogical(), ObservationValueTypeGet(), ObservationValueTypeIsValid(), ObservationValueTypeLogicalToDisplay(), ObservationValueTypeLogicalToOdbc(), ObservationValueTypeNormalize(), ObservationValueTypeSet()
property Status as %String (MAXLEN = 100);
The status of the observation. VIEWERLIB: Not stored
Property methods: StatusDisplayToLogical(), StatusGet(), StatusIsValid(), StatusLogicalToDisplay(), StatusLogicalToOdbc(), StatusNormalize(), StatusSet()

Inherited Members

Inherited Properties

Inherited Methods

FeedbackOpens in a new tab