cancel
Showing results for 
Search instead for 
Did you mean: 

Variable en sap

Former Member
0 Kudos

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

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

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

--===============================================

Former Member
0 Kudos

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.

Former Member
0 Kudos

Eduardo ya averigue el modo de llamar las demas variables mil y mil gracias por tu ayuda me sirvio muchisimo.

Answers (2)

Answers (2)

Former Member
0 Kudos

Lender,

Excelente que ya lograste solucionarlo.

Saludos.

Former Member
0 Kudos

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

Former Member
0 Kudos

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