Ir al contenido


Foto

Como actualizar valor de un campo desde otra tabla


  • Por favor identifícate para responder
4 respuestas en este tema

#1 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 27 febrero 2009 - 11:07

Saludos.

A continuación explicare como en Firebird podemos actualizar el valor de un campo desde otro campo perteneciente a una tabla distinta a la que queremos modificar.

Las tablas para este ejemplo:


sql
  1. CREATE TABLE VENDEDOR(
  2. VENDEDOR_ID INTEGER,
  3. NOMBRE VARCHAR(30),
  4. APELLIDO VARCHAR(30),
  5. TOTAL_VENDIDO DOUBLE PRECISION
  6. );
  7.  
  8. CREATE TABLE VENTAS(
  9. ARTICULO INTEGER,
  10. VENDEDOR_ID INTEGER,
  11. CANTIDAD INTEGER,
  12. MONTO DOUBLE PRECISION
  13. );




Cuando se nos presenta esta situación por lo regular procedemos a crear un procedimiento almacenado (Stored Procedure) para realizar dicha tarea, el mismo quedaria así­:



sql
  1. CREATE PROCEDURE SPC_ACTUALIZA_VENTA_VENDEDOR( VENDEDOR_ID INTEGER)
  2. AS
  3.   DECLARE VARIABLE VTOTAL DOUBLE PRECISION;
  4. BEGIN
  5.   --Sumamos el valor de las ventas realizadas por el vendedor
  6.   SELECT SUM(MONTO) FROM VENTAS
  7.   WHERE VENDEDOR_ID = :VENDEDOR_ID
  8.   INTO :VTOTAL;
  9.  
  10.   --Actualizamos la tabla de vendedores con el valor obtenido
  11.   UPDATE VENDEDOR
  12.   SET TOTAL_VENDIDO = :VTOTAL
  13.   WHERE VENDEDOR_ID = :VENDEDOR_ID;
  14. END



Pero Firebird es bastante generoso con nosotros y nos da la posibilidad de ahorrarnos el código anterior, ósea no necesariamente tenemos que crear un Stored Procedure para tal fin.



sql
  1.   UPDATE VENDEDOR
  2.   SET TOTAL_VENDIDO = (SELECT SUM(MONTO) FROM VENTAS
  3.                       WHERE VENTAS.VENDEDOR_ID = VENDEDOR.VENDEDOR_ID
  4.                       AND VENTAS.VENDEDOR_ID = :VENDEDOR_ID)
  5.   WHERE VENDEDOR_ID = :PARAMETRO;



Como pueden apreciar, el truco esta en hacer una subconsulta que devuelva un registro para el campo deseado, hasta el momento Firebird solo ofrece este método para dicha tarea.  Si queremos actualizar más de un campo con las mismas condiciones tenemos que hacer tantas subconsultas como campos sean requeridos para actualización.

Espero les sirva, hasta luego.
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 febrero 2009 - 07:27

Hola Rolphy,
¿Y no se puede hacer lo mismo con triggers?
Porque según lo que entiendo se puede hacer uso de un AFTER UPDATE en VENTAS para actualizar el valor del campo TOTAL_VENDIDO.

Saludos,


  • 0

#3 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 27 febrero 2009 - 10:29

Hola Rolphy,
¿Y no se puede hacer lo mismo con triggers?
Porque según lo que entiendo se puede hacer uso de un AFTER UPDATE en VENTAS para actualizar el valor del campo TOTAL_VENDIDO.

Saludos,


Hola.

Delphius en lo que planteas tienes cierto punto de razón, pero mi truco se trata de "actualizar" directamente la tabla sin dar muchos "pasos".  Lo interesante del truco es usar las sentencias directas (built-in) que nos ofrece Firebird.

Recuerda que en mi post, hablo de que por lo regular se hace un SP para actualizar cuando FB tiene sentencias para realizar dicha tarea.
  • 0

#4 armakaisen

armakaisen

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 13 junio 2024 - 05:14

Escrito 27 febrero 2009 - 02:07

aún cuando es de hace mucho tiempo, para mi siempre es una gran ayuda encontrar lo que busco y en este caso, me solucionaste un gran problema que tenía, ya que no sabía como hacerlo... muchas gracias y espero que sigas todavía enseñando.


  • 1

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 17 junio 2024 - 07:08

Escrito 27 febrero 2009 - 02:07

aún cuando es de hace mucho tiempo, para mi siempre es una gran ayuda encontrar lo que busco y en este caso, me solucionaste un gran problema que tenía, ya que no sabía como hacerlo... muchas gracias y espero que sigas todavía enseñando.

 

Un gusto saber que ha servido este post. 

 

Saludos


  • 0




IP.Board spam blocked by CleanTalk.