go to post Yone Moreno · May 17, 2023 Thanks Robert Camper. I am grateful for your help, and I value the most your explanation rephrasing the issue with both examples, what I expect, what I get. Thanks for your didactic answer.
go to post Yone Moreno · May 15, 2023 Thanks for your reply Alex Woodhead. You seem to offer a very complete solution and handle some special cases, such as whitespace removal and case insensitive searches.
go to post Yone Moreno · May 15, 2023 Thanks Alexander Koblov, Why is $Listnext recommended? Is it true? The "$List" function returns a complete list, while "$ListGet" returns a specific item from a list given its index. When you need to iterate over a list, you can use the "$Listnext" function. This function allows you to get the elements of a list one by one, without having to load the whole list into memory at once. Using "$Listnext" instead of "$List" or "$ListGet" can improve performance, as it avoids the need to load and process the entire list at once. Instead, each item can be fetched individually as needed, which is particularly useful in cases where the list is large.
go to post Yone Moreno · Apr 20, 2023 🙌 Thank you so much, Maria Nesterenko, for sharing the valuable testimony and explanation of how you developed the Sheep's Galaxy sleep analysis application using InterSystems IRIS Cloud SQL and IntegratedML technologies. Your application is truly innovative and provides users with the tools to analyze and improve their sleep quality. It's impressive how you took into account factors such as noise levels, room lighting, caffeine consumption, and more to help users create optimal conditions for sleep. The use of Angular framework for frontend, FastApi framework with DB-API package for backend, and IRIS Cloud SQL with IntegratedML to analyze and store data is remarkable. Your team's work is inspiring, and we thank you for contributing to important issues in such a cutting-edge way. 👏 So, to summarize, does the application provide the user with a "sleep score" or does it have additional uses? 🤔
go to post Yone Moreno · Apr 20, 2023 Hi Timothy, Thank you so much for your response and for explaining the use of the $$$FormatText macro in ObjectScript. It's great to know that this macro simplifies the process of string formatting and can be particularly useful in conjunction with localization. 🙌 Best regards!
go to post Yone Moreno · Nov 28, 2022 🧐 Additionally we have read 💭💭 carefully: https://docs.intersystems.com/healthconnectlatest/csp/docbook/DocBook.UI... https://docs.intersystems.com/healthconnectlatest/csp/docbook/DocBook.UI... https://docs.intersystems.com/healthconnectlatest/csp/docbook/DocBook.UI... https://docs.intersystems.com/healthconnectlatest/csp/docbook/DocBook.UI... https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI... https://community.intersystems.com/post/making-jwtoauth20 However, we do still have the same question: What way is there to "call", "invoke", "communicate" from the other environments ( for example INTEGRATION ) with the PREPRODUCTION Resource Server in order to Validate the Token? That is to say, the question in another way would be: What mechanism exists to communicate from an Environment A (Integration) with an Environment B (Preproduction) with the mission to Validate the Token from Environment A using the centralized Resource Server available in Environment B? 👀 Thank you very much for your attention, and thank you for your answers. Best regards
go to post Yone Moreno · Sep 19, 2022 As a reference a the Java solution: Could be: import java.util.*; public class DnaStrand { static final Map<String,String> letters = Map.ofEntries(Map.entry("A","T"),Map.entry("T","A"),Map.entry("G","C"),Map.entry("C","G")); public static String makeComplement /*🧬🔁🧬*/ (String dna) { StringBuilder result = new StringBuilder(); for(String letter:dna.split("")){ result.append(letters.get(letter)); } return result.toString(); } } Would you like to improve this in ObjectScript? Are you able?
go to post Yone Moreno · Sep 18, 2022 Example solutions: dinglemouse, ChungGor, rainrain, EAnoch, lunac, julialebow, Andrew P., Kuzmanov_Mario, IvanKotsovski, Zasho (+ 13)'s solutions public class Kata { public static String declareWinner(Fighter fighter1, Fighter fighter2, String firstAttacker) { Fighter a=fighter1, b=fighter2; if (firstAttacker.equals(fighter2.name)) { a = fighter2; b = fighter1; } while (true) { if ((b.health -= a.damagePerAttack) <= 0) return a.name; // a wins if ((a.health -= b.damagePerAttack) <= 0) return b.name; // b wins } } } My own: public class Kata { public static String declareWinner(Fighter fighter1, Fighter fighter2, String firstAttacker) { String nextAttacker = firstAttacker; do{ if(nextAttacker.equals(fighter1.name)){ fighter2.health -= fighter1.damagePerAttack; if(fighter2.health > 0){ nextAttacker = fighter2.name; } }else{ fighter1.health -= fighter2.damagePerAttack; if(fighter1.health > 0){ nextAttacker = fighter1.name; } } }while(fighter1.health > 0 && fighter2.health > 0); return nextAttacker; } } marko-bekhta, KutayB, SVarakuta, rosedhivya, ShreyasR, animeshp's solution public class Kata { public static String declareWinner(Fighter fighter1, Fighter fighter2, String firstAttacker) { int moves1 = (int) Math.ceil( (double)fighter2.health / fighter1.damagePerAttack); int moves2 = (int) Math.ceil( (double)fighter1.health / fighter2.damagePerAttack); if (moves1 > moves2) { return fighter2.name; } else if (moves1 < moves2) { return fighter1.name; } else { return firstAttacker; } } } I hope you feel challenged with this exercise
go to post Yone Moreno · Sep 14, 2022 Hello Dewey Hunt, thanks for your replies: 1) I am looking to develop current skills and/or generate new ones. But it would be prefered to deep into ObjectScript or into some skills related to interoperability. 2) It is interesting what you write about state of flow Greetings
go to post Yone Moreno · Sep 13, 2022 As a reference you could observe my following solution in Java: import java.util.Arrays; public class Kata { public static int findShort(String s) { String[] words = s.split(" "); int shortestLength = 0; for(String word : words){ if(shortestLength == 0){ shortestLength = word.length(); }else{ if(shortestLength > word.length()){ shortestLength = word.length(); } } } return shortestLength; } }
go to post Yone Moreno · Apr 1, 2022 Thanks Pasi Leino for your reply and help We would be very grateful if you could help us with the following: Could you explain us how could we download, install and start to use a free version od the Dicom Dvtk Ris-Emulator, please?
go to post Yone Moreno · Oct 15, 2021 We may need to add the Content-Disposition header in the request and there specify the file name. In the example we had originally made with SoapUI, that header had this value: Content-Disposition: attachment; name="application.zip" Fine Tuning a WebClient tells you how you can specify headers in your web client using the SetHttpHeader() method that inherits from %SOAP.WebClient. Following the explanation in the documentation, we have added: do ..SetHttpHeader("Content-Disposition","application.zip") We have written the line before: Quit ..WebMethod("cargarFichero","CargarFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero",.fichero,.ccaaId,.tipoFichero) When capturing the LOGSOAP we notice that it is left without including the Content-Disposition header and the name application.zip in what we send: Why could it be that when writing the line, it is left without including the new Content-Disposition header and the application.zip file name? 💭🤔 Also, in other tests, we have written 3 additional ways, to try to solve it: set ..ContentType="application/octet-stream; name=nombre" Using the above line, we don't see that it adds the "name" parameter. We tried the following line and it would generate an Ensemble exception: set ..HttpRequest.ContentType="application/octet-stream; name=nombre" ERROR #5001: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1 and using the next line: do ..HttpRequest.SetHeader("name","nombre") It gives us exception as well: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1 The complete class we have written of the Web Service is: Class WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP Extends %SOAP.WebClient [ ProcedureBlock ] { // Parameter LOCATION = "https://regvacube.sns.gob.es/regvacu/ws/FicheroVacuService"; /// This is the URL used to access the web service. /// This is the namespace used by the Service Parameter NAMESPACE = "http://ws.regvacuWs.ms.es/regvacu/ws/FicheroVacuService"; /// 20/09/21 Cambiamos a 0, con el objetivo de quitar el xsi:type Parameter OUTPUTTYPEATTRIBUTE = 0; /// Determines handling of Security header. Parameter SECURITYIN = "ALLOW"; /// This is the name of the Service Parameter SERVICENAME = "FicheroVacuService"; // Parameter SOAPVERSION = 1.2; Parameter SOAPVERSION = 1.1; /// This is the SOAP version supported by the service. Parameter MTOMREQUIRED = 1; // Method cargarFichero(fichero As %xsd.base64Binary(REQUIRED=1), ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ] // Method cargarFichero(fichero As %GlobalBinaryStream, ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ] /// 15 10 21 Edu explica que el fichero, el .zip con un .csv necesitamos enviarlo SIN CODIFICAR /// quitamos %GlobalBinaryStream y ponemos %GlobalCharacterStream /// Method cargarFichero(fichero As %GlobalCharacterStream, ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ] { //Header - Addresing set addressing = ..crearAddressing() set addressing.Action = "cargarFichero" set ..AddressingOut = addressing set ..AddressingOut.mustUnderstand = "1" //Firma el XML (mensaje SOAP) //do ..crearSignature() set ..MTOMRequired=1 //24 09 21 para añadir parametro name en cabecera content type //set ..ContentType="application/octet-stream; name=nombre" //28 09 21 probamos a ajustarlo //set ..ContentType="application/octet-stream; charset=latin1" //set ..ContentType="application/xhtml+xml; charset=latin1" /* 27 09 21 con el objetivo de poner parametro name en cabecera content type Genera excepcion: ERROR #5001: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1 */ //set ..HttpRequest.ContentType="application/octet-stream; name=nombre" //do ..HttpRequest.SetHeader("name","nombre") /* 15 10 21 seguimos la indicacion de Alberto Fuentes: ➕ añadir la cabecera Content-Disposition en la petición y ahí especificar el nombre del archivo. https://es.community.intersystems.com/post/%C2%BFc%C3%B3mo-podr%C3%ADamos-usar-mtom-para-enviar-un-zip-con-un-csv-adentro#comment-169536 https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GSOAP_cli_details#GSOAP_cli_details_http_headers */ do ..SetHttpHeader("Content-Disposition","application.zip") Quit ..WebMethod("cargarFichero","CargarFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero",.fichero,.ccaaId,.tipoFichero) } Method infoFichero(ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), infoFichero As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(REQUIRED=1), Output estado As EsquemasDatos.HistoriaClinica.tns.EstadoFicheroType(REQUIRED=1)) As %xsd.base64Binary(XMLNAME="fichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ] { set ..MTOMRequired=1 Quit ..WebMethod("infoFichero","InfoFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/infoFichero",.ccaaId,.infoFichero,.estado) } Method crearAddressing() As %SOAP.Addressing.Properties { set IPRedSanitaria = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","IPRedSanitaria") set puertoRespuestas = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","PuertoRespuestasSSL") set ReplyTo = ##class(%SOAP.Addressing.EndpointReference).%New() set ReplyTo.Address = "http://www.w3.org/2005/08/addressing/anonymous" //set ReplyTo.Address = "https://"_IPRedSanitaria_":"_puertoRespuestas_"/csp/SNS/Servicios.ProgramasAsistenciales.SIFCOv02r00.cls" set MessageId = ##class(Util.FuncionesComunes).getUID() set addressing = ##class(%SOAP.Addressing.Properties).%New() set addressing.MessageId = MessageId set addressing.Destination = ..Location set addressing.ReplyEndpoint = ReplyTo Quit addressing } } How could we understand, debug, tune, and resolve together, this situation? If you could give us some guidance, we would appreciate it 🙇🙏🙏🙏🙏🙏 How would you recommend us to follow? What documentation do we need to study, read, understand, to complete this part? Thanks for your answers and time reading this question
go to post Yone Moreno · Oct 15, 2021 We have been developing the Web Service following the official documentation: Using MTOM for Attachments. Webclient Specifically we have followed an example of a web service client where MTOMRequired property has been activated, and we have also changed the data types to %Stream. We have written the following WebService: Class WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP Extends %SOAP.WebClient [ ProcedureBlock ] { // Parameter LOCATION = "https://regvacube.sns.gob.es/regvacu/ws/FicheroVacuService"; /// This is the URL used to access the web service. /// This is the namespace used by the Service Parameter NAMESPACE = "http://ws.regvacuWs.ms.es/regvacu/ws/FicheroVacuService"; /// 20/09/21 Cambiamos a 0, con el objetivo de quitar el xsi:type Parameter OUTPUTTYPEATTRIBUTE = 0; /// Determines handling of Security header. Parameter SECURITYIN = "ALLOW"; /// This is the name of the Service Parameter SERVICENAME = "FicheroVacuService"; // Parameter SOAPVERSION = 1.2; Parameter SOAPVERSION = 1.1; /// This is the SOAP version supported by the service. Parameter MTOMREQUIRED = 1; // Method cargarFichero(fichero As %xsd.base64Binary(REQUIRED=1), ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ] // Method cargarFichero(fichero As %GlobalBinaryStream, ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ] /// 15 10 21 Edu explica que el fichero, el .zip con un .csv necesitamos enviarlo SIN CODIFICAR /// quitamos %GlobalBinaryStream y ponemos %GlobalCharacterStream /// Method cargarFichero(fichero As %GlobalCharacterStream, ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ] { //Header - Addresing set addressing = ..crearAddressing() set addressing.Action = "cargarFichero" set ..AddressingOut = addressing set ..AddressingOut.mustUnderstand = "1" //Firma el XML (mensaje SOAP) //do ..crearSignature() set ..MTOMRequired=1 //24 09 21 para añadir parametro name en cabecera content type //set ..ContentType="application/octet-stream; name=nombre" //28 09 21 probamos a ajustarlo //set ..ContentType="application/octet-stream; charset=latin1" set ..ContentType="application/xhtml+xml; charset=latin1" /* 27 09 21 con el objetivo de poner parametro name en cabecera content type Genera excepcion: ERROR #5001: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1 */ //set ..HttpRequest.ContentType="application/octet-stream; name=nombre" //do ..HttpRequest.SetHeader("name","nombre") Quit ..WebMethod("cargarFichero","CargarFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero",.fichero,.ccaaId,.tipoFichero) } Method infoFichero(ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), infoFichero As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(REQUIRED=1), Output estado As EsquemasDatos.HistoriaClinica.tns.EstadoFicheroType(REQUIRED=1)) As %xsd.base64Binary(XMLNAME="fichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ] { set ..MTOMRequired=1 Quit ..WebMethod("infoFichero","InfoFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/infoFichero",.ccaaId,.infoFichero,.estado) } Method crearAddressing() As %SOAP.Addressing.Properties { set IPRedSanitaria = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","IPRedSanitaria") set puertoRespuestas = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","PuertoRespuestasSSL") set ReplyTo = ##class(%SOAP.Addressing.EndpointReference).%New() set ReplyTo.Address = "http://www.w3.org/2005/08/addressing/anonymous" //set ReplyTo.Address = "https://"_IPRedSanitaria_":"_puertoRespuestas_"/csp/SNS/Servicios.ProgramasAsistenciales.SIFCOv02r00.cls" set MessageId = ##class(Util.FuncionesComunes).getUID() set addressing = ##class(%SOAP.Addressing.Properties).%New() set addressing.MessageId = MessageId set addressing.Destination = ..Location set addressing.ReplyEndpoint = ReplyTo Quit addressing } Method crearSignature() As %XML.Security.Signature { //Generamos el Binary Security Token a partir del mcertificado set x509alias = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","aliasCertMSSSI") set pwd = ##class(Util.TablasMaestras).getValorMaestra("PARAMETROS","pwdCertMSSSI") set cred = ##class(%SYS.X509Credentials).GetByAlias(x509alias,pwd) set token = ##class(%SOAP.Security.BinarySecurityToken).CreateX509Token(cred) //Creamos la firma //set sig1=##class(%XML.Security.Signature).CreateX509(token,,$$$KeyInfoX509IssuerSerial) //set sig2=##class(%XML.Security.Signature).CreateX509(token,$$$SOAPWSIncludeSoapBody,$$$SOAPWSReferenceDirect) set sig2=##class(%XML.Security.Signature).CreateX509(token,$$$SOAPWSIncludeDefault,$$$SOAPWSReferenceDirect) //do sig1.SetSignatureMethod($$$SOAPWSrsasha1) do sig2.SetSignatureMethod($$$SOAPWSrsasha1) //do sig1.SetDigestMethod($$$SOAPWSsha1) do sig2.SetDigestMethod($$$SOAPWSsha1) //Creamos la referencia al id del token generado a partir de la firma //set algorithm=$$$SOAPWSEnvelopedSignature_","_$$$SOAPWSc14n set reference=##class(%XML.Security.Reference).Create(token.Id) do sig2.AddReference(reference) //Crear TimeStamp Set timestamp=##class(%SOAP.Security.Timestamp).Create() //Se une //do ..SecurityOut.AddElement(sig1) do ..SecurityOut.AddToken(token) do ..SecurityOut.AddElement(sig2) Do ..SecurityOut.AddToken(timestamp) } } The target system, asks us to implement a WebService with MTOM to send the zip with a csv inside, as follows: When importing the WSDL of the target system, the header of the "cargarFichero" (loadFile) method was generated with "fichero" (file) as a "%xsd.base64Binary". We changed file to "%GlobalCharacterStream". This way the file, the csv, is sent unencoded, inside a CDATA Being the response of the target system: 10/15/2021 08:57:24 ********************* Input to Web client with SOAP action = http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero --MIME_Boundary Content-ID: <root.message@cxf.apache.org> Content-Type: application/xop+xml; type="text/xml"; charset=utf-8 Content-Transfer-Encoding: 8bit <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <soap:Fault> <faultcode>soap:Server</faultcode> <faultstring>Name must not be null</faultstring> </soap:Fault> </soap:Body> </soap:Envelope> --MIME_Boundary-- --------------- Validate Security header: action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero, MethodName=cargarFichero **** SOAP client return error. method=cargarFichero, action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero ERROR #6248: La respuesta de SOAP es un error de SOAP: faultcode=Server faultstring=Name must not be null faultactor= detail= However, as we can see in the first image, the target system would need, would require, that we send the file encoded in binary, since it says: Content-Transfer-Encoding: binary When we adapt the file to be "%GlobalBinaryStream" we see the following trace, where it is encoded in binary: When sending binary encoded, the target system also responds: 09/28/2021 16:56:43 ********************* Input to Web client with SOAP action = http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero --MIME_Boundary Content-ID: <root.message@cxf.apache.org> Content-Type: application/xop+xml; type="text/xml"; charset=utf-8 Content-Transfer-Encoding: 8bit <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <soap:Fault> <faultcode>soap:Server</faultcode> <faultstring>Name must not be null</faultstring> </soap:Fault> </soap:Body> </soap:Envelope> --MIME_Boundary-- --------------- Validate Security header: action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero, MethodName=cargarFichero **** SOAP client return error. method=cargarFichero, action=http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero ERROR #6248: La respuesta de SOAP es un error de SOAP: faultcode=Server faultstring=Name must not be null faultactor= detail= In short, the target system needs from us: "add the "name" parameter inside the "Content-Type" header when attaching the file. Your client should generate this parameter to avoid getting this error." Being the full comparison between what is sent by ensemble (without the "name" parameter, therefore incorrect) on the left; and what is generated by the SoapUI (with the name parameter, correct), on the right: ➡️ Please could you point us to examples, documentation, projects, code, that we can use as a reference to investigate, research and complete the development? 💭 We have also investigated the following answers: https://community.intersystems.com/post/add-parameter-name-inside-conten... Thank you very much for your time, reading and responding. Thanks for your help.
go to post Yone Moreno · Oct 8, 2021 Thanks Jeffrey Drumm for your help, because the answer you have proposed works as expected In addition you have helped us to learn about the square bracket syntax [] to find a value in a field in all repeating segments Plus you have shared with us how does it outputs the values of the repeating segments: inside a string where each field's value is inside "<...>" Thanks
go to post Yone Moreno · Oct 7, 2021 Thanks Jeffrey Drumm for your reply We have observed that our Ensemble's version is: Cache for UNIX (Red Hat Enterprise Linux for x86-64) 2017.2.1 (Build 801_3_18358U) Tue Jul 24 2018 16:36:10 EDT It does not contain "RegexMatch" function in Ens.Util.FunctionSet We have tried to develop a rule using Length and Contains functions We would need to detect the following: if at least one OBX3.1 is "24642" or at least one OBX3.5 = "24642" What we have developed does not work, and we do not know why Could you help us, please? We have been testing, developing and debugging some hours, and we would really appreciate your time, replies, effort, and examples, please The rule which does not work is: Being the code: <rule name="22 09 21 ADTs Antigenos DragoAE -> DRAGOAP" disabled="true"> <constraint name="source" value="GestionPacientesFromSelenev02"></constraint> <constraint name="msgClass" value="EnsLib.HL7.Message"></constraint> <constraint name="docCategory" value="2.5"></constraint> <when condition="(Document.{MSH:MessageType.TriggerEvent}="A08")&&(((Length(HL7.[OBX:3.1])="5")&&(HL7.[OBX:3.1] Contains "24642"))||((Length(HL7.[OBX:3.5])="5")&&(HL7.[OBX:3.5] Contains "24642")))&&((Document.{OBX(1):ObservationResultStatus}="R")||(Document.{OBX(1):ObservationResultStatus}="C"))"> <trace value=""Se permiten ADTs con código de Antígenos en OBX3.5 o OBX3.1 y con OBX.11 = 'R' Creaciones o 'C' Modificaciones""></trace> <send transform="" target="EnrutadorTestAntigenos"></send> <return></return> </when> </rule> Could you help us? Would you know why it does not detect that the OBX3.1 and OBX3.5 are "24642"? Thanks for your time
go to post Yone Moreno · Sep 27, 2021 Thanks David Hockenbroch for your help We have written: set ..HttpRequest.ContentType="application/octet-stream; name=nombre" do ..HttpRequest.SetHeader("name","nombre") Being the full method as follows: Method cargarFichero(fichero As %GlobalBinaryStream, ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ] { //Header - Addresing set addressing = ..crearAddressing() set addressing.Action = "cargarFichero" set ..AddressingOut = addressing set ..AddressingOut.mustUnderstand = "1" //Firma el XML (mensaje SOAP) //do ..crearSignature() set ..MTOMRequired=1 //24 09 21 para añadir parametro name en cabecera content type set ..ContentType="application/octet-stream; name=nombre" /* 27 09 21 con el objetivo de poner parametro name en cabecera content type */ set ..HttpRequest.ContentType="application/octet-stream; name=nombre" do ..HttpRequest.SetHeader("name","nombre") Quit ..WebMethod("cargarFichero","CargarFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero",.fichero,.ccaaId,.tipoFichero) } When we execute it, Ensemble throws an exception in the message viewer: ➡️ ERROR #5001: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1 We think it means that the variable "HttpRequest" is an invalid oref How could we continue? What steps would you recommend us to add the parameter "name" inside "Content-Type" header when we send a MTOM attachment using a SOAP request? Thanks for your time, answers and help 💭
go to post Yone Moreno · Sep 24, 2021 Thanks Sean Connelly for your time and help answering to us We have written: Method cargarFichero(fichero As %GlobalBinaryStream, ccaaId As EsquemasDatos.HistoriaClinica.tns.CCAAIdType(REQUIRED=1), tipoFichero As EsquemasDatos.HistoriaClinica.tns.TipoFicheroType(REQUIRED=1)) As EsquemasDatos.HistoriaClinica.tns.InfoFicheroType(XMLNAME="responseFichero") [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ] { //Header - Addresing set addressing = ..crearAddressing() set addressing.Action = "cargarFichero" set ..AddressingOut = addressing set ..AddressingOut.mustUnderstand = "1" //Firma el XML (mensaje SOAP) //do ..crearSignature() set ..MTOMRequired=1 //24 09 21 para añadir parametro name en cabecera content type set ..ContentType="application/octet-stream; name=nombre" Quit ..WebMethod("cargarFichero","CargarFicheroVacuRequest").Invoke($this,"http://ws.regvacuWs.ms.es/FicheroVacu/cargarFichero",.fichero,.ccaaId,.tipoFichero) } However when we output the LOGSOAP we observe: Output from Web client with SOAP action =http:// [endpoint]/cargarFichero ----boundary2247.8235294117647062276.235294117647059-- Content-Type: application/xop+xml; type="text/xml"; charset="UTF-8" Content-Transfer-Encoding: 8bit Content-Id: <0.E238359C.1D35.11EC.923C.005056B672A4> <?xml version="1.0" encoding="UTF-8" ?> <SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema' xmlns:wsa='http://www.w3.org/2005/08/addressing'> <SOAP-ENV:Header> <wsa:Action>cargarFichero</wsa:Action> <wsa:MessageID>e236513c1d3511ec923c005056b672a4</wsa:MessageID> <wsa:ReplyTo> <wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address> </wsa:ReplyTo> <wsa:To>https://[endpoint]?wsdl</wsa:To> </SOAP-ENV:Header> <SOAP-ENV:Body> <CargarFicheroVacuRequest xmlns="http://[endpoint]"> <fichero> <xop:Include href="cid:1.E238359C.1D35.11EC.923C.005056B672A4" xmlns:xop="http://www.w3.org/2004/08/xop/include"/> </fichero> <ccaaId>01</ccaaId> <tipoFichero>2</tipoFichero> </CargarFicheroVacuRequest> </SOAP-ENV:Body> </SOAP-ENV:Envelope> ----boundary2247.8235294117647062276.235294117647059-- Content-Id: <1.E238359C.1D35.11EC.923C.005056B672A4> Content-Transfer-Encoding: binary CONTENT-TYPE: application/octet-stream ;;;47B7F6BF1C6D [... csv file content ...] As you would observe in the LOGSOAP, the request is sending the headers as: "CONTENT-TYPE: application/octet-stream" We would need to send: Content-Type: application/octet-stream; name=1.E238359C.1D35.11EC.923C.005056B672A4 Content-Disposition: attachment; name="1.E238359C.1D35.11EC.923C.005056B672A4"; filename="1.E238359C.1D35.11EC.923C.005056B672A4" Because it is being expected by the receiver system, to include the parameter "name" inside the header "Content-Type", as is shown in the next image: How could we achieve this feature? Would you recommend us some guide or documentation, to read about this topic? Are there any examples that could help us? Thanks in advance
go to post Yone Moreno · Aug 9, 2021 Thanks Julius Kavay for your reply Your contribution has helped us a lot, thanks, sincerely thanks. Specially we thank you for your explanation it was very helpful!