Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Consulta de Acces-->SQL Server.

Estas en el tema de Consulta de Acces-->SQL Server. en el foro de SQL Server en Foros del Web. Hola, tengo una consulta de Acces que debo pasar a SQL Server. Creo que es el SQL Server 7, pero no estoy seguro. El problema ...
  #1 (permalink)  
Antiguo 02/08/2006, 00:07
 
Fecha de Ingreso: marzo-2006
Mensajes: 29
Antigüedad: 18 años, 1 mes
Puntos: 0
Consulta de Acces-->SQL Server.

Hola, tengo una consulta de Acces que debo pasar a SQL Server. Creo que es el SQL Server 7, pero no estoy seguro.

El problema viene en que en la consulta Acces toma como origen de datos dos subconsultas relacionadas entre si, y esas consultas cogen valores de un formulario.

En SQL Server lo unico que se me ha ocurrido es usar dos procedimientos almacenados con parametros de entrada.

Hasta aqui mas o menos bien, pero el problema viene cuando quiero relacionar las dos consultas, ya que me parece que SQL Server no lo permite.

Seria algo asi: "Consulta1 inner join Consulta2 on Consulta1.PK=Consulta2.PK".
O mejor dicho "StoreProcedure1 inner join StoreProcedure2 on StoreProcedure1.PK=StoreProcedure2.PK"

Ademas, esta ultima consulta o procedimiento, debe ser un origen de datos para un informe de Crystal Reports 8, por lo que la cosa se complica todavia un poco mas.
  #2 (permalink)  
Antiguo 02/08/2006, 07:08
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
Cuando dices: Consulta1 inner join Consulta2 on Consulta1.PK=Consulta2.PK a que te refieres?????
  #3 (permalink)  
Antiguo 02/08/2006, 07:34
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
No requieres hacer un sp para cada una de las consultas que pretendes unir... si posteas la estructura de las tablas y el resultado que deseas aca te ayudaremos a construir la consulta origen del reporte Crystal.

un saludo
  #4 (permalink)  
Antiguo 02/08/2006, 16:38
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Pues hacerlo
1) creando un VIEW de cada consulta.
2) usando tablas temporales
3) usando subquerys
4) usando UDFs (user defined functions)

El cual conviene más depende de tus gustos y las necesidades de tu programa. En general usar VIEWS es lo más sencillo, aunque no es recomendable crear vistas para un solo query y que no reciben parámetros.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #5 (permalink)  
Antiguo 03/08/2006, 00:17
 
Fecha de Ingreso: marzo-2006
Mensajes: 29
Antigüedad: 18 años, 1 mes
Puntos: 0
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.
  #6 (permalink)  
Antiguo 03/08/2006, 14:07
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
El filtro por fecha lo deberías hacer directamente en el SP, no en las vistas, a menos que busques que el filtro sea fijo siempre.

No veo que pueda tener mal, sin los datos para las pruebas pertinentes no podemos hacer mucho en ese aspecto, aunque diría que probablemente sea la forma en que haces un join en algún punto.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:43.