Una forma fácil de generar y administrar números consecutivos para nuestras tablas.
Números consecutivos para nuestras tablas Por Luis María Guayán, Tucumán, Argentina
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
ENDFUNCCada 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
|