Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

obtener el ultimo registro y guardarlo en variable

Estas en el tema de obtener el ultimo registro y guardarlo en variable en el foro de Mysql en Foros del Web. Hola a todos. El contexto es el siguiente. necesito generar un procedimiento almacenado tengo dos tablas, articulos y articulosenml articulos tiene entre sus campos uno ...
  #1 (permalink)  
Antiguo 23/03/2011, 16:06
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
obtener el ultimo registro y guardarlo en variable

Hola a todos.

El contexto es el siguiente.

necesito generar un procedimiento almacenado

tengo dos tablas, articulos y articulosenml

articulos tiene entre sus campos uno que se llama estaenml que es booleano y que indica que ese articulo esta en mercadolibre

articulosenml tiene entre sus campos el id del articulo que tenga su campo estanenml como true

entonces, lo que necesito es saber como obtengo y guardo dentro del procedimiento el id del ultimo articulo registrado para poder incluirlo en la consulta que inserta en la tabla articulosenml


Aqui tengo cual es mi idea de como hacerlo pero no se como obtener yguardar el id del articulo (al parecer con un select into no funciona)


Código MySQL:
Ver original
  1. DELIMITER $$   
  2. CREATE PROCEDURE REGISTRO_ARTICULO(IN al_id INT, IN ar_nombre VARCHAR(50), IN ar_descripcion VARCHAR(100), ar_especificaciones VARCHAR(100), ar_medidas VARCHAR(50), ar_peso DOUBLE, ar_foto VARCHAR(100), ar_cantreal INT, ar_cantpag INT, ar_costoreal DOUBLE, ar_costopromedio DOUBLE, ar_iva DOUBLE, ar_precio DOUBLE, ar_estado BOOL, ar_eskit BOOL, ar_espromocional BOOL, ar_estaenml BOOL)
  3.     INSERT INTO articulos VALUES (NULL, ar_nombre, ar_descripcion,ar_especificaciones,ar_medidas,ar_peso, ar_foto,ar_cantreal,ar_cantpag,ar_costoreal, ar_costopromedio,ar_iva,ar_precio,NOW(),ar_estado, ar_eskit,ar_espromocional,ar_estaenml);
  4.     IF ar_estaenml <> 0 THEN    
  5.         SELECT ar_id into id FROM articulos where ar_id = (SELECT MAX(ar_id) FROM articulos);
  6.         INSERT INTO mercado_libre VALUES (NULL, id, null, null);
  7.     END IF;
  8. END$$
  #2 (permalink)  
Antiguo 30/03/2011, 03:23
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: obtener el ultimo registro y guardarlo en variable

Intenta generando una variable despues del insert que tome el valor de SELECT MAX(ar_id) FROM articulos y ese se lo pasas al id para ingresarlo.

Algo asi:
Código MySQL:
Ver original
  1. DELIMITER $$    
  2. CREATE PROCEDURE REGISTRO_ARTICULO(IN al_id INT, IN ar_nombre VARCHAR(50), IN ar_descripcion VARCHAR(100), ar_especificaciones VARCHAR(100), ar_medidas VARCHAR(50), ar_peso DOUBLE, ar_foto VARCHAR(100), ar_cantreal INT, ar_cantpag INT, ar_costoreal DOUBLE, ar_costopromedio DOUBLE, ar_iva DOUBLE, ar_precio DOUBLE, ar_estado BOOL, ar_eskit BOOL, ar_espromocional BOOL, ar_estaenml BOOL)
  3.     INSERT INTO articulos VALUES (NULL, ar_nombre, ar_descripcion,ar_especificaciones,ar_medidas,ar_peso, ar_foto,ar_cantreal,ar_cantpag,ar_costoreal, ar_costopromedio,ar_iva,ar_precio,NOW(),ar_estado, ar_eskit,ar_espromocional,ar_estaenml);
  4.     SET @ultimoID = SELECT MAX(ar_id) FROM articulos;
  5.     IF ar_estaenml <> 0 THEN
  6.         INSERT INTO mercado_libre VALUES (NULL, @ultimoID, NULL, NULL);
  7.     END IF;
  8. END$$

Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #3 (permalink)  
Antiguo 02/04/2011, 21:53
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: obtener el ultimo registro y guardarlo en variable

Me gusta tu opcion aunque no la he probado, buscando encontre una funcion que te regresa el ultimo id insertado pero creo es el ultimo id de cualquier tabla, no de la tabla que quiera y pues ahi puede haber obtencion de ids de otras tablas, en fin.

Tengo otra duda, veo que creas una variable local usando set y le asigna un select max(campo), quiciera saber como puedo obtener un id en especifico a partir de su nombre y guardarlo en la variable, esto es crucial para poder codificar mas correctamente. Actualmente a lo que menciono, lo que hago es guardar en un arreglo de enteros (visual basic) los ids de cierta tabla, asi cuando necesite el id, como lo que tengo mostrado son nombres (y no el id), nomas checo el indice de por ejemplo, el combobox con los nombres y traigo el id que corresponda al index seleccionado, pero no es lo ideal.

si aun no me entiendes, te pondre un ejemplo de lo que quiero hacer basado en tu respuesta:

Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE OBTENER_ID(IN ar_nombre varchar(100))
  3. SET @ID = SELECT ar_id FROM articulos where articulos.ar_nombre = ar_nombre;
  4. INSERT INTO tabla VALUES (NULL, @ID,'dato1','dato2');
  5. END$$
  #4 (permalink)  
Antiguo 04/04/2011, 14:06
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: obtener el ultimo registro y guardarlo en variable

Tendrias que ponerle un LIMIT para asegurarte que esa consulta te entregue solo un valor... de todas maneras la manera correcta es tal cual lo armaste tu.

Saludos!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #5 (permalink)  
Antiguo 05/04/2011, 08:57
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: obtener el ultimo registro y guardarlo en variable

Cita:
Iniciado por Marvin Ver Mensaje
Tendrias que ponerle un LIMIT para asegurarte que esa consulta te entregue solo un valor... de todas maneras la manera correcta es tal cual lo armaste tu.

Saludos!

la columna ar_nombre es de tipo unica, por lo que no puede haber dos nombres iguales, de cualquier modo probare de las dos maneras, aunque no se si hoy, estoy con el diseño de la gui.
  #6 (permalink)  
Antiguo 08/04/2011, 10:13
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: obtener el ultimo registro y guardarlo en variable

Oye no funciona, me marca error, este es el codigo del procedimiento:

Código MySQL:
Ver original
  1. DELIMITER $$   
  2. CREATE PROCEDURE REGISTRO_ARTICULO(IN codigarticulo VARCHAR(10), IN nombre VARCHAR(50), IN descripcion VARCHAR(100), IN especificaciones VARCHAR(100), IN medidas VARCHAR(50), IN peso DOUBLE, IN foto VARCHAR(100), IN moneda INT, IN margenminimo INT,IN ti_nombre INT)
  3. BEGIN  
  4.     SET @ti_id=SELECT ti_id FROM tipo_iva WHERE tipo_iva.ti_nombre=ti_nombre;
  5.     INSERT INTO articulos VALUES (NULL,@ti_id, codigarticulo, nombre,descripcion,especificaciones,medidas,peso,foto,0,0,0,0,0,moneda,margenminimo,NOW(),1, 0,0,0);     
  6. END$$

este es el error:

Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT ti_id FROM tipo_iva WHERE tipo_iva.ti_nombre=ti_nombre;
INSERT INTO arti' at line 3
  #7 (permalink)  
Antiguo 08/04/2011, 10:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: obtener el ultimo registro y guardarlo en variable

Código MySQL:
Ver original
  1. DELIMITER $$    
  2. CREATE PROCEDURE REGISTRO_ARTICULO(IN codigarticulo VARCHAR(10), IN nombre VARCHAR(50), IN descripcion VARCHAR(100), IN especificaciones VARCHAR(100), IN medidas VARCHAR(50), IN peso DOUBLE, IN foto VARCHAR(100), IN moneda INT, IN margenminimo INT,IN ti_nombre INT)
  3. BEGIN  
  4.     SET @ti_id = (SELECT ti_id FROM tipo_iva WHERE tipo_iva.ti_nombre=ti_nombre);
  5.     INSERT INTO articulos VALUES (NULL,@ti_id, codigarticulo, nombre,descripcion,especificaciones,medidas,peso,foto,0,0,0,0,0,moneda,margenminimo,NOW(),1, 0,0,0);      
  6. END$$
  7. DELIMITER;

o bien:
Código MySQL:
Ver original
  1. DELIMITER $$    
  2. CREATE PROCEDURE REGISTRO_ARTICULO(IN codigarticulo VARCHAR(10), IN nombre VARCHAR(50), IN descripcion VARCHAR(100), IN especificaciones VARCHAR(100), IN medidas VARCHAR(50), IN peso DOUBLE, IN foto VARCHAR(100), IN moneda INT, IN margenminimo INT,IN ti_nombre INT)
  3. BEGIN  
  4.     SELECT ti_id INTO @ti_id  FROM tipo_iva WHERE tipo_iva.ti_nombre=ti_nombre;
  5.     INSERT INTO articulos VALUES (NULL,@ti_id, codigarticulo, nombre,descripcion,especificaciones,medidas,peso,foto,0,0,0,0,0,moneda,margenminimo,NOW(),1, 0,0,0);      
  6. END$$
  7. DELIMITER;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 08/04/2011, 10:55
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: obtener el ultimo registro y guardarlo en variable

Ya hice funcionar el procedimiento, sin embargo, necesito poder realizar varias veces una consulta (insert) ya que al registrar un articulo, este puede pertenecer a varias categorias y para esto, necesitaria saber el tipo de dato para usar arrays en el procedimiento, tanto el parametro array donde vendran los nombres de las categorias como dentro hacer un for para ir registrando las categorias para ese articulo.
Actualmente lo que tengo es otro procedimiento almacenado que registra en esa tabla (articulos_categorias) pero el bucle se hace desde el codigo de vb y me gustaria poder hacer todo en el mismo procedimiento para usar transacciones y asi, en caso de fallar o de por ejemplo, que quieran registrar otro articulo con mismo nombre (no se admiten nombres repetidos), no haga el insert en registros categorias (ya que al encontrar la restriccion unique de ar_nombre debe de hacer rollback y detener el procedimiento, asi me aseguro de que no alla inserciones equivocadas).

PD Gracias gnzsoloyo por el dato

Etiquetas: registro, ultimo, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:21.