Código:
R2 = Sigma(Pedidos.Cod_art = Articulos.Cod_art)(PEDIDOS x R1)
En esta parte en concreto que significa el . entre medias y por qué hay un igual y un símbolo de multiplicar
No comprendo lo que significa.
El símbolo de multiplicar es igual que lo que habías puesto tú pero tú has usado un asterisco (*) y yo he usado una x. Es un producto cartesiano, es decir, que el resultado de hacer un producto entre dos tablas es una tabla nueva en la que relacionas cada fila de la primera tabla con cada fila de la segunda tabla.
Tabla 1:
a1 a2
a3 a4
Tabla 2:
b1 b2
b3 b4
Resultado de Tabla1 x Tabla2:
a1 a2 b1 b2
a1 a2 b3 b4
a3 a4 b1 b2
a3 a4 b3 b4
Lo que queremos con eso es juntar en una misma fila los campos de la tabla Pedidos con los campos de la tabla Artículos. Pero si tenemos la siguiente situación:
PEDIDOS (#Cod_prov, #Cod_art, Cantidad):
P1 A1 5
P1 A2 8
P2 A1 3
P2 A3 1
ARTICULOS (#Cod_art, Nombre, Color):
A1 NombreA1 Rojo
A2 NombreA2 Verde
A3 NombreA3 Azul
Si hacemos el producto de PEDIDOS x ARTICULOS sin más obtenemos:
P1 A1 5 A1 NombreA1 Rojo
P1 A1 5 A2 NombreA2 Verde
P1 A1 5 A3 NombreA3 Azul
P1 A2 8 A1 NombreA1 Rojo
P1 A2 8 A2 NombreA2 Verde
P1 A2 8 A3 NombreA3 Azul
P2 A1 3 A1 NombreA1 Rojo
P2 A1 3 A2 NombreA2 Verde
P2 A1 3 A3 NombreA3 Azul
P2 A3 1 A1 NombreA1 Rojo
P2 A3 1 A2 NombreA2 Verde
P2 A3 1 A3 NombreA3 Azul
Pero como puedes imaginar no tiene sentido juntar en (por ejemplo) la segunda fila un pedido del Artículo A1 con los datos del Artículo A2. Entonces de todas estas filas las únicas que tienen sentido son las que ambos códigos de artículo (tanto el de PEDIDOS como el de ARTICULOS) coincide. Para esto se usa el operador =. Queremos que el Cod_art de Pedidos sea igual al Cod_art de Artículos. Como ambos campos se llaman igual para diferenciar el de una tabla y el de la otra, se pone delante la tabla a la que pertenece.
R1 = Sigma(Pedidos.Cod_art = Articulos.Cod_art)(Pedidos x Articulos) da como resultado:
P1 A1 5 A1 NombreA1 Rojo
P1 A2 8 A2 NombreA2 Verde
P2 A1 3 A1 NombreA1 Rojo
P2 A3 1 A3 NombreA3 Azul
Entonces el proveedor P1 ha suministrado el artículo A1 que es rojo y el artículo A2 que es verde. El proveedor P2 ha suministrado el artículo A1 también que es rojo y el artículo A3 que es Azul. Pero no nos vale con saber el código del proveedor P1, P2,... sino que queremos su nombre.
Para tener el nombre de los proveedores tenemos que volver a "mezclar" las 4 filas de arriba con la tabla Proveedores que por ejemplo es:
PROVEEDORES(#Cod_prov, Nombre):
P1 NombreP1
P2 NombreP2
Y el resultado de hacer otro producto cartesiano entre PROVEEDORES x R1 (que es la tabla anterior) sin más sería:
P1 A1 5 A1 NombreA1 Rojo P1 NombreP1
P1 A1 5 A1 NombreA1 Rojo P2 NombreP2
P1 A2 8 A2 NombreA2 Verde P1 NombreP1
P1 A2 8 A2 NombreA2 Verde P2 NombreP2
P2 A1 3 A1 NombreA1 Rojo P1 NombreP1
P2 A1 3 A1 NombreA1 Rojo P2 NombreP2
P2 A3 1 A3 NombreA3 Azul P1 NombreP1
P2 A3 1 A3 NombreA3 Azul P2 NombreP2
Pero por lo mismo de antes, no tiene sentido juntar un pedido del proveedor P1 con los datos del proveedor P2 (cosa que pasa por ejemplo en la segunda fila). Para eso se vuelve a poner la condición de que los Cod_prov de cada uno sean iguales.
R2 = Sigma(R1.Cod_prov = Proveedor.Cod_prov)(R1 x Proveedor):
P1 A1 5 A1 NombreA1 Rojo P1 NombreP1
P1 A2 8 A2 NombreA2 Verde P1 NombreP1
P2 A1 3 A1 NombreA1 Rojo P2 NombreP2
P2 A3 1 A3 NombreA3 Azul P2 NombreP2
Ahora: Nombre de los proveedores que suministran artículos rojos. Pues de la tabla R2 que tenemos justo encima cogemos con Sigma() las filas cuyo Color es Verde (por ejemplo) y de ahí mostramos con PI() el Nombre del proveedor.
RFinal1 = PI(NombreProveedor)(Sigma(Color = 'Verde')(R2):
NombreP1
El proveedor con nombre NombreP1 es el único que suministra algún artículo Verde.
Hacemos lo mismo con el Rojo:
RFinal2 = PI(NombreProveedor)(Sigma(Color = 'Rojo')(R2):
NombreP1
NombreP2
Tanto el proveedor NombreP1 como NombreP2 suministran algún artículo de color Rojo.
Si queremos saber los que suministran artículos tanto de color Verde como Rojo hacemos la intersección de ambos, es decir, los nombres que estén tanto en RFinal1 como en RFinal2.
RFinal = RFinal1 INTERSECCION RFinal2:
NombreP1