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?
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.
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.
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 ).
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.
“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
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.
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.
Un saludo.
P.D.: Y sí, en load() sí estaba usando “REF” correctamente…