JavaScript: readRegister() con clave no primaria no lee registro


([N2] pnogueira) #1

Muy buenas.

Haciendo pruebas he comprobado que usando ‘readRegister()’ con una clave que no es primaria nunca encuentra el registro (o bien la lectura de los campos no funciona). Sin embargo usando ‘load’ y ‘readAt( 0 )’ usando una lista de la misma tabla sí funciona.

Código usado:

regArt.readRegister( “REG”, [li_ref], VRegister.SearchThis );
li_art = regArt.fieldToInt( “ID” );
if ( li_art ) {
Log( "LOCALIZADO el artículo " + li_ref, li_ref );
} else {
Log( "NO se ha encontrado el artículo " + li_ref, li_ref );
};

¿Alguien más ha notado este comportamiento? ¿Hay algo que estoy pasando por alto?


([N4] sergioinfortic) #2

Hola.

Según la documentación:

El modo “SearchThis”, “SearchThisOrNext” y “SearchThisOrPrev” sólo son operativos correctamente con índices de tipo clave única, un índice de tipo Acepta repetidas, por ejemplo, no puede devolver un único registro para un valor dado en el índice.

Puedes verlo en:

https://doc.velneo.es/vregister.html#readregister


([N3] pacosatu) #3

Hola pnogueira.

La función readRegister() es algo confusa debido a la dificultad crónica que tiene Velneo para documentar correctamente.

Se supone que vas a usar la función readRegister() para localizar un registro concreto mediante un atributo que sabes con certeza que es único, como el ID, REF, NIF, … Por lo tanto usarás siempre un Índice de Clave Única con el parámetro VRegister.SearchThis para indicar que solo deseas devolver este registro en caso de que exista.

Conclusión, usa esta función exclusivamente para cargar Registros que sean únicos en la tabla. La función devuelve True si existe el registro y False en caso contrario.

Saludos
Paco Satué


([N2] pnogueira) #4

Hola Sergio, Paco.

La clave que estoy usando sí es única, lo que no es es primaria.
Debería haberlo aclarado en mi post, disculpas.

Gracias por vuestras respuestas.


([N4] sergioinfortic) #5

Hola.

Entonces, “debería” funcionar, aunque nunca se sabe, jejeje.

¿puede ser un problema de tipado?

¿REG es un string? puedes probar c li_ref.toString()


([N2] pnogueira) #6

Hola Sergio.

He cambiado el código para probar esto. He tenido en cuenta que la función devuelve un booleano y compruebo eso también. Inicialmente lo hacía así, pero como no me funcionaba pensé que a lo mejor la documentación estaba errada.

if ( regArt.readRegister( "REG", [li_ref.toString()], VRegister.SearchThis ) ) {
        li_art = regArt.fieldToInt( "ID" );
	Log( "LOCALIZADO el artículo " + li_ref, li_ref );
} else {
	Log( "NO se ha encontrado el artículo " + li_ref, li_ref );
};

REG” es de tipo Alfa 64

Sigue fallando.

(No hagáis mucho caso a los parámetros de Log(), es un sistema que estoy probando para registrar mensajes en la aplicación.)

Tampoco me voy a pelear mucho con esto, si con ‘load()’ funciona me vale, pero prefería que el código fuese más eficiente (y lógico :slight_smile: ).

Gracias de nuevo.


([N4] sergioinfortic) #7

Ok, no sé cual será el problema, yo lo tengo así en algunos sitios con claves no primarias pero únicas y sí me que me funciona, no tengo claro que puede pasar en tu caso sorry.

Doy por supuesto que regArt está declarado y con el setTable puesto ¿no?

Es por buscarle una explicación y reportarlo si falla en algún caso concreto, que no se tire otro horas probando lo mismo sin funcionar.


([N2] pnogueira) #8

Sí, en principio las variables deberían estar bien inicializadas. (De hecho si no tampoco funcionaría con load() entiendo).

Pongo un trozo del código que uso más completo:

var tblArt = "velneo_verp_2_dat/ART_M";
var regArt = new VRegister( theRoot );

regArt.setTable( tblArt );

{...}

if ( li_ref ) {
	if ( regArt.readRegister( "REG", [li_ref.toString()], VRegister.SearchThis ) ) {
		li_art = regArt.fieldToInt( "ID" );
		Log( "LOCALIZADO el artículo "  + li_ref, li_ref );
	} else {
		Log( "NO se ha encontrado el artículo "  + li_ref, li_ref );
	};
	
	Log( "TEST: regArt.ID = " + regArt.fieldToString( "ID" ), li_art );
};

Igual es que estoy yo ya muy obcecado con este código después de darle mil vueltas y hay algún error obvio que se me ha pasado por alto.


([N4] sergioinfortic) #9

La verdad es que no veo nada raro.

Si el índice REG es de un sólo componente y único, yo lo tengo así en algunos sitios sin problemas.

Deberías consultarlo con soporte por si hay algún problema en el método.


([N3] pacosatu) #10

Hola pnogueira.

Dices:

“en principio las variables deberían estar bien inicializadas. (De hecho si no tampoco funcionaría con load() entiendo)”

Vamos a ver, NO tiene nada que ver. Un load() es como un Cargar lista, devuelve Listas de 0 a N registros y readRegister(), cuando usas VRegister.SearchThis, solo es capaz de devolver 0 o 1 registro desde un Índice Único.

En lugar de darle tantas vueltas ¿NO sería más fácil “testear” tu código poniendo un literal en lugar de la expresión li_ref.toString()?

Por ejemplo: regArt.readRegister( “REG”, [“REF_0001”], VRegister.SearchThis siendo “REF_0001” un valor único del Índice REG

Saludos
Paco Satué


([N2] pnogueira) #11

Hola Paco.

Sí, entiendo que load() y readRegister() no son lo mismo. A lo que me refiero es a que con load( "REF", [valor] ) sí me encuentra el registro que existe, mientras que con readRegister( "REG", [valor], VRegister.SearchThis ) ) no lo hace, siendo “REF” una clave única y de un sólo componente.

En todo caso, he probado a usar un literal que sí existe en la base de datos (gracias por la sugerencia) y sigue sin encontrarlo. Por si acaso, he probado el mismo código pero usando “ID” (clave primaria) y el literal correspondiente a la misma entrada de la tabla, y sí que funciona. También he probado con otra clave única distinta a la anterior y resulta que esta también funciona.

Por simplificar, he creado este script completo que reproduce el supuesto bug:

var tblArt = "velneo_verp_2_dat/ART_M";
var regArt = new VRegister( theRoot );
regArt.setTable( tblArt );

var li_ref = "TK-6U9-5LM";
var li_codbar = "TEST-000777";

if ( regArt.readRegister( "REG", [li_ref], VRegister.SearchThis ) ) {
	li_art = regArt.fieldToInt( "ID" );
	alert( "LOCALIZADO el artículo por REF " + li_ref + "\nID: " + li_art );
} else {
	alert( "NO se ha encontrado el artículo por REF: " + li_ref );
};

if ( regArt.readRegister( "COD_BAR", [li_codbar], VRegister.SearchThis ) ) {
	li_art = regArt.fieldToInt( "ID" );
	alert( "LOCALIZADO el artículo por COD_BAR " + li_codbar + "\nID: " + li_art );
} else {
	alert( "NO se ha encontrado el artículo por COD_BAR: " + li_codbar );
};

La única diferencia que veo entre “REF” y “COD_BAR” es que el primero es Alfa 64 y el segundo Alfa 256.

Voy a crear una tabla desde cero y volver a probar este código a ver si consigo reproducir el error e informar a soporte.

Gracias a ambos por vuestras respuestas.
Un saludo.


([N2] pnogueira) #12

Nada, ya he encontrado dónde está el fallo. Resulta que soy medio lerdo (por decirlo suavemente), y todo el rato estaba usando “REG” cuando debería haber usado "REF"

En fin, corramos un tupido velo. Muchas gracias de nuevo por vuestras respuestas, y siento haberos hecho perder el tiempo. :sweat:

Un saludo.

P.D.: Y sí, en load() sí estaba usando “REF” correctamente… :crazy_face:


([N3] pacosatu) #13

Hola pnogueira.

De perder tiempo en absoluto. Estos son los Hilos que se te quedan grabados a fuego de por vida.

Seguro que a más de uno le habrá servido para entender el gran valor añadido que tenemos con Velneo nativo y su potentísimo “Inspector de errores”.

Y gracias por reconocer el error y publicarlo porque otros lo hubieran dejado tal cual y el resto del foro sin saber a qué se debía el fallo.

Saludos
Paco Satué