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:
CREATE TABLE VENDEDOR( VENDEDOR_ID INTEGER, NOMBRE VARCHAR(30), APELLIDO VARCHAR(30), TOTAL_VENDIDO DOUBLE PRECISION ); CREATE TABLE VENTAS( ARTICULO INTEGER, VENDEDOR_ID INTEGER, CANTIDAD INTEGER, MONTO DOUBLE PRECISION );
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í:
CREATE PROCEDURE SPC_ACTUALIZA_VENTA_VENDEDOR( VENDEDOR_ID INTEGER) AS DECLARE VARIABLE VTOTAL DOUBLE PRECISION; BEGIN --Sumamos el valor de las ventas realizadas por el vendedor SELECT SUM(MONTO) FROM VENTAS WHERE VENDEDOR_ID = :VENDEDOR_ID INTO :VTOTAL; --Actualizamos la tabla de vendedores con el valor obtenido UPDATE VENDEDOR SET TOTAL_VENDIDO = :VTOTAL WHERE VENDEDOR_ID = :VENDEDOR_ID; 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.
UPDATE VENDEDOR SET TOTAL_VENDIDO = (SELECT SUM(MONTO) FROM VENTAS WHERE VENTAS.VENDEDOR_ID = VENDEDOR.VENDEDOR_ID AND VENTAS.VENDEDOR_ID = :VENDEDOR_ID) 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.