#ObjectScript

0 Seguidores · 219 Publicaciones

InterSystems ObjectScript es un lenguaje de programación para operar con datos mediante cualquier modelo de datos que se encuentre en InterSystems Data Platform (Objetos, relacionales, valores clave, documentos, globales) y desarrollar lógica empresarial para aplicaciones del lado del servidor en InterSystems Data Platform.

Consultar la documentación.

Artículo Ricardo Paiva · oct 20, 2023 1m read

Preguntas frecuentes de InterSystems

ObjectScript permite pasar cualquier número de argumentos utilizando arrays. Se hace añadiendo ... después del nombre del argumento.

Os muestro un ejemplo. En la sentencia del ejemplo, la información del argumento se establece en una variable global (una variable almacenada en la base de datos) para que pueda ser fácilmente verificada después de que se ejecute el método.

Class TEST.ARGTEST1 Extends%RegisteredObject
{
ClassMethod NewMethod1(Arg... As %StringAs %Boolean
{
 kill ^a
 merge ^a = Arg
}
}
0
0 120
Artículo Ricardo Paiva · oct 12, 2023 2m read

Preguntas frecuentes de InterSystems

En el siguiente ejemplo, un archivo de imagen se codifica en una cadena Base64 en una propiedad de clase, se guarda, se decodifica la cadena en Base64 y se restaura en otro archivo.

【Classe ejemplo】

Class User.test Extends %Persistent
{
Property pics As %GlobalBinaryStream;
}


【Cuando se importa】

0
0 296
Pregunta Jose-Tomas Salvador · oct 21, 2022

Buenos días, tardes, noches,... wink

Una pequeña reflexión/pregunta para hoy... es una realidad que las nuevas versiones de IRIS for Health son cada vez más potentes en cuanto a capacidades FHIR. Permiten consumir recursos FHIR con extrema facilidad, podemos crear conexiones con end-points de servidores FHIR externos muy facilmente y hacer que IRIS actúe de passthrough o que consuma esos recursos... o, más aún, podemos definir y poner en funcionamiento un repositorio FHIR, literalmente, en menos de 5 minutos.

Sin embargo, hay una cosa que echo en falta en proyectos de tipo FHIR Façade, cuando tenemos que implementar una capa FHIR sobre un sistema que "no habla" FHIR. Se trata de la posiblidad de tener ayuda en nuestro IDE (Studio o VS Code) a la hora de codificar la lógica que crearía el o los objetos dinámicos (%DynamicObject) que representan los recursos FHIR que queremos definir...

3
0 128
Artículo Alberto Fuentes · sep 20, 2023 1m read

Preguntas frecuentes de InterSystems

El lenguaje ObjectScript de InterSystems no permite definir métodos con el mismo nombre pero utilizando diferentes argumentos.

En general, se suele clasificar Objectscript como un lenguaje de programación dinámico. En ObjectScript se puede controlar libremente qué argumentos se utilizan cuando se ejecuta un método, así que a diferencia de otros lenguajes como Java, que no son lenguajes de programación dinámicos, no es necesario distinguir estrictamente los métodos por el número de argumentos en la fase de compilación.

El lenguaje ObjectScript, por tanto, no contiene la característica conocida como overloadingo sobrecarga como tal.

0
0 99
Artículo Luis Angel Pérez Ramos · sep 8, 2023 1m read

InterSystems FAQ

Puedes evitar este error especificando un objeto de tipo stream como argumento de la función %ToJSON usando durante la generación del string JSON desde el objeto dinámico.

A continuación podéis ver un ejemplo.

USER>set temp=##class(%Stream.TmpCharacter).%New()

USER>set jsonobj={}

USER>set jsonobj.pro1=["a","b","c","d"]

USER>set jsonobj.pro2=["あ","い","う","え"]

USER>do jsonobj.%ToJSON(temp)

USER>write temp.Size
51
USER>write temp.Read()
{"pro1":["a","b","c","d"],"pro2":["あ","い","う","え"]}

Podéis consultar la documentación si queréis más detalles al respecto.

0
0 137
Artículo Ricardo Paiva · ago 28, 2023 3m read

Como se señaló en el artículo anterior, la API nativa tiene algunos límites. Así que investigué un poco sobre una interfaz más parecida a una Terminal. De manera a permitirme una consola al estilo terminal de IRIS para permitir $QUERY y otros comandos útiles que no son compatibles/mapeados a la API nativa para ObjectScript.

Las herramientas básicas están bien preparadas y disponibles

  • Connection()crea una partición estable y completamente operativa
  • Function()permite llamar a cualquier rutina o método que necesite
  • ClassMethodValue y ClassMethodVoid similares
1
0 121
Artículo Ricardo Paiva · ago 24, 2023 1m read

Preguntas frecuentes de InterSystems

Si el valor de una variable local es un OREF o no se puede determinar usando $IsObject(). Sea v la variable que desea verificar,

$IsObject(v)=1// v is an OREF$IsObject(v)=0// v is not an OREF$IsObject(v)=-1// v is an OREF but does not point to a valid object

Tenga en cuenta que $IsObject(v) dará un error UNDEFINED si v no está definido.

Para evitar errores UNDEFINED, se recomienda utilizar $Get así:

$IsObject($Get(v))
0
0 86
Artículo Ricardo Paiva · ago 23, 2023 3m read

Esta pregunta apareció originalmente en los comentarios de la publicación: Descargar globales desde un servidor en particular

Este artículo se inspiró en una pregunta reciente de @Evgeny.Shvarov.

Descargar globales desde un servidor en particular
No es un código de hacer clic y ejecutar, sino un borrador que requiere ajustes para cubrir las necesidades de cada caso de uso. Para ello debe agregar:

1
0 113
Artículo Ricardo Paiva · ago 14, 2023 2m read

Hola desarrolladores, actualmente estoy haciendo una demostración sobre la creación de una interfaz de usuario haciendo análisis de datos y configurando una prueba de rendimiento con objetos de datos. Por lo tanto, usar la "Utilidad de generación/población" podría ayudarme a generar automáticamente algunos datos de muestra con los que puedo jugar.

En esta publicación, me gustaría compartir mi experiencia con el uso de la utilidad Populate, incluido el uso del parámetro POPSPEC.

0
0 102
Artículo Alberto Fuentes · jun 14, 2023 11m read

Qué es el Web Scraping:

En términos sencillos, el Web scraping, también conocido como recolección de datos de sitios web o extracción de datos de sitios web es un proceso automatizado que permite la recopilación de grandes volúmenes de datos (no estructurados) de los sitios web. El usuario puede extraer datos de sitios web específicos, según sus necesidades. Los datos recopilados se pueden almacenar en un formato estructurado para su posterior análisis.

¿Qué es el Web Scraping? — James Le

**Pasos necesarios para realizar Web scraping:**
  1. Encontrar la URL de la página web de la que se desean extraer los datos
  2. Seleccionar ciertos elementos mediante una inspección
  3. Escribir el código para obtener el contenido de los elementos seleccionados
  4. Almacenar los datos en el formato requerido

¡¡Así de sencillo!!

Las librerías/herramientas más populares para realizar Web scraping son:

  • Selenium: un framework para probar aplicaciones web
  • BeautifulSoup: una librería de Python para obtener datos a partir de HTML, XML y otros lenguajes de marcado
  • Pandas: una librería de Python para manipulación y análisis de datos

##¿Qué es Beautiful Soup?

Beautiful Soup es una librería de Python que sirve para extraer datos estructurados de un sitio web. Permite analizar datos a partir de archivos HTML y XML. Funciona como un módulo de ayuda e interactúa con HTML de forma similar pero mejor a como interactuarías con una página web utilizando otras herramientas disponibles para desarrolladores.

  • Por lo general, ahorra horas o días de trabajo a los programadores, porque funciona con analizadores muy conocidos, como lxml y html5lib, para ofrecer formas compatibles con Python para navegar, efectuar búsquedas y modificar el árbol de análisis de elementos de la página.
  • Otra potente y útil característica de Beautiful soup es la inteligencia con la que cuenta para convertir a Unicode los documentos obtenidos y a UTF-8 los documentos de salida. Como desarrollador, no tienes que ocuparse de eso a menos que el documento en sí no especifique una codificación o BeautifulSoup no pueda detectar una.
  • También se considera que es más rápido en comparación con otras técnicas generales de análisis o extracción de datos. 

En este artículo utilizaremos Python Embebido con ObjectScript para extraer de ae.indeed.com empresas y ofertas de empleo de Python

Paso 1 - Encontrar la URL de la página web de la que se desean extraer los datos
 

URL = https://ae.indeed.com/jobs?q=python&l=Dubai&start=0

La página web de la que extraeremos los datos se ve así:

Para simplificar el proceso y con fines educativos, extraeremos los datos "Job" (Puesto de trabajo) y "Company" (Empresa). El resultado sería algo similar esto:

 

 Utilizaremos dos librerías de Python.

  • requests Requests es una librería HTTP para el lenguaje de programación Python. El objetivo del proyecto es hacer que las solicitudes HTTP sean más sencillas y amigables para el usuario. 
  • bs4 para BeautifulSoup BeautifulSoup es un paquete de Python para analizar documentos HTML y XML. Crea un árbol de análisis para las páginas analizadas, que puede utilizarse para extraer datos de HTML, lo que es útil para el proceso de web scraping.

Vamos a instalar estos paquetes de Python (en Windows)

irispip install --target C:\InterSystems\IRISHealth\mgr\python bs4

irispip install --target C:\InterSystems\IRISHealth\mgr\python requests

Ahora importaremos las librerías de Python a ObjectScript
 

<span class="hljs-keyword">Class</span> PythonTesting.WebScraper <span class="hljs-keyword">Extends</span> <span class="hljs-built_in">%Persistent</span>
{

<span class="hljs-comment">// pUrl = https://ae.indeed.com/jobs?q=python&l=Dubai&start=</span>
<span class="hljs-comment">// pPage = 0</span>
<span class="hljs-keyword">ClassMethod</span> ScrapeWebPage(pUrl, pPage)
{
    <span class="hljs-comment">// imports the requests python library</span>
    <span class="hljs-keyword">set</span> requests = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%SYS.Python</span>).Import(<span class="hljs-string">"requests"</span>)
    <span class="hljs-comment">// import the bs4 python library</span>
    <span class="hljs-keyword">set</span> soup = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%SYS.Python</span>).Import(<span class="hljs-string">"bs4"</span>)
    <span class="hljs-comment">// import builtins package which contains all of the built-in identifiers</span>
    <span class="hljs-keyword">set</span> builtins = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%SYS.Python</span>).Import(<span class="hljs-string">"builtins"</span>)
}

Recopilamos los datos HTML utilizando la librería requests

Nota: El "user agent" se encontró buscando en Google "my user agent"
La URL es "https://ae.indeed.com/jobs?q=python&l=Dubai&start=", donde pPage es el número de página

Haremos una solicitud HTTP GET a la URL usando requests y almacenaremos la respuesta en "req"

    <span class="hljs-keyword">set</span> headers  = {<span class="hljs-string">"User-Agent"</span>: <span class="hljs-string">"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"</span>}
    <span class="hljs-keyword">set</span> url = <span class="hljs-string">"https://ae.indeed.com/jobs?q=python&l=Dubai&start="</span>_pPage
    
    <span class="hljs-keyword">set</span> req = requests.get(url,<span class="hljs-string">"headers="</span>_headers)

El objeto "req" tendrá el HTML que fue devuelto desde la página web.

Ahora ejecutaremos el analizador de HTML de BeautifulSoup, para que podamos extraer la información del puesto de trabajo.

<span class="hljs-keyword">set</span> soupData = soup.BeautifulSoup(req.content, <span class="hljs-string">"html.parser"</span>)
<span class="hljs-keyword">set</span> title = soupData.title.text
<span class="hljs-keyword">W</span> !,title

El título se ve de la siguiente manera:

Paso 2: Seleccionar ciertos elementos mediante una inspección.

En este escenario nos interesa la lista de trabajos que normalmente se encuentra en una etiqueta < div >. En el navegador se puede inspeccionar el elemento para encontrar la clase "div".

En nuestro caso, la información necesaria se almacena en <div class="cardOutline tapItem ... </ div >

Paso 3: Escribir el código para obtener el contenido de los elementos seleccionados

Utilizaremos la función find_all de BeautifulSoup para buscar todas las etiquetas < div > que contengan la clase con el nombre "cardOutline".

&lt;span class="hljs-comment">//parameters to python would be sent as a python dictionary&lt;/span>
&lt;span class="hljs-keyword">set&lt;/span> divClass = {&lt;span class="hljs-string">"class"&lt;/span>:&lt;span class="hljs-string">"cardOutline"&lt;/span>}
&lt;span class="hljs-keyword">set&lt;/span> divsArr = soupData.&lt;span class="hljs-string">"find_all"&lt;/span>(&lt;span class="hljs-string">"div"&lt;/span>,divClass...)

Esto devolverá una lista que podremos examinar para extraer los Puestos de trabajo y la Empresa.

Paso 4: Almacenar los datos en el formato requerido

En el siguiente ejemplo escribiremos los datos en el terminal.

&lt;span class="hljs-keyword">set&lt;/span> len = builtins.len(divsArr)
    
&lt;span class="hljs-keyword">W&lt;/span> !, &lt;span class="hljs-string">"Job Title"&lt;/span>,&lt;span class="hljs-built_in">$C&lt;/span>(&lt;span class="hljs-number">9&lt;/span>)_&lt;span class="hljs-string">" --- "&lt;/span>_&lt;span class="hljs-built_in">$C&lt;/span>(&lt;span class="hljs-number">9&lt;/span>),&lt;span class="hljs-string">"Company"&lt;/span>
&lt;span class="hljs-keyword">for&lt;/span> i = &lt;span class="hljs-number">1&lt;/span>:&lt;span class="hljs-number">1&lt;/span>:len {
    &lt;span class="hljs-keyword">Set&lt;/span> item = divsArr.&lt;span class="hljs-string">"__getitem__"&lt;/span>(i - &lt;span class="hljs-number">1&lt;/span>)
    &lt;span class="hljs-keyword">set&lt;/span> title = &lt;span class="hljs-built_in">$ZSTRIP&lt;/span>(item.find(&lt;span class="hljs-string">"a"&lt;/span>).text,&lt;span class="hljs-string">"&lt;>W"&lt;/span>)
    &lt;span class="hljs-keyword">set&lt;/span> companyClass = {&lt;span class="hljs-string">"class_"&lt;/span>:&lt;span class="hljs-string">"companyName"&lt;/span>}
    &lt;span class="hljs-keyword">set&lt;/span> company = &lt;span class="hljs-built_in">$ZSTRIP&lt;/span>(item.find(&lt;span class="hljs-string">"span"&lt;/span>, companyClass...).text,&lt;span class="hljs-string">"&lt;>W"&lt;/span>)
    &lt;span class="hljs-keyword">W&lt;/span> !,title,&lt;span class="hljs-built_in">$C&lt;/span>(&lt;span class="hljs-number">9&lt;/span>),&lt;span class="hljs-string">" --- "&lt;/span>,&lt;span class="hljs-built_in">$C&lt;/span>(&lt;span class="hljs-number">9&lt;/span>),company
}

Hay que tener en cuenta que estamos usando la función builtins.len() para obtener la longitud de la lista divsArr

<p>
  Nombres de los identificadores:<br />

Las reglas para nombrar a los identificadores son diferentes entre ObjectScript y Python. Por ejemplo, el guion bajo (_) está permitido en el nombre de los métodos de Python, y de hecho se utiliza ampliamente para los llamados métodos y atributos “dunder” (“dunder” es la abreviatura de “double underscore”), como  getitem o class. Para usar estos identificadores desde ObjectScript, hay que ponerlos entre comillas dobles:
<a

href="https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON_sharedata_identifiers">Documentación sobre los nombres de los identificadores

 

 Ejemplo de Método de Clase.

 
ClassMethod ScrapeWebPage(pUrl, pPage)
<div class="spoiler-content">
  <pre class="codeblock-container" idlang="0" lang="ObjectScript" tabsize="4"><code class="language-cls hljs cos">&amp;lt;span class="hljs-comment">// pUrl = https://ae.indeed.com/jobs?q=python&l=Dubai&start=&amp;lt;/span>

&lt;span class="hljs-comment">// pPage = 0&lt;/span> &lt;span class="hljs-keyword">ClassMethod&lt;/span> ScrapeWebPage(pUrl, pPage) { &lt;span class="hljs-keyword">set&lt;/span> requests = &lt;span class="hljs-keyword">##class&lt;/span>(&lt;span class="hljs-built_in">%SYS.Python&lt;/span>).Import(&lt;span class="hljs-string">"requests"&lt;/span>)

&amp;lt;span class="hljs-keyword">set&amp;lt;/span> soup = &amp;lt;span class="hljs-keyword">##class&amp;lt;/span>(&amp;lt;span class="hljs-built_in">%SYS.Python&amp;lt;/span>).Import(&amp;lt;span class="hljs-string">"bs4"&amp;lt;/span>)

&amp;lt;span class="hljs-keyword">set&amp;lt;/span> builtins = &amp;lt;span class="hljs-keyword">##class&amp;lt;/span>(&amp;lt;span class="hljs-built_in">%SYS.Python&amp;lt;/span>).Builtins()

&amp;lt;span class="hljs-keyword">set&amp;lt;/span> headers  = {&amp;lt;span class="hljs-string">"User-Agent"&amp;lt;/span>: &amp;lt;span class="hljs-string">"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"&amp;lt;/span>}
&amp;lt;span class="hljs-keyword">set&amp;lt;/span> url = pUrl_pPage

&amp;lt;span class="hljs-keyword">set&amp;lt;/span> req = requests.get(url,&amp;lt;span class="hljs-string">"headers="&amp;lt;/span>_headers)

&amp;lt;span class="hljs-keyword">set&amp;lt;/span> soupData = soup.BeautifulSoup(req.content, &amp;lt;span class="hljs-string">"html.parser"&amp;lt;/span>)

&amp;lt;span class="hljs-keyword">set&amp;lt;/span> title = soupData.title.text

&amp;lt;span class="hljs-keyword">W&amp;lt;/span> !,title

&amp;lt;span class="hljs-keyword">set&amp;lt;/span> divClass = {&amp;lt;span class="hljs-string">"class_"&amp;lt;/span>:&amp;lt;span class="hljs-string">"cardOutline"&amp;lt;/span>}
&amp;lt;span class="hljs-keyword">set&amp;lt;/span> divsArr = soupData.&amp;lt;span class="hljs-string">"find_all"&amp;lt;/span>(&amp;lt;span class="hljs-string">"div"&amp;lt;/span>,divClass...)

&amp;lt;span class="hljs-keyword">set&amp;lt;/span> len = builtins.len(divsArr)

&amp;lt;span class="hljs-keyword">W&amp;lt;/span> !, &amp;lt;span class="hljs-string">"Job Title"&amp;lt;/span>,&amp;lt;span class="hljs-built_in">$C&amp;lt;/span>(&amp;lt;span class="hljs-number">9&amp;lt;/span>)_&amp;lt;span class="hljs-string">" --- "&amp;lt;/span>_&amp;lt;span class="hljs-built_in">$C&amp;lt;/span>(&amp;lt;span class="hljs-number">9&amp;lt;/span>),&amp;lt;span class="hljs-string">"Company"&amp;lt;/span>
&amp;lt;span class="hljs-keyword">for&amp;lt;/span> i = &amp;lt;span class="hljs-number">1&amp;lt;/span>:&amp;lt;span class="hljs-number">1&amp;lt;/span>:len {
        &amp;lt;span class="hljs-keyword">Set&amp;lt;/span> item = divsArr.&amp;lt;span class="hljs-string">"__getitem__"&amp;lt;/span>(i - &amp;lt;span class="hljs-number">1&amp;lt;/span>)
        &amp;lt;span class="hljs-keyword">set&amp;lt;/span> title = &amp;lt;span class="hljs-built_in">$ZSTRIP&amp;lt;/span>(item.find(&amp;lt;span class="hljs-string">"a"&amp;lt;/span>).text,&amp;lt;span class="hljs-string">"&amp;lt;>W"&amp;lt;/span>)
        &amp;lt;span class="hljs-keyword">set&amp;lt;/span> companyClass = {&amp;lt;span class="hljs-string">"class_"&amp;lt;/span>:&amp;lt;span class="hljs-string">"companyName"&amp;lt;/span>}
        &amp;lt;span class="hljs-keyword">set&amp;lt;/span> company = &amp;lt;span class="hljs-built_in">$ZSTRIP&amp;lt;/span>(item.find(&amp;lt;span class="hljs-string">"span"&amp;lt;/span>, companyClass...).text,&amp;lt;span class="hljs-string">"&amp;lt;>W"&amp;lt;/span>)
        &amp;lt;span class="hljs-keyword">W&amp;lt;/span> !,title,&amp;lt;span class="hljs-built_in">$C&amp;lt;/span>(&amp;lt;span class="hljs-number">9&amp;lt;/span>),&amp;lt;span class="hljs-string">" --- "&amp;lt;/span>,&amp;lt;span class="hljs-built_in">$C&amp;lt;/span>(&amp;lt;span class="hljs-number">9&amp;lt;/span>),company
 }

}

  <p>
     
  </p>
</div>

 

Próximos pasos...

Usando Object Script y Python Embebido y creando unas pocas líneas de código, podríamos extraer fácilmente la información de las páginas web más populares para buscar trabajo, recoger el nombre del puesto de trabajo, la empresa, el sueldo, la descripción del trabajo y correos electrónicos/enlaces. Esta información se puede añadir a un DataFrame de Pandas para eliminar los datos duplicados. Se pueden aplicar filtros basados en ciertas palabras clave que interesen.
Se pueden ejecutar estos datos a través de NumPy y obtener algunos gráficos de líneas. O realizar una One-Hot encoding de los datos, y crear/entrenar modelos de Machine Learning para que si hay puestos de trabajo que interesan particularmente, envíen una notificación. 😉


¡Feliz desarrollo!

0
0 501
Pregunta Lorenzo Scalese · jun 14, 2023

¡Hola!

Me gustaría encontrar programáticamente todas las clases que no están actualizadas en un namespace.

Con IRIS Studio, podemos ver el signo "+", pero no sé cómo hacerlo con un script.

Set sql = "SELECT ID, Name FROM %Dictionary.ClassDefinition WHERE NOT ID %STARTSWITH ?"Set params($Increment(params)) = "%"Set tResult = ##class(%SQL.Statement).%ExecDirect(, sql, params...)

If (tResult.%SQLCODE'=0)&&(tResult.%SQLCODE'=100) Set sc = $$$ERROR($$$SQLError, tResult.%SQLCODE, tResult.%Message) Quit sc

While tResult.%Next() {
    // if class not up to date ??
}

¿Alguien tiene alguna idea?

1
0 88
InterSystems Official Jose-Tomas Salvador · jun 9, 2023

Traducción del artículo originalmente publicado el 27 de Febrero de 2023

Me complace anunciar la versión 2.6.0 de la extensión VS Code ObjectScript, que contiene un buen número de mejoras para hacer más fácil la vida de los desarrolladores. Describo más abajo las más destacadas. Como siempre, podéis encontrar la lista de modificaciones en el CHANGELOG, incluyendo muchas correcciones de errores y vulnerabilidades.

Cambio rápido de namespaces

0
0 167
Artículo Luis Angel Pérez Ramos · mayo 19, 2023 1m read

¡Hola Comunidad!

Me gustaría presentaros una nueva utilidad para importar CSV a IRIS - ¡csvgenpy!

Instalación

USER>zpm "install csvgenpy"

Uso:

do ##class(shvarov.csvgenpy.csv).Generate("file or url","table","schema")

Ejemplo:

USER>do ##class(shvarov.csvgenpy.csv).Generate("https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv","titanic","data")

Esto creará la tabla y la clase data.titanic en IRIS y a continuación cargará los datos. Podéis probarlo con:

0
0 76
Pregunta Yone Moreno · mayo 9, 2023

Buenos días,

Antes que nada agradecer el tiempo de ustedes al leer, reflexionar y sobre todo responder y aclarar las dudas.

Tenemos una cuestión:

¿Cuál es la forma recomendada de convertir un Objeto de Ensemble a JSON?,

en concreto, para ser más preciso:

¿cuál es la manera idónea de transformar un Mensaje Response con cualquier tipo de Property: %String, %List of String, otros objetos de Ensemble (EsquemasDatos); a un GlobalCharacterStream que represente al JSON? a retornar a Sistema Origen, desde el Servicio.

3
0 232
Artículo Heloisa Paiva · abr 11, 2023 3m read

Introducción

Este artículo tiene la intención de ser un sencillo tutorial de cómo crear conexiones ODBC y trabajar con ellas, ya que me pareció que empezar con ellas es un poco confuso. Yo tuve la ayuda de unas personas increíbles, y creo que todos merecemos ese apoyo.

Voy dividir cada pequeña parte en sesiones, así que puedes ir directamente a la que necesites, aunque recomiendo leerlo todo.

Voy a usar los datos de ejemplo creados en un artículo previo, Tutorial rápido para crear bases de datos de ejemplo: Samples.PersistentData, con las propiedades Name y Age.
 

Creando la conexión

0
0 488
Artículo Nancy Martínez · mayo 30, 2022 1m read

Estoy seguro de que os habéis encontrado esta situación:

  • Hay un bug en un sistema que no puedes reproducir por ti mismo localmente
  • Necesitas ejecutar unas pocas líneas en la instancia afectada
  • Tienes acceso completo al Portal de Gestión
  • Pero no hay terminal, ni consola, ni acceso con Studio, Atelier o VSCode
  • ¿Cómo ejecutar tus pocas líneas para probar???
1
0 203
Artículo Maria Gladkov · mar 27, 2023 3m read

¡Hola a todos!  

En este artículo, me gustaría revisar las extensiones de VS Code que uso para trabajar con InterSystems y que hacen mi trabajo mucho más cómodo. Estoy segura de que este artículo será útil para aquellos que acaban de empezar su viaje aprendiendo las tecnologías de InterSystems. Y también espero que pueda resultar útil para los desarrolladores más experimentados, con muchos años de experiencia, y les descubra nuevas posibilidades cuando usen VS Code para desarrollo.

Os recomiendo a todos los que trabajáis con InterSystems que instaléis estas extensiones y en este artículo os mostraré cómo usar algunas de ellas.

0
0 290
Artículo Alberto Fuentes · mayo 20, 2022 3m read

Si estás desarrollando soluciones en IRIS y quieres utilizar Git, ¡es genial! Sólo tienes que utilizar VSCode con un repositorio git local y enviar los cambios al servidor, así de fácil.

Pero qué sucede si:

  • Colaboras con otros desarrolladores en un entorno de desarrollo remoto compartido y quieres evitar la edición simultánea del mismo archivo
  • Utilizas editores basados en el portal de administración para BPL, DTL, tablas dinámicas, cuadros de mando, etc. y quieres incluir esos elementos en el control de código de forma sencilla.
  • Aún utilizas Studio para realizar algunas cosas y/o ocasionalmente vuelves a usarlo desde VSCode. O tu equipo todavía no ha adoptado completamente VSCode y algunos miembros del equipo todavía quieren utilizar Studio
  • Trabajas en varios proyectos diferentes al mismo tiempo en el mismo namespace - digamos, en varios paquetes definidos mediante InterSystems Package Manager - y quieres trabajar con todos ellos desde una vista de edición de isfs (en vez de en varios proyectos distintos) con los cambios rastreados automáticamente en el repositorio de git apropiado

En ese caso no era tan sencillo... hasta finales del año pasado, cuando lanzamos Git para Entornos de Desarrollo Compartidos (Open Exchange / GitHub).

Puedes descargar esta extensión mediante InterSystems Package Manager:

zpm "install git-source-control"

Antes de esto, las opciones para controlar las fuentes con Git eran una antigua extensión de Git, principalmente para Windows, y sólo para entornos de desarrollo local y un proyecto más reciente de Open Exchange basado en él pero más sencillo. También está Port, que únicamente maneja archivos y es independiente del sistema de control de versiones.

¿Qué tiene git-source-control que no tienen estos paquetes?

  • Una integración sencilla con git, basada en un menú, que funciona en cualquier sistema operativo
  • Una interfaz de usuario de git para cubrir un conjunto de operaciones comunes de git, sin tener que conectarse con SSH al entorno remoto.
  • Control de concurrencia para múltiples usuarios que trabajan en el mismo entorno al mismo tiempo. Una vez que realizas cambios en una clase/rutina/etc., se vuelve tuya hasta que se descarten o se confirmen los cambios. (Sin embargo, tenemos formas de evitarlo cuando es necesario)
  • Integración con el administrador de paquetes: simplemente usa zpm mediante "load -dev /path/to/package" y si "/path/to/package/.git" existe, los cambios en los recursos de tu paquete se reflejarán automáticamente en el sitio correcto del sistema de archivos del servidor. La interfaz de usuario también funciona con esto, basada en la clase/etc. desde la que se ejecuta.

Todo esto funciona desde VSCode:

Spoiler

Y Studio:

 
Spoiler

Para que tengas el control y la visión de tu repositorio de git:

 
Spoiler

Esperamos que esto permita desarrollar con éxito las soluciones basadas en IRIS.

¡Agradecemos vuestros comentarios!

NOTA: Para ver la presentación del lanzamiento en el Global Summit de 2021, consultad este artículo: https://community.intersystems.com/post/video-git-gitlab-shared-development-environments

1
1 273
Artículo Muhammad Waseem · oct 13, 2021 4m read

A lo largo de los años, me he encontrado con la necesidad de crear varios mensajes HL7 basados en un solo mensaje entrante. Por lo general, toman la forma de un pedido o son el resultado de un laboratorio. Cada vez que he afrontado el reto, he intentado empezar de cero, con la convicción de que el intento anterior podría haberse hecho mejor.

Recientemente, volvió a surgir la necesidad y pude crear una solución de la que no me avergonzaba. Mi principal preocupación era que siempre me encontraría enterrado en un BPL, o usaría ObjectScript e intentaría editar mensajes usando el método SetValueAt para la clase de mensaje HL7.

Problema
Cuando el Sistema A procesa múltiples pedidos para un solo paciente, el resultado vendrá en un solo mensaje con ORCgrp repetido con los segmentos OBR y OBX contenidos en este. El sistema B solo puede recibir un único OBR por mensaje.

1
1 388
InterSystems Official Jose-Tomas Salvador · feb 22, 2023

Comenzando este año 2023, hemos programado una serie de cursos oficiales sobre InterSystems IRIS que iremos realizando a lo largo del año. Los cursos se impartirán on-line y ya están abiertos para que os podáis registrar si estáis interesados (hasta un máximo de 10 personas por curso, quorum mínimo 5 asistentes). Toda la información está disponible en nuestro sitio web: Formación en el aula virtual | InterSystems

0
0 118
Anuncio Alberto Fuentes · feb 16, 2023

Para todos aquellos que aún utilizáis el IDE Studio para programar con ObjectScript y vais a pasar por el proceso de migración a VS Code, ¿sabíais que hay una sección en la documentación de VS Code justo para vosotros? Echad un vistazo al apartado Migración desde Studio. Incluye los siguientes aspectos:

  • Edición del lado del servidor y control de código fuente
  • Proyectos de Studio
  • Importación de definiciones de servidor desde el Registro de Windows
  • Carga de fragmentos de código de Studio y colores de sintaxis

Y ahora hay una sección llamada Atajos de teclado, que muestra los atajos equivalentes en VS Code a los que estéis acostumbrados, para que las manos no tengan que dejar el teclado. En muchos casos el atajo es el mismo, por lo que no será necesario re-aprender. Y recordad, todos los atajos en VS Code son configurables por el usuario, por lo que tendréis un nivel de control que Studio nunca ofreció.

0
0 122
Artículo Jose-Tomas Salvador · ene 28, 2020 5m read

Hola Desarrolladores!

"objectscript.conn" :{
      "ns": "IRISAPP",
      "active": true,
      "docker-compose": {
        "service": "iris",
        "internalPort": 52773
      }

Quiero compartir con vosotros una estupenda nueva funcionalidad que he descubierto en la nueva versión 0.8 del plugin de VSCode ObjectScript desarrollado por @Dmitry.Maslennikovy CaretDev.

La versión viene con un nuevo parámetro de configuración: "docker-compose"; que resuelve el problema con los puertos que necesitas para conectar tu editor VSCode a IRIS. No era muy cómodo si tenías más de un contenedor docker con IRIS corriendo en la misma máquina. Ahora ¡esto está resuelto!

Veamos como funciona ahora...

1
0 216
Artículo Alberto Fuentes · mayo 6, 2021 4m read

¡Hola desarrolladores!

Supón que tienes una clase persistente con datos y quieres tener una interfaz de usuario Angular sencilla, para ver los datos y llevar a cabo operaciones CRUD.

En este artículo describíamos cómo desarrollar una interfaz de usuario Angular para InterSystems IRIS utilizando RESTForms2.

A continuación vamos a explicar cómo conseguir una interfaz de usuario Angular sencilla que permita realizar operaciones CRUD y ver automáticamente los datos de tu clase de InterSystems IRIS en menos de 5 minutos.

¡Vamos!

Necesitarás:

  1. InterSystems IRIS
  2. ZPM
  3. Los módulos RESTForms2 y RESTForms2-UI.

Utilizaré como ejemplo la clase Data.Countries que generé e importé a través de csvgen, utilizando este comando:

d ##class(community.csvgen).GenerateFromURL("https://raw.githubusercontent.com/datasciencedojo/datasets/master/WorldDBTables/CountryTable.csv",",","Data.Countries"

Para crear una interfaz de usuario Angular necesitamos exponer una API REST para esta clase, que dará servicio a las operaciones CRUD.

Vamos a utilizar el módulo restforms2 para esto. 

Este comando en dockerfile instala restforms2 en el contenedor IRIS:

zpm "install restforms2" \

Para añadir una API REST, necesitamos hacer que nuestra clase de ejemplo herede de Form.Adaptor:

Class Data.Countries Extends (%Library.Persistent, Form.Adaptor)

Añade los parámetros restforms2 a la clase persistente para gestionar el comportamiento general: ordenación, visualización, etc:

// Form name, not a global key so it can be anything
Parameter FORMNAME = "Countries";

/// Default permissions
/// Objects of this form can be Created, Read, Updated and Deleted
/// Redefine this parameter to change permissions for everyone
/// Redefine checkPermission method (see Form.Security) for this class 
/// to add custom security based on user/roles/etc.
Parameter OBJPERMISSIONS As %String = "CRUD";

/// Property used for basic information about the object
/// By default getObjectDisplayName method gets its value from it
Parameter DISPLAYPROPERTY As %String = "name";

Perfecto. A continuación, podemos utilizar la sintaxis de restforms2 para hacerle saber qué propiedades de la clase queremos exponer a la API CRUD. Puedes hacerlo añadiendo el atributo "DISPLAYNAME =" a las propiedades que quieras exponer en restforms2-ui. Por ejemplo:

Property code As %Library.String(MAXLEN = 250) [ SqlColumnNumber = 2 ];

Property name As %Library.String(DISPLAYNAME = "Name", MAXLEN = 250) [ SqlColumnNumber = 3 ];

Property continent As %Library.String(DISPLAYNAME = "Continent", MAXLEN = 250) [ SqlColumnNumber = 4 ];

Property region As %Library.String(DISPLAYNAME = "Region", MAXLEN = 250) [ SqlColumnNumber = 5 ];

Property surfacearea As %Library.Integer(DISPLAYNAME = "Surface Area", MAXVAL = 2147483647, MINVAL = -2147483648) [ SqlColumnNumber = 6, SqlFieldName = surface_area ];

Property independenceyear As %Library.Integer(DISPLAYNAME = "Independence Year", MAXVAL = 2147483647, MINVAL = -2147483648) [ SqlColumnNumber = 7, SqlFieldName = independence_year ];

¡Genial! Ahora vamos a introducir la capa de interfaz de usuario. Este comando en dockerfile instala restforms2-ui, que es la interfaz de usuario Angular para Restform2:

zpm "install restforms2-ui" \

¡Y ya está! Vamos a echarle un vistazo a la interfaz de usuario de nuestra clase de ejemplo, que puedes encontrar en la URL server:port/restforms2-ui:

RESTForms incluye las clases de prueba Person y Company, y se pueden utilizar para examinar las características de restfomsUI. Actualmente, puedes editar campos de cadenas de texto, numéricos, booleanos, de fecha y búsqueda.

Puedes probar todo esto en tu portátil, si clonas y construyes este repositorio:

docker-compose up -d --build

Y, a continuación, abres la URL:

localhost:port/restforms2-ui/index.html

o si usas VSCode, selecciona este elemento del menú:

¡Happy coding!

1
0 323
Artículo Alberto Fuentes · dic 14, 2022 1m read

Las rutinas con privilegios te permiten elevar los roles de un usuario mientras las utiliza. Estas rutinas con privilegios (Privileged Routine Application) pueden utilizarse con rutinas y también con clases / métodos.

Cuando las utilices, es importante asegurarse de incluir new $ROLES, antes de elevar los privilegios con AddRoles(). Por ejemplo:

new$ROLESset status=$System.Security.AddRoles("MyPrivilegedRoutineApplication")
0
0 142