Вы находитесь на странице: 1из 19

LABORATORIO

Asuma que en un mtodo de diseo de bases de datos distribuidas se tiene el siguiente


modelo conceptual global de una Base de datos de facturacin.
CLIENTES = (CEDULA, NOMBRE)
CP = CEDULA
SUCURSALES (CODIGO, NOMBRE, DIRECCION)
CP = CODIGO
D_CODIGO = Una letra mayscula en (N, S, E, C, O)
PRODUCTOS = (CODIGOP, DESCRIPCION, STOCK, FABRICANTE,
DIMENCIONES, FECHA)
CP = CODIGOP
FACTURAS = (NUMERO, FECHA, VALOR, CLIENTE, SUCURSAL)
CP = NUMERO
D_NUMERO = 10 Caracteres, el primero de la izquierda es la letra correspondiente al
cdigo de la sucursal donde se emite la factura, los dems caracteres dan un nmero > 0
CF1 = CLIENTE, se refiere a CLIENTES en CEDULA
CF2 = SUCURSAL, se refiere a SUCURSALES en CODIGO
VENTAS = (FACTURA, CANTIDAD, PRECIO, PRODUCTO)
CF3 = FACTURA, se refiere a FACTURAS en NUMERO
CF4 = PRODUCTO, se refiere a PRODUCTOS en CODIGOP.
Las siguientes especificaciones se han extractado del documento de requerimientos:
a) Las sucursales estn ubicadas en sitios convenientes de acuerdo a una
masificacin poblacional.
b) Un cliente puede comprar en cualquier sucursal
c) Algunas sucursales pueden tener todos los productos, otras solamente los ms
solicitados en el lugar.
d) El stock de cada producto es dependiente de la sucursal. Por ejemplo, en la
sucursal N puede haber 10 palas anchas, en la sucursal S puede haber solo 7.
PRIMERA PARTE: REPLICACION.
SITIO SRV1 (SITIO 1).
CREATE DATABASE LINK SITIO2
CONNECT TO USUARIOX IDENTIFIED BY USUARIOX
USING
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = SITIO2)(PORT = 1521))
)
(CONNECT_DATA =

(SERVICE_NAME = orcl)
)
);
SELECT * FROM TAB@SITIO2;
CREATE TABLE CLIENTES
(CEDULA VARCHAR (10) PRIMARY KEY,
NOMBRE CHAR (40));
CREATE SNAPSHOT LOG ON CLIENTES;
COLUMN OBJECT_NAME FORMAT A20;
COLUMN OBJECT_NAME FORMAT A20;
SELECT OBJECT_NAME, OBJECT_TYPE
FROM USER_OBJECTS;
SITIO SRV2 (SITIO 2).
CREATE DATABASE LINK SITIO1
CONNECT TO USUARIOX IDENTIFIED BY USUARIOX
USING
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = SITIO1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
);
CREATE SNAPSHOT S_CLIENTES
REFRESH FAST
START WITH SYSDATE
NEXT SYSDATE + 0.0001
WITH PRIMARY KEY
AS
SELECT *
FROM CLIENTES@SITIO1;
SELECT * FROM S_CLIENTES;
INSERT INTO S_CLIENTES VALUES (1700003238,PAUL FUERTES); No se
puede ingresar datos en una vista materializada.

INSERT INTO CLIENTES@SITIO1


VALUES
(1700003238,PAUL FUERTES);
COMMIT;
SELECT * FROM S_CLIENTES;
CREATE SYNONYM CLIENTES FOR CLIENTES@SITIO1;
INSERT INTO CLIENTES
VALUES
(1700003239,LUIS VILLAFUERTE);
COMMIT;
SELECT * FROM S_CLIENTES;
SELECT * FROM CLIENTES;

SEGUNDA PARTE: FRACCIONAMIENTO HORIZONTAL PRIMARIO.


SUCURSALES (CODIGO, NOMBRE, DIRECCION)
CP = CODIGO
D_CODIGO = Una letra mayscula en (N, S, E, C, O)
EN EL SITIO SRV1 (SITIO 1).
CREATE TABLE SUCURSALES
(CODIGO CHAR (1) PRIMARY KEY
CHECK (CODIGO IN (S)),
NOMBRE CHAR (30),
DIRECCION CHAR (30));
EN EL SITIO SRV2 (SITIO 2).
CREATE TABLE SUCURSALES
(CODIGO CHAR (1) PRIMARY KEY
CHECK (CODIGO IN (N)),
NOMBRE CHAR (30),
DIRECCION CHAR (30));
INSERT INTO SUCURSALES VALUES

(S, SUCURSAL SUR, AV. ANTONIO JOSE DE SUCRE S-12);


INSERT INTO SUCURSALES@SITIO2 VALUES
(N, SUCURSAL NORTE, AV. LOS ESTADIOS);
COMMIT;
SELECT * FROM SUCURSALES
UNION
SELECT * FROM SUCURSALES@SITIO1;

TERCERA PARTE: FRACCIONAMIENTO VERTICAL.


PRODUCTOS = (CODIGOP, DESCRIPCION, STOCK, FABRICANTE,
DIMENCIONES, FECHA)
CP = CODIGOP
D_CODIGOP = ENTERO > 0
F1_PRODUCTOS = (CODIGOP, FABRICANTE, DIMENSIONES)
F2_PRODUCTOS = (CODIGOP, DESCRIPCION, STOCK)
SITIO SRV1 (SITIO 1).
CREATE TABLE F1_PRODUCTOS
(CODIGOP NUMBER PRIMARY KEY
CHECK (CODIGOP > 0),
FABRICANTE VARCHAR (40),
DIMESIONES VARCHAR (50));
CREATE SNAPSHOT LOG ON F1_PRODUCTOS;
SITIO SRV2 (SITIO 2).
CREATE SNAPSHOT S_F1_PRODUCTOS
REFRESH FAST
START WITH SYSDATE
NEXT SYSDATE + 0.0001
WITH PRIMARY KEY
AS
SELECT *
FROM F1_PRODUCTOS@SITIO1;
CREATE TABLE F2_PRODUCTOS
(CODIGOP UNIQUE,

DESCRIPCION CHAR (40),


STOCK NUMBER (10, 2),
CONSTRAINT FK_F1 FOREIGN KEY (CODIGOP)
REFERENCES S_F1_PRODUCTOS (CODIGOP));
SITIO SRV1 (SITIO 1).
CREATE TABLE F2_PRODUCTOS
(CODIGOP UNIQUE,
DESCRIPCION CHAR (40),
STOCK NUMBER (10, 2),
CONSTRAINT FK_F1 FOREIGN KEY (CODIGOP)
REFERENCES F1_PRODUCTOS (CODIGOP));
CREATE VIEW V_PRODUCTOS
AS
SELECT S SITIO, F.*, DESCRIPCION, STOCK
FROM F1_PRODUCTOS F, F2_PRODUCTOS;
CREATE OR REPLACE TRIGGER T_PRODUCTOS
INSTEAD OF INSERT
ON V_PRODUCTOS
FOR EACH ROW
DECLARE
CURSOR C1 IS
SELECT 1 FROM F1_PRODUCTOS
WHERE CODIGOP = :NEW.CODIGOP;
X C1%ROWTYPE;
BEGIN
OPEN C1;
FETCH C1 INTO X;
IF C1%ROWCOUNT = 0 THEN
INSERT INTO F1_PRODUCTOS
(CODIGOP, FABRICANTE, DIMESIONES)
VALUES
(:NEW.CODIGOP, :NEW.FABRICANTE, :NEW.DIMESIONES);
END IF;
IF :NEW.SITIO = S THEN
INSERT INTO F2_PRODUCTOS
(CODIGOP, DESCRIPCION, STOCK)
VALUES
(:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK);
ELSE
INSERT INTO F2_PRODUCTOS@SITIO2
(CODIGOP, DESCRIPCION, STOCK)
VALUES
(:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK);
END IF;
END;

.
/
INSERT INTO V_PRODUCTOS VALUES
(S, 1, XX,YY,DESCRI, 20);
INSERT INTO V_PRODUCTOS VALUES
(N, 1, XX,YY,DESCRI, 10);

CUARTA PARTE: FRACCIONAMIENTO HORIZONTAL DERIVADO.


Derivado se la realiza cuando la tabla es dependiente (depende de otras)
FACTURAS = (NUMERO, FECHA, VALOR, CLIENTE, SUCURSAL)
CP = NUMERO
D_NUMERO = 10 Caracteres, el primero de la izquierda es la letra correspondiente al
cdigo de la sucursal donde se emite la factura, los dems caracteres dan un nmero > 0
CF1 = CLIENTE, se refiere a CLIENTES en CEDULA
CF2 = SUCURSAL, se refiere a SUCURSALES en CODIGO
SITIO SRV2 (SITIO 2).
CREATE TABLE FACTURAS
(NUMERO CHAR (10) PRIMARY KEY
CHECK (SUBSTR (NUMERO, 1, 1) IN (N)
AND RTRIM (SUBSTR (NUMERO, 2, 9)) > 0),
FECHA DATE,
VALOR NUMBER (10, 2),
CLIENTE,
SUCURSAL,
CONSTRAINT FK_CLI FOREIGN KEY (CLIENTE)
REFERENCES S_CLIENTES (CEDULA),
CONSTRAINT FK_SUC FOREIGN KEY (SUCURSAL)
REFERENCES SUCURSALES (CODIGO));
SITIO SRV1 (SITIO 1).
CREATE TABLE FACTURAS
(NUMERO CHAR (10) PRIMARY KEY
CHECK (SUBSTR (NUMERO, 1, 1) IN (S)
AND RTRIM (SUBSTR (NUMERO, 2, 9)) > 0),
FECHA DATE,
VALOR NUMBER (10, 2),
CLIENTE,
SUCURSAL,

CONSTRAINT FK_CLI FOREIGN KEY (CLIENTE)


REFERENCES CLIENTES (CEDULA),
CONSTRAINT FK_SUC FOREIGN KEY (SUCURSAL)
REFERENCES SUCURSALES (CODIGO));

VENTAS = (FACTURA, CANTIDAD, PRECIO, PRODUCTO)


CF3 = FACTURA, se refiere a FACTURAS en NUMERO
CF4 = PRODUCTO, se refiere a PRODUCTOS en CODIGOP.
CREATE TABLE VENTAS
(FACTURA,
CANTIDAD NUMBER (10, 2),
PRECIO NUMBER (10, 2),
PRODUCTO,
CONSTRAINT FK_FAC1 FOREIGN KEY (FACTURA)
REFERENCES FACTURAS (NUMERO),
CONSTRAINT FK_PROD1 FOREIGN KEY (PRODUCTO)
REFERENCES F2_PRODUCTOS (CODIGOP));

QUINTA PARTE: INSERCION DE DATOS EN FACTURAS Y VENTAS.


CREATE VIEW TODAS_FACTURAS
AS
SELECT NUMERO
FROM FACTURAS
UNION
SELECT NUMERO
FROM FACTURAS@SITIO2;
CREATE VIEW TODAS_VENTAS
AS SELECT F.*,
CANTIDAD, PRECIO, PRODUCTO
FROM FACTURAS F, VENTAS
WHERE NUMERO = FACTURA
UNION
SELECT F.*,
CANTIDAD, PRECIO, PRODUCTO
FROM FACTURAS@SITIO2 F, VENTAS@SITIO2
WHERE NUMERO = FACTURA;
CREATE OR REPLACE TRIGGER T_VENTAS
INSTEAD OF INSERT
ON TODAS_VENTAS

FOR EACH ROW


DECLARE
CURSOR C1 IS
SELECT 1 FROM TODAS_FACTURAS
WHERE NUMERO = :NEW.NUMERO;
X C1%ROWTYPE;
BEGIN
OPEN C1;
FETCH C1 INTO X;
IF C1%ROWCOUNT = 0 THEN
IF :NEW.SUCURSAL = S THEN
INSERT INTO FACTURAS VALUES
(:NEW.NUMERO,
SYSDATE,
:NEW.VALOR,
:NEW.CLIENTE,
:NEW.SUCURSAL);
INSERT INTO VENTAS VALUES
(:NEW.NUMERO, :NEW.CANTIDAD, :NEW.PRECIO, :NEW.PRODUCTO);
ELSE
INSERT INTO FACTURAS@SITIO2 VALUES
(:NEW.NUMERO,
SYSDATE,
:NEW.VALOR,
:NEW.CLIENTE,
:NEW.SUCURSAL);
INSERT INTO VENTAS@SITIO2 VALUES
(:NEW.NUMERO, :NEW.CANTIDAD, :NEW.PRECIO, :NEW.PRODUCTO);
END IF;
ELSE
IF :NEW.SUCURSAL = S THEN
INSERT INTO VENTAS VALUES
(:NEW.NUMERO, :NEW.CANTIDAD, :NEW.PRECIO, :NEW.PRODUCTO);
ELSE
INSERT INTO VENTAS@SITIO2 VALUES
(:NEW.NUMERO, :NEW.CANTIDAD, :NEW.PRECIO, :NEW.PRODUCTO);
END IF;
END IF;
END;
.
/
INSERT INTO TODAS_VENTAS VALUES
(S000000001,SYSDATE, 120.35, 1700003237,S, 2, 5.23, 1);
INSERT INTO TODAS_VENTAS VALUES
(N000000001,SYSDATE, 120.35, 1700003237,N, 2, 5.23, 1);

SEXTA PARTE: USUARIOS Y PERFILES

USUARIOS
Gerente
Contador
Bodeguero
Vendedores
PERFIL: GERENTE
SUCURSALES
CLIENTES
PRODUCTOS
FACTURAS
VENTAS

CONSULTAR
X
X
X
X
X

PERFIL: CONTADOR
SUCURSALES
CLIENTES
PRODUCTOS
FACTURAS
VENTAS

X
X
X
X
X

PERFIL:BODEGUEROS
SUCURSALES
CLIENTES
PRODUCTOS
FACTURAS
VENTAS

X
X
X
X
X

PERFIL:VENDEDORES
SUCURSALES
CLIENTES
PRODUCTOS
FACTURAS
VENTAS

X
X
X
X
X

INSERTAR
X

ACTUALIZAR

X
X

X
X
X

DEMANDAS TIPO:
GERENTE:
1.- Total vendido por sucursal en una fecha dada.
SELECT SUM (VALOR) AS VENTAS, NOMBRE
FROM FACTURAS F, SUCURSALES S

WHERE F.SUCURSAL = S.CODIGO


AND TO_CHAR (FECHA, MMDDYYYY = DATO
GROUP BY NOMBRE;
2.- Nmero de clientes hasta la fecha.
CONTADOR:
1.- Nmero de facturas emitidas y monto por sucursal
2.- Listado de fabricantes de productos
BODEGUEROS:
1.- Stock de los productos.
2.- Ingreso y actualizacin de datos de productos
3.- Listado de fabricantes de los productos.
VENDEDORES:
1.- Ingreso de facturas y ventas
2.- Consulta de ventas realizadas
TRADUCCION DE LAS PREGUNTAS A SQL:
GERENTE:
1.- SELECT SUM (VALOR) AS VENTAS, NOMBRE
FROM FACTURAS F, SUCURSALES S
WHERE F.SUCURSAL = S.CODIGO
AND TO_CHAR (FECHA, MMDDYYYY = DATO
GROUP BY NOMBRE;
EQUIVALENTE EN EL SISTEMA DISTRIBUIDO:
SELECT SUM (VALOR) AS VENTAS, NOMBRE
FROM FACTURAS F, SUCURSALES S
WHERE F.SUCURSAL = S.CODIGO
AND TO_CHAR (FECHA, MMYYYY) = &DATO
GROUP BY NOMBRE
UNION
SELECT SUM (VALOR) AS VENTAS, NOMBRE
FROM FACTURAS@SITIO2 F, SUCURSALES@SITIO2 S

WHERE F.SUCURSAL = S.CODIGO


AND TO_CHAR (FECHA, MMYYYY) = &DATO
GROUP BY NOMBRE;
CREATE VIEW VENTAS_SUCURSAL
AS
SELECT SUM (VALOR) AS VENTAS, NOMBRE
FROM FACTURAS F, SUCURSALES S
WHERE F.SUCURSAL = S.CODIGO
AND TO_CHAR (FECHA, MMYYYY) = &DATO
GROUP BY NOMBRE
UNION
SELECT SUM (VALOR) AS VENTAS, NOMBRE
FROM FACTURAS@SITIO2 F, SUCURSALES@SITIO2 S
WHERE F.SUCURSAL = S.CODIGO
AND TO_CHAR (FECHA, MMYYYY) = &DATO
GROUP BY NOMBRE;
2.- SELECT COUNT(*) CLIENTES
FROM CLIENTES;
CREATE VIEW TOTAL_CLIENTES
AS
SELECT COUNT(*) CLIENTES
FROM CLIENTES;
CONTADOR:
1.- SELECT COUNT(*) AS NUMERO, SUM (VALOR) AS TOTAL, NOMBRE
FROM FACTURAS F, SUCURSALES S
GROUP BY NOMBRE;
EQUIVALENTE EN EL SISTEMA DISTRIBUIDO:
SELECT COUNT(*) AS NUMERO, SUM (VALOR) AS TOTAL, NOMBRE
FROM FACTURAS F, SUCURSALES S
GROUP BY NOMBRE
UNION
SELECT COUNT(*) AS NUMERO, SUM (VALOR) AS TOTAL, NOMBRE
FROM FACTURAS@SITIO2 F, SUCURSALES@SITIO2 S
GROUP BY NOMBRE;
CREATE VIEW TOTAL_FACTURAS
AS
SELECT COUNT(*) AS NUMERO, SUM (VALOR) AS TOTAL, NOMBRE
FROM FACTURAS F, SUCURSALES S
GROUP BY NOMBRE
UNION
SELECT COUNT(*) AS NUMERO, SUM (VALOR) AS TOTAL, NOMBRE

FROM FACTURAS@SITIO2 F, SUCURSALES@SITIO2 S


GROUP BY NOMBRE;
2.- SELECT DESCRIPCION, FABRICANTE
FROM PRODUCTOS
ORDER BY DESCRIPCION;
EQUIVALENTE EN EL SISTEMA DISTRIBUIDO:
SELECT DESCRIPCION, FABRICANTE
FROM F1_PRODUCTOS F1, F2_PRODUCTOS F2
WHERE F1.CODIGOP = F2.CODIGOP
ORDER BY DESCRIPCION;
CREATE VIEW FABRICANTES AS
SELECT DESCRIPCION, FABRICANTE
FROM F1_PRODUCTOS F1, F2_PRODUCTOS F2
WHERE F1.CODIGOP = F2.CODIGOP
ORDER BY DESCRIPCION;
BODEGUEROS:
1.- SELECT DESCRIPCION, STOCK, NOMBRE, 0 STOCK1, NOMBRE1
FROM F2_PRODUCTOS, SUCURSALES
UNION
SELECT DESCRIPCION, 0 STOCK, NOMBRE, STOCK STOCK1, NOMBRE
NOMBRE1
FROM F2_PRODUCTOS@SITIO2, SUCURSALES@SITIO2;
CREATE TABLE T_STOCKS
(CODIGOP NUMBER,
DESCRIPCION CHAR (40) PRIMARY KEY,
STOCK1 NUMBER (10, 2),
STOCK2 NUMBER (10, 2))
CREATE OR REPLACE PROCEDURE STOCKS
AS
CURSOR A1 IS
SELECT CODIGOP, DESCRIPCION, STOCK
FROM F2_PRODUCTOS;
CURSOR A2 IS
SELECT CODIGOP, DESCRIPCION, STOCK
FROM F2_PRODUCTOS@SITIO2;
X A1%ROWTYPE;
BEGIN
DELETE T_STOCKS;
COMMIT;
FOR X IN A1 LOOP
INSERT INTO T_STOCKS

(CODIGOP, DESCRIPCION, STOCK1) VALUES


(X.CODIGOP, X.DESCRIPCION, X.STOCK);
END LOOP;
FOR X IN A2 LOOP
UPDATE T_STOCKS
SET STOCK2 = X.STOCK
WHERE DESCRIPCION = X.DESCRIPCION;
END LOOP;
COMMIT;
END;
.
/
2.- Ingreso de datos de productos.
Se utiliza la vista V_PRODUCTOS.
INSERT INTO V_PRODUCTOS VALUES
(S, 1, XX,YY,DESCRI, 20);
INSERT INTO V_PRODUCTOS VALUES
(N, 1, XX,YY,DESCRI, 10);
Actualizacin de stock de productos:
UPDATE F2_PRODUCTOS
SET STOCK = NUEVO_STOCK
WHERE CODIGOP = &DATO;
Para una sucursal remota:
UPDATE F2_PRODUCTOS@SITIO2
SET STOCK = NUEVO_STOCK
WHERE CODIGOP = &DATO;
BOTON ACTUALIZAR:
DECLARE
CODIGO NUMBER;
CURSOR C1 IS
SELECT 1 FROM F2_PRODUCTOS
WHERE CODIGOP = :F2_PRODUCTOS.CODIGOP;
X NUMBER;
NO_HAY EXCEPTION;
BEGIN
IF :F2_PRODUCTOS.STOCK <> 0 THEN

OPEN C1;
FETCH C1 INTO X;
IF X <> 0 THEN
UPDATE F2_PRODUCTOS
SET STOCK = :F2_PRODUCTOS.STOCK
WHERE CODIGOP = :F2_PRODUCTOS.CODIGOP;
COMMIT;
MESSAGE ('STOCK ACTUALIZADO');
ELSE
RAISE NO_HAY;
END IF;
END IF;
EXCEPTION
WHEN NO_HAY THEN
RAISE FORM_TRIGGER_FAILURE;
END;
BOTON OTRO:
BEGIN
GO_BLOCK ('F2_PRODUCTOS');
GO_ITEM ('F2_PRODUCTOS.CODIGOP');
:F2_PRODUCTOS.CODIGOP := '';
:F2_PRODUCTOS.DESCRIPCION := '';
:F2_PRODUCTOS.STOCK := '';
END;
BOTON SALIR:
BEGIN
CLOSE_FORM('MODULE1');
END;
ITEM CODIGOP WHEN_VALIDATE_ITEM:
DECLARE
NO_HAY EXCEPTION;
X NUMBER;
BEGIN
SELECT COUNT(*)INTO X
FROM F2_PRODUCTOS
WHERE CODIGOP = :F2_PRODUCTOS.CODIGOP;
IF X <> 0 THEN
SELECT DESCRIPCION, STOCK INTO
:F2_PRODUCTOS.DESCRIPCION, :F2_PRODUCTOS.STOCK
FROM F2_PRODUCTOS
WHERE CODIGOP = :F2_PRODUCTOS.CODIGOP;
ELSE
MESSAGE ('NO HAY ESTE PRODUCTO');
GO_BLOCK ('BOTONES');

END IF;
EXCEPTION
WHEN NO_HAY THEN
GO_BLOCK ('BOTONES');
WHEN OTHERS THEN
RAISE FORM_TRIGGER_FAILURE;
GO_BLOCK ('BOTONES');
END;
VENDEDORES.
FORMULARIO PARA INGRESO DE FACTURAS Y VENTAS
-- FACTURAS WHEN-NEW-BLOCK-INSTANCE
BEGIN
SELECT SYSDATE INTO :FACTURAS.FECHA
FROM DUAL;
END;
/* POST-TEXT-ITEM EN VENTAS.PRODUCTO */
DECLARE
K INTEGER;
CURSOR C1 IS
SELECT 1
FROM F2_PRODUCTOS
WHERE CODIGOP =
:VENTAS.PRODUCTO;
NOEXISTE EXCEPTION;
BEGIN
OPEN C1;
FETCH C1 INTO K;
IF K IS NOT NULL THEN
SELECT DESCRIPCION INTO :VENTAS.DESCRIPCION
FROM F2_PRODUCTOS
WHERE CODIGOP =
:VENTAS.PRODUCTO;
:GLOBAL.SI := 'S';
ELSE
-MESSAGE ('DEBE INGRESAR UN CODIGO');
:GLOBAL.SI := '';
END IF;
CLOSE C1;
IF :GLOBAL.SI IS NULL
AND :VENTAS.PRODUCTO IS NOT NULL THEN
:VENTAS.PRODUCTO := '';
RAISE NOEXISTE;
END IF;

EXCEPTION
WHEN NOEXISTE THEN
MESSAGE ('ESTE PRODUCTO NO EXISTE, VERIFIQUE');
RAISE FORM_TRIGGER_FAILURE;
END;

-- BOTON ACEPTAR WHEN-BUTTON-PRESSED


DECLARE
K INTEGER := 0;
NCOMPROB CHAR (10);
MORDINAL INTEGER;
SINNUMERO EXCEPTION;
FALTANDATOS EXCEPTION;
BEGIN
IF :FACTURAS.NUMERO IS NOT NULL THEN
NCOMPROB := RTRIM(:FACTURAS.SUCURSAL) ||
RTRIM(:FACTURAS.NUMERO);
ELSE
K := 1;
RAISE SINNUMERO;
END IF;
IF :FACTURAS.FECHA IS NULL THEN
:FACTURAS.FECHA := SYSDATE;
END IF;
IF K = 0 THEN
GO_BLOCK ('VENTAS');
FIRST_RECORD;
MORDINAL := 1;
WHILE :VENTAS.PRODUCTO IS NOT NULL LOOP
IF :VENTAS.PRECIO IS NULL OR :VENTAS.CANTIDAD IS
NULL THEN
MESSAGE ('FALTAN VALORES REVISE');
RAISE FALTANDATOS;
END IF;
/*
NUMERO
FECHA
VALOR
CLIENTE
SUCURSAL
CANTIDAD
PRECIO
PRODUCTO
*/
INSERT INTO TODAS_VENTAS

(
NUMERO,
FECHA
,
VALOR
,
CLIENTE
,
SUCURSAL
,
CANTIDAD
,
PRECIO
,
PRODUCTO)
VALUES
(
NCOMPROB,
:FACTURAS.FECHA ,
:FACTURAS.VALOR ,
:FACTURAS.CLIENTE ,
RTRIM(:FACTURAS.SUCURSAL) ,
:VENTAS.CANTIDAD ,
:VENTAS.PRECIO ,
:VENTAS.PRODUCTO );
NEXT_RECORD;
MORDINAL := MORDINAL + 1;
END LOOP;
COMMIT;
ELSE
-MESSAGE ('OTROS ERRORES, VERIFIQUE');
RAISE FORM_TRIGGER_FAILURE;
END IF;
EXCEPTION
WHEN SINNUMERO THEN
MESSAGE ('FALTA NUMERO DE COMPROBANTE');
GO_BLOCK ('FACTURAS');
GO_ITEM ('FACTURAS.NUMERO');
RAISE FORM_TRIGGER_FAILURE;
WHEN FALTANDATOS THEN
MESSAGE ('FALTAN DATOS');
GO_BLOCK ('VENTAS');
GO_ITEM ('VENTAS.PRODUCTO');
RAISE FORM_TRIGGER_FAILURE;
WHEN OTHERS THEN
MESSAGE ('HAY ERRORES');
RAISE FORM_TRIGGER_FAILURE;
END;
-- BOTON SALIR WHEN-BUTTON-PRESED
EXIT_FORM;

SPTIMA PARTE.
REPLICACION BIDIRECCIONAL.
SITIO SRV1 (SITIO 1).
CREATE TABLE PROMOCIONES
(CODIGOP NUMBER PRIMARY KEY,
DESCRIPCION CHAR (40),
STOCK NUMBER (10, 2),
FECHAINICIAL DATE,
FECHAFINAL DATE);
SITIO SRV2 (SITIO 2).
CREATE TABLE PROMOCIONES
(CODIGOP NUMBER PRIMARY KEY,
DESCRIPCION CHAR (40),
STOCK NUMBER (10, 2),
FECHAINICIAL DATE,
FECHAFINAL DATE);
SITIO SRV1 (SITIO 1).
CREATE OR REPLACE TRIGGER T_PROMOCIONES
AFTER INSERT ON PROMOCIONES
FOR EACH ROW
DECLARE
CURSOR C1 IS
SELECT 1 FROM PROMOCIONES@SITIO2
WHERE CODIGOP = :NEW.CODIGOP;
X C1%ROWTYPE;
BEGIN
OPEN C1;
FETCH C1 INTO X;
IF C1%NOTFOUND THEN
INSERT INTO PROMOCIONES@SITIO2
VALUES
(:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK,
:NEW.FECHAINICIAL, :NEW.FECHAFINAL);
CLOSE C1;
END IF;
END;
.
/
INSERT INTO PROMOCIONES VALUES
(1, DESCRI,27,SYSDATE + 10, SYSDATE +20);

SITIO SRV2 (SITIO 2).


CREATE OR REPLACE TRIGGER T_PROMOCIONES
AFTER INSERT ON PROMOCIONES
FOR EACH ROW
DECLARE
CURSOR C1 IS
SELECT 1 FROM PROMOCIONES@SITIO1
WHERE CODIGOP = :NEW.CODIGOP;
X C1%ROWTYPE;
BEGIN
OPEN C1;
FETCH C1 INTO X;
IF C1%NOTFOUND THEN
INSERT INTO PROMOCIONES@SITIO1
VALUES
(:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK,
:NEW.FECHAINICIAL, :NEW.FECHAFINAL);
CLOSE C1;
END IF;
END;
.
/
INSERT INTO PROMOCIONES VALUES
(2, DESCRI,27,SYSDATE + 10, SYSDATE +20);

Вам также может понравиться