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

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

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:

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
}