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

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/puerto

Aquí 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)
	

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.

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

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 compiling

Antes 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 Manager

Algo 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.

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.

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

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.

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:

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.