Discussion:
GENERAR NUMERO CONSECUTIVO
(demasiado antiguo para responder)
hector barajas
2005-06-28 23:41:49 UTC
Permalink
ESTOY CAPTURANDO UN CONSECUTIVO DE COMPRAS EN EL CUAL TENGO LOS CAMPOS
"NUMERO", "CLAVEPROV" Y "FECHA". DESEO QUE CUANDO CARGUE EL FORMULARIO ME
AGREGUE EL SIGUIENTE NUMERO CONSECUTIVO TOMANDO EN CONSIDERACION LOS QUE YA
ESTAN CAPTURADOS. NO DESEO USAR EL TIPO AUTONUMERICO, YA QUE DESEO QUE EL
NUMERO CONSECUTIVO SEA TEXTO (POR EJEMPLO "001", "002", ETC.). ALGUIEN TIENE
ALGUN PROCEDIMIENTO PARA GENERAR ALGO ASI, ES DECIR QUE REVISE EN LA BASE DE
DATOS Y DETERMINE CUAL ES EL NUMERO SIGUIENTE Y ME LO PUEDA CAPTURAR EN UNA
CELDA.
Alejandro A. (leon,gto)
2005-06-29 00:00:55 UTC
Permalink
Hola Hector
con una sentencia sql...

"select max(clave) as SIGFOLIO from tabla" 'esta instruccion
guarda el num.mayor maximo y lo guardas en un recordset

y con un reaad al recordset

wsigfolio= val( recordset("sigfolio") +1

espero haber ayudado

salduos
Alex Martínez
2005-06-29 06:49:29 UTC
Permalink
Puedes usar una tabla auxiliar con un único registro y un único campo para
el contador (si es necesario, puedes aprovechar esa tabla para generar
contadores de otras tablas, si añades un campo para el nombre de la tabla y
haces que ya no tenga un único registro). Dentro de una transacción (esto es
importante para evitar que, en un entorno multiusuario, otro usuario pueda
"robarte" el contador), consultas el valor actual del contador, lo
incrementas en 1, lo actualizas en la base de datos e insertas el registro
de compras con el valor del contador obtenido (y, opcionalmente, en ese
momento avisas al usuario del número del contador). Como podrás imaginar,
para que todo esto sea válido, este proceso se realiza cuando ya tienes
todos los datos necesarios para dar de alta el registro de compras. Por
tanto, no se ajusta exactamente a tu planteamiento (es decir, que al cargar
el formulario te presente en pantalla el número que va a usar). Lo que
sucede es que tu planteamiento no es correcto en un ambiente multiusuario
(asumo que una aplicación de compras lo será), porque sería muy probable que
dos usuarios presentaran el mismo número en pantalla.

En cuanto a lo de no usar autonuméricos (me parece respetable), si sólo lo
dices para poder tener valores del tipo '001', '002', ... pero no necesitas
que contenga valores alfanuméricos, puedes plantearte que sí sea numérico y
en todo caso formatear el valor completando con ceros a la izquierda cuando
sea necesario (en impresos o formularios). Los autonuméricos - sin ser
perfectos - pueden ayudarte a simplificar mucho el proceso.
--
Saludos,
Alex
[MS-MVP Visual Basic]
Post by hector barajas
ESTOY CAPTURANDO UN CONSECUTIVO DE COMPRAS EN EL CUAL TENGO LOS CAMPOS
"NUMERO", "CLAVEPROV" Y "FECHA". DESEO QUE CUANDO CARGUE EL FORMULARIO ME
AGREGUE EL SIGUIENTE NUMERO CONSECUTIVO TOMANDO EN CONSIDERACION LOS QUE YA
ESTAN CAPTURADOS. NO DESEO USAR EL TIPO AUTONUMERICO, YA QUE DESEO QUE EL
NUMERO CONSECUTIVO SEA TEXTO (POR EJEMPLO "001", "002", ETC.). ALGUIEN TIENE
ALGUN PROCEDIMIENTO PARA GENERAR ALGO ASI, ES DECIR QUE REVISE EN LA BASE DE
DATOS Y DETERMINE CUAL ES EL NUMERO SIGUIENTE Y ME LO PUEDA CAPTURAR EN UNA
CELDA.
Saga
2005-06-29 14:18:57 UTC
Permalink
Hola Alex,

Yo le haria una recomendacion ligeramente diferente a la tuya <g>

Donde dices que la tabla de folios puede contener un registro, con
varios
campos para diferentes folios, porque no mejor agregar registros segun
el numero de folios que sean necesarios... un ejemplo:

Tabla Folios1

Campos:
FolioFactura tipo numerico

Con esta estructura, la tabla soporta un folio, que es para facturas.
Si yo necesito ahora tambien soportar folios para pedidos, puedo
modificar
la tabla asi:

Tabla Folios1

Campos:
FolioFactura tipo numerico
FolioPedidos tipo numerico

En este caso, tuve que modificar la tabla. Pero que pasa si en lugar
tengo
una tabla asi:

Tabla Folios2

Campo:
IdFolio - tipo numerico
Folio - tipo numerico

Le asingo que el folio de la facturas corresponda a 1, asi que

IdFolio = 1 - folio de las facturas

Si ahora necesito el foli de los pedidos, le asigno el id 2:

IdFolio = 2 - folio de los pedidos

Ahora si yo necesito el folio de un peeido yo puedo hacer esto:

select Folio from Folios2 where IdFolio=2

Este esquema me permite agregar mas folios para otros conceptos
sin la necesidad de modificar la estructura de la tabla.

Saludos
Saga
Post by Alex Martínez
Puedes usar una tabla auxiliar con un único registro y un único campo
para el contador (si es necesario, puedes aprovechar esa tabla para
generar contadores de otras tablas, si añades un campo para el nombre
de la tabla y haces que ya no tenga un único registro). Dentro de una
transacción (esto es importante para evitar que, en un entorno
multiusuario, otro usuario pueda "robarte" el contador), consultas el
valor actual del contador, lo incrementas en 1, lo actualizas en la
base de datos e insertas el registro de compras con el valor del
contador obtenido (y, opcionalmente, en ese momento avisas al usuario
del número del contador). Como podrás imaginar, para que todo esto sea
válido, este proceso se realiza cuando ya tienes todos los datos
necesarios para dar de alta el registro de compras. Por tanto, no se
ajusta exactamente a tu planteamiento (es decir, que al cargar el
formulario te presente en pantalla el número que va a usar). Lo que
sucede es que tu planteamiento no es correcto en un ambiente
multiusuario (asumo que una aplicación de compras lo será), porque
sería muy probable que dos usuarios presentaran el mismo número en
pantalla.
En cuanto a lo de no usar autonuméricos (me parece respetable), si
sólo lo dices para poder tener valores del tipo '001', '002', ... pero
no necesitas que contenga valores alfanuméricos, puedes plantearte que
sí sea numérico y en todo caso formatear el valor completando con
ceros a la izquierda cuando sea necesario (en impresos o formularios).
Los autonuméricos - sin ser perfectos - pueden ayudarte a simplificar
mucho el proceso.
--
Saludos,
Alex
[MS-MVP Visual Basic]
Post by hector barajas
ESTOY CAPTURANDO UN CONSECUTIVO DE COMPRAS EN EL CUAL TENGO LOS CAMPOS
"NUMERO", "CLAVEPROV" Y "FECHA". DESEO QUE CUANDO CARGUE EL
FORMULARIO ME
AGREGUE EL SIGUIENTE NUMERO CONSECUTIVO TOMANDO EN CONSIDERACION LOS QUE YA
ESTAN CAPTURADOS. NO DESEO USAR EL TIPO AUTONUMERICO, YA QUE DESEO QUE EL
NUMERO CONSECUTIVO SEA TEXTO (POR EJEMPLO "001", "002", ETC.). ALGUIEN TIENE
ALGUN PROCEDIMIENTO PARA GENERAR ALGO ASI, ES DECIR QUE REVISE EN LA BASE DE
DATOS Y DETERMINE CUAL ES EL NUMERO SIGUIENTE Y ME LO PUEDA CAPTURAR EN UNA
CELDA.
Alex Martínez
2005-06-29 14:44:06 UTC
Permalink
Post by Saga
Hola Alex,
Yo le haria una recomendacion ligeramente diferente a la tuya <g>
Donde dices que la tabla de folios puede contener un registro, con
varios
campos para diferentes folios, porque no mejor agregar registros segun
el numero de folios que sean necesarios (...)
Quizá no me haya explicado bien, pero eso es precisamente lo que yo pretendía decir. Cuando dije que había un campo con el nombre de la tabla no me refería a que el nombre del campo indica la tabla y que necesito un campo para cada tabla a controlar, sino que tengo un campo CUYO CONTENIDO me indica la tabla a controlar.

Es decir:

Tabla Contadores
Campo "TablaAControlar"
Campo "Contador"

Un ejemplo del contenido de la tabla Contadores:

TablaAControlar Contador
Pedidos 123
Facturas 121
Albaranes 567
--
Saludos,
Alex
[MS-MVP Visual Basic]
Saga
2005-06-29 15:19:24 UTC
Permalink
Oops, creo que el error de lectura fue mio. Efectivamente eso es lo
que dices :-)

Saga
Post by Saga
Hola Alex,
Yo le haria una recomendacion ligeramente diferente a la tuya <g>
Donde dices que la tabla de folios puede contener un registro, con
varios
campos para diferentes folios, porque no mejor agregar registros segun
el numero de folios que sean necesarios (...)
Quizá no me haya explicado bien, pero eso es precisamente lo que yo pretendía decir. Cuando dije que había un campo con el nombre de la tabla no me refería a que el nombre del campo indica la tabla y que necesito un campo para cada tabla a controlar, sino que tengo un campo CUYO CONTENIDO me indica la tabla a controlar.

Es decir:

Tabla Contadores
Campo "TablaAControlar"
Campo "Contador"

Un ejemplo del contenido de la tabla Contadores:

TablaAControlar Contador
Pedidos 123
Facturas 121
Albaranes 567

--
Saludos,
Alex
[MS-MVP Visual Basic]
Lluís Franco
2005-06-29 07:53:10 UTC
Permalink
:-)
Hola,
Únicamente una pregunta para relfexionar:

¿Que sucede (existiendo el registro "001" y el "002" en la BD) si un usuario
comienza a crear un nuevo registro?

Obviamente deberíamos asignarle el "003", verdad? Pero ¿y si antes de que
grabe el registro en la BD, otro usuario comienza a crear un nuevo registro?
¿Le asignamos el "003" o el "004"? ¿Y como sabemos que hay usuarios con
nuevos registros a medio editar? ¿Y si el primer usuario (el que le
asignamos el "003") se arrepiente y decide no guardar el registro?

Resumiendo, ¿Por que no dejas que sea la base de datos la que se encargue de
asignar valores a los nuevos registros?
Si lo que deseas es mostrarlo como texto "00x", puedes formatear el valor
numérico con Format(Valor, "000")

Saludos,
--
Lluís Franco i Montanyés
[MS-MVP-MCP Visual Basic]

This posting is provided "AS IS" with no warranties, and confers no rights.
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho

--
(Guía de netiquette del foro)
http://www.uyssoft.com/MSNews.aspx?sm=10
FIMARGE, S.A.
Principat d'Andorra
***@ODIO_EL_SPAMfimarge.ad
Tel.: +376 805 100
Fax: +376 824 500
Mi Perfil MVP en: http://tinyurl.com/4nbnb
Saga
2005-06-29 14:58:42 UTC
Permalink
Aparte de lo que indican los demas, y quizas hasta repitiendo, te
hago las siguientes recomendaciones:


1. Al menos de que tu folio sea realmente alfanumerico, o sea que
pienses usar letras ademas de digitos, este debe ser de tipo
numerico. Ya que lo presentes con ceros a la izquierda es otra
cosa diferentem, que facilmente lo puedes hacer con format tal
como te indican.

2. Es bueno contar con un campo autonumerico en tablas que
guadar clientes, faturas, pedidos y otros datos. Esto no significa
que vas a usar el autonumerico dentro de tu aplicacion, mas bien
este dato seria de uso interno. Este es util cuando, por ejemplo,
cargas registros a una lista (que puede ser un grid, listview, list,
combo, etc). Consigues el autonumerico (que suelo llamar Id)
y lo guardas en la lista como llave unica. Con los Lists, se guarda
en el ItemData, en algunas rejillas (grids) se guarda en el RowData
(creo que asi se llama). Cuando se selecciona el elemento y es
necesario modificarlo, solo usas el Id y ya esta.

3. Como ya te han dicho, el folio se consigue cuando das de alta
el registro (compras, factura, pedido, etc). No es posible conseguir
este dato cuando inicialmente se abre la ventana de captura. Hacer
esto lleva a la posibilidad de brincarte consecutivos.

4. Donde sea posible, has que tu llave primaria sea numerico en lugar
de texto, ya que esto agiliza las busqueda (aunque sea un poquito).

5. No dices que base de datos usas, aunque el termino automunerico
normalemente se asocia con los mdbs de Access, asi que es
importante que al dar de alta la factura (o lo que sea), le pongas
un candado a la tabla de folios para que nadie intente dar de alta
dos facturas con el mismo folio.

6. Cuando se redactan mensajes en mayusculas... das la impresion
que estas gritando. Como el oido no es necesario para leer los
mensajes (al menos que tengas un reproductor de voz), no es
necesrio que grites, asi que usa las mayusculas prudentemente :-)

Suerte!
Saga
Post by hector barajas
ESTOY CAPTURANDO UN CONSECUTIVO DE COMPRAS EN EL CUAL TENGO LOS CAMPOS
"NUMERO", "CLAVEPROV" Y "FECHA". DESEO QUE CUANDO CARGUE EL FORMULARIO ME
AGREGUE EL SIGUIENTE NUMERO CONSECUTIVO TOMANDO EN CONSIDERACION LOS QUE YA
ESTAN CAPTURADOS. NO DESEO USAR EL TIPO AUTONUMERICO, YA QUE DESEO QUE EL
NUMERO CONSECUTIVO SEA TEXTO (POR EJEMPLO "001", "002", ETC.). ALGUIEN TIENE
ALGUN PROCEDIMIENTO PARA GENERAR ALGO ASI, ES DECIR QUE REVISE EN LA BASE DE
DATOS Y DETERMINE CUAL ES EL NUMERO SIGUIENTE Y ME LO PUEDA CAPTURAR EN UNA
CELDA.
Cristian
2005-06-29 19:20:38 UTC
Permalink
Hola.
Bajo las condiciones propuestas por ti es facil dar una solución :
Cuando cargues el formulario ocupas un max + 1, en todo caso el usuario
debe estar conciente que ese numero es momentaneo, ya que cuando hagas
el Insert sera nuevamente max + 1 y eso pudo haber cambiado en el tiempo
que el usuario se tomo para presionar grabar, no hay mas remedio.
La idea de la tabla que guarde los folios es buena de hecho tambien la
he utilizado, pero el max no es del todo malo tampoco, la final el
resultado es le mismo, la Tabla de Folios es mucho mas util en todo caso.

Atentamente,
Cristian.
Post by hector barajas
ESTOY CAPTURANDO UN CONSECUTIVO DE COMPRAS EN EL CUAL TENGO LOS CAMPOS
"NUMERO", "CLAVEPROV" Y "FECHA". DESEO QUE CUANDO CARGUE EL FORMULARIO ME
AGREGUE EL SIGUIENTE NUMERO CONSECUTIVO TOMANDO EN CONSIDERACION LOS QUE YA
ESTAN CAPTURADOS. NO DESEO USAR EL TIPO AUTONUMERICO, YA QUE DESEO QUE EL
NUMERO CONSECUTIVO SEA TEXTO (POR EJEMPLO "001", "002", ETC.). ALGUIEN TIENE
ALGUN PROCEDIMIENTO PARA GENERAR ALGO ASI, ES DECIR QUE REVISE EN LA BASE DE
DATOS Y DETERMINE CUAL ES EL NUMERO SIGUIENTE Y ME LO PUEDA CAPTURAR EN UNA
CELDA.
Loading...