go to post Elisha Gould · May 5, 2022 Thank you, I'll have a look at it. I did open a WRC Support request about it, but still waiting to hear back if it can be added to our current release.
go to post Elisha Gould · Jun 30, 2020 For those interested. We copied part of the validation check, and updated with some options to truncate as per the schema. It can be called with: set tSC = ##class(User.Hl7RangeCheck).RangeChk(.pRequest) Include EnsHL7 Class User.Hl7RangeCheck{ ClassMethod RangeChk(ByRef pMsg As EnsLib.HL7.Message) As %Status{#dim pIndex as %Integer = 1Set tSC=$$$OK , tSC2=$$$OK, tSC1=$$$OKfor {set pSeg = pMsg.GetSegmentAt(pIndex)quit:($ZSTRIP(##class(%String).LogicalToDisplay(pSeg), "<>W" ) = "") quit:(pSeg.Name = "") //$$$ERROR($$$EnsErrGeneral, "Cannot validate segment schemas without a segment name. Unable to validate segment "_$get(pSegNum)_".")set hasSegNum = 1 - ($get(pSegNum)="")quit:(pSeg.DocTypeCategory = "") //$$$ERROR($$$EnsErrGeneral, "Cannot validate segment schemas without a category. Unable to validate segment "_$S(hasSegNum:pSegNum_":",1:"")_pSeg.Name_".") quit:($get($$$vaSchemaGbl(pSeg.DocTypeCategory, "SS", pSeg.Name)) = "") //$$$ERROR($$$EnsErrGeneral, "Unable to retrieve the schema to validate segment against. Unable to validate segment "_$S(hasSegNum:pSegNum_":",1:"")_pSeg.Name_".")set schema = $$$vaSchemaGbl(pSeg.DocTypeCategory, "SS", pSeg.Name)for fieldNum=1:1:$listlength(schema) {quit:(fieldNum > pSeg.Count)set fieldDat = pSeg.GetValueAt(fieldNum, pSeg.Separators, .tSC2)if ($$$ISERR(tSC2)) {set tSC = $$$ADDSC(tSC, $$$ERROR($$$EnsErrGeneral, "Unable to retrieve field "_fieldNum_" from segment "_$S(hasSegNum:pSegNum_":",1:"")_pSeg.Name_"."))quit ; can only continue with this field if no error in getting it}set fieldSchema = $listget(schema, fieldNum)if '(((pSeg.Name = "MSH") || (pSeg.Name = "BHS") || (pSeg.Name = "FHS")) && ((fieldNum = 1) || (fieldNum = 2))) {set dat = $tr(fieldDat, pSeg.Separators, "") ; remove separators from field}else {set dat = fieldDat}set data = (dat '= "") ; is anything left?if (data) {//if not data structures, components, subcomponents, datatypes, and/or code tablesif ($listget(fieldSchema, 1) = ""){ set len = $length(fieldDat)if (($listget(fieldSchema, 4) '= "") && (len > $listget(fieldSchema, 4))) ; over length restriction{if '(((pSeg.Name = "MSH") || (pSeg.Name = "BHS") || (pSeg.Name = "FHS")) && (fieldNum = 2)) {for rep=1:1:($length(fieldDat, pSeg.RS)) {if ($length($p(fieldDat, pSeg.RS, rep)) > $listget(fieldSchema, 4)) { set tSC = pMsg.SetValueAt(..Truncate(pMsg.GetValueAt(pSeg.Name_":"_fieldNum_"("_rep_")"),$listget(fieldSchema, 4)) , pSeg.Name_":"_fieldNum_"("_rep_")")}} } }}else {k infoset info("SegName") = pSeg.Name , info("fieldNum") = fieldNum, info("sep") = pSeg.Separatorsset (info("rep"), info("comp"), info("subComp")) = 1 set:(hasSegNum) info("SegNum") = pSegNumset info("hasSegNum") = hasSegNum if ($listget(fieldSchema, 1) '= "") ; there is a data structure for the field{set dataStruct = $listget(fieldSchema, 1)set tSC = ..ValidateFieldDataStructure(.pMsg,fieldDat, dataStruct, .info)}}}} set pIndex = pIndex+1}return tSC} ClassMethod ValidateFieldDataStructure(ByRef pMsg As EnsLib.HL7.Message, field As %String, struct As %String, ByRef info) As %Status [ Internal ]{set tSC = $$$OK, error = 0set category = $p(struct, ":", 1)set dataStruct = $p(struct, ":", 2) quit:((category = "") || (dataStruct = "")) $$$ERROR($$$EnsErrGeneral, "Cannot find schema for data structure "_struct_". Unable to validate segment "_$S($get(info("SegNum"))'="":info("SegNum")_":",1:"")_info("SegName")_" field "_info("fieldNum")_" against this structure.")set structure = $get($$$vaSchemaGbl(category, "DT", dataStruct))quit:('$data(structure)) $$$ERROR($$$EnsErrGeneral, "Cannot find schema for data structure "_struct_". Unable to validate segment "_$S(info("hasSegNum"):info("SegNum")_":",1:"")_info("SegName")_" field "_info("fieldNum")_" against this structure.") if '(((info("SegName") = "MSH") || (info("SegName") = "BHS") || (info("SegName") = "FHS")) && (info("fieldNum") = 2)) {for info("rep") = 1:1:$length(field, $$$RSSEP(info("sep"))) {set repeat = $piece(field, $$$RSSEP(info("sep")), info("rep"))for info("comp")=1:1:$length(repeat, $$$CSSEP(info("sep"))) {quit:(info("comp") > $listlength(structure))set component = $piece(repeat, $$$CSSEP(info("sep")), info("comp"))set dat = $tr(component, $$$SSSEP(info("sep"))) ; remove separators from fieldset data = (dat '= "") ; is anything left?if (data) {set len = $length(component)if (($listget($listget(structure, info("comp")),3)'="") && (len > $listget($listget(structure, info("comp")),3))) ; over length restriction { set tSC = pMsg.SetValueAt(..Truncate(component,$listget($listget(structure, info("comp")),3)), info("SegName")_":"_info("fieldNum")_"("_info("rep")_")"_"."_info("comp"))}}}}}Return tSC} ClassMethod Truncate(pString As %String, pNum As %Integer) As %String{#dim tString As %String = pString If ($LENGTH(pString) > pNum){Set tString = $EXTRACT(pString,1,pNum)} Return tString} }
go to post Elisha Gould · May 26, 2020 Hi, It's a few particular down stream applications that have strict limits on its field sizes. I can't just drop the message if it doesn't conform as they still require the data, and it is valid output from the source system. I know I could update the DTL to go through every field and truncate as needed, however that would need every field to have the limit put on it, which gets a bit excessive with the number of fields that need the limit placed on. I was mainly trying to see if there was something already existing that was able to just use the schema before I went down that rabbit hole.