answer461951

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
}

 

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.

Aqui otra solución mucho más sencilla

/// Elimina un item de la producción
ClassMethod ProductionItemRemove(pProdName, pItemName) As %Status
{
    write !,"Removing Item: "_pItemName

   if ##class(Ens.Config.Item).NameExists(pProdName, pItemName,.itemId)

    {
        set objItem=##class(Ens.Config.Item).%OpenId(itemId)
        set prod=##class(Ens.Config.Production).%OpenId(pProdName)
        do prod.RemoveItem(objItem)
        do prod.%Save()
        
        kill objItem
    
        do ##class(Ens.Director).RestartProduction(0,1)
    }
    
    quit $$$OK
}

Un saludo,

Francisco López