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 cTablaPor 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 Guayán
LuisMa como siempre sos un grande..!!!!!!!!
ResponderBorraramigos 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!!
ResponderBorrargrax
Mira éste artículo en el Blog:
ResponderBorrar-- Numerar los registros de un Select --
https://comunidadvfp.blogspot.com/2006/10/numerar-los-registros-de-un-select.html