Bien, me va a quedar un post tocho, pero voy a intentar poner toda la informacion posible:
Aqui las consultas originales de Acces:
Código:
SELECT RECEPCIONES.PRCOPR, [MAESTRO DE PROVEEDORES].[RAZON SOCIAL], Count(RECEPCIONES.PRCOPR) AS Lotes, Sum(IIf([CANTIDAD RECHAZADA]<>0,1,0)) AS [Lotes rechazados], Sum(IIf([CANTIDAD CON RESERVAS]<>0,1,0)) AS [Aceptados condicionales], 100-(([Lotes rechazados]+[Aceptados condicionales]/2)/[lotes]*100) AS Valoracion, Sum([CANTIDAD ACEPTADA]+[CANTIDAD RECHAZADA]+[CANTIDAD CON RESERVAS]) AS [cant servida], Sum(RECEPCIONES.[CANTIDAD RECHAZADA FAB]) AS [cant rechazada fab], ([cant rechazada fab]*1000000)/[cant servida] AS PPM
FROM RECEPCIONES INNER JOIN [MAESTRO DE PROVEEDORES] ON RECEPCIONES.PRCOPR = [MAESTRO DE PROVEEDORES].PRCOPR
WHERE (((RECEPCIONES.[FECHA RECEPCION]) Between IIf([Formularios]![EVALUACION DE PROVEEDORES]![FECHA INI] Is Null,#1/1/2000#,[Formularios]![EVALUACION DE PROVEEDORES]![FECHA INI]) And IIf([Formularios]![EVALUACION DE PROVEEDORES]![FECHA FIN] Is Null,#12/31/2050#,[Formularios]![EVALUACION DE PROVEEDORES]![FECHA FIN])) AND ((RECEPCIONES.ALBARAN) Is Not Null))
GROUP BY RECEPCIONES.PRCOPR, [MAESTRO DE PROVEEDORES].[RAZON SOCIAL]
HAVING (((RECEPCIONES.PRCOPR)=IIf([Formularios]![EVALUACION DE PROVEEDORES]![PROVEEDOR] Is Null,[RECEPCIONES]![PRCOPR],[Formularios]![EVALUACION DE PROVEEDORES]![PROVEEDOR])));
Código:
SELECT RECEPCIONES.PRCOPR, [MAESTRO DE PROVEEDORES].[RAZON SOCIAL], Count(RECEPCIONES.PRCOPR) AS Lotes, Sum(IIf([CANTIDAD RECHAZADA]<>0,1,0)) AS [Lotes rechazados], Sum(IIf([CANTIDAD CON RESERVAS]<>0,1,0)) AS [Aceptados condicionales], 100-(([Lotes rechazados]+[Aceptados condicionales]/2)/[lotes]*100) AS Valoracion, Sum([CANTIDAD ACEPTADA]+[CANTIDAD RECHAZADA]+[CANTIDAD CON RESERVAS]) AS [cant servida], Sum(RECEPCIONES.[CANTIDAD RECHAZADA FAB]) AS [cant rechazada fab], ([cant rechazada fab]*1000000)/[cant servida] AS PPM
FROM RECEPCIONES INNER JOIN [MAESTRO DE PROVEEDORES] ON RECEPCIONES.PRCOPR = [MAESTRO DE PROVEEDORES].PRCOPR
WHERE (((RECEPCIONES.[FECHA RECEPCION]) Between IIf([Formularios]![EVALUACION DE PROVEEDORES]![FECHA INI] Is Null,#1/1/2000#,[Formularios]![EVALUACION DE PROVEEDORES]![FECHA INI]) And IIf([Formularios]![EVALUACION DE PROVEEDORES]![FECHA FIN] Is Null,#12/31/2050#,[Formularios]![EVALUACION DE PROVEEDORES]![FECHA FIN])))
GROUP BY RECEPCIONES.PRCOPR, [MAESTRO DE PROVEEDORES].[RAZON SOCIAL]
HAVING (((RECEPCIONES.PRCOPR)=IIf([Formularios]![EVALUACION DE PROVEEDORES]![PROVEEDOR] Is Null,[RECEPCIONES]![PRCOPR],[Formularios]![EVALUACION DE PROVEEDORES]![PROVEEDOR])));
Y la que es origen de datos para el informe de Acces:
Código:
SELECT [inf ppm22].PRCOPR, [inf ppm22].[RAZON SOCIAL], [inf ppm22].Lotes, [inf ppm22].[Lotes rechazados], [inf ppm22].[Aceptados condicionales], [inf ppm22].Valoracion, [inf ppm33].[cant servida], [inf ppm33].[cant rechazada fab], [inf ppm33].PPM
FROM [inf ppm22] INNER JOIN [inf ppm33] ON [inf ppm22].PRCOPR = [inf ppm33].PRCOPR;
Y esto es lo que llevo desarrollado para SQL Server, he creado dos vistas y un SP que relaciona esas dos vistas, pero el resultado no es exactamente lo que busco:
Código:
SELECT RECEPCIONES.PRCOPR as [prcopr ppm2], [MAESTRO DE PROVEEDORES].[RAZON SOCIAL]
(Count(RECEPCIONES.PRCOPR)) AS Lotes,
(Sum(CASE WHEN [CANTIDAD RECHAZADA]<>0 THEN 1 ELSE 0 END)) AS [Lotes rechazados],
(Sum(CASE WHEN [CANTIDAD CON RESERVAS]<>0 THEN 1 ELSE 0 END)) AS [Aceptados condicionales],
100-(((Sum(CASE WHEN [CANTIDAD RECHAZADA]<>0 THEN 1 ELSE 0 END))+(Sum(CASE WHEN [CANTIDAD CON RESERVAS]<>0 THEN 1 ELSE 0 END))/CAST(2 AS FLOAT))/(Count(RECEPCIONES.PRCOPR))*100) AS Valoracion,
(SUM([CANTIDAD ACEPTADA]+[CANTIDAD RECHAZADA]+[CANTIDAD CON RESERVAS])) AS [cant servida],
(Sum(RECEPCIONES.[CANTIDAD RECHAZADA FAB])) AS [cant rechazada fab],
((Sum(RECEPCIONES.[CANTIDAD RECHAZADA FAB]))*1000000)/(SUM([CANTIDAD ACEPTADA]+[CANTIDAD RECHAZADA]+[CANTIDAD CON RESERVAS])) AS PPM
FROM RECEPCIONES INNER JOIN [MAESTRO DE PROVEEDORES] ON RECEPCIONES.PRCOPR = [MAESTRO DE PROVEEDORES].PRCOPR
where (NOT (dbo.RECEPCIONES.ALBARAN IS NULL))
GROUP BY RECEPCIONES.PRCOPR, [MAESTRO DE PROVEEDORES].[RAZON SOCIAL]
Código:
SELECT RECEPCIONES.PRCOPR, [MAESTRO DE PROVEEDORES].[RAZON SOCIAL],
(Count(RECEPCIONES.PRCOPR)) AS Lotes,
(Sum(CASE WHEN [CANTIDAD RECHAZADA]<>0 THEN 1 ELSE 0 END)) AS [Lotes rechazados],
(Sum(CASE WHEN [CANTIDAD CON RESERVAS]<>0 THEN 1 ELSE 0 END)) AS [Aceptados condicionales],
100-(((Sum(CASE WHEN [CANTIDAD RECHAZADA]<>0 THEN 1 ELSE 0 END))+(Sum(CASE WHEN [CANTIDAD CON RESERVAS]<>0 THEN 1 ELSE 0 END))/CAST(2 AS FLOAT))/(Count(RECEPCIONES.PRCOPR))*100) AS Valoracion,
(SUM([CANTIDAD ACEPTADA]+[CANTIDAD RECHAZADA]+[CANTIDAD CON RESERVAS])) AS [cant servida],
(Sum(RECEPCIONES.[CANTIDAD RECHAZADA FAB])) AS [cant rechazada fab],
((Sum(RECEPCIONES.[CANTIDAD RECHAZADA FAB]))*1000000)/(SUM([CANTIDAD ACEPTADA]+[CANTIDAD RECHAZADA]+[CANTIDAD CON RESERVAS])) AS PPM
FROM RECEPCIONES INNER JOIN [MAESTRO DE PROVEEDORES] ON RECEPCIONES.PRCOPR = [MAESTRO DE PROVEEDORES].PRCOPR
GROUP BY RECEPCIONES.PRCOPR, [MAESTRO DE PROVEEDORES].[RAZON SOCIAL]
Y el SP que me relaciona las dos vistas, con parametros:
Código:
CREATE PROCEDURE [ppm4] @proveedor varchar(10) as
select * from [vista ppm2] inner join [vista ppm3] on [vista ppm2].[prcopr ppm2]=[vista ppm3].prcopr
where [vista ppm2].[prcopr ppm2]=@proveedor
GO
Asi tal cual esta, funciona mas o menos bien, de hecho el SP me devuelve un solo registro, que es lo que tiene que hacer, pero si os fijais un poco, las consultas originales hacen un filtrado por fechas, y cuando le agrego los campos de fechas a las vistas y los filtro en el SP me devuelven muchisimos mas valores de los buscados, que solo tiene que ser uno.
Acabo de hacer unas pruebas en Acces, y efectivamente, cuando uso el filtrado por fechas me devuelve un solo registro.
El problema viene de las vistas, creo, ya que no agrupa correctamente por fechas.