21 de marzo de 2005

Números consecutivos para nuestras tablas

Muchas veces necesitamos crear números consecutivos para nuestras tablas, como ser Números de Facturas, Albaranes, Remitos, Clientes, Ordenes, etc. Una forma de hacerlo es tener una tabla con los últimos números generados, y una función que genere el siguiente número consecutivo para cada una de nuestras necesidades.

La tabla de números consecutivos (Ids) puede ser una tabla libre o una tabla incluida en nuestra base de datos, y solo contendrá dos campos, uno con el nombre de la tabla (cTabla C(30)) y el otro con el último número utilizado (cId I) y un índice por el campo cTabla.

La creación de la tabla y el índice lo realizamos por única vez con el siguiente código:
CREATE TABLE Ids ;
  (cTabla C(30) NOT NULL, ;
  nId I NOT NULL)
INDEX ON UPPER(cTabla) TAG cTabla
Por cada tabla que necesitemos llevar un número consecutivo, insertamos un registro con el nombre de la tabla e inicializamos el contador en 0 (cero):
INSERT INTO Ids (cTabla, nId) VALUES ("Facturas", 0)
INSERT INTO Ids (cTabla, nId) VALUES ("Albaranes", 0)
INSERT INTO Ids (cTabla, nId) VALUES ("Clientes", 0)
INSERT INTO Ids (cTabla, nId) VALUES ("Ciudades", 0)
La función que nos generará el nuevo número consecutivo (NuevoId()), puede estar ubicada en un archivo de procedimientos de nuestra aplicación, o puede ser un procedimiento almacenado de nuestra base de datos. El código de la función es el siguiente:
FUNCTION NuevoID(tcAlias)
  LOCAL lcAlias, lnId, lnAreaAnt, lcReprAnt
  lnId = 0
  lnAreaAnt = SELECT()
  lcReprAnt = SET('REPROCESS')
  SET REPROCESS TO AUTOMATIC
  lcAlias = UPPER(ALLTRIM(tcAlias))
  IF NOT USED("Ids")
    USE Ids IN 0
  ENDIF
  SELECT Ids
  IF SEEK(lcAlias, "Ids", "cTabla")
    IF RLOCK()
      REPLACE nId WITH nId + 1 IN Ids
      lnID = Ids.nId
      UNLOCK
    ENDIF
  ENDIF
  SELECT (lnAreaAnt)
  SET REPROCESS TO lcReprAnt
  RETURN lnID
ENDFUNC
Cada vez que necesitemos un nuevo número consecutivo de una tabla, invocamos la función pasando el nombre de la tabla o su alias como parámetro:
lnNuevoId = NuevoId("Facturas")
El valor retornado por la función NuevoId() es del tipo Entero. Si por ejemplo el código de cliente de nuestra tabla Clientes es del tipo caracter de 4 y justificado con 0s (ceros) a la izquierda, transformamos el número retornado de la siguiente manera:
lcCodCli = TRANSFORM(NuevoId("Clientes"), "@L 9999")
Espero que este breve código sea de utilidad para Uds.

Hasta la próxima.

Luis María Guayán

3 comentarios :

  1. LuisMa como siempre sos un grande..!!!!!!!!

    ResponderBorrar
  2. amigos ayuda por favor necesito generar un consecutivo en un select de una tabla ya existente que no cuenta con id quiero generarlo desde el select por favor ayuda!!

    grax

    ResponderBorrar
  3. Mira éste artículo en el Blog:

    -- Numerar los registros de un Select --
    https://comunidadvfp.blogspot.com/2006/10/numerar-los-registros-de-un-select.html

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.