Crear un contador alternativo.


([N1] sostaco) #1

Cuando creo una ficha, el campo Codigo aumenta automaticamente, y luego, aunque elimine esa ficha, al crear otra nueva, comienza desde donde estaba, y no desde la siguiente vacia. Es decir, si tengo 10 fichas, elimino una y creo otra, la nueva ficha tendria el codigo 11, en lugar del 10.

Estoy intentando hacer un contador alternativo, que aumente cuando cree fichas nuevas, y disminuya cuando las de de baja. El problema que tengo es que parece que no se actualiza como deberia.

En la tabla, he creado un campo numerico NCliente y creo una actualizacion anterior a un alta. Con estas lineas.

Cargar Lista ( Clientes, ID)
-Seleccionar ficha por posicion (1)
-Modificar ficha seleccionada
–Modificar campo ( #NCliente, ~#NCliente+1)
–Set dato de Retorno(#Ncliente)

El problema es que cuando creo una ficha nueva, en el formulario aparece siempre 0, y una vez creada, el valor de NCliente sigue siendo 0.

¿¿ Que es lo que estoy haciendo mal ??


([N1] ebarbeito) #2

Hola,

La idea de numerar correlativamente las fichas de una tabla sin que haya huecos decir que te será posible siempre y cuando los borrados sean de la última ficha de la tabla, pero en el momento que hayan borrados por en medio tendrás que utilizar un proceso auxiliar que te recorra secuencialmente todas las fichas y ajuste la correlación que buscas. Necesitarás un campo numérico “CONT” y un índice de clave única para este campo. La idea de este proceso auxiliar es obtener la lista de todas las fichas ordenadas por este índice “CONT” y de manera inversa obtener el número de fichas (sysListSize), éste será valor que le darás al campo CONT de la primera ficha en tu lista, de manera que decrementes ese valor y vayas reasignando el valor decrementado al campo CONT de todas las fichas.

Para mantener el contador podrías utilizar estas líneas en el trigger previo al alta (adjunto imagen)

Es una idea para mantener un contador como creo haber entendido que quieres. Hay otras soluciones como usar una tabla de contadores. Esta opción es buena para cuando necesitas llevar distintos contadores por agrupaciones y/o por tablas independientes (por ejemplo una tabla de contadores de pedidos/albaranes/facturas por series. En la vGestión hay un buen ejemplo de esto)

Un saludo


Enrique Barbeito García (@enriquebarbeito en twitter)
Mis demos en vatp://demo:@v7cloud3.velneo.com:7288 [attachment=25748,2004]




([N1] sostaco) #3

Lo acabo de probar, y funcionar funciona bien. Sin embargo, al utilizar un trigger anterior a alta de ficha, el valor del contador no aumenta.

Pensaba que el campo se actualizaria antes de hacer el alta. Y si el codigo CONT valiese 5, al hacer una nueva alta, el valor de CONT valdra 6 (5+1), sin embargo, el campo edicion CONT ( edicion numerica ) se queda siempre en 0


([N1] ebarbeito) #4

Hola,

Debería funcionar en un trigger anterior a un alta (el código es sencillo pero no sé lo acabo de probar y funciona). La idea de este contador es que sea automático y que el usuario no le de valor. Cuando el usuario acepta un formulario de alta el campo CONT vale cero, y puede ocurrir que:

  1. La tabla esté vacía. En este caso sysListSize valdrá cero, no podrá leer ninguna ficha seleccionada y el valor del campo #CONT será 1 (0+1)
  2. La tabla no está vacía. En este caso todas las fichas tendrán un valor en su campo #CONT (podrá ser cualquier valor, incluso cero). La lista cargada se realiza por un índice para el campo CONT, por lo que obtienes la lista de fichas ordenada ascendentemente por dicho campo. Al seleccionar la última, ya obtienes el último valor del contador (sea cual sea, incluso valdría si se aceptaran valores repetidos). El valor del campo #CONT quedará como el último valor del contador más 1 (CONT+1)

Pero esta solución ignora cualquier valor que el usuario añada al campo CONT. Su valor preinicial es indiferente porque se decide justo previo al alta de la ficha automáticamente.

Saludos


Enrique Barbeito García (@enriquebarbeito en twitter)
Mis demos en vatp://demo:@v7cloud3.velneo.com:7288


([N1] ebarbeito) #5

Una cosa. Cuando digo que el valor del campo #CONT podrá ser cualquiera incluso cero lo digo porque podría ocurrir que el usuario utilizara la funcionalidad de “Modificar campo” y dejar ese campo en cero en alguna de las fichas. Pero en principio #CONT tendrá siempre un valor mayor de cero.

Si tuvieras cuatro registros de este modo:
NAME CONT

F1 1
F2 2
F3 3
F4 0

Al añadir un quinto, su contador quedaría en 4.

Saludos


Enrique Barbeito García (@enriquebarbeito en twitter)
Mis demos en vatp://demo:@v7cloud3.velneo.com:7288


([N4] mperez) #6

El caso que comentas es bastante habitual en algunas aplicaciones, por qjemplo sucede algo parecido con el numero de apunte

¿Pero por qué deseas que el número de lineas te lo realice en el acto?

Siempre es mucho mas sencillo una opción de renumerar lineas, que puede ser manual o automatica al dar por buena la cabecera.

Desconozco tu aplicación, pero teniendo en cuenta que el campo código, ya es el que te identifica univocamente a cada registro en Velneo, y que es el que Velneo va a utilizar para los enlaces y de forma automática ¿Es realmente importante que el atributo linea se actualice en ese mismo momento?

Bueno, es lo primero que pensé al ver tu post, aunque indiscutiblemente si lo deseas hacer así, es posible como te comenta Enrique.


([N1] sostaco) #7

ebarbeito, hay una cosa que no tengo clara del todo, en un formulario tengo un campo enlazado a #CONT, y siempre esta a 0, aunque luego al crear la ficha nueva, en la rejilla el valor de CONT si que es el correcto.

Si #CONT se actualiza antes del alta…¿¿ porque el campo CONT al dar de alta una nueva ficha esta a 0?? No deberia aparecer en el campo #CONT el valor “CONT + 1” al hacer una nueva alta??

mperez crear un contador alternativo por varias razones, una de ellas es la que expongo arriba, si creo un cliente, pongamos por ejemplo el 100, lo borro y creo uno nuevo, este nuevo cliente seria el 101, y esto es una cosa que no queria que ocurriera. Otra es porque lei por aqui, que el campo codigo, es un contador, pero era mas para uso interno del programa que no era recomendable modificarlo ni trabajar con el.

Otro detalle del que acabo de darme cuenta, es que da igual si edito yo el campo CONT, el valor que tenga una vez haga el alta, va a ser siempre el de CONT+1.

Quiero decir, si borro la ficha 2, y creo una nueva, y pongo en el campo CONT el valor 2, una vez finalizada el alta sera siempre CONT+1, si hubiera 100 fichas, el valor de cont seria 101, en lugar de 2, que es el valor que yo le asigne


([N1] ebarbeito) #8

Hay que tener en cuenta que el código que mantiene el contador se ejecuta como parte del trigger previo al alta. Cuando abres un formulario para dar de alta una nueva ficha no quiere decir que se realice el alta en ese momento. El alta no se realizará hasta que no se ejecute el comando “Aceptar” (normalmente un “botón Aceptar” que ejecuta tal comando, pero también puede ser llamado desde un evento, o al llamar al comando de proceso “Alta de ficha”). Es análogo al comportamiento que sucede con el campo código cuando es siguiente al último. Al abrir un formulario o crear una nueva ficha en memoria (mediante proceso) el #ID de esa “prenueva” ficha es 0, y hasta que no se realice el alta no se decide (a nivel interno) cuál será su valor.

El campo #CONT en tu formulario debería ser sólo lectura o no ser mostrado ya que el valor no lo decide el usuario. Es un contador automático, si lo quisieras manual entonces sí tendría que ser el ususario quien lo modifique (y no hacerlo en el trigger previo al alta). Tu necesidad era disponer de un contador alternativo (y automático entendí) donde, a fin de cuentas, puedas decidir cuál será el último valor siguiente. Con #ID no puedes hacerlo, pues #ID va siempre siguiente al último. Con el #CONT usado tal como indico consigues un “#id” donde decides (previo al alta) cuál será el siguiente último valor.

Si lo que quieres es lidiar con los huecos que puedan quedar (cuando borres fichas desde la primera hasta la penúltima aparecerán “huecos”) entonces lo que necesitas es un proceso que reenumere (reajuste) el contador.

Espero que se entienda un poco mejor, sino ya sabes :slight_smile:

Saludos


Enrique Barbeito García (@enriquebarbeito en twitter)
Mis demos en vatp://demo:@v7cloud3.velneo.com:7288