go to post Thembelani Mlalazi · Jun 27, 2018 @Eduard Lebedyuk I have tried your suggestions and still get the error when opening the file with adobe reader. If I try on a simple pass through operation like this below everything works fine.ERROR: Adobe acrobat reader could not open file.pdf because it is either not a supported file type or because the file has been damaged.the service Method OnProcessInput(pInput As %Stream.Object, Output pOutput As %RegisteredObject) As %Status { #dim pt as TestingEnvironment.ECGTrace.TEST.FSMREQ=##class(TestingEnvironment.ECGTrace.TEST.FSMREQ).%New() Set tSource=pInput.Attributes("Filename"), pInput=$zobjclassmethod(..#CONTAINERCLASS,"%New",pInput) Set tSC=..resolveAndIndex(pInput) Quit:$$$ISERR(tSC) tSC set pt.filestream=pInput set pt.path=tSource Set tWorkArchive=(""'=..Adapter.ArchivePath)&&(..Adapter.ArchivePath=..Adapter.WorkPath || (""=..Adapter.WorkPath && (..Adapter.ArchivePath=..Adapter.FilePath))) $$$SyncCommitSet(tSyncCommit) For iTarget=1:1:$L(..TargetConfigNames, ",") { Set tOneTarget=$ZStrip($P(..TargetConfigNames,",",iTarget),"<>W") Continue:""=tOneTarget $$$sysTRACE("Sending input Stream "_pInput.Stream_"("_pInput.Stream.Size_")"_$S(tWorkArchive:" Async",1:" Sync")_" from '"_tSource_"' to '"_tOneTarget_"'") If tWorkArchive { Set tSC1=..SendRequestAsync(tOneTarget,pt) Set:$$$ISERR(tSC1) tSC=$$$ADDSC(tSC,tSC1) //Set tSC1=..SendRequestAsync(tOneTarget,pInput) Set:$$$ISERR(tSC1) tSC=$$$ADDSC(tSC,tSC1) } Else { #; If not archiving send Sync to avoid Adapter deleting file before Operation gets it //Set tSC1=..SendRequestSync(tOneTarget,pInput) Set:$$$ISERR(tSC1) tSC=$$$ADDSC(tSC,tSC1) Set tSC1=..SendRequestSync(tOneTarget,pt) Set:$$$ISERR(tSC1) tSC=$$$ADDSC(tSC,tSC1) } } $$$SyncCommitClear(tSyncCommit) Quit tSC } the operation Method OnMessage(pREs As TestingEnvironment.ECGTrace.TEST.FSMREQ, pRequest As Ens.StreamContainer, Output pResponse As %Persistent) As %Status { set pRequest=pREs.filestream Quit:'$IsObject(pRequest.Stream) $$$ERROR($$$EnsErrGeneral,"No Stream contained in StreamContainer Request") Set tFilename=..Adapter.CreateTimestamp(##class(%File).GetFilename(pRequest.OriginalFilename),..Filename) Set tSC=..Adapter.PutStream(tFilename, pRequest.Stream) Do pRequest.%Save() ; re-save in case PutStream() optimization changed the Stream filename Quit tSC } my code the service Method OnProcessInput(pInput As %Stream.Object, Output pOutput As %RegisteredObject) As %Status { #dim meta as DocumentUpload.GenericUploadMREQ=##class(DocumentUpload.GenericUploadMREQ).%New() ;get the filepath from the request ;;wrap the stream object into container for easy transpotation Set tFileName=pInput.Attributes("Filename") , pInput=$zobjclassmethod(..#CONTAINERCLASS,"%New",pInput) $$$TRACE(tFileName) ;get the file name set dataPiece=##class(%File).GetFilename(tFileName) $$$TRACE(dataPiece) Set tSC=..resolveAndIndex(pInput) Quit:$$$ISERR(tSC) tSC ;check if the file path data is populated if (dataPiece'="") { ;build the ECG Message set meta.ClientID =$Piece(dataPiece,"_",1) set meta.LastName=$Piece(dataPiece,"_",2) set meta.FirstName=$Piece(dataPiece,"_",3) set meta.DateOfBirth=$Piece(dataPiece,"_",4) set meta.Directory =$Piece(tFileName,"\",*-1) set meta.OGFileName =dataPiece set meta.Fullpath =tFileName ;get the date to testing set DateOfTest=$Piece(dataPiece,"_",5) ;get the time of testing set mtim=$Piece(dataPiece,"_",6) ;separate the extension of the file path and the time set TimeOfTest=$Piece(mtim,".",1) set meta.FileTimeStamp =DateOfTest_""_TimeOfTest set meta.recordAdded =$ZDT($ZTIMESTAMP,3,1,3) set meta.TargetConfig ="RIO.DocumentUpload.RiOFileOPRN" set meta.payLoad=pInput set meta.DocumentType=..DocumentType set meta.Description=..Description set meta.Title=..Title set meta.FinalRevision=..Revesion set meta.Author=..Author_""_$Piece(tFileName,"\",*-1) set messagetype=$PIECE(..Author," ",1) set meta.UserId=..UserID set meta.sourceConfig =tFileName set meta.TypeMes=messagetype Set tWorkArchive=(""'=..Adapter.ArchivePath)&&(..Adapter.ArchivePath=..Adapter.WorkPath || (""=..Adapter.WorkPath && (..Adapter.ArchivePath=..Adapter.FilePath))) $$$SyncCommitSet(tSyncCommit) For iTarget=1:1:$L(..TargetConfigNames, ",") { Set tOneTarget=$ZStrip($P(..TargetConfigNames,",",iTarget),"<>W") Continue:""=tOneTarget $$$sysTRACE("Sending input Stream "_pInput.Stream_"("_pInput.Stream.Size_")"_$S(tWorkArchive:" Async",1:" Sync")_" from '"_tFileName_"' to '"_tOneTarget_"'") If tWorkArchive { Set tSC1=..SendRequestAsync(tOneTarget,meta) Set:$$$ISERR(tSC1) tSC=$$$ADDSC(tSC,tSC1) } Else { #; If not archiving send Sync to avoid Adapter deleting file before Operation gets it Set tSC1=..SendRequestSync(tOneTarget,meta) Set:$$$ISERR(tSC1) tSC=$$$ADDSC(tSC,tSC1) } } $$$SyncCommitClear(tSyncCommit) } quit tSC } the operation please note I have a Route in between which simple transformers the message to the message expected by the operation its just a simple mapping scenario Method WriteOutFiles(pRequest As DocumentUpload.FileMREQ, pInput As Ens.StreamContainer, Output pResponse As DocumentUpload.GenericRESP) As %Status { set pInput=pRequest.FileStream ;the variable to hold the status for the method #dim status as %Status=$$$OK ;clear the pResponse kill pResponse set pResponse=$$$NULLOREF ;set the file name to the sequence number set ..Filename=pRequest.NewFileName ;the filepath set on the settings of this OPERATION set origDirectory = ..Adapter.FilePath ;the file directory to drop the file set ..Adapter.FilePath = ..Adapter.FilePath_"\"_..StubDirectory ;start writing out file data to the stub file set:$$$ISOK(status) status= ..Adapter.PutLine(..Filename_"."_..stubExtension, $CHAR(34)_ pRequest.ClientID_$CHAR(34)_$CHAR(44)_$CHAR(34)_pRequest.UserId_$CHAR(34)_$CHAR(44)_$CHAR(34)_ pRequest.DocumentType _$CHAR(34)_$CHAR(44)_$CHAR(34)_pRequest.Title_$CHAR(34)_$CHAR(44)_$CHAR(34)_pRequest.Description_$CHAR(34)_$CHAR(44)_$CHAR(34)_pRequest.Author _$CHAR(34)_$CHAR(44)_$CHAR(34)_pRequest.DocumentDate_$CHAR(34)_$CHAR(44)_$CHAR(34)_pRequest.FinalRevision_$CHAR(34)) if ($$$ISOK(status)) { ;set back to the operation settings set ..Adapter.FilePath = origDirectory ;set the file name to write out to set ..Filename=pRequest.NewFileName_"."_..DocExtension ;set the filepath on the production settings to this variable set origDirectory = ..Adapter.FilePath ;set the new filepath set ..Adapter.FilePath = ..Adapter.FilePath_"\"_..DocumentDirectory // set:$$$ISOK(status) status= ..Adapter.PutStream(..Filename, pInput.Stream) //error here to file set:$$$ISOK(status) status=..OriginalFileOut(pInput,pResponse,..Filename) ;set adapter to its original file path set ..Adapter.FilePath = origDirectory ;check writing out file worked if ($$$ISOK(status)) { set pResponse=##class(DocumentUpload.GenericRESP).%New() set pResponse.Process="FileOPRN_files Written to their respective directories" set pResponse.Status=status set status=pResponse.%Save() } } ;return status return status } // passthrough original method to write out file Method OriginalFileOut(pRequest As Ens.StreamContainer, Output pResponse As %Persistent, filenamess) As %Status { Quit:'$IsObject(pRequest.Stream) $$$ERROR($$$EnsErrGeneral,"No Stream contained in StreamContainer Request") Set tFilename=..Adapter.CreateTimestamp(##class(%File).GetFilename(pRequest.OriginalFilename),filenamess) Set tSC=..Adapter.PutStream(tFilename, pRequest.Stream) Do pRequest.%Save() ; re-save in case PutStream() optimization changed the Stream filename Quit tSC }
go to post Thembelani Mlalazi · Jun 25, 2018 @Eduard Lebedyuk I have tried changing the file to a txt file and the file is being created with nothing in it
go to post Thembelani Mlalazi · May 22, 2018 @Eduard Lebedyuk Looked at the class this classEnsLib.RecordMap.Service.BatchFileService and the EnsLib.RecordMap.Service.BatchStandard class apparently these are fine but for some reason the custom class acts as if it goes into a loop.I have put some traces in my code and tried to capture the status and change it to fail if a certain validation fails but that makes the whole service to log an error after successfully delivering the first message . here are the changes made thanks for your help ClassMethod GetBatchHeader(pIOStream As %IO.DeviceStream, pTimeout As %Numeric = -1, Output pBatch As EnsLib.RecordMap.SimpleBatch, ByRef pLookAhead As %String) As %Status { $$$TRACE("Begin") Try { #dim cpStatus as %Status=$$$OK Set tStatus = $$$OK Set pBatch = "" Set tTerm = ..GetHeaderTerm() //Set tFullHeader = 63 _ tTerm Set tHeaderLen =63+$length(tTerm) set stage="" If tHeaderLen { Set tFound = 0 $$$TRACE("0") Set tLeadingJunk = "" Set pLookAhead = $get(pLookAhead) Set tTimeout = pTimeout Set tEndTime = $zhorolog + pTimeout // While ('tFound) && ('pIOStream.AtEnd) // { Set tReadLen = tHeaderLen - $length(pLookAhead) If tReadLen > 0 { Set tData = pLookAhead _ pIOStream.Read(tReadLen, .tTimeout, .tStatus) $$$TRACE("1") If $$$ISERR(tStatus) Quit If tTimeout { Set tStatus = $$$ERROR($$$EnsErrTCPReadTimeoutExpired, pTimeout, tReadLen) Quit } Set pLookAhead = "" } Else { $$$TRACE("Else treadlen less than 0-[2]") Set tData = $extract(pLookAhead, 1, tHeaderLen) Set pLookAhead = $extract(pLookAhead, tHeaderLen + 1, *) } If ($extract(tData,1,3) = "001" ) { Set pBatch = ..%New() set pBatch.BatchHeader = tData Set tFound = 1 $$$TRACE("Foundlee[3]"_tFound) Quit } Else { $$$TRACE("else $extract(tData1,3)Failed[3]") Set pLookAhead = pLookAhead _ tData #; Check if we should start discarding leading data If ($length(pLookAhead) >= tHeaderLen) { If ($length(tLeadingJunk) < 400) { Set tLeadingJunk = tLeadingJunk _ $extract(pLookAhead,1) } Set pLookAhead = $extract(pLookAhead,2,*) } set cpStatus=0 set stage="Extractfailed" //check here // Quit //Continue } If (pTimeout = -1) { Set tTimeout = -1 } Else { $$$TRACE("time out ok [4]") Set tCurrTime = $zhorolog If (tCurrTime > tEndTime) { Set tStatus = $$$ERROR($$$EnsErrTCPReadTimeoutExpired, pTimeout, tReadLen) Quit } Set tTimeout = tEndTime - tCurrTime } If $$$ISERR(tStatus) Quit // } //while $$$TRACE("while end"_tFound) If $$$ISERR(tStatus) Quit #; Clear the lookahead buffer if we didn't find the batch header $$$TRACE("###Status###[5]"_tStatus) If (('tFound) && ($length(tLeadingJunk) < 400)&&('pLookAhead="")&&($$$ISERR(cpStatus))) { Set tLeadingJunk = tLeadingJunk _ $get(pLookAhead) Set pLookAhead = "" $$$TRACE("###Not Found###[6]"_tFound) } If (tLeadingJunk '= "") && ('..#IgnoreLeadingData) { #; Use JS escaping to handle control characters Set tLoggedJunk = $zconvert($extract(tLeadingJunk,1,400),"O","JS") _ $select($length(tLeadingJunk) > 400: "...", 1: "") $$$LOGWARNING($$$FormatText($$$Text("[]Discarding unexpected leading data: '%1'","Ensemble"),tLoggedJunk)) } If (('tFound)&&($$$ISERR(cpStatus))) { Set pBatch = "" $$$TRACE("Not Found[8]") //Set tStatus = $$$ERROR($$$EnsRecordMapErrBatchHeaderNotFound,$classname($this)) if (stage="Extractfailed" &&($$$ISERR(cpStatus))) { set tStatus=cpStatus $$$LOGWARNING($classname($this)_":: Empty Batch Discarded") set tStatus=$$$OK } else { // Set tStatus = $$$EnsSystemError Set tStatus = $$$ERROR($$$EnsRecordMapErrBatchHeaderNotFound,$classname($this)) } Quit } } Else { Set pBatch = ..%New() Set pLookAhead = $get(pLookAhead) Quit } } Catch ex { $$$TRACE("in catch]") Set tStatus = $$$EnsSystemError quit } Quit tStatus } Since this is made up of three classes how do I control the status to send the call with within the block have a look at where I have newStatus and I would like to quit and pass new status
go to post Thembelani Mlalazi · May 22, 2018 @Eduard Lebedyuk was wondering if you can spot what the problem is thanks in advance
go to post Thembelani Mlalazi · Apr 5, 2018 The concept is about relationships the batch needs to be instantiated outside the loop and the record created and inserted in the loop. The batch has many records so every time we loop we add to records and then save records to a batch which was created only once Method OnRequest(pRequest As DQToolsSet.PrimaryMessageREQ, Output pResponse As HSCIC.DBS.RequestRBAT) As %Status { #dim status as %Status=$$$OK #dim resultSet as %SQL.StatementResult set pResponse=##class(HSCIC.DBS.RequestRBAT).%New() set status=..Adapter.ExecuteQuery(.resultSet,..GetTheSubmissionData(pRequest.pMonth, pRequest.pApp, pRequest.pRef, pRequest.pInPat)) nbsp;if ($$$ISOK(status)) { While (resultSet.%Next(.status) && $$$ISOK(status)) { set ppResponse=##class(HSCIC.DBS.RequestRMAP.Record).%New() set ppResponse.RequestCode=resultSet.Get("recType") set ppResponse.PatientID=resultSet.Get("ClientID") set ppResponse.DOB=resultSet.Get("DOB") set ppResponse.Property4=resultSet.Get("u1") set ppResponse.Property5=resultSet.Get("u2") set ppResponse.NHSNumber=resultSet.Get("NNN") set ppResponse.Surname=resultSet.Get("Surname") set ppResponse.AltSurname=resultSet.Get("u3") set ppResponse.GivenName=resultSet.Get("GivenName1") set ppResponse.AltGivenName=resultSet.Get("u4") set ppResponse.SpineGender=resultSet.Get("Gender") set ppResponse.Address1=resultSet.Get("a1") set ppResponse.Address2=resultSet.Get("a2") set ppResponse.Address3=resultSet.Get("a3") set ppResponse.Address4=resultSet.Get("a4") set ppResponse.Address5=resultSet.Get("a5") set ppResponse.PostCode=resultSet.Get("Postcode") set ppResponse.AltAddress1=resultSet.Get("p1") set ppResponse.AltAddress2=resultSet.Get("p2") set ppResponse.AltAddress3=resultSet.Get("p3") set ppResponse.AltAddress4=resultSet.Get("p4") set ppResponse.AltAddress5=resultSet.Get("p5") set ppResponse.AltPostCode=resultSet.Get("p6") set ppResponse.GPCode=resultSet.Get("GPCode") set ppResponse.GPPracticeCode=resultSet.Get("PracticeCode") set ppResponse.NewField3=resultSet.Get("u5") set ppResponse.NewFiel23=resultSet.Get("u6") set status=ppResponse.%Save() if ($$$ISOK(status)) { set status=pResponse.Records.InsertObject(pobject) } } } set status=pResponse.Records.%Save() }
go to post Thembelani Mlalazi · Mar 19, 2018 @Robert.Cemper Have tried changing that as per your suggestion but seem not to get it working do you have another suggestion on how I can approach this was wondering is there a function like select to stream to do this
go to post Thembelani Mlalazi · Mar 13, 2018 @Sean ConnellyClass TOpp Extends Ens.BusinessOperation{Parameter ADAPTER = "EnsLib.SQL.OutboundAdapter";Property Adapter As EnsLib.SQL.OutboundAdapter;Parameter INVOCATION = "Queue";Method CheckRequests(pRequest As Ens.Request, Output pResponse As Ens.Response) As %Status{ set query= ";with apt as" _"(" _" Select ac.ClientID from AmsAppointmentContact ac join AmsAppointment a on a.SequenceID = ac.SequenceID where" _" a.AppointmentDate > CAST(DATEADD(M,-6,GETDATE()) AS DATE) and a.CancellationDateTime is null " _" )," _" ref as" _"(" _" select ClientID" _" from" _" ( select ROW_NUMBER() OVER(PARTITION BY ClientID ORDER BY ReferralNumber) rn, * from AmsReferral" _" where DischargeDateTime is null) a" _" where rn = 1 " _" )," _" inp as" _" (" _" select ClientID" _" from" _"(" _" select ROW_NUMBER() OVER (PARTITION BY ClientID ORDER BY EventNumber) as rn,* from ImsEvent" _" where DischargeDate is null) a " _" where rn = 1" _" )," _" cohort as " _" (select ClientID from " _" ( " _" select row_number() OVER(PARTITION BY ClientID ORDER BY ClientID) as rn,ClientID from " _" (select * from apt" _" union all " _" select * from ref " _" union all " _" select * from inp) a) b where rn=1 " _" ) " _" select '10' as recType, c.ClientID, CONVERT(VARCHAR(8), c.DateOfBirth, 112) as DOB, '' as u1, '' as u2, ISNULL(c.NNN, '') as NNN," _" cn.Surname, '' as u3, cn.GivenName1, '' as u4, g.SpineCode as Gender," _" '' as a1,'' as a2,'' as a3,'' as a4,'' as a5 ,ca.PostCode,'' as p1,'' as p2,'' as p3,'' as p4,'' as p5,'ZZ99' as p6, ch.GPCode, ch.PracticeCode,'' as u5,'' as u6 " _" from ClientIndex c left join ClientName cn on cn.ClientID = c.ClientID left join ClientAddress ca on ca.ClientID = c.ClientID left join ClientHealthCareProvider ch on c.ClientID = ch.ClientID " _" left join GenGender g on g.Code = c.Gender join cohort on cohort.ClientID = c.ClientID where " _" c.DateOfDeath is null and ca.ToDate is null and ca.AddressGroup = 1 and cn.AliasType = '1' and ch.ToDate is null and c.NonClient = 0" set file = ##class(%Stream.FileCharacter).%New() set fileName="C:\File\123.txt" set sc="" do file.LinkToFile(fileName) while 'file.AtEnd { set rs = ##class(%SQL.Statement).%ExecDirect(, query) set sc = rs.%DisplayFormatted(100,file)} quit sc }XData MessageMap{<MapItems> <MapItem MessageType="Ens.Request"> <Method>CheckRequests</Method> </MapItem></MapItems>}}
go to post Thembelani Mlalazi · Mar 13, 2018 @Sean Connelly thanks I have tried your suggestions both but still not writing anything to a file and no file is being created am I missing anything please advise thanks in advance
go to post Thembelani Mlalazi · Mar 12, 2018 @Scott Roth have tried your suggestion still same problem .Under Data Settings I have a query "SELECT ID FROM dbs.DBS WHERE Status='Pending'" and the above code just in case I did not do it right please advise
go to post Thembelani Mlalazi · Jan 31, 2018 @Dmitry Maslennikov I have done this for starters but got an error ^<INVALID OREF>zTalkToTheWorld here is my code Method TalkToTheWorld() { Set httprequest=##class(%Net.HttpRequest).%New() Set httprequest.Server="https://maps.googleapis.com/maps/api/distancematrix/json?origins=BRISTOL&destinations=LONDON&key=TZhydlRg6-dUm-EoIuees43456rtyu7 " Do httprequest.Get("/") Do httprequest.HttpResponse.OutputToDevice() Do httprequest.Get("/cache/") Do httprequest.HttpResponse.OutputToDevice() }
go to post Thembelani Mlalazi · Jan 15, 2018 I am supposed to use the EnsLib.MsgRouter.VDocRoutingEngine on the process and use the following syntax to get to the property level/Document.{Property.Property} this works
go to post Thembelani Mlalazi · Jan 15, 2018 @Jeffrey.Drumn Assuming I got this right He is trying to get to reference a property from a record mapper that will work just fine here is an exampleTestEnvironment.Record being my record mapper class and the Document.wardAge being my property (WARDAGE)
go to post Thembelani Mlalazi · Jan 15, 2018 On the condition I would like to do something like this but I do not get the opportunity to actual get to the schema that I would like to reference to get to that. Message will be the root of my xml document Header an element with attribute Action @Robert.Cemper