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

[SOLUCIONADO] Procedimiento almacenado en SQL con Acumulados

Estas en el tema de Procedimiento almacenado en SQL con Acumulados en el foro de SQL Server en Foros del Web. Hola a todos: otra ves sufriendo con consultas ahora lo que pretendo hacer es un procedimiento almacenado que me permita hacer un Update para agregar ...
  #1 (permalink)  
Antiguo 20/05/2013, 10:47
Avatar de aid_val  
Fecha de Ingreso: mayo-2013
Ubicación: Guanajuato
Mensajes: 302
Antigüedad: 11 años
Puntos: 5
Pregunta Procedimiento almacenado en SQL con Acumulados

Hola a todos: otra ves sufriendo con consultas

ahora lo que pretendo hacer es un procedimiento almacenado que me permita hacer un Update para agregar acumulados en mi tabla.

este es mi procedimiento almacenado
Código SQL:
Ver original
  1. CREATE PROCEDURE [dbo].[PA_MODIFICAR_CANTIDAD]
  2. @ID_RESUMEN_GENERADOR BIGINT,
  3. @ID_CONCEPTO BIGINT,
  4. @CANTIDAD_ESTIMACION DECIMAL(18,4)
  5. AS
  6. DECLARE @ACUMULADO_ESTIMACION_ATERIOR DECIMAL(18,4),
  7. @ACUMULADO_ESTIMACION DECIMAL(18,4),
  8. @CANTIDAD_FALTANTE DECIMAL(18,4)
  9.  
  10. BEGIN try
  11. BEGIN tran
  12.  
  13. SET @ACUMULADO_ESTIMACION  =(SELECT a.ID_RESUMEN_GENERADOR, a.CANTIDAD_ESTIMACION, SUM(b.CANTIDAD_ESTIMACION) FROM resumen_generador  a CROSS JOIN resumen_generador  b WHERE (b.id_resumen_generador <= a.id_resumen_generador AND A.id_concepto=@ID_CONCEPTO )GROUP BY a.id_resumen_generador ,a.cantidad_estimacion ORDER BY a.id_resumen_generador ,a.cantidad_estimacion )
  14. SET @ACUMULADO_ESTIMACION_ATERIOR =(SELECT a.ID_RESUMEN_GENERADOR,       a.CANTIDAD_ESTIMACION,       SUM(b.CANTIDAD_ESTIMACION) -(MAX(a.CANTIDAD_ESTIMACION) ) FROM resumen_generador  a CROSS JOIN resumen_generador  b WHERE (b.id_resumen_generador <= a.id_resumen_generador AND A.id_concepto=@ID_CONCEPTO )GROUP BY a.id_resumen_generador ,a.cantidad_estimacion ORDER BY a.id_resumen_generador ,a.cantidad_estimacion )
  15. SET @CANTIDAD_FALTANTE =((SELECT CANTIDAD_PRESUPUESTO FROM ConceptoPresu WHERE id_concepto = @ID_CONCEPTO)-@ACUMULADO_ESTIMACION )
  16.  
  17. UPDATE resumen_generador SET @CANTIDAD_ESTIMACION=CANTIDAD_ESTIMACION,
  18.                              @ACUMULADO_ESTIMACION_ATERIOR  = CANTIDAD_ACUMULADA_ANTERIOR,
  19.                              @ACUMULADO_ESTIMACION = CANTIDAD_ACUMULADA_ESTIMACION,
  20.                              @CANTIDAD_FALTANTE = CANTIDAD_FALTANTE
  21.                              WHERE id_resumen_generador=@ID_RESUMEN_GENERADOR
  22.            
  23. COMMIT
  24. END TRY
  25. BEGIN CATCH
  26.     ROLLBACK
  27.     PRINT error_message()
  28. END CATCH

Pero me manda un error y la verdad no se por qué sea.
La cláusula ORDER BY no es válida en vistas, funciones insertadas, tablas derivadas, subconsultas ni expresiones de tabla común, salvo que se especifique también TOP o FOR XML.

De ante mano muchas gracias

Última edición por gnzsoloyo; 20/05/2013 a las 10:56 Razón: SQL sin etiquetar. Usar HIGHLIGHT "SQL"
  #2 (permalink)  
Antiguo 20/05/2013, 10:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Procedimiento almacenado en SQL con Acumulados

a ver vamos por partes:

1.-No puedes asignar un conjunto de valores a una variable(a menos que sea una variable de tipo tabla) deberias de asginarlo algo asi:

select @valor=valor from (consulta)


2.-En el update, traes los valores pero tendrias que hacerlo de esta manera:
Código SQL:
Ver original
  1. UPDATE resumen_generador
  2. SET
  3.  CANTIDAD_ESTIMACION=@CANTIDAD_ESTIMACION,
  4. ACUMULADO_ESTIMACION_ATERIOR = @CANTIDAD_ACUMULADA_ANTERIOR,
  5. ACUMULADO_ESTIMACION = @CANTIDAD_ACUMULADA_ESTIMACION,
  6. CANTIDAD_FALTANTE = @CANTIDAD_FALTANTE
  7. WHERE id_resumen_generador=@ID_RESUMEN_GENERADOR

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por gnzsoloyo; 20/05/2013 a las 10:57 Razón: SQL sin etiquetar. Usar HIGHLIGHT "SQL"
  #3 (permalink)  
Antiguo 20/05/2013, 11:33
Avatar de aid_val  
Fecha de Ingreso: mayo-2013
Ubicación: Guanajuato
Mensajes: 302
Antigüedad: 11 años
Puntos: 5
Respuesta: Procedimiento almacenado en SQL con Acumulados

Cita:
Iniciado por Libras Ver Mensaje
a ver vamos por partes:

1.-No puedes asignar un conjunto de valores a una variable(a menos que sea una variable de tipo tabla) deberias de asginarlo algo asi:

select @valor=valor from (consulta)


2.-En el update, traes los valores pero tendrias que hacerlo de esta manera:
Código SQL:
Ver original
  1. UPDATE resumen_generador
  2. SET
  3.  CANTIDAD_ESTIMACION=@CANTIDAD_ESTIMACION,
  4. ACUMULADO_ESTIMACION_ATERIOR = @CANTIDAD_ACUMULADA_ANTERIOR,
  5. ACUMULADO_ESTIMACION = @CANTIDAD_ACUMULADA_ESTIMACION,
  6. CANTIDAD_FALTANTE = @CANTIDAD_FALTANTE
  7. WHERE id_resumen_generador=@ID_RESUMEN_GENERADOR

saludos!
y por ejemplo si en mi select solo le pongo mi sum

Última edición por aid_val; 20/05/2013 a las 11:38 Razón: me equivoqe
  #4 (permalink)  
Antiguo 20/05/2013, 11:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Procedimiento almacenado en SQL con Acumulados

si que no puedes asignar a una variable mas de un valor por ejemplo

Código SQL:
Ver original
  1. DECLARE @variable VARCHAR(20)
  2.  
  3. SET @variable=(SELECT SUM(1) AS total,server_name FROM #results WHERE server_name='FNTRIPLV' GROUP BY server_name ORDER BY server_name)
  4.  
  5. me marca este error:
  6.  
  7. Msg 1033, Level 15, State 1, Line 3
  8. The ORDER BY clause IS invalid IN views, inline functions, derived TABLES, subqueries, AND common TABLE expressions, unless TOP OR FOR XML IS also specified.
  9.  
  10. quito el ORDER BY de la consulta:
  11.  
  12. DECLARE @variable VARCHAR(20)
  13.  
  14. SET @variable=(SELECT SUM(1) AS total,server_name FROM #results WHERE server_name='FNTRIPLV' GROUP BY server_name)
  15.  
  16. me marca el sig error
  17.  
  18. Msg 116, Level 16, State 1, Line 3
  19. ONLY one expression can be specified IN the SELECT list WHEN the subquery IS NOT introduced WITH EXISTS.
  20.  
  21. que es lo que se tiene que hacer, lo siguiente:
  22.  
  23. DECLARE @variable VARCHAR(20)
  24.  
  25. SET @variable=(SELECT SUM(1) AS total FROM #results WHERE server_name='FNTRIPLV' GROUP BY server_name)

y asi tenemos el valor de la suma en la variable :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 20/05/2013, 12:03
Avatar de aid_val  
Fecha de Ingreso: mayo-2013
Ubicación: Guanajuato
Mensajes: 302
Antigüedad: 11 años
Puntos: 5
Respuesta: Procedimiento almacenado en SQL con Acumulados

a Ok muchas gracias ahora intentare ejecutarlo haber si me funciona.

Cita:
Iniciado por Libras Ver Mensaje
si que no puedes asignar a una variable mas de un valor por ejemplo

Código SQL:
Ver original
  1. DECLARE @variable VARCHAR(20)
  2.  
  3. SET @variable=(SELECT SUM(1) AS total,server_name FROM #results WHERE server_name='FNTRIPLV' GROUP BY server_name ORDER BY server_name)
  4.  
  5. me marca este error:
  6.  
  7. Msg 1033, Level 15, State 1, Line 3
  8. The ORDER BY clause IS invalid IN views, inline functions, derived TABLES, subqueries, AND common TABLE expressions, unless TOP OR FOR XML IS also specified.
  9.  
  10. quito el ORDER BY de la consulta:
  11.  
  12. DECLARE @variable VARCHAR(20)
  13.  
  14. SET @variable=(SELECT SUM(1) AS total,server_name FROM #results WHERE server_name='FNTRIPLV' GROUP BY server_name)
  15.  
  16. me marca el sig error
  17.  
  18. Msg 116, Level 16, State 1, Line 3
  19. ONLY one expression can be specified IN the SELECT list WHEN the subquery IS NOT introduced WITH EXISTS.
  20.  
  21. que es lo que se tiene que hacer, lo siguiente:
  22.  
  23. DECLARE @variable VARCHAR(20)
  24.  
  25. SET @variable=(SELECT SUM(1) AS total FROM #results WHERE server_name='FNTRIPLV' GROUP BY server_name)

y asi tenemos el valor de la suma en la variable :)

saludos!
  #6 (permalink)  
Antiguo 20/05/2013, 12:35
Avatar de aid_val  
Fecha de Ingreso: mayo-2013
Ubicación: Guanajuato
Mensajes: 302
Antigüedad: 11 años
Puntos: 5
Respuesta: Procedimiento almacenado en SQL con Acumulados

Los he ejecutado pero no me funciono no me manda ningun error.
Cita:
Iniciado por Libras Ver Mensaje
si que no puedes asignar a una variable mas de un valor por ejemplo

Código SQL:
Ver original
  1. DECLARE @variable VARCHAR(20)
  2.  
  3. SET @variable=(SELECT SUM(1) AS total,server_name FROM #results WHERE server_name='FNTRIPLV' GROUP BY server_name ORDER BY server_name)
  4.  
  5. me marca este error:
  6.  
  7. Msg 1033, Level 15, State 1, Line 3
  8. The ORDER BY clause IS invalid IN views, inline functions, derived TABLES, subqueries, AND common TABLE expressions, unless TOP OR FOR XML IS also specified.
  9.  
  10. quito el ORDER BY de la consulta:
  11.  
  12. DECLARE @variable VARCHAR(20)
  13.  
  14. SET @variable=(SELECT SUM(1) AS total,server_name FROM #results WHERE server_name='FNTRIPLV' GROUP BY server_name)
  15.  
  16. me marca el sig error
  17.  
  18. Msg 116, Level 16, State 1, Line 3
  19. ONLY one expression can be specified IN the SELECT list WHEN the subquery IS NOT introduced WITH EXISTS.
  20.  
  21. que es lo que se tiene que hacer, lo siguiente:
  22.  
  23. DECLARE @variable VARCHAR(20)
  24.  
  25. SET @variable=(SELECT SUM(1) AS total FROM #results WHERE server_name='FNTRIPLV' GROUP BY server_name)

y asi tenemos el valor de la suma en la variable :)

saludos!
  #7 (permalink)  
Antiguo 20/05/2013, 12:49
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Procedimiento almacenado en SQL con Acumulados

no marca error vamos de gane, como dejaste tu codigo??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 20/05/2013, 13:45
Avatar de aid_val  
Fecha de Ingreso: mayo-2013
Ubicación: Guanajuato
Mensajes: 302
Antigüedad: 11 años
Puntos: 5
Respuesta: Procedimiento almacenado en SQL con Acumulados

Cita:
Iniciado por Libras Ver Mensaje
no marca error vamos de gane, como dejaste tu codigo??
Lo he dejado asi pero cuando executo el procedimiento almqacenado me dice la fila afectada pero lo consulto y no me manda ninguna modificacion

Código SQL:
Ver original
  1. ALTER PROCEDURE [dbo].[PA_MODIFICAR_CANTIDAD]
  2. @CANTIDAD_ESTIMACION DECIMAL(18,4),
  3. @ID_RESUMEN_GENERADOR BIGINT,
  4. @ID_CONCEPTO BIGINT
  5.  
  6. AS
  7. DECLARE
  8. @ACUMULADO_ESTIMACION_ATERIOR DECIMAL(18,4),
  9. @ACUMULADO_ESTIMACION DECIMAL(18,4),
  10. @CANTIDAD_FALTANTE DECIMAL(18,4)
  11.  
  12. BEGIN try
  13. BEGIN tran
  14. SELECT @ACUMULADO_ESTIMACION  = SUM(b.CANTIDAD_ESTIMACION) FROM resumen_generador  a CROSS JOIN resumen_generador  b WHERE (b.id_resumen_generador <= a.id_resumen_generador AND A.id_concepto=@ID_CONCEPTO )GROUP BY a.id_resumen_generador ,a.cantidad_estimacion ORDER BY a.id_resumen_generador ,a.cantidad_estimacion
  15. SELECT  @ACUMULADO_ESTIMACION_ATERIOR = (SUM(b.CANTIDAD_ESTIMACION) -(MAX(a.CANTIDAD_ESTIMACION)) ) FROM resumen_generador  a CROSS JOIN resumen_generador  b WHERE (b.id_resumen_generador <= a.id_resumen_generador AND A.id_concepto=@ID_CONCEPTO )GROUP BY a.id_resumen_generador ,a.cantidad_estimacion ORDER BY a.id_resumen_generador ,a.cantidad_estimacion
  16. SET @CANTIDAD_FALTANTE =( SELECT CANTIDAD_PRESUPUESTO FROM ConceptoPresu WHERE id_concepto = @ID_CONCEPTO)-@ACUMULADO_ESTIMACION
  17.  
  18. UPDATE resumen_generador SET @CANTIDAD_ESTIMACION=CANTIDAD_ESTIMACION,
  19.                              @ACUMULADO_ESTIMACION_ATERIOR  = CANTIDAD_ACUMULADA_ANTERIOR,
  20.                              @ACUMULADO_ESTIMACION = CANTIDAD_ACUMULADA_ESTIMACION,
  21.                              @CANTIDAD_FALTANTE = CANTIDAD_FALTANTE
  22.                              WHERE id_resumen_generador=@ID_RESUMEN_GENERADOR
  23.            
  24. COMMIT
  25. END TRY
  26. BEGIN CATCH
  27.     ROLLBACK
  28.     PRINT error_message()
  29. END CATCH
  30.  
  31.  
  32. SELECT * FROM estimaciones
  33. SELECT * FROM resumen_generador
  34. SELECT @ACUMULADO_ESTIMACION  = SUM(b.CANTIDAD_ESTIMACION)
  35. FROM resumen_generador  a CROSS JOIN resumen_generador  b
  36. WHERE (b.id_resumen_generador <= a.id_resumen_generador AND A.id_concepto=4 )GROUP BY a.id_resumen_generador ,a.cantidad_estimacion ORDER BY a.id_resumen_generador ,a.cantidad_estimacion

Última edición por gnzsoloyo; 20/05/2013 a las 20:00 Razón: SQL sin etiquetar. USAR HIGHLIGHT "SQL".
  #9 (permalink)  
Antiguo 20/05/2013, 15:40
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Procedimiento almacenado en SQL con Acumulados

como ejecutas tu procedure?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 20/05/2013, 15:43
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Procedimiento almacenado en SQL con Acumulados

¿No deberian tus SET quedar asi?

Código SQL:
Ver original
  1. UPDATE resumen_generador SET CANTIDAD_ESTIMACION = @CANTIDAD_ESTIMACION,
  2. CANTIDAD_ACUMULADA_ANTERIOR = @ACUMULADO_ESTIMACION_ATERIOR,
  3. CANTIDAD_ACUMULADA_ESTIMACION = @ACUMULADO_ESTIMACION,
  4. CANTIDAD_FALTANTE = @CANTIDAD_FALTANTE
  5. WHERE id_resumen_generador=@ID_RESUMEN_GENERADOR
__________________
MCTS Isaias Islas
  #11 (permalink)  
Antiguo 20/05/2013, 15:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Procedimiento almacenado en SQL con Acumulados

Cita:
Iniciado por iislas Ver Mensaje
¿No deberian tus SET quedar asi?

Código SQL:
Ver original
  1. UPDATE resumen_generador SET CANTIDAD_ESTIMACION = @CANTIDAD_ESTIMACION,
  2. CANTIDAD_ACUMULADA_ANTERIOR = @ACUMULADO_ESTIMACION_ATERIOR,
  3. CANTIDAD_ACUMULADA_ESTIMACION = @ACUMULADO_ESTIMACION,
  4. CANTIDAD_FALTANTE = @CANTIDAD_FALTANTE
  5. WHERE id_resumen_generador=@ID_RESUMEN_GENERADOR
muy buena observacion amigo iislas
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 21/05/2013, 10:43
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Procedimiento almacenado en SQL con Acumulados

XD....................a veces requiero de mucha paciencia.....
__________________
MCTS Isaias Islas
  #13 (permalink)  
Antiguo 21/05/2013, 13:22
Avatar de aid_val  
Fecha de Ingreso: mayo-2013
Ubicación: Guanajuato
Mensajes: 302
Antigüedad: 11 años
Puntos: 5
Respuesta: Procedimiento almacenado en SQL con Acumulados

Cita:
Iniciado por iislas Ver Mensaje
¿No deberian tus SET quedar asi?

Código SQL:
Ver original
  1. UPDATE resumen_generador SET CANTIDAD_ESTIMACION = @CANTIDAD_ESTIMACION,
  2. CANTIDAD_ACUMULADA_ANTERIOR = @ACUMULADO_ESTIMACION_ATERIOR,
  3. CANTIDAD_ACUMULADA_ESTIMACION = @ACUMULADO_ESTIMACION,
  4. CANTIDAD_FALTANTE = @CANTIDAD_FALTANTE
  5. WHERE id_resumen_generador=@ID_RESUMEN_GENERADOR
Muchas gracias esto es lo que me ayudo..Saludos

Etiquetas: almacenado, funcion, insert, procedimiento, select, sql, tabla
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 12:22.