Mysql- Implementación numeradores para nuestras tablas.

906 views
Skip to first unread message

claudio luna

unread,
Feb 7, 2011, 1:57:19 PM2/7/11
to Comunidad de Visual Foxpro en Español
Hola a todos
En tablas de fox esta implementado mediante la rutina publicada en
portalfox por Luis M.Guayan
http://www.portalfox.com/index.php?name=News&file=article&sid=1466
Ahora bien, en Mysql se podrìa hacer algo similar con procedimientos
almacenados ?, triggers ??
Que me recomiendan ?
Desde ya muchas gracias a todos

Saludos
Claudio

Carlos Miguel FARIAS

unread,
Feb 7, 2011, 3:21:21 PM2/7/11
to publice...@googlegroups.com
mysql tiene claves autoincrementales propias, y la clave se genera al insertar el registro, luego hay una función del mysql que te devuelve el id de el ultimo id insertado en tu conexion.

IRCSAsw

unread,
Feb 7, 2011, 7:39:35 PM2/7/11
to publice...@googlegroups.com
Claudio,

La funci�n de MySQL que te comenta el compa�ero Carlos es:
last_insert_id()

Por ejemplo, al guardar un cliente en una tabla: clave,
nombre, tel�fono... donde clave es un campo autoincremental.

cmd = SQLEXEC(lnHandle, "INSERT INTO clientes(nombre,
telefono) VALUES ('Juan', '123-456789')")
IF cmd > 0
cmd = SQLEXEC(lnHandle, "SELECT last_insert_id() AS
cLastID", "curLastID") && Obtiene un cursor con un campo con
el �ltimo ID insertado
IF cmd > 0
nUltimoID = VAL(curLastID.cLastID)
MESSAGEBOX("La clave del nuevo cliente es:
"+curLastID.cLastID, 64, "Cliente Nuevo")
ENDIF
ENDIF

Nota que en el INSERT no mando nada para el campo clave,
MySQL le asigna el valor que le toca y lo recuperas con la
siguiente llamada.

Saludos.

Arturo Ramos
www.ircsasoftware.com.mx
Canc�n, M�xico.

claudio luna

unread,
Feb 8, 2011, 11:05:13 AM2/8/11
to Comunidad de Visual Foxpro en Español
Hola,
Muchas gracias a todos por vuestras respuestas.
A lo que yo me referìa es que quiero obtener un numerador por el tipo
de dato que estoy ingresando es decir, por ejemplo:
Si el codigo de movimiento es factura tiene un numerador determinado.
Si es nota de credito otro, y asì suceivamente, implementado de forma
similar al ejemplo que puse en el post inicial que hace referencia a
un post de Luis María Guayan.
Tala de numeradores:
Factura : proxid = 5555
NCredcito proxid = 8888
Entonces si inserto una factura su numero serà 5555+1, de forma
similar para la notra de Credito y otros tipos...
Espero haber sido claro con el concepto.
Saludos
Claudio
> Canc n, M xico.

Carlos Miguel FARIAS

unread,
Feb 8, 2011, 4:24:58 PM2/8/11
to publice...@googlegroups.com
Entonces lo que necesitas es tener en una tabla, con los campos tipo documento y ultimo usado.
Entonces cuando necesitas el siguiente numero, lees la tabla segun el tipo a generar, obtienes el valor, le sumas uno, ese es el valor que vas a usar y el que ademas debes guardar en dicha tabla auxiliar (debes grabar en forma inmediata, o bloqueando el registro) para que no se superpongan accesos.
Hay que tener en cuenta que en algunos casos, (Argentina al menos) el numero de factura esta compuesto por dos partes, el numero de sucursal (o equivalente) y el numero de factura propiamente dicho, y ahi tienes que generar el numero correlativo por cada sucursal.

claudio luna

unread,
Feb 11, 2011, 1:44:49 PM2/11/11
to Comunidad de Visual Foxpro en Español
Gracias compañeros
Como me recomiendan "bloquear" en MYSQL para hacer dichos
numeradores ?
Saludos
Claudio Luna

On 8 feb, 18:24, Carlos Miguel FARIAS <carlosmiguelfar...@gmail.com>
wrote:
> Entonces lo que necesitas es tener en una tabla, con los campos tipo
> documento y ultimo usado.
> Entonces cuando necesitas el siguiente numero, lees la tabla segun el tipo a
> generar, obtienes el valor, le sumas uno, ese es el valor que vas a usar y
> el que ademas debes guardar en dicha tabla auxiliar (debes grabar en forma
> inmediata, o bloqueando el registro) para que no se superpongan accesos.
> Hay que tener en cuenta que en algunos casos, (Argentina al menos) el numero
> de factura esta compuesto por dos partes, el numero de sucursal (o
> equivalente) y el numero de factura propiamente dicho, y ahi tienes que
> generar el numero correlativo por cada sucursal.
>

Carlos Miguel FARIAS

unread,
Feb 12, 2011, 11:05:11 AM2/12/11
to publice...@googlegroups.com
Si tus tablas son myisam, solo dispones de bloqueo a nivel tabla, si son innodb, si podes bloquear fila por fila. Para la tabla de control, con myisam, puede ser posiblemente mas util bloquear la tabla, recuperar tu valor, hacer los cambios y soltar la tabla que hacer bloqueo sobre fila especifico.
Eso con myisam.
Con myisam no tenes posibilidad de hacer integridad referencial ni transacciones de mas de un comando.

carlos SALCEDO

unread,
Feb 12, 2011, 11:31:41 AM2/12/11
to publice...@googlegroups.com
As contemplado la posibilidad de dejar que Mysql + innodb creen automaticamnete el consecutivo

o tra forma es la siquiente:
1:crear un procedimiento quese llame guardar y antes de hacer el insert
y despues de validar lo que tengas que validar, haces un select count de la tabla
asignando a una variable el resultado, si el el resultado es mayor que cero entonces el consecutivo es igual
alvalor + 1(o mas lo que tu quieras) y si no simplemente el consecutivo es igual a 1
En lo que respecta a bloqueos MYSQL(innodb) bloquea automaticmante la tabla hasta que la transaccion no se complete
claro en ms.

si la tabla no tiene muchos campos yo te ayudo con el SP
enviame un backup solo de la tabla y te ayudo

Bendiciones


Carlos


Date: Sat, 12 Feb 2011 13:05:11 -0300
Subject: Re: [vfp] Re: Mysql- Implementación numeradores para nuestras tablas.
From: carlosmig...@gmail.com
To: publice...@googlegroups.com

claudio luna

unread,
Mar 3, 2011, 1:51:14 PM3/3/11
to Comunidad de Visual Foxpro en Español
Carlos
Muchas gracias por tu apoyo no había visto tu respuesta.
Te mando mañana un backup de las tablas para ver que me orientes en el
tema.
Saludos
Claudio

On 12 feb, 13:31, carlos SALCEDO <carosam1...@hotmail.com> wrote:
> As contemplado la posibilidad de dejar que Mysql + innodb creen automaticamnete el consecutivo
>
> o tra forma es la siquiente:
> 1:crear un procedimiento quese llame guardar y antes de hacer el insert
> y despues de validar lo que tengas que validar, haces un select count de la tabla
> asignando a una variable el resultado, si el el resultado es mayor que cero entonces el consecutivo es igual
> alvalor + 1(o mas lo que tu quieras) y si no simplemente el consecutivo es igual a 1
> En lo que respecta a bloqueos MYSQL(innodb)  bloquea automaticmante la tabla hasta que la transaccion no se complete
> claro en ms.
>
> si la tabla no tiene muchos campos yo te ayudo con el SP
> enviame un backup solo de la tabla y te ayudo
>
> Bendiciones
>
> Carlos
>
> Date: Sat, 12 Feb 2011 13:05:11 -0300
> Subject: Re: [vfp] Re: Mysql- Implementación numeradores para nuestras tablas.
> From: carlosmiguelfar...@gmail.com
> To: publice...@googlegroups.com
>
> Si tus tablas son myisam, solo dispones de bloqueo a nivel tabla, si son innodb, si podes bloquear fila por fila. Para la tabla de control, con myisam, puede ser posiblemente mas util bloquear la tabla, recuperar tu valor, hacer los cambios y soltar la tabla que hacer bloqueo sobre fila especifico.
>
> Eso con myisam.
> Con myisam no tenes posibilidad de hacer integridad referencial ni transacciones de mas de un comando.
>

claudio luna

unread,
Mar 3, 2011, 1:53:15 PM3/3/11
to Comunidad de Visual Foxpro en Español
Carlos no había visto tu contestación...
Muchas gracias por el ofrecimiento.
Te mando a la brevedad un backup de la base.
Saludos
Claudio

On 12 feb, 13:31, carlos SALCEDO <carosam1...@hotmail.com> wrote:
> As contemplado la posibilidad de dejar que Mysql + innodb creen automaticamnete el consecutivo
>
> o tra forma es la siquiente:
> 1:crear un procedimiento quese llame guardar y antes de hacer el insert
> y despues de validar lo que tengas que validar, haces un select count de la tabla
> asignando a una variable el resultado, si el el resultado es mayor que cero entonces el consecutivo es igual
> alvalor + 1(o mas lo que tu quieras) y si no simplemente el consecutivo es igual a 1
> En lo que respecta a bloqueos MYSQL(innodb)  bloquea automaticmante la tabla hasta que la transaccion no se complete
> claro en ms.
>
> si la tabla no tiene muchos campos yo te ayudo con el SP
> enviame un backup solo de la tabla y te ayudo
>
> Bendiciones
>
> Carlos
>
> Date: Sat, 12 Feb 2011 13:05:11 -0300
> Subject: Re: [vfp] Re: Mysql- Implementación numeradores para nuestras tablas.
> From: carlosmiguelfar...@gmail.com
> To: publice...@googlegroups.com
>
> Si tus tablas son myisam, solo dispones de bloqueo a nivel tabla, si son innodb, si podes bloquear fila por fila. Para la tabla de control, con myisam, puede ser posiblemente mas util bloquear la tabla, recuperar tu valor, hacer los cambios y soltar la tabla que hacer bloqueo sobre fila especifico.
>
> Eso con myisam.
> Con myisam no tenes posibilidad de hacer integridad referencial ni transacciones de mas de un comando.
>

Mauricio Molinero,

unread,
Mar 3, 2011, 2:22:22 PM3/3/11
to Comunidad de Visual Foxpro en Español
Claudio,

Con la siguiente instruccion podes obtener una clave unica por
ejecucion para ser usada como Id. Nunca devuelve la misma ya lee y
actualiza al mismo tiempo.

UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field +
1);
SELECT LAST_INSERT_ID();

Saludos!

Mauricio R. Molinero,

IRCSAsw

unread,
Mar 9, 2011, 10:13:25 PM3/9/11
to publice...@googlegroups.com
Mauricio,

un par de dudas,

el LAST_INSERT_ID(counter_field + 1) del UPDATE regresa el
�ltimo ID insertado de este mismo UPDATE ???

c�mo manejas las conexiones a la base de datos ???, una
global desde que abres el sistema o una para cada
instrucci�n ???

Claudio Luna

unread,
Mar 9, 2011, 11:32:53 PM3/9/11
to publice...@googlegroups.com
A todos,
Muchas gracias por vuestras respuestas, voy a ponerlas en práctica.

Saludos

El 10 de marzo de 2011 00:13, IRCSAsw <irc...@gmail.com> escribió:
Mauricio,

un par de dudas,

el LAST_INSERT_ID(counter_field + 1) del UPDATE regresa el último ID insertado de este mismo UPDATE ???

cómo manejas las conexiones a la base de datos ???, una global desde que abres el sistema o una para cada instrucción ???


Saludos.

Arturo Ramos
www.ircsasoftware.com.mx
Cancún, México.

Carlos Miguel FARIAS

unread,
Mar 10, 2011, 4:52:47 PM3/10/11
to publice...@googlegroups.com
El update no actualizaria el ultimo registro insertado (last_insert_id), esa instrucción, despues de un insert, te devuelve el valor de la clave primaria recien ingresada, si el indice primario es autoincremental.
Lo bueno del autoincremental que funciona con cualquier tamaño de campo entero.

Mauricio Molinero,

unread,
Mar 10, 2011, 6:07:15 PM3/10/11
to Comunidad de Visual Foxpro en Español
No soy un experto en Mysql, pero ese codigo lo saque de la
documentacion de MySql, tambien lo verifique con 2 aplicaciones
generando registros al mismo tiempo y funciona.

Aqui el enlace, al final del todo.
http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

Saludos!

Mauricio R. Molinero,


On 10 mar, 18:52, Carlos Miguel FARIAS <carlosmiguelfar...@gmail.com>
wrote:
> El update no actualizaria el ultimo registro insertado (last_insert_id), esa
> instrucción, despues de un insert, te devuelve el valor de la clave primaria
> recien ingresada, si el indice primario es autoincremental.
> Lo bueno del autoincremental que funciona con cualquier tamaño de campo
> entero.
>
> El 10 de marzo de 2011 01:32, Claudio Luna <thome...@gmail.com> escribió:
>
>
>
>
>
>
>
> > A todos,
> > Muchas gracias por vuestras respuestas, voy a ponerlas en práctica.
>
> > Saludos
>

Douglas Sánchez Guillén

unread,
Mar 10, 2011, 7:20:49 PM3/10/11
to publice...@googlegroups.com
Hola que quieres crear tu propio id de cata tabla lo mejor es trabarjar con transacciones y hacer una vista yo asi lo trabajo y manejo bien mysql y vfp qu versiontiene tu de msyql yo la server 5.5.

crea una vista y ahi va el ejemplo tabla tblencmod  incremento el idencmod     encabezado de la modificacion.

ahi te va la vista.

DROP VIEW IF EXISTS `nombredetubase`.`vistatblencmod`;
CREATE OR REPLACE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vistatblencmod` AS select ifnull(max((`tblencmod`.`idencmod` + 1)),0) AS `consec` from `tblencmod`;


ifnull es para si te retorna null mejor retorne cero. ahieta el truco si te entendi bien lo kieres si es otra cosa ps me avisas.
va retornar.

1
2
3
4
5
6
7
8
n


salues



--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Movistar: 505 8759 - 5342
Claro: 505 88495476

Reply all
Reply to author
Forward
0 new messages