Este tipo de utilidades siempre vienen bien! Como nota adicional, en la última versión de IRIS (2023.3), se ha implementado un nuevo algoritmo que mejora la velocidad de cálculo... Ahí va el link a las release notes: si alguno tiene un global bien crecidito, podría mandar tiempos de cálculo entre otras versiones y esta última... a ver la mejora.

Casi, casi,... se acerca mucho pero esas clases representan los recursos tal cual de las distintas releases... está muy bien, pero no podríamos usarlas cuando estemos utilizando un profile específico que sea distinto de la versión estándar. Por ejemplo, si tuvieramos un profile para España que modificase el recurso paciente para añadir un segundo apellido, ¿cómo lo haríamos? Quizá valdría con tener una utilidad que genere automáticamente un paquete, similar al *.vR4.Model.Resource.*, para ese profile específico... Es una idea para una solución en OpenExchange... a ver si alguien coge el testigo! 😉 

Excelente resumen!. Además, desde hace unos meses, ZPM fue adoptado oficialmente por InterSystems y pasa a llamarse IPM. Se mantiene eso sí como open source, pero pasa a estar soportado por InterSystems como Package Manager... Para el que quiera contribuir dando ideas para mejorarlo, comentar problemas, dudas, etc... dejo aquí el GitHub: GitHub - intersystems/ipm: InterSystems ObjectScript Package Manager. Tambien tendréis acceso a versiones beta...

Gracias por compartir Tomás. Muy interesante... seguro que ayudará a muchos que no puedan esperar a la acualización de su versión de IRIS y tengan que utilizar Exchange. Si es posible, te pediría que compartieses el código como proyecto en GitHub... puede resultar más fácil para otros si quieren aportar correcciones o mejoras.

Hola Ramón! Bienvenido a la Comunidad... Gracias por compartir!! Interesante artículo, con un caso de uso que es bastante común y que otros seguro aprovechan. La ventaja de ir a través de una BO es que igual que en este caso tu has decidido realizar directamente la inserción vía SQL en IRIS, esa misma BO y toda la lógica de negocio anterior, podría estar dirigida a otra BD externa, que puede ser IRIS o no, e incluso a otra tabla. Es decir, la BO te encapsula el almacenamiento. El Business Process o Business Service que la llama, no sabe ni cómo ni dónde se va a almacenar la información... el BO se encarga y puede cambiar sin afectar al resto. Este desacople nos simplifica muchísimo el trabajo de mantenimiento y evolución de la solución!!

Estaría muy bien si pudieras poner tu código en un GitHub y compartirlo junto con el artículo. Seguro que otros lo pueden aprovechar.

Gracias por compartir tu experiencia Heloisa... mucha gente no sabe que tiene la posibilidad de decidir el formato de los objetos JSON... y que puede predefinir distintos formatos de exportación e importación y utilizar uno u otro según necesite.

Duda... las clases de las que quieres exportar objetos en JSON, ¿no deberían heredar de %JSON.Adaptor? O es que consigues hacerlo de otro modo?

Muy ingenioso. Gracias por compartir!

Me ha gustado cómo le sacas partido a las funciones de asignación dinámica tanto de métodos ( $classmethod(clase,metodo)), como de propiedades ( $property(objRef,propName)). Igualmente el utilizar las macros del sistema $$$comMemberNext y $$$cCLASSproperty. 

Como sugerencia, en lugar de utilizar directamente estas macros, quizá ahí sería mejor utilizar el API que ya existe en %SYSTEM.Dictionary. En concreto esa línea podría ser:

set prop = $system.Dictionary.comMemberNext(claseRequest,$$$cCLASSproperty,prop)

Yo creo que en el Kahoot hubo hasta codazos!! laugh  La verdad es que estuvo genial poder compartir experiencias y sobre todo vernos después de casi 3 años... y las exposiciones super interesantes... personalmente me quedé con ganas de más... y los que exponían ya ni hablamos (David Cano y Carlos Fernández de Roche y Florencio López y Mario del Pozo por Arisnova)... yo creo que si no los paran aún seguían. laughlaugh  Estuvo genial. A ver si repetimos.

Seguro que hay todavía mucho %ZEN.proxyObject por ahí. ¡¡Nunca es tarde si la dicha es buena!! wink

La única precaución es que %ZEN.proxyObject es una clase de sistema... Si la modificamos, hay que preservarla en las actualizaciones y validar que no haya cambiado o hacer un merge... de otro modo perderemos los cambios nuestros o las correcciones de producto.

Por "IRIS-izarlo" un poco... aunque no tan automático como lo que presentas, podemos también alterar temporalmente los tipos en los %Library.DynamicObject.

set obj = {}
set objB = {}

set objB.phone = 961000000

set obj.phone = 91001001
set obj.nombre = "Luis"
set obj.objetoB = objB

set orig = obj.%GetSerial() //si queremos preservar el valor original
do obj.%Set("phone",obj.phone,"string")
do objB.%Set("phone",objB.phone,"string")

do obj.%ToJSON()

set obj = obj.%SetSerial(orig)  //para volver al objeto JSON original
do obj.%ToJSON()

Resultado:

{"phone":"91001001","nombre":"Luis","objetoB":{"phone":"961000000"}}
{"phone":91001001,"nombre":"Luis","objetoB":{"phone":961000000}}

Igual sería interesante ver todas las posibilidades de formateo de las antiguas clases %ZEN y ver si están cubiertas por %Dynamic*, %JSON.Adaptor y %JSON.Formatter,... y, si no,... pues igual toca funcionalidad nueva en OpenExchange! :laugh