Hola a todos,
Les cuento lo que he estado realizando, se tienen unos analizadores de gases que generan muestras y via TCP envían mensajes HL7 a un servidor Mirth. En el servidor tengo un canal que cuenta con una transformada en su destino, para la escritura a una base de datos de parámetros OBX seleccionados (las muestras son variables en sus segmentos OBX). La versión del Mirth que utilizo es:
Mirth Connect Server 3.8.1
Built on September 12, 2019
Java version: 1.8.0_181
La creación de las variables es de acuerdo al siguiente código:
var _x = Lists.list(); var _OV = Lists.list(); var _Units = Lists.list(); var _RefMin = Lists.list(); var _RefMax = Lists.list(); for (var i = 0; i < getArrayOrXmlLength(msg['OBX']); i++) { var mapping; try { mapping = msg['OBX'][i]['OBX.3']['OBX.3.4'].toString(); } catch (e) { logger.error(e); mapping = ''; } _x.add(validate(mapping, '', new Array())); var mapping; try { mapping = msg['OBX'][i]['OBX.5']['OBX.5.1'].toString(); } catch (e) { logger.error(e); mapping = ''; } _OV.add(validate(mapping, '', new Array())); var mapping; try { mapping = msg['OBX'][i]['OBX.6']['OBX.6.1'].toString(); } catch (e) { logger.error(e); mapping = ''; } _Units.add(validate(mapping, '', new Array())); var mapping; try { mapping = msg['OBX'][i]['OBX.7']['OBX.7.1'].toString(); } catch (e) { logger.error(e); mapping = ''; } _RefMin.add(validate(mapping, '', new Array())); var mapping; try { mapping = msg['OBX'][i]['OBX.7']['OBX.7.2'].toString(); } catch (e) { logger.error(e); mapping = ''; } _RefMax.add(validate(mapping, '', new Array())); } globalChannelMap.put('x', _x.toArray()); globalChannelMap.put('OV', _OV.toArray()); globalChannelMap.put('Units', _Units.toArray()); globalChannelMap.put('RefMin', _RefMin.toArray()); globalChannelMap.put('RefMax', _RefMax.toArray());
La escritura a la base de datos está de acuerdo al siguiente script:
var dbConn;
try {
dbConn = DatabaseConnectionFactory.createDatabaseConnection ('org.postgresql.Driver','jdbcostgresql://localhost:5432/production','postgres','postgres').getConnection() ;
var ps = dbConn.prepareStatement("INSERT INTO sample (Variable, ValorObservado, Unidades, ReferenciaMin, ReferenciaMax) VALUES (?,?,?,?,?)");
ps.setString(1,$('x'));
ps.setString(2,$('xOV'));
ps.setString(3,$('xUnits'));
ps.setString(4,$('RefMin'));
ps.setString(5,$('RefMax'));
ps.executeUpdate();
} finally {
if (dbConn)
try { dbConn.close(); } catch(e) {}
}
Mi problema es que se los campos OBX se unen cada una de las variables como un arreglo y al escribirlos a la BD se tiene un error:
[Ljava.lang.Object;@.(#)
Que he tratado de solventar con distintos tipos de códigos pero no he logrado desaparacer.
El código de escritura es para una base de datos en Postgres y también lo estaría aplicando para una en MySQL.
Me podrían ayudar con nuevas ideas para este tema?
Agradeciendo sus aportes.
Saludos
Hola.
Por lo que veo estás tratando de insertar en base de datos un conjunto de arrays en las columnas
Variable, ValorObservado, Unidades, ReferenciaMin, ReferenciaMax
¿Son estas columnas de tipo array también?. Si no es así, y en realidad lo que deseas hacer es insertar cada conjunto de valores de los arrays en una fila independiente de la base de datos, tendrás que realizar una inserción por cada fila.
Hola Nikkator,
Muchas gracias, estás totalmente en lo correcto. Las columnas no son del tipo array sino que son integer. Lo que me ha pasado es que no he podido hacer ese loop para llamar directamente cada elemento y escribirlo en la base de datos. ¿Me podrías dar una ayuda para saber cómo estructurar ese código?
Saludos,
Lo que debes hacer es incluir el código de inserción en base de datos dentro de un bucle que itere una vez por cada valor existente dentro de uno de los arrays, ya que todos los arrays deberían tener el mismo tamaño. Para la iteración, puedes usar la misma variable como índice de todos los arrays.
Hola Nikkator,
Me he pasado estos días intentanto completar un código para hacer esa inserción de los datos de forma ordenada, pero ninguno me funciona adecuadamente. He encontrado varias funciones (aunque no sé si serán adecuadas) como Arrays.toString, pero nada. ¿Tú tendrás una línea que pueda utilizar como referencia para analizar su estructura y así poderla adaptar a la tabla que necesito exportar?
Muchas gracias por la asistencia.
Saludos,
Hola @corellana,
gracias por participar en nuestro foro.
Estoy leyéndome el hilo y la respuesta de Nikkator parece dar en la clave, no puedes insertar los arrays (arreglos) directamente sino que tienes que escribir un bucle que los recorra e inserte una fila en la tabla con cada iteración. Es decir, tantos INSERT como filas quieras insertar. Escribiendo un pseudoejemplo rápido es algo como:
// recorremos los arrays
for(int i; i< longitudDelArray; i++){
a = array1[i];
b = array2[i];
c = array3[i];
//...
// Aquí el código que corresponda para insertar un conjunto
// de valores en una fila de la tabla
// ...
// INSERT INTO (columnaA,columnaB,columnaC, ...) VALUES (a,b,c, ...)
// ...
}
Teniendo cuidado con cosas como la longitud de los arrays como bien indica Nikkator.
A partir de aquí, la pregunta se sale de lo que es NextGen Mirth Connect y se mete en una cuestión de programación general que se sale del objetivo del foro. Para que el foro mantenga su utilidad para los usuarios, propongo dejar la cuestión en este punto.
Por supuesto, si tienes cualquier pregunta concreta sobre estándares de salud o Mirth Connect, nos encantará verla publicada en el foro y haremos lo posible por ayudarte.
Gracias y un cordial saludo