ir a la publicación Pierre-Yves Duq... · 1 mar, 2024 Hay malas lenguas que insinúan que se debería añadir el nombre del Arbitro como Característica del modelo para mejorar las predicciones.
ir a la publicación Pierre-Yves Duq... · 13 feb, 2024 Si trabajas en Windows y tu instancia de IRIS puede interactuar con el escritorio (esto se configura en el servicio de Windows de IRIS), puedes arrancar un IRIS Studio desde el código ObjectScript de tu servicio Rest y forzar un "attach" a tu proceso en curso: set ns=$zu(5) //El Namespace actual set username="_SYSTEM",password="SYS" set server="/fastconnect:127.0.0.1[51777]:"_ns_":"_username_":"_password set cmd="Start "_$SYSTEM.Util.InstallDirectory()_"bin\CStudio.exe "_server_" /pid="_$JOB do $ZF(-2,cmd) //Funcción "obsoleta", pero funciona...reemplazar por $ZF(-100,"/ASYNC",...)
ir a la publicación Pierre-Yves Duq... · 31 ene, 2024 Claro. El intervalo de tiempo entre el ExternalFreeze() y el ExternalThaw() debe estar limitado, especialmente si se trata de un sistema en producción, ya que el Write Daemon no escribe a disco en este tiempo y los Global Buffers se podrían llenar de información pendiente de volcar a disco si este tiempo se alargara. Es decir, si el tiempo que va tardar el subsistema de disco en hacer la copia de los IRIS.DAT es grande (mas de unos poco minutos), la estrategia recomendada por Luis Angel es mejor: usar la herramienta de Online Backup de IRIS (seleccionando solo las BBDD a copiar) y restaurandolas en otro sistema o directorio para generar su nueva versión así.
ir a la publicación Pierre-Yves Duq... · 31 ene, 2024 Con el ExternalFreeze() (seguido por el ExternalThaw() al final) puedes hacer una copia limpia de las bases de datos de tu namespace, y puedes usar estas copias de los ficheros IRIS.DAT como base para tu nuevo namespace. Si tu definición de Namespace no contiene excesivos Mapeos (de base de datos, de Globals, de Rutinas o de Clases), puedes definir el nuevo namespace desde el portal, referenciando las nuevas copias de los IRIS.DAT. La estrategia que propones es buena. No existe función más automatizada para "Clonar Namespace".
ir a la publicación Pierre-Yves Duq... · 3 feb, 2023 Hola Oscar,Por temas de seguridad, la importación de DTDs (que es mecanismo obsoleto para definiciones XML) no se permite en el asistente de esquemas XML.Sin, embargo, puedes realizar una importación manual con este código: Class XML.SchemaReader Extends %Persistent { ClassMethod ImportClasses(fileName As %String = "C:\Temp\Fw__Importación_de_clases_TicketBai\Esquemas de archivos XSD de envío y anulación de factura_1_2\ticketBai V1-2.xsd") As %Status { #include %occInclude #include %occSAX #dim sReader as %XML.Utils.SchemaReader = ##class(%XML.Utils.SchemaReader).%New() #dim features as Filero.DataType.String set sReader.SAXFlags = $$$SAXFULLDEFAULT-$$$SAXVALIDATIONREUSEGRAMMAR set sReader.MakePersistent = 0 set sReader.MakeRelationships = 0 set sReader.GenerateXMLNILNOOBJECT = 1 set sReader.GenerateXMLNIL = 1 set sReader.KeepEmptyClasses = 1 set features("BINARYASSTREAM") = 1 quit sReader.Process(fileName,"ImportedScheme",.features) } } También, tenemos un ejemplo (un poco antiguo) de como realizar la firma XADES para facturae desde ObjectScript
ir a la publicación Pierre-Yves Duq... · 2 feb, 2023 Hola,El procesamiento de un DICOM se hace en base a los DICOM Settings definidos en el portal de gestión de la instancia de IRIS. Allí se pueden definir las "Transfer Syntax" soportadas para cada DICOM Association entre un "Calling AET" y "Called AET". Es posible que las definiciones de DICOM Settings en ambas instancias de IRIS sean distintas, or que las Calling AET y Called AET no coincidan (possiblemente los 2 entornos IRIS estan registrados con AETs distintas?)
ir a la publicación Pierre-Yves Duq... · 20 sep, 2022 Puedes usar desde un terminal: do $SYSTEM.SQL.Shell() y la funccion siguiente: [o help para ver todas las opciones] run [<filename>] Run an SQL script. If <filename> is not specified then the user will be prompted for the file name. Tambien, existe la funccion: do $SYSTEM.SQL.Help() para ver las funciones de Importacion de SQL/DDL: $SYSTEM.SQL.MSSQLServer()$SYSTEM.SQL.Oracle()$SYSTEM.SQL.ImportDir()Nota: algunas de estas funciones estan "obsoletas" en IRIS, pero las encontraras en Cacheé 2018. q
ir a la publicación Pierre-Yves Duq... · 19 sep, 2022 Hola Curro, Creo que el error que te devuelve en el tSC de Adapter.SendFormDataArray() no se corresponde con el error 402 de la API.el tSC indica un error en el "<WRITE>" al hacer el envio sobre el pipe TCP en zSend+120^%Net.HttpRequest.1: Esto ocurre en el envio, antes de leer cualquier cabecera de respuesta.Puede ser indicativo de un error en: - el Host, port definido en el Adapter/BO no es el correcto - Hay un problema al abrir un canal TCP desde IRIS hacia este host/puertoAquí un ejemplo de procesamiento de HttpStatus que he copiado de un entorno en producción: set tSC=..Adapter.SendFormDataArray(.tHttpResponse,"POST",.tHttpRequest,tVars,.tData,tURL) $$$TRACE("Code:"_tHttpResponse.StatusCode) set pResponse.code=tHttpResponse.StatusCode if $isobject(tHttpResponse.Data) { set tData=tHttpResponse.Data.Read(3200000) }else { set tData=tHttpResponse.Data } $$$TRACE("Data:"_tData)
ir a la publicación Pierre-Yves Duq... · 1 ago, 2022 Hola,En este bloque de código:set dicom = ##class(EnsLib.DICOM.Document).%New()do ##class(EnsLib.DICOM.Document).CreateFromDicomFileStream(pInput,dicom)set objetoEntrada.dicom = dicom$$$LOGINFO("objetoEntrada.dicom: "_objetoEntrada.dicom) El do ##class(EnsLib.DICOM.Document).CreateFromDicomFileStream() crea siempre una nueva instancia de Dicom document que devuelve como output. Creo que en este bloque de codigo no hace falta hacer el %New() previo de la variable "dicom" y hay que pasarle por referencia a la funccion "CreateFromDicomFileStream" (con el "PUNTO" delante del parametro dicom: do ##class(EnsLib.DICOM.Document).CreateFromDicomFileStream(pInput,.dicom) No se si sera suficiente para areglar el problema, es solo un primer paso.
ir a la publicación Pierre-Yves Duq... · 21 jul, 2022 Hola Kurro,He forzado un udpdate en mi instalación de IRIS 2021 y sigue funcionando.Mirando el código, el error ocurre en la clase WebTerminal.StaticContent donde referencia los .js, .css y .html que estan almacenados en bloques XDATA de la propia clase.Podrías probar lo siguiente:- *Forzar* la recompilacion completa de esta clase (dependiende de la configuración de tu IDE, el compilador evita recompilar elementos que ya están al día) do $SYSTEM.OBJ.Compile("WebTerminal.StaticContent","fck") - Poner una traza en el metodo Write de la clase WebTerminal.StaticContent para grabar el valor del parametro "Const" y validar que se recibe uno de los valores válidos Themecache, html, css, js
ir a la publicación Pierre-Yves Duq... · 21 abr, 2022 entre 6 y 8 tienes que recompilar las clases del namespace: do $SYSTEM.OBJ.CompileAll("fckd-l") ///puedes cambiar los flags por otros f: force, c:compile,k:keep source,d:display, -l: do not lock classes while compilingAntes del punto 6, cuando esta en fase de pruebas, se suele cambiar en el iris.cpf el parametro "EnsembleAutoStart=0", para que no se arranquen automaticamente las producciones de interoperabilidad configuradas como AutoStart en cada namespace. Si son 15 namespaces, puedes copiar secciones del Cache.cpf al IRIS.PF, especialmente si mantienes la misma estructura de directorios y ubicaciones de BBDD entre el servidor actual de ensemble y el nuevo de IRIS.Adicionalmente a las BBDD tienes que copiar/regenerar en IRIS: - Las configuraciones de seguridad (usuarios, roles, recursos, privilegios, applicaciones Web), con los cambios de nombre pertinentes de CACHE a IRIS- Las configuraciones SSL/TLS - Los certificados X509- las tareas (Purge de mensajes, Backups Online de IRIS i hay) definidas en el Task ManagerAlgo que probablemente no se copiara entre el Cache y el IRIS son las passwords de los credenciales definidos. Se pueden exportar manualmente e importar o copiar a mano.
ir a la publicación Pierre-Yves Duq... · 20 abr, 2022 La esctrutura CACHE.DAT e IRIS.DAT es la misma. Puedes renombrar un CACHE.DAT a un IRIS.DAT para montarla base de datos en IRIS. para Migraciones, suelo hacer un backup en Ensemble, y en la maquina IRIS, instalar tambien temporalmente un Ensemble 2018 para hacer el restore con este, parar el Ensemble temporal, renombrar los CACHE.DAT creados a IRIS.DAT y montarlos en IRIS.
ir a la publicación Pierre-Yves Duq... · 10 mar, 2021 Hola Hector, Si lo entiendo bien, estas hablando de ZEN Reports. Ten en cuenta que es una funcionalidad deprecada en Intersystems IRIS, donde se siguen soportando lo Zen reports ya desarrollados con anterioridad, pero se recomienda migrarlos a "InterSystemt Reports" documentado aquí: https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI... En cuanto a la pregunta, parece que puedes sobrescribir el valor del parametro de clase REPORTNAME con un valor de parametro de URL en la petición de Report "?ReportName=MiInforme": Esto es el código en %ZEN.Report.reportPage que usa el parametr de URL si esta definido: //JSL4724 set reportnameurlparam = $get(%request.Data("ReportName",1)) set reportname=$s(reportnameurlparam'="":reportnameurlparam,..#REPORTNAME'="":..#REPORTNAME,1:..%ClassName(1)) Lo puedes probar? Saludos,PYD
ir a la publicación Pierre-Yves Duq... · 21 oct, 2020 la SuperClase %XML.Adaptor añadida a tu clase solo afecta a la proyección XML de lo miembros esta clase User.MiClase. Cualquier cambio que hagas en un paramero de XML Adapter, como XMLIGNORENULLS solo entra en juego cuando realizas un ObjectInstance.%XMLExport() para exportar o que usas el %XMLImport o %XMLReader para importatar miembros de esta clase User.MiClase. El $C(0) es la representación interna de SQL "" (Cambio Vacío) en los campos de una tabla / propiedades de una clase. el SQL NULL se representa internamento como "". Es decir, si creas una tabla con: Create table MyTable(one VARCHAR(20), two VARCHAR(20) Insert into MyTable(one) values ('Hola') -> Para esta fila el campo two tendra el valor SQL NULL, por lo cual el Global de la tabla (la representación interna) sera "" para este campo. Insert into MyTable(one,two) values ('Prueba','') -> Para esta fila, el campo two tendra el valor SQL "" (Campo Vacío), por lo cual el global de la tabla tendra $c(0) para el campo "two" en esta fila. Esto dicho, más importante que la representación interna de los valores SQL/Objetos en el Global, que es lo que necesitas hacer? Si tienes que acceder a los globals de tablas/Objetos creado por SQL/Objetos, siempre tendrás que procesar la representación interna, o acceder via las APIs de SQL/objetos/XML/JSON que devuelven el valor introducido correctamente.
ir a la publicación Pierre-Yves Duq... · 13 mayo, 2020 El código Mumps y sus variantes, sean Micronetics Standard Mumps, Digital Standard Mumps, DataTree Mumps se puede seguir ejecutando en versiones recientes de la plataforma Caché, Ensemble y la más reciente InterSystems IRIS. Historicamente, clientes que han querido dotar una aplicación texto de una capa visual han optado por: un entorno Visual para desarrollar la parte cliente en Visual Basic o más recientemente .NET, o a veces con frameworks visuales Java. Se pueden conectar a la plataforma mediante ODBC/ADO.NET/JDBC u otros mecanismos , (incluido el ya muy antiguo MSM-Activate). un desarrollo directo en entorno Web, sea mediante la generación directa de paginas Web desde CSP (Caché Server Pages). Más recientemente muchos desarrollos Web se realizan con frameworks modernos como Angular, VueJS o React, connectando-los a un back-end Caché/IRIS donde ejecutar el código. En este ejemplo se explica como hace esto: https://es.community.intersystems.com/post/ejemplo-de-aplicaci%C3%B3n-angular-intersystems-iris
ir a la publicación Pierre-Yves Duq... · 23 mayo, 2019 Lo utilizo en una herramienta adhoc de gestión de despliegues de Integración; permite borrar / añadir nuevos componentes a una producción en funcionamiento, y configurarlos con sus parametros que pueden ser distintos en los entornos test / prod.
ir a la publicación Pierre-Yves Duq... · 23 mayo, 2019 Hay que retocar multiples clases para manipular una producción:Hay que cargar la definición del XML, manipular esta definición y volver a grabar los cambios al XML.Aquí un ejemplo: ClassMethod Remove(pProdName, pItemName) As %Status { #DIM tSC as %Status=$$$OK #DIM errObj as %Exception.AbstractException try { //Copy Production XData Content to the Ens.Config.Production and Save $$$THROWONERROR(tSC,##class(Ens.Config.Production).LoadFromClass(pProdName)) set tProdConfig=##class(Ens.Config.Production).%OpenId(pProdName) if (tProdConfig="") { $$$ThrowStatus($$$ERROR($$$GeneralError,"No se ha encontrado la Configuración de producción "_pProdName)) } for tIx=tProdConfig.Items.Count():-1:1 { //Reverse Scan to Avoid skipping Item after remove set tItem=tProdConfig.Items.GetAt(tIx) if (tItem.Name=pItemName) { //---Remove Item from Production Configuration Do tProdConfig.Items.RemoveAt(tIx) Do ##class(Ens.Config.Item).%DeleteId(tItem.%Id()) } } // update production class $$$THROWONERROR(tSC,tProdConfig.SaveToClass()) //Recompile Class do $SYSTEM.OBJ.Compile(pProdName,"f") //Update or Restart Production do ##class(Ens.Director).UpdateProduction() }catch(errObj) { set tSC=errObj.AsStatus() } quit tSC }