viernes, 5 de agosto de 2011

Generar contador de registros automatico - VFP

Saludos estimados. Hay ocasiones en las que necesitamos generar un contador de registros automatico para nuestras aplicaciones tales como Facturadores, Pedidos, Notas de debito y muchas otras. Al decir "automatico" me refiero a dar un click en un boton "Nuevo registro" (por ejemplo) y que nos aparezca el numero concecutivo de registro en un control (text) de nuestro form. Asi ahorramos tiempo, evitamos errores en la numeracion y hacemos mas eficiente nuestra aplicacion. El generar un concecutivo no es mas que contar el numero de registros actual de la tabla al momento de ingresar uno nuevo [registro] y sumarle 1, el cual representa el registro en cuestion.


Para ilustar esto, tomaremos como supuesto que tenemos la tabla clientes, un campo [numerico] numreg (para almacenar el # de cada registro), un boton "Nuevo"  y un control "Text1".

Nota: el codigo esta dirigido solo a generar el concecutivo al ingresar un nuevo registro. Puede ser usado en culaquier otro evento de otro control! :)

En el evento Click del boton "Nuevo" escribiremos un codigo como este:


SELECT clientes
codreg = RECCOUNT()

THISFORM.Text1.Value = codreg + 1
THISFORM.Refresh


En el campo numreg almacenamos el numero de registro estableciendo la propiedad ControlSource del Text1 = clientes.numreg y almacenandolo a traves de la sintaxis de codigo mas conveniente.

Sugerencias y comentarios son siempre bienvenidos.
Un abrazo! Desde Managua, Nicaragua!
Ravenn! :)

12 comentarios:

  1. 897878/897878784848787998

    ResponderEliminar
    Respuestas
    1. vete a la verga perro

      Eliminar
    2. Gracias Dios por los $8,200 dolares americanos del mes pasado por saber foxpro en lugar de estar de culero escribiendo mierdas como "vete a la verga perro"! xD hahahahaha! Hijo de puta!

      Eliminar
  2. Compañero, esto no es tan funcional, pues sería solo para un sistema monousuario; ahora, otro asunto es que el consecutivo no sería tan real, pues si se eliminan registros de la tabla, entonces van a aparecer "huecos" en la numeración, por ejemplo en la facturación que no debe suceder. Con el conteo de registro no creo sea la forma más apropiada de manejar consecutivos,... solo mi opinión.
    Saludos.

    ResponderEliminar
  3. Saludos. Gracias por tu observacion Anonimo! :) Efectivamente distes en el clavo: mono usuario. :D Ahora, respecto a los huecos: es debatible, segun la caracteristica de la aplicacion y de como quiera llevar su registro concecutivo. Me comentaba un amigo programador que los concecutivos se le hacian un dolor de cabeza, puesto que el no tomaba en cuenta los registros eliminados y al generar un nuevo numero de registro, dejaba alteraciones en el concecutivo.

    Si daba de alta 10 registros y luego eliminaba 1, quedaban 9 disponibles y al generar el concecutivo, contaba solo los registros disponibles y el resultado volvia a ser 10, con lo cual, perdia la concecutividad de la numeracion. Entonces, le propusimos la solucion arriba detallada y resulto efectiva! Claro que no es la unica solucion. :) Si hay 10 registros y se elimina 1, el registro siguiente deberia ser 11. Si en la tabla se anula el registro 10, cuando genere el siguiente registro 11, por que no tomar en cuenta el registro marcado para eliminacion si su naturaleza y conceptualidad estan acorde con la concecutividad de los registros y permite la generacion normal y logica de la misma?

    Facturacion: Huecos? El registro eliminado debe tener una justificacion valida. Segun la legislacion nicaraguense (en nuestro caso especifico) en el ambito tributario, una factura por estar anulada no pierde su calidad de comprobante de transaccion realizada, incluso si fue anulada por una razon amparada en la ley y es objeto de examen auditable por la autoridad fiscalizadora, tanto en fisico como en el sistema. En el sistema se debe anular, pero el registro (marcado para eliminacion) debe permitir continuar con la concecutividad de los registros, tal el caso para el cual fue conceptualizado y creado.

    Claro esta, hay varias formas y mas eficaces para lograr tal cometido! :) Solo es una opcion que a algunos les ha servido!

    Saludos!
    Desde Managua, Nicaragua! :)
    Un abrazo!

    Gracias por consultar! XDXDXD

    ResponderEliminar
  4. Estoy de acuerdon con Ravenn, hay diferentes maneras de hacerlo, no debemos de limitarnos a uno solo, siempre y cuando den el mismo resultado todo es válido, para programar debemos probar muchos comandos a veces hasta podemos redundar pero si vemos que nos dan el mismo resultado que a como normalmente da, perfecto.. hemos descubierto una nueva forma de hacerlo... si al supongamos que el RECCOUNT() es = 9 y si le sumamos 1 el nuevo registro sera = a 10, tambien lo podemos hacer Select mitabla Set order to codigo, GO BOTTOM XCODIGO = CODIGO + 1, el resultado seguira siendo 10.

    ResponderEliminar
  5. Les puedo asegurar que el registro sigue siendo consecutivo al eliminar un registro, si tienes 10 eliminas 1 supuestamente quedan 9, con la solucion a esto de que siga el registro a 11, serial, en la tabla donde guardas tu registro consecutivo (tabla--->modify---->indexes----> y en tu index del codigo colocas esto en FILTER (.not. deleted() ), esto hace qué, cuando eliminas un registro, solo se oculta, obviamente con el comando SET DELETED ON en tu inicio de prg, saludos espero sea de ayuda

    ResponderEliminar
  6. Les puedo asegurar que el registro sigue siendo consecutivo al eliminar un registro, si tienes 10 eliminas 1 supuestamente quedan 9, con la solucion a esto de que siga el registro a 11, serial, en la tabla donde guardas tu registro consecutivo (tabla--->modify---->indexes----> y en tu index del codigo colocas esto en FILTER (.not. deleted() ), esto hace qué, cuando eliminas un registro, solo se oculta, obviamente con el comando SET DELETED ON en tu inicio de prg, saludos espero sea de ayuda

    ResponderEliminar
  7. Les puedo asegurar que el registro sigue siendo consecutivo al eliminar un registro, si tienes 10 eliminas 1 supuestamente quedan 9, con la solucion a esto de que siga el registro a 11, serial, en la tabla donde guardas tu registro consecutivo (tabla--->modify---->indexes----> y en tu index del codigo colocas esto en FILTER (.not. deleted() ), esto hace qué, cuando eliminas un registro, solo se oculta, obviamente con el comando SET DELETED ON en tu inicio de prg, saludos espero sea de ayuda

    ResponderEliminar
  8. FUNCIONA BIEN PORQUE AUNQUE ELIMINES UN REGISTRO SOLO AUMENTA AL CODREG , O SEA LE SUMA 1 AL CONTADOR.
    SI ELIMINA UN REGISTRO , ESE NRO REGISTRO ES INDEPENDIENTE DEL CODREG.
    POR FAVOR QUE NO OPINEN LOS MALEDUCADOS QUE NO SABEN.

    ResponderEliminar
  9. Yo lo haría ,la tabla principal al campo codigo por decir tabla1
    Y haría un select * from tabla1 into
    Cursor xtabla1 de Ahy tomaría el consecutivo y lo guardo con un replace ala tabla original que es la tabla1,no tendría problemas de eliminación de datos,y me sumaria el correlativo sin problemas
    Ejemplos
    Tabla1
    Campo codigo
    ,.......................
    Select * from tabla1 into cursor xtabla1
    Donde xtabla1.codigo seria
    Le pondría un reccount() +1
    Select xtabla1
    Conde=reccount()+1
    Ahora actualizo la tabla original con el nuevo valor
    Replace o upodate usaré el
    Replace tabla1.codigo with code

    Aquí ya no habrá problemas de borrado ni registros huecos ala hora de eliminación en la tabla1,para que trabaje en red, esto que se ejecute solo al momento de guardar ,cosa que en la red usa este mecanismo el que primero entre a gravar el primero en salí y así en orden

    ResponderEliminar