Error en campo formula numerica con puntero virtual


([N3] blanyi) #1

Hola buenos días.

Acudo a ustedes nuevamente debido a que se me presenta una situación que paso a comentar.

Tengo dos tablas, la una es la maestra, la tabla CREDITOS (Ver estructura en el archivo “Estructura de la Tabla CREDITOS.pdf”) y la otra es la hija o el detalle de la anterior, es CREDITOS_DT (Ver estructura en el archivo “Estructura de la Tabla CREDITOS_DT.pdf”). En Creditos_Dt tengo un indice de Clave Única como muestra el archivo “Indice CUOTAS_PAG.JPG” en el que se incluyen los registros que cumplan la condición de tener un saldo menor que uno.

En la tabla maestra CREDITOS he creado un campo puntero virtual con enlace Singular del Plural por Posición llamado CUOTAS_PAG tal como lo muestra la imagen “Definicion Cuotas_Pag y Cuotas_Faltan.jpg” que apunta al indice Cuotas_Pag de la tabla Creditos_Dt.

En la misma tabla CREDITOS también tango un campo tipo formula numérica llamado CUOTAS_FALTAN (ver imagen “Definicion Cuotas_Pag y Cuotas_Faltan.jpg” cuya formula es (#NUM_CUOTAS-#CUOTAS_PAG.NUMERO_CUOTA). Como se puede ver en la formula interviene el campo puntero virtual CUOTAS_PAG.NUMERO_CUOTA. El campo NUMERO_CUOTA se puede comprobar que existe mirando la estructura de la tabla creditos_dt.

El problema que tengo es que al iniciar el programa, ejecutar algunos procesos o mostrar una rejilla en la que se incluya el campo formula númeric CUOTAS_FALTAN el programa se vuelve muy lento y en los mensajes del administrador genera una lista de 10774 líneas con el siguiente mensaje de error:

Error: Campo inexistente CUOTAS_PAG.NUMERO_CUOTA

Ambas tablas son con persistencia en disco.

Agradezco si alguien me puede ayudar explicando porque se produce el error y como corregirlo.

YIMY MORA ACONCHA

Estructura-de-la-Tabla-CREDITOS.pdf (33.7 KB)

Estructura-de-la-Tabla-CREDITOS_DT.pdf (32.4 KB)




([N3] blanyi) #2

Buenos días.

Les recuerdo esta inquietud por si a alguien más le ha pasado y me puede ayudar.

Aclaro que la lentitud es al momento de arrancar el programa, no es mostrando rejilla ni ninguna otra cosa, es cuando aun no se muestra nada.

Gracias.
YIMY MORA ACONCHA


([N3] pacosatu) #3

Hola YIMY.

Tendrás que depurar el código para ver en qué línea se produce el primer Error: Campo inexistente CUOTAS_PAG.NUMERO_CUOTA.
Consulta a Soporte qué significa ese error y en qué contextos se puede producir dicho error.

Ten en cuenta que los Punteros Virtuales son igual de “maravillosos” que de “asquerosos”.

Saludos
Paco Satué


([N4] Infortic) #4

A mi también me aparecen hoy miles de errores de Error: Campo inexistente XXXXXX

De momento no encuentro el fallo, debe de ser alguna propiedad que se ha quedado cargada y que ahora no se usa o algo, porque no la encuentro…


([N2] ramiro) #5

Buenas tardes:

Uno de los motivos de que aparezcan mensajes del tipo “Campo inexistente xxxx” puede ser el siguiente:

Imaginemos un campo que en un momento determinado fuese de tipo formula siendo el valor de dicha fórmula ( #CAMPO1 - #CAMPO2 ). Posteriormente cambiamos el tipo de campo y lo hacemos, por ejemplo, numérico. Aunque ya no lo veamos, internamente conservará el valor de la fórmula (basta con volver a definirlo como fórmula para encontrar ese tipo de información)

Posteriormente eliminamos uno de los campos que intervenían en una fórmula que ya no usamos y que el editor tampoco nos muestra.

En esas condiciones, o algo bastante parecido a esto, el mensaje indicando que no existe un campo que no usamos y que no vemos, comenzará a aparecer en el Servidor o en la barra de mensajes, volviéndonos locos.

Avisé de esto a soporte hará tal vez 10 versiones, sino más, pero ahí sigue.

Bastaría con que al grabar el proyecto, el editor eliminase las propiedades que no sean relevantes al tipo de objeto finalmente elegido, pero no lo hace, dejando basura en el proyecto. Pero basura que da guerra. Es lo que hay…

Saludos. Ramiro


([N4] Infortic) #6

Si, es lo que pensaba, porque no encuentro la referencia a ese campo, alguna propiedad oculta me la está jugando. En fin, seguiré buscando.

Gracias.


([N3] blanyi) #7

Buenos días.

Ramiro lo que usted explica no es mi caso, tengo la formula y no he eliminado ni cambiado ninguno de los campos que intervienen en ella.

Ya encontré lo que sucede. El puntero singular del plural por posición que he creado no siempre tiene a donde apuntar, si el cliente no tiene pagos no va a tener registros a los que hacer referencia, así que al pretender usar #CUOTAS_PAG.NUMERO_CUOTA logicamente no encuentra nada (porque no hay pagos) el programa genera el error de que campo no existe.

Cómo controlar eso para que no genere esa lista interminable de mensajes de “campo no existe” en el vadmin es lo que aun no tengo muy claro, pero yo o resolví de la siguiente manera.

La formula que tenía para calcular el número de cuotas restantes (#NUM_CUOTAS-#CUOTAS_PAG.NUMERO_CUOTA) la cambié por una función quedando la formula así:

fun:CAL_CUO_FAL@CrediPresDB.dat(#NUM_CUOTAS,#ID)

Como puede verse a la función le paso dos parametros, el número de cuotas total y el número del contrato (#ID) y en la función lo que hago es cargar el contrato, luego cargar los plurales de cuotas pagadas y asiganar a una variable NUM_CUO_PAG el valor de sysListSize, de tal forma que si hay pagos de devolverá el número de pagos realizados y si no pues devolverá cero.

Finalmente calculo el número e cuotas faltantes con la formula (TOT_CUOT-NUM_CUO_PAG) y este valor es que la funció retorna.

No me parece muy eficiente pero es la manera en que he podido corregir el error.

Adjunto imagen con la definición de la función para mayor detalle.

Gracias a todos y a Soporte.

YIMY MORA ACONCHA



([N2] Mgalvezh) #8

Y esa es la solución que te ha dado en soporte ? o es idea tuya ?.


([N3] blanyi) #9

Hola Mgalvezh.

Soporte solo me dijo que debería cambiar la formula por una función. Así que la solución fue mía.

YIMY MORA ACONCHA


([N3] pacosatu) #10

Hola YIMY.

Pues no has solucionado el problema original.
En realidad lo que has hecho es NO usar el Puntero Virtual y recurrir a la solución clásica de ejecutar la función o lo que es lo mismo, poner en práctica el dichoso prueba y error.

Habrá que saber porqué no está controlado ese error o aplicar alguna forma de controlarlo, de lo contrario es un Bug que tienen que documentar y arreglar.

Yo uso los Punteros Virtuales “Hermano contiguo” y no se produce ese error cuando accedo al Puntero Virtual en el primer registro y último del Índice. En esas posiciones el Puntero Virtual “Hermano contiguo” no apunta a nada y la fórmula no genera error.

La pregunta a soporte es: ¿ Qué valor toma un Puntero Virtual cuando no apunta a nada ? --> Valor Nulo, Cero, NAN, …

Tu fórmula ¿se podría arreglar con la siguiente expresión? -> choose(#CUOTAS_PAG, #NUM_CUOTAS - #CUOTAS_PAG.NUMERO_CUOTA, 0)

Otro tema muy diferente es la lentitud de tu aplicación debido al uso de Punteros Virtuales en Interface o recorriendo Listas.

Saludos
Paco Satué


([N3] blanyi) #11

Hola Paco, buenos días.

Efectivamente como lo dije en mi comentario anterior estoy conciente de que la solución no es la más optima, pero de momento fue lo que se me ocurrio. Tienes razón al decir que he dejado de usar el puntero, porque en la formula ya no lo tengo en cuenta.

Yo he pensado que es una falla que tiene Velneo al usar un campo puntero singular del plural por posición (no lo he probado en los otros tipos de punteros) dentro de un campo formula, porque cuando hago referencia al puntero en una rejilla o en cualquier otro control no hay problema, si el puntero no apunta a nada presenta el espacio en blanco, el error se presenta en la tabla, más concretamente en el campo formula que hace referencia al puntero.

En cuanto a tu pregunta:

Tu fórmula ¿se podría arreglar con la siguiente expresión? -> choose(#CUOTAS_PAG, #NUM_CUOTAS – #CUOTAS_PAG.NUMERO_CUOTA, 0)

Pues te comento que antes de crear la función probé cambiando la formula con la siguiente expresión:
(#NUM_CUOTAS-choose(#CUOTAS_PAG.NUMERO_CUOTA:isEmpty(), 0, #CUOTAS_PAG.NUMERO_CUOTA))

Pero tampoca da resultado, el error se sigue presentando

Este caso lo expuse a soporte y queda la sencación de que su ayuda fue poca, no me dieron una solución clara en cuanto al problema y no me dijeron como controlar la situación cuando el puntero no tiene a donde apuntar, como lo dije anteriormente lo que dijeron es que cambiara la formula por una función.

Te aclaro que la lentitud no se me presenta cuando muestro los datos en la rejilla o los exporto a excel, la lentitud se presenta al iniciar la aplicación cuando hago los cambios en la tabla, en el campo formula. A mi parecer, al regenerar la tabla (la estructura y los indices), es cuando se presenta el retardo. Ver imagen “Msg Erro Campo No Existe.jpg”.

Cordial Saludo.

YIMY MORA ACONCHA