Hola invitado         02 Sep, 2010 - 04:33
Menú principal
 
Ads
 
Patrocinadores
 
Anuncios
 
© 2009 PortalFox
Números consecutivos para nuestras tablas lecturas 13897
 Enviado por Luis María Guayán en Lunes, 21 Marzo, 2005
Bases de Datos Una forma fácil de generar y administrar números consecutivos para nuestras tablas.

Números consecutivos para nuestras tablas

Luis María Guayán 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
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

 Versión imprimible  
Números consecutivos para nuestras tablas | Entrar/Crear una cuenta | 5 Comentarios
Los comentarios son propiedad de sus respectivos autores.
No somos responsables de su contenido.

Re: Números consecutivos para nuestras tablas


por Balmes en 22 Mar, 2005 - 01:04
(Información del usuario  | Enviar un mensaje http://)
Es exactamente tal y como lo uso en mi sistema hecho en VFP6, excepto que para generar el número consecutivo, pongo en el campo Id de cada tabla, en la propiedad Valor predeterminado, una llamada a la función NuevoID. Creo que esto lo leí en el ejemplo Tastrade de VFP6. Esta función(NuevoID) la tengo en los procedimientos almacenados de la base de datos. Hasta la fecha me funcina perfectamente y, en entorno de red.

  • Re: Re: Números consecutivos para nuestras tablas


    por LuisMaria (luismaria@portalfoxxx.com) en 22 Mar, 2005 - 05:37
    (Información del usuario | Enviar un mensajehttp://www.luismariaguayan.com.ar

    Lo que indicas está en el siguiente artículo:

    -- Campos "Autoincrementales" en VFP --
    http://www.panoramabox.com/GoPub.aspx?IdObj=866

    Cabe aclarar la diferencia entre Campos Autoincrementales y un Números Consecutivos:

    El campo autoincremental debe usarse solo para valores no significativos (Ej: Claves Sustitutas [Surrogate Keys]) y no para valores significativos como la numeración de comprobantes, artículos, etc.
    VFP no maneja los defasajes que puedan ocurrir en campos autoincrementales al hacer un TABLEREVERT() o fallar la inserción del registro.

    Para la numeración de comprobantes, debemos tener un control propio de la aplicación que nos asegure un valor único y consecutivo para evitar duplicidad o defasajes en la secuencia de números. A esto es lo que denominamos números consecutivos.

    Luis María


    [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

  • Re: Re: Números consecutivos para nuestras tablas


    por denis en 06 Jun, 2005 - 05:01
    (Información del usuario | Enviar un mensajehttp://
    dado que esta funcion es para dbf, me vi en la necesidad de modificarla para cualquier bd en mi caso es SQlserver, utilizando ADO, la estructura al inicio es la misma lo que cambia en si es la funcion.



    FUNCTION NuevoID(tcAlias)
    #INCLUDE ADOVFP.H
    LOCAL cn,rs,Msql,lnID
    cn=CreateObject("adodb.connection")
    rs=CreateObject("adodb.recordset")
    cn.ConnectionString="Provider=SQLOLEDB.1;Data Source=TUSERVER;Initial Catalog=TUBD;Integrated Security=SSPI;"
    cn.open()
    msql="select * from IDS WHERE Ctabla='"+tcAlias+"'"
    rs.Open(mSql, cn,adOpenKeyset,adLockOptimistic,adCmdText)
    IF NOT rs.eof()
    lnID = rs.Fields(1).Value + 1
    rs.Fields(1).value = lnID
    rs.Update()
    ENDIF
    rs.close()
    RETURN lnID
    ENDFUNC


    Archivo AdoVfp.h

    *--------------------------------------------------------------------
    * Microsoft ADO
    *
    * (c) 1998 Microsoft Corporation. All Rights Reserved.
    *
    *
    *
    * ADO constants include file for Visual FoxPro
    *
    *--------------------------------------------------------------------

    *---- CursorTypeEnum Values ----
    #DEFINE ADOPENFORWARDONLY 0
    #DEFINE ADOPENKEYSET 1
    #DEFINE ADOPENDYNAMIC 2
    #DEFINE ADOPENSTATIC 3

    *---- CursorOptionEnum Values ----
    #DEFINE ADHOLDRECORDS 0x00000100
    #DEFINE ADMOVEPREVIOUS 0x00000200
    #DEFINE ADADDNEW 0x01000400
    #DEFINE ADDELETE 0x01000800
    #DEFINE ADUPDATE 0x01008000
    #DEFINE ADBOOKMARK 0x00002000
    #DEFINE ADAPPROXPOSITION 0x00004000
    #DEFINE ADUPDATEBATCH 0x00010000
    #DEFINE ADRESYNC 0x00020000
    #DEFINE ADNOTIFY 0x00040000

    *---- LockTypeEnum Values ----
    #DEFINE ADLOCKREADONLY 1
    #DEFINE ADLOCKPESSIMI
    Leer el resto de este comentario...

    [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

    • Re: Re: Números consecutivos para nuestras tablas


      por TREBOR en 01 Sep, 2008 - 12:39
      (Información del usuario | Enviar un mensaje
      Buenas tardes.

      Perdona mi pregunta.
      ¿Como controlarías el bloqueo del registro para que en el caso de que, por ejemplo la FACTURA, no se pudiera grabar posteriormente, el "nuevoAlias" pase a ser en anterior otra vez, evitando que nadie pueda haberlo modificado ?

      Un saludo

      Roberto García.

      [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]

  • Re: Re: Números consecutivos para nuestras tablas


    por Henry_Soft en 23 Sep, 2005 - 05:57
    (Información del usuario | Enviar un mensaje
    Excelente, trabaja muy bien y me sera de gran ayuda

    [ No se permiten comentarios a los usuarios anónimos. Por favor, Inicia tu cuenta o registrate ]




  • Todas las marcas y los logos utilizados en este sitio son propiedad de sus respectivos dueños.
    Los artículos, noticias y comentarios son propiedad y responsabilidad de sus respectivos autores.
    Copyright © 2000-2010 PortalFox. Todos los derechos reservados.