on 09-16-2014 9:38 PM
Hola buenas tardes, estoy probando una consulta en sap y necesito saber como hago para crear una variable y que esta pueda ser ingresada por el usuario, les explico lo que pasa es que necesito que cuando el usuario abra la consulta digite el numero de dias intente de la siguiente forma:
declare @tp nvarchar(3)
set @tp = [%0]
pero no consigo que funcione, este es el codigo que tengo:
declare @tp NVARCHAR(3)
Set @tp = 120 "si lo dejo con valor fijo funciona de maravilla"
SELECT DISTINCT T1.[SWW], T1.[ItemCode], T0.[Dscription], T2.[ItmsGrpNam], T3.[FirmName] as Linea, T1.[U_Subgrupo],
CASE WHEN
SUM(T0.[Quantity])/ ROUND((DATEDIFF(dd, (getdate()-90), getdate())/30.0),0) * @tp/30 - T1.[OnHand] >0
THEN SUM(T0.[Quantity])/ ROUND((DATEDIFF(dd, (getdate()-90), getdate())/30.0),0) * @tp/30 - T1.[OnHand]
WHEN SUM(T0.[Quantity])/ ROUND((DATEDIFF(dd, (getdate()-90), getdate())/30.0),0) * @tp/30 - T1.[OnHand] <0
THEN SUM((T0.[Quantity])/ ROUND((DATEDIFF(dd, (getdate()-90), getdate())/30.0),0) * @tp/30 - T1.[OnHand])*0 END as SUGERIDO,
SUM(T0.[Quantity])/ ROUND((DATEDIFF(dd, (getdate()-90), getdate())/30.0),0) * @tp/30 as PROYECCION ,
T1.[OnHand] AS EXISTENCIAS,
T1.[OnHand] / (SUM(T0.[Quantity])/ROUND((DATEDIFF(dd, (getdate()-90), getdate())/30.0),0)) as CAPACIDAD_INVENTARIO,
SUM(T0.[Quantity])/ ROUND((DATEDIFF(dd, (getdate()-90), getdate())/30.0),0) AS CONSUMO_TOTAL,
SUM(T0.[Quantity]) AS VENTA_ULTIMOS_3_MESES,
@tp/30 as TIEMPO_REPOSICION
FROM INV1 T0
INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode
INNER JOIN OITB T2 ON T1.ItmsGrpCod = T2.ItmsGrpCod
INNER JOIN OMRC T3 ON T1.FirmCode = T3.FirmCode
WHERE T2.[ItmsGrpNam]=[%0] and T0.[DocDate] >= (getdate()-90) and T0.[DocDate] <= getdate()
GROUP BY T1.[ItemCode], T2.[ItmsGrpNam], T1.[OnHand],T0.[Dscription],T1.[SWW],T3.[FirmName], T1.[U_Subgrupo]
ORDER BY T3.[FirmName], T1.[U_Subgrupo]
for browse
lo que quiero es que en vez de poner un valor fijo el usuario pueda poner el numero de dias que quiera, espero me entiendan y me colaboren ya que es algo que necesito con suma urgencia.
Mil gracias a todos por su ayuda
Lender,
Tienes que crear el Store Procedure desde SQL Server.
Seria algo así:
--===========================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TU_SP_AQUI]
-- Aqui va el nombre de la variable que va recibir el valor numérico
@Numero as INT
AS
BEGIN
-- Insert statements for procedure here
-- Aqui insertas el codigo que tienes (entre el begin y el end)
END
GO
--===========================================================
La consulta quedaría algo asi, para que sea de tipo de dato numérico.
--===============================================
/*SELECT FROM [dbo].[OINV] T1] T1*/
declare @numero as INT
/* WHERE */
set @numero= /* T1.DocNum */ [%0]
EXEC [dbo].[TU_SP_AQUI] @numero
--===============================================
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hola Eduardo gracias por la respuesta me sirvió muchísimo, pero me queda una duda, es posible agregarle mas variables a esta consulta es decir en el store procedure se que puedo declarar las variables pero como tendría que hacer en el query manager para llamar las otras variables, te explico lo que quiero la consulta que tenia sin usar SP era esta:
Declare @F1 Datetime
Declare @F2 Datetime
declare @tp int
declare @Grupo nvarchar(25)
set @Grupo = (select distinct X0.[itmsgrpnam] from [dbo].[OITB] X0 where X0.[itmsgrpnam] = '[%2]')
Set @F1 = (select min(S0.DocDate) from INV1 S0 Where S0.Docdate >= '[%0]')
Set @F2 = (Select max(S1.Docdate) from INV1 S1 Where S1.DocDate <='[%1]')
set @tp = 150
Select A.ID_adicional, A.Numero_de_articulo, A.Descripcion, A.Grupo, A.Linea, A.Subgrupo,
CASE WHEN
((A.Ventas - ISNULL(B.Devoluciones,0))/(ROUND((DATEDIFF(dd, (@f1), @f2)/30.0),0))* @tp/30)-C.Existencias > 0
THEN ((A.Ventas - ISNULL(B.Devoluciones,0))/(ROUND((DATEDIFF(dd, (@f1), @f2)/30.0),0))* @tp/30)-C.Existencias
WHEN ((A.Ventas - ISNULL(B.Devoluciones,0))/(ROUND((DATEDIFF(dd, (@f1), @f2)/30.0),0))* @tp/30)-C.Existencias < 0
THEN (((A.Ventas - ISNULL(B.Devoluciones,0))/(ROUND((DATEDIFF(dd, (@f1), @f2)/30.0),0))* @tp/30)-C.Existencias) *0 END AS Sugerido,
(A.Ventas - ISNULL(B.Devoluciones,0))/(ROUND((DATEDIFF(dd, (@f1), @f2)/30.0),0))* @tp/30 AS Proyeccion,
C.Existencias, D.Bodega_Uno, D.Bodega_Dos ,D.Bodega_Tres ,D.Bodega_Cuatro , D.Bodega_Cinco,
C.Existencias /((A.Ventas - ISNULL(B.Devoluciones,0))/(ROUND((DATEDIFF(dd, (@f1), @f2)/30.0),0))) as Capacidad_Inventario,
(A.Ventas - ISNULL(B.Devoluciones,0))/(ROUND((DATEDIFF(dd, (@f1), @f2)/30.0),0)) as Consumo_Total,
(A.Ventas - ISNULL(B.Devoluciones,0)) AS Ventas_ultimo_meses,
@tp/30 as Tiempo_Entrega
FROM
(
SELECT DISTINCT T1.[SWW] as ID_adicional, T1.[ItemCode] AS Numero_de_articulo, T1.[ItemName] as Descripcion, T2.[ItmsGrpNam] as Grupo, T3.[FirmName] as Linea, T1.[U_Subgrupo] as Subgrupo,
SUM(T0.[Quantity]) AS Ventas,
@tp/30 as Tiempo_Entrega
FROM [dbo].[INV1] T0
INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode
INNER JOIN OITB T2 ON T1.ItmsGrpCod = T2.ItmsGrpCod
INNER JOIN OMRC T3 ON T1.FirmCode = T3.FirmCode
WHERE T2.[ItmsGrpNam]= @Grupo and T0.[DocDate] >= @f1 and T0.[DocDate] <= @f2
GROUP BY T1.[ItemCode], T2.[ItmsGrpNam],T1.[ItemName],T1.[SWW],T3.[FirmName], T1.[U_Subgrupo]
)A
left Join
(
SELECT T0.[ItemCode] AS ITEM_DEVUELTO, SUM(T0.[Quantity]) AS Devoluciones
FROM RIN1 T0
WHERE T0.[DocDate] >=@f1 AND T0.[DocDate] <= @f2
GROUP BY T0.[ItemCode]
)B
On A.Numero_de_articulo=B.ITEM_DEVUELTO
left JOIN
(
SELECT T0.[ItemCode]AS Item, SUM(T0.[OnHand]) as Existencias
FROM OITW T0 INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode
INNER JOIN OITB T2 ON T1.ItmsGrpCod = T2.ItmsGrpCod
WHERE T0.[WhsCode] IN (01,02,03,04,05) AND T2.[ItmsGrpNam]= @Grupo
GROUP BY T0.[ItemCode]
)C
ON C.Item=A.Numero_de_articulo
JOIN
(
SELECT T1.ItemCode,t1.Itemname,
(select distinct(T8.ONHAND)
from OITM X0 INNER JOIN OITW T8 ON X0.ItemCode = T8.ItemCode
where T8.WhsCode='01' and X0.ItemCode=T1.ItemCode) as Bodega_Uno,
(select distinct(T8.onhand)
from OITM X0 INNER JOIN OITW T8 ON X0.ItemCode = T8.ItemCode
where T8.WhsCode='02' and X0.ItemCode=T1.ItemCode) as Bodega_Dos,
(select distinct(T8.onhand)
from OITM X0 INNER JOIN OITW T8 ON X0.ItemCode = T8.ItemCode
where T8.WhsCode='03' and X0.ItemCode=T1.ItemCode) as Bodega_Tres,
(select distinct(T8.onhand)
from OITM X0 INNER JOIN OITW T8 ON X0.ItemCode = T8.ItemCode
where T8.WhsCode='04' and X0.ItemCode=T1.ItemCode) as Bodega_Cuatro,
(select distinct(T8.onhand)
from OITM X0 INNER JOIN OITW T8 ON X0.ItemCode = T8.ItemCode
where T8.WhsCode='05' and X0.ItemCode=T1.ItemCode) as Bodega_Cinco
from OITM T1
) D ON D.ItemCode=A.Numero_de_articulo
GROUP BY A.Ventas, B.Devoluciones, A.ID_adicional, A.Numero_de_articulo,
A.Descripcion, A.Grupo, C.Existencias, A.Linea,A.Subgrupo, D.Bodega_Uno, D.Bodega_Dos ,D.Bodega_Tres ,D.Bodega_Cuatro , D.Bodega_Cinco
HAVING (A.Ventas - ISNULL(B.Devoluciones,0))/(ROUND((DATEDIFF(dd, (@f1), @f2)/30.0),0)) > 0
Order By A.Linea, A.Subgrupo
for browse
Si te fijas para que me funcionara antes tenia que poner la variable @tp con un valor fijo y funcionaba bien, gracias al store procedure pude capturar este valor pero para que me funcionara el SP tube que poner en las letras que estan en verde valores fijos es decir debi poner un nombre de grupo y una fecha a cada variable y funciono bien ya que si las dejaba con los parametros [%5] me arrojaba el siguiente error:
1). [Microsoft][SQL Server Native Client 10.0][SQL Server]Conversion failed when converting date and/or time from character string. 'Valores definidos por usuario' (CSHS)
me imagino que es porque en sql no toma el [%5] como un parámetro entonces lo que quiero hacer es declarar mis demás variables en el SP y saber como las tendría que llamar en la consulta es decir mi SP quedaria asi:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TU_SP_AQUI]
-- Aqui va el nombre de las variables
(
@tp as INT,
@F1 Datetime,
@F2 Datetime,
@Grupo nvarchar(25)
)
AS
BEGIN
-- Aqui mi codigo
END
GO
mi pregunta es como llamo esas variables en la consulta??
pense que se podia hacer algo asi:
/*SELECT FROM [dbo].[OINV] T1] T1*/
declare @tp as INT
/* WHERE */
set @tp= /* T1.DocNum */ [%0]
/*SELECT FROM [dbo].[OITB] T2] T2*/
declare @Grupo as varchar(25)
/* WHERE */
set @Grupo= /* T2.ItmsGrpNam */ [%1]
EXEC [dbo].[CONSULTAALAMOS] @tp,@Grupo ----claro esta llamando todas las variables
pero me arroja el siguiente error
1). [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid column name 'bbb'.--- Este es el nombre que le di al grupo 2). [Microsoft][SQL Server Native Client 10.0][SQL Server]Statement 'Valores definidos por usuario' (CSHS) (s) could not be prepared.
que pena alargarme tanto pero ps queria que entendieras bien mi pregunta y espero me puedas ayudar.
Mil gracias por tu paciencia.
Lender,
Excelente que ya lograste solucionarlo.
Saludos.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Que tal Lender,
Puedes realizarlo haciendo un Stored Procedure poniendo todo el query.
Y en SAP, en el Query Manager le agregas algo como esto:
-- =====================================================
/*SELECT FROM [dbo].[OCRD] T1] T1*/
declare @variable as nvarchar (30)
/* WHERE */
set @variable= /* T1.CardCode */ [%0]
EXEC [dbo].[Tu_SP_Aqui] @variable
-- =====================================================
Te pedirá ingresar el dato y ese dato se lo manda al SP.
Realizar pruebas y comentas.
// la información salio de los foros, ya me había tocado realizar algo similar a esto y lo encontré buscando en los foros.
Saludos y suerte.
atte:
Edd
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hola Eduardo gracias por responder, que pena mi falta de experiencia, pero es que no he trabajado con procedimientos almacenados en SAP debo crearlo en SAP o desde el SQL? modificaría mi base de datos y perdería la garantía de SAP si lo creo desde SQL? si podrías mandarme un ejemplo de como hacerlo te lo agradecería infinitamente, otra cosa por que en el ejemplo que me das la variable la usas con CardCode? la variable que necesito que me capture debe ser de tipo entero es decir lo que quiero capturar son los días que el usuario digite eje: 15 días o 30 o 120 en fin, que pena molestar tanto pero es que llevo tiempo tratando de resolver esto y no he podido.
Agradezco tu ayuda y el tiempo que te tomaste en responderme.
Mil gracias
User | Count |
---|---|
91 | |
10 | |
10 | |
6 | |
5 | |
5 | |
5 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.