Pesquisar

Article
· Oct 20 4m read

Ampliar la capacidad de ObjectScript para procesar YAML

El lenguaje ObjectScript cuenta con un soporte increíble para JSON gracias a clases como %DynamicObject y %JSON.Adaptor. Este soporte se debe a la enorme popularidad del formato JSON, que sustituyó el dominio previo de XML. JSON trajo consigo una representación de datos menos verbosa y una mayor legibilidad para las personas que necesitaban interpretar su contenido. Para reducir aún más la verbosidad y aumentar la legibilidad, se creó el formato YAML.

El formato YAML, muy fácil de leer, se convirtió rápidamente en el más popular para representar configuraciones y parametrizaciones, gracias a su legibilidad y mínima verbosidad. Mientras que XML rara vez se utiliza para parametrización y configuración, con YAML el JSON está quedando gradualmente limitado a ser un formato de intercambio de datos, más que uno para configuraciones, parametrizaciones y representaciones de metadatos. Ahora, todo esto se hace con YAML. Por lo tanto, el lenguaje principal de las tecnologías de InterSystems necesita un soporte amplio para el procesamiento de YAML, al mismo nivel que el que ya tiene para JSON y XML. Por esta razón, he publicado un nuevo paquete para convertir ObjectScript en un potente procesador de YAML. El nombre del paquete es yaml-adaptor.

Empecemos instalando el paquete.

1. Si usáis IPM, abrid el Terminal de IRIS y ejecutad:

USER>zpm “install yaml-adaptor”

2. Si usáis Docker, clonad o actualizad el repositorio yaml-adaptor en cualquier directorio local:

$ git clone https://github.com/yurimarx/yaml-adaptor.git

3. Abrid el terminal en este directorio y ejecutad:

$ docker-compose build

4. Ejecutad el contenedor IRIS con vuestro proyecto:

$ docker-compose up -d

¿Por qué usar este paquete?

Con este paquete podréis interoperar fácilmente, leer, escribir y transformar YAML en DynamicObjects, JSON y XML de forma bidireccional. Este paquete os permite leer y generar datos, configuraciones y parametrizaciones en los formatos más populares del mercado de manera dinámica, con poco código, alto rendimiento y en tiempo real.

¡El paquete en acción!

Es muy sencillo usar este paquete. Las funciones son:

  1. Convertir de una cadena YAML a una cadena JSON
ClassMethod TestYamlToJson() As %Status
{
    Set sc = $$$OK
    set yamlContent = ""_$CHAR(10)_
        "user:"_$CHAR(10)_
        "    name: 'Jane Doe'"_$CHAR(10)_
        "    age: 30"_$CHAR(10)_
        "    roles:"_$CHAR(10)_
        "    - 'admin'"_$CHAR(10)_
        "    - 'editor'"_$CHAR(10)_
        "database:"_$CHAR(10)_
        "    host: 'localhost'"_$CHAR(10)_
        "    port: 5432"_$CHAR(10)_
        ""
    Do ##class(dc.yamladapter.YamlUtil).yamlToJson(yamlContent, .jsonContent)
    Set jsonObj = {}.%FromJSON(jsonContent)
    Write jsonObj.%ToJSON()

    Return sc
}

2. Generar un archivo YAML a partir de un archivo JSON

ClassMethod TestYamlFileToJsonFile() As %Status
{

    Set sc = $$$OK
    Set yamlFile = "/tmp/samples/sample.yaml"
    Set jsonFile = "/tmp/samples/sample_result.json"
    Write ##class(dc.yamladapter.YamlUtil).yamlFileToJsonFile(yamlFile,jsonFile)
    

    Return sc
}

3. Convertir de una cadena JSON a una cadena YAML

ClassMethod TestJsonToYaml() As %Status
{
    Set sc = $$$OK
    set jsonContent = "{""user"":{""name"":""Jane Doe"",""age"":30,""roles"":[""admin"",""editor""]},""database"":{""host"":""localhost"",""port"":5432}}"
    Do ##class(dc.yamladapter.YamlUtil).jsonToYaml(jsonContent, .yamlContent)
    Write yamlContent

    Return sc
}

4. Generar un archivo JSON a partir de un archivo YAML

ClassMethod TestJsonFileToYamlFile() As %Status
{

    Set sc = $$$OK
    Set jsonFile = "/tmp/samples/sample.json"
    Set yamlFile = "/tmp/samples/sample_result.yaml"
    Write ##class(dc.yamladapter.YamlUtil).jsonFileToYamlFile(jsonFile, yamlFile)
    

    Return sc
}

5. Cargar un objeto dinámico desde una cadena YAML o archivos YAML

ClassMethod TestYamlFileToDynamicObject() As %Status
{
    Set sc = $$$OK
    Set yamlFile = "/tmp/samples/sample.yaml"
    Set dynamicYaml = ##class(YamlAdaptor).CreateFromFile(yamlFile)

    Write "Title: "_dynamicYaml.title, !
    Write "Version: "_dynamicYaml.version, !

    Return sc
}

Generar YAML a partir de objetos dinámicos

ClassMethod TestDynamicObjectToYaml() As %Status
{
    Set sc = $$$OK
    Set dynaObj = {}
    Set dynaObj.project = "Project A"
    Set dynaObj.version = "1.0"
    Set yamlContent = ##class(YamlAdaptor).CreateYamlFromDynamicObject(dynaObj)

    Write yamlContent

    Return sc
}

Generar un archivo XML a partir de un archivo YAML

ClassMethod TestXmlFileToYamlFile() As %Status
{

    Set sc = $$$OK
    Set xmlFile = "/tmp/samples/sample.xml"
    Set yamlFile = "/tmp/samples/sample_xml_result.yaml"
    Write ##class(dc.yamladapter.YamlUtil).xmlFileToYamlFile(xmlFile, yamlFile)
    

    Return sc
}

Generar un archivo YAML a partir de un archivo XML

ClassMethod TestYamlFileToXmlFile() As %Status
{

    Set sc = $$$OK
    Set yamlFile = "/tmp/samples/sample.yaml"
    Set xmlFile = "/tmp/samples/sample_result.xml"
    Write ##class(dc.yamladapter.YamlUtil).yamlFileToXmlFile(yamlFile, "sample", xmlFile)
    

    Return sc
}
Discussion (0)0
Log in or sign up to continue
Digest
· Oct 20

Publications des développeurs d'InterSystems, semaine Octobre 13 - 19, 2025, Résumé

Announcement
· Oct 20

Noticias del ecosistema de desarrolladores de InterSystems, tercer trimestre de 2025

¡Hola y bienvenidos a las Noticias del Ecosistema de Desarrolladores!

El tercer trimestre del año estuvo lleno de actividades emocionantes en el Ecosistema de Desarrolladores de InterSystems. Por si os habéis perdido algo, hemos preparado una selección de las noticias y temas más destacados para que os pongáis al día.

Noticias

🎇 Nuevo tutorial práctico: RAG con InterSystems IRIS Vector Search

🎆 Formad parte de nuestro vídeo por el 10.º aniversario

💡 Noticias de InterSystems Ideas n.º#23#24, y #25

📝 Actualización de las plataformas de InterSystems T3-2025

📝 Aviso de seguridad IRISSECURITY en InterSystems IRIS 2025.2

👨‍💻 Programas de acceso anticipado (EAP) de InterSystems

📝 [Nueva función en DC] Añadid enlaces a la documentación en vuestros artículos

Recompensa por artículos de agosto y septiembre en Global Masters

🎁 Desbloquead nuevos y emocionantes premios en Global Masters

Concursos y eventos

 
InterSystems Ideas Contest
 
Demo Games

🤝 Encuentro de desarrolladores en Cambridge - Creación y evaluación de sistemas de recuperación generativa basada en agentes

🤝 Encuentro de desarrolladores en Boston - IA / IA basada en agentes

🤝 Encuentro de desarrolladores en Cambridge - Encuentro de creadores y startups de tecnología sanitaria: FHIR, IA e interoperabilidad

🤝 Encuentro de desarrolladores en São Paulo, Brasil: IA generativa e IA basada en agentes

📺 [Seminario web] El futuro de la integración sanitaria con Health Connect e InterSystems

📺 [Seminario web] Tecnología de búsqueda vectorial con IA en InterSystems IRIS

👩‍💻 InterSystems en MIT Hacking Medicine 2025, Brasil

 

Últimos lanzamientos

⬇️ InterSystems anuncia la disponibilidad general de InterSystems IRIS 2025.2

⬇️ Ya está disponible la versión de mantenimiento 2025.1.1 de InterSystems IRIS, IRIS for Health y HealthShare Health Connect

⬇️ InterSystems publica el anuncio de lanzamiento de la versión 25.1 de Reports

⬇️ VS Code - Extensión de ObjectScript ahora con telemetría mejorada

⬇️ InterSystems Cloud Services - Notas de la versión - 18 de agosto de 2025

Mejores prácticas y preguntas clave

❓ Preguntas clave: Julio, AgostoSeptiembre

Personas y empresas que deberíais conocer

👩‍🏫 Celebrando a una voz pionera en la comunidad de desarrolladores

👩‍🏫 Celebrando una fuerza creativa en la comunidad de desarrolladores

💼 Experto en conversión de bases de datos de MUMPS DTM a InterSystems IRIS

💼 Oportunidad para desarrolladores de Cache Object Script

💼 Se busca desarrollador de InterSystems IRIS for Health – remoto (solo EE. UU.)

👨‍💻 En búsqueda de empleo

👨‍💻 Busca trabajo con experiencia en HealthConnect

👨‍💻 Especialista en la plataforma de datos IRIS | Más de 10 años de experiencia | En busca del próximo empleo

Así que...

Aquí tenéis nuestra selección de los temas más interesantes e importantes.

¿Cuáles fueron vuestros momentos destacados de este último trimestre? Compartidlos en los comentarios y recordemos juntos los buenos momentos que hemos pasado.

1 Comment
Discussion (1)1
Log in or sign up to continue
Article
· Oct 20 2m read

Lier des tables par programmation

Rubrique FAQ InterSystems

Dans InterSystems IRIS, vous pouvez créer des tables liées à l'aide de commandes, au lieu d'utiliser System Explorer > SQL > Wizard > Linked Tables dans le Portail de gestion :

Pour créer une table liée, utilisez la méthode CreateLinkedTable de la classe %SYSTEM.SQL.Schema. Consultez la référence de la classe pour plus de détails.

Pour l'exécuter, procédez comme suit :

set sc = $SYSTEM.SQL.Schema.CreateLinkedTable("<dsn>","<Schema>","<Table>","<primaryKeys>","<localClass>","<localTable>","")

/// 1er argument : dsn - Nom de la connexion SQL Gateway
/// 2e argument : Schema - Nom du schéma source
/// 3e argument : Table - Nom de la table source
/// 4e argument : primaryKeys - Clé primaire
/// 5e argument : localClass - Nom de la classe liée (par exemple, User.LinkedClass)
/// 6e argument : localTable - Nom de la table SQL liée (SqlTableName)
/// 7e argument : columnMap - Informations sur les champs liés

Si vous l'exécutez de cette façon, la table liée sera créée avec l'attribut ReadOnly. Si vous souhaitez supprimer l'attribut ReadOnly, vous devez le spécifier dans le septième argument, columnMap.

set columnMap("external field name") = $lb("new class property name","new sql field name","read-only(1/0)")

Dans cet exemple, un columnMap est créé qui définit ReadOnly sur 0 pour tous les champs (colonnes), et une table liée est créée. La primaryKey est définie pour hériter de la primaryKey de la table liée. L'utilisation est la suivante :

do ##class(ISC.LinkUtils).LinkTable("<dsn>","<Schema>","<Table>","<localClass>")

/// Premier argument : dsn - Nom de la connexion SQL Gateway
/// Deuxième argument : Schéma - Nom du schéma source du lien
/// Troisième argument : Table - Nom de la table source du lien
/// Quatrième argument : localClass - Nom de la classe de destination du lien (par exemple, User.LinkedClass)

Vous pouvez également voir l'exemple utilisé ici : https://github.com/Intersystems-jp/CreateLinkedTable

Discussion (0)1
Log in or sign up to continue
Digest
· Oct 20