Details

Grants

References

Dependencies

Code


NAME VALUE
OWNER CARTERAINVERSION_USER
OBJECT_NAME UPDSITUACIONCARTERA
SUBOBJECT_NAME null
OBJECT_ID 28320
DATA_OBJECT_ID null
OBJECT_TYPE TRIGGER
CREATED 11/06/15
LAST_DDL_TIME 11/06/15
TIMESTAMP 2015-06-11:22:56:09
STATUS VALID
TEMPORARY N
GENERATED N
SECONDARY N
NAMESPACE 3
EDITION_NAME null
PRIVILEGE GRANTEE GRANTABLE GRANTOR OBJECT_NAME
NAME OWNER TYPE OBJECT_ID STATUS TYPE_LINK
NAME OWNER TYPE OBJECT_ID STATUS TYPE_LINK
EST_3_MAYORCARTERACLIENTE CARTERAINVERSION_USER TABLE 28260 VALID TABLE
GESTIONTEST CARTERAINVERSION_USER PACKAGE 28298 VALID PACKAGE
ORDENTRADING CARTERAINVERSION_USER TABLE 28276 VALID TABLE
ACCIONHISTORICO CARTERAINVERSION_USER TABLE 28251 VALID TABLE
ORDENINVERSION CARTERAINVERSION_USER TABLE 28270 VALID TABLE
CLIENTEHISTORICO CARTERAINVERSION_USER TABLE 28258 VALID TABLE
EST_4_MAYORVOLUMENACCION CARTERAINVERSION_USER TABLE 28262 VALID TABLE
SITUACIONCARTERA CARTERAINVERSION_USER TABLE 28282 VALID TABLE
ACCION CARTERAINVERSION_USER TABLE 28248 VALID TABLE
CLIENTE CARTERAINVERSION_USER TABLE 28256 VALID TABLE
TRIGGER UPDSITUACIONCARTERA
AFTER UPDATE  ON SITUACIONCARTERA
FOR EACH ROW
DECLARE
valor 						NUMBER;
valorMes     				NUMBER;
vANO 						NUMBER;
vMes 						NUMBER;
vANOAnterior 				NUMBER;
vMesAnterior				NUMBER;
existe						NUMBER;
vClienteId					NUMBER;
vNombre						VARCHAR2(150);
vValorCarteraInversiones	NUMBER;
newValorCarteraInversiones	NUMBER;
oldValorCarteraInversiones	NUMBER;
vISINId						CHAR(12);
vTicker						VARCHAR2(10);
vTickerDescripcion			VARCHAR2(100);
vVolumenNegociacion			NUMBER;
RSP  						VARCHAR2(50);
BEGIN

/* Se actualiza el valor cartera inversiones de la tabla cliente con el diferencial
	- entre el diferencial de la cantidad anterior y la nueva cantidad.
	- entre el valor de cotización anterior y el nuevo valor */

	newValorCarteraInversiones := 0;
	oldValorCarteraInversiones := 0;
IF((:new.cantidad <>  :old.cantidad ) OR (:new.ValorCotizacionUlt <> :old.ValorCotizacionUlt)) THEN

	SELECT ValorCarteraInversiones INTO oldValorCarteraInversiones
	FROM Cliente
	WHERE ClienteId = :new.ClienteId;

	valor := (:new.cantidad * :new.ValorCotizacionUlt)- (:old.cantidad * :old.ValorCotizacionUlt) ;
	update Cliente
	set ValorCarteraInversiones =  ValorCarteraInversiones+valor
    where ClienteId = :new.ClienteId;

	SELECT ValorCarteraInversiones INTO newValorCarteraInversiones
	FROM Cliente
	WHERE ClienteId = :new.ClienteId;


	SELECT ValorCarteraInversiones, ClienteId, Nombre INTO vValorCarteraInversiones, vClienteId, vNombre
	FROM (SELECT ValorCarteraInversiones, ClienteId, Nombre
		  FROM Cliente
		  ORDER BY ValorCarteraInversiones DESC)
	WHERE ROWNUM = 1;

	/* La operación UPSERT actualiza o inserta una fila en una tabla,
	dependiendo de si la tabla ya tiene una fila que coincide con los
	datos.
	Ya que Oracle no tiene una declaración específica de UPSERT,
	utilizaremos la declaración "merge" que fusiona los datos
	entre dos tablas. Uso DUAL nos permite utilizar este comando. */

	merge into Est_3_MayorCarteraCliente m
	using dual on (Id = 1)
	when not matched then
	insert (Id,ClienteId, Nombre, ValorCarteraInversiones)
		values (1, vClienteId, vNombre, vValorCarteraInversiones)
	when matched then
	update set 	ClienteId = vClienteId,
				Nombre = vNombre,
				ValorCarteraInversiones = vValorCarteraInversiones;
END IF ;

/* 	Se actualiza el volumen de negociación de la acción.
	Se tiene en cuenta el diferencial de la cantidad anterior
	respecto a la nueva cantidad en valor absoluto.*/

IF (:new.cantidad <>  :old.cantidad ) THEN
	valor := ABS((:new.cantidad )- (:old.cantidad )) ;
	update Accion set VolumenNegociacion =  VolumenNegociacion+valor
    where ISINId = :new.ISINId;


	SELECT ISINId,Ticker, VolumenNegociacion, TickerDescripcion INTO vISINId, vTicker, vVolumenNegociacion, vTickerDescripcion
	FROM (SELECT ISINId,Ticker, VolumenNegociacion, TickerDescripcion
		  FROM Accion
		  ORDER BY VOLUMENNEGOCIACION DESC)
	WHERE ROWNUM = 1;

	/* La operación UPSERT actualiza o inserta una fila en una tabla,
	dependiendo de si la tabla ya tiene una fila que coincide con los
	datos.
	Ya que Oracle no tiene una declaración específica de UPSERT,
	utilizaremos la declaración "merge" que fusiona los datos
	entre dos tablas. Uso DUAL nos permite utilizar este comando. */

	merge into Est_4_MayorVolumenAccion m
	using dual on (Id = 1)
	when not matched then
	insert (Id,ISINId, Ticker, VolumenNegociacion, TickerDescripcion)
		values (1, vISINId, vTicker, vVolumenNegociacion, vTickerDescripcion)
	when matched then
	update set 	ISINId = vISINId,
				Ticker = vTicker,
				VolumenNegociacion = vVolumenNegociacion,
				TickerDescripcion = vTickerDescripcion;

END IF ;

/* Se actualiza la cantidad pendiente de venta de la acción.
	Se tiene en cuenta el diferencial de la cantidad pendiente anterior
	respecto a la nueva cantidad pendiente. */
IF (:new.CantidadPendienteVenta <>  :old.CantidadPendienteVenta ) THEN
 valor := (:new.CantidadPendienteVenta )- (:old.CantidadPendienteVenta ) ;
 update Accion set NumeroAccionesDisponibles =  NumeroAccionesDisponibles + valor
    where ISINId = :new.ISINId;
END IF ;

/* Si se produce un cambio de mes se generara ClienteHistorico   */
IF (:new.FechaCotizacionUlt  <>  :old.FechaCotizacionUlt ) THEN
 vANO := EXTRACT(YEAR FROM :new.FechaCotizacionUlt);
 vMes := EXTRACT(MONTH FROM :new.FechaCotizacionUlt);

 SELECT count(*) INTO existe
	FROM ClienteHistorico
	WHERE ClienteId = :new.ClienteId;
	IF (existe = 0) THEN /* La primera vez se carga los dos valores iguales */
	oldValorCarteraInversiones:= newValorCarteraInversiones;
	END IF;

SELECT count(*) INTO existe
	FROM ClienteHistorico
	WHERE ANO = vANO AND
		  Mes = vMes AND
		  ClienteId = :new.ClienteId;

	IF (existe = 0) THEN /* se genera el nuevo registro del mes */
		/* miramos que exista el mes anterior */
		vANOAnterior := vANO;
		vMesAnterior := vmes -1;
		IF (vMesAnterior = 0) THEN
			vMesAnterior := 12;
			vANOAnterior := vANO - 1;
		END IF;

		SELECT count(*) INTO existe
		FROM ClienteHistorico
		WHERE ANO = vANOAnterior AND
			  Mes = vMesAnterior AND
			  ClienteId = :new.ClienteId ;

		IF (existe > 0) THEN
		/* Si existe recogemos el valor final del mes anterior */
			SELECT  IMPORTEFINAL INTO  valorMes
			  FROM ClienteHistorico
			  WHERE ANO = vANOAnterior AND
				Mes = vMesAnterior AND
				ClienteId = :new.ClienteId ;
			oldValorCarteraInversiones:= valorMes;
		END IF;
		/* En este punto oldValorCarteraInversiones tendra el valor
		   de newValorCarteraInversiones si es la primera vez que se carga este cliente
		   o bien tendra el valor ImporteFinal del mes anterior.		*/
		GestionTest.ins_ClienteHistorico(:new.ClienteId, vMes, vANO, oldValorCarteraInversiones, newValorCarteraInversiones, RSP );
	ELSE
	/* Durante el mes se actualiza el valor en ImporteFinal*/
		SELECT  IMPORTEINICIAL INTO  valorMes
		FROM ClienteHistorico
		WHERE ANO = vANO AND
			  Mes = vMes AND
			  ClienteId = :new.ClienteId ;
		GestionTest.upd_ClienteHistorico(:new.ClienteId, vMes, vANO, valorMes, newValorCarteraInversiones, RSP );

	END IF;

END IF;
END;