Escritura de campos...
 
Avisos
Vaciar todo

Escritura de campos OBX variables a una Base de Datos  

  RSS

(@corellana)
Miembro Activo
Registrado: hace 3 semanas
Mensajes: 4
17 julio, 2020 13:57  

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

 


Cita
Nikkator
(@nsoria)
Miembro Moderator
Registrado: hace 5 años
Mensajes: 52
20 julio, 2020 10:13  

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.


ResponderCita
(@corellana)
Miembro Activo
Registrado: hace 3 semanas
Mensajes: 4
21 julio, 2020 17:06  

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,


ResponderCita
Nikkator
(@nsoria)
Miembro Moderator
Registrado: hace 5 años
Mensajes: 52
22 julio, 2020 09:24  

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.


ResponderCita
(@corellana)
Miembro Activo
Registrado: hace 3 semanas
Mensajes: 4
23 julio, 2020 23:01  

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,


ResponderCita
(@pmtorres)
Miembro Admin
Registrado: hace 7 años
Mensajes: 19
24 julio, 2020 11:31  

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


ResponderCita
(@corellana)
Miembro Activo
Registrado: hace 3 semanas
Mensajes: 4
24 julio, 2020 17:01  

Hola @pmtorres @nsoria

 

Muy amables por sus indicaciones, he estado en eso mismo un buen tiempo.  Estoy totalmente de acuerdo en dejar el tema hasta acá.  Igual el código que me compartió Pedro me da una guía.  

 

Muchas gracias por su ayuda.

 

Saludos.


ResponderCita
Share:
caduceusadminForum