cancel
Showing results for 
Search instead for 
Did you mean: 

Query - Manager

Former Member
0 Kudos

Amigos,

Estoy haciendo un reporte en el Query Manager, que liste todas las facturas creadas por fecha (que elegimos) y por usuario (que elegimos), de tal manera que solo me liste por ejemplo.

10000002 - Proveedor - 18/04/2012 - UsuarioX

10000005 - Proveedor - 18/04/2012 - UsuarioX

10000010 - Proveedor - 18/04/2012 - UsuarioX

Tengo el siguiente Query:

DECLARE @Fecha Datetime

DECLARE @Usuario nvarchar(155)

SET @Fecha = /* T0.[DocDate] */ '[%0]'

SET @Usuario = (SELECT U_NAME FROM OUSR WHERE Groups = 0 AND Department = 5)

SELECT

T1.Docnum,

T1.CardCode,

T1.CardName,

T1.DocDate,

T1.DocCur,

T1.DocTotal,

T1.DocTotalFC,

T1.Comments,

T2.U_NAME

FROM OPCH T1

Inner Join OUSR T2 ON T1.usersign = T2.userID

WHERE T1.CreateDate = @Fecha and T2.U_NAME = @Usuario

El tema es que me indica que en la variable @Usuario no puede haber más de 1 valor, y Yo deseo que me aparesca el listado del Select que le doy, ya que de esa manera solo la persona que desea el reporte elegira el nombre del usuario, la fecha y se le mostrara el reporte.

Espero me puedan ayudar. Gracias!!

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Estimado anonimo,

llevo ya unos años usando SQL (sera mi especialidad),

y por lo que estoy viendo quieres hacer

esto:

SET @Usuario = (SELECT U_NAME FROM OUSR WHERE Groups = 0 AND Department = 5) 

el problema aqui para comenzar es que segun yo se tu variable @Usuario es nvarchar y estas tratando de asignarle una tabla, por lo que solo tomara el primer valor que encuentre o el ultimo en todo caso, es por eso que te dicen que le hagas un top 1, lo cual no seria incorrecto segun la variable que quieres hacer,

lo que yo te recomiendo es que uses una sentencia SQL llamada COALESCE

te muestro un ejemplo y te menciono lo que hace

Sentencia :

select @Vlo = Coalesce(@Vlo + ', ','') + CodeVuelo from vuelo1  where FechaVuelo=@Fecha

print @Vlo

Datos:

CodeVuelo

----------------

1331

1332

1333

3310

3320

3325

3381

3382

Resultado de ejecucion de sentencia:

1331, 1332, 1333, 3310, 3320, 3325, 3381, 3382,

Luego con esos datos tienes lo que desees,

tu dices que quieres seleccionar usuarios, bueno no sabria con sap, ojala te sirva de algo esto.

Answers (6)

Answers (6)

former_member658676
Discoverer
0 Kudos

Desde Cali, Colombia, me presento: José Eduardo Gómez Martínez, Contador Público con Diplomado en Gerencia de Costos 2013. Pontificia Universidad Javeriana Cali.

El Query manager de SAP B1 que logré implementar en una empresa industrial aquí en Cali, es el INFORME DE COSTOS POR ÓRDENES DE FABRICACIÓN, el cual les adjunto: incluye y esto es importante el desensamble de una Orden de Fabricación cuando por alguna razón y es normal que ocurra, se comete algún error o que una vez cerrada, no se va a producir. Estos son los parámetros y quedo atento a sus comentarios. Éxitos para todos:

SAP B1: QUERY MANAGER

INFORME DE COSTOS POR ÓRDENES DE FABRICACION-FINAL

(Febrero 5 de 2020)

SELECT T0."Type", T0."Series", T5."SeriesName", T0."DocNum", T0."PostDate", T0."Status", T0."ItemCode", T2."ItemName", (T0."PlannedQty"*-1) as "Cantidad Planificada - Cabecera", (T0."CmpltQty"*-1) as "Cantidad Completada", T1."LineNum", T1."ItemCode", T3."ItemName", (T1."PlannedQty"*-1) as "Cantidad Planificada - Filas", (T1."IssuedQty"*-1) as "Cantidad suministrada", T4."Price", T4."StockPrice", (T4."LineTotal"*-1) as "Total líneas", (T1."IssuedQty" * T4."StockPrice" *-1) as "TOTAL CALCULADO", T4."WhsCode", T4."AcctCode"

FROM OWOR T0

INNER JOIN WOR1 T1 ON T0."DocEntry" = T1."DocEntry"

left join OITM T2 ON T2."ItemCode" = T0."ItemCode"

left join OITM T3 ON T3."ItemCode" = T1."ItemCode"

left join IGN1 T4 ON T4."BaseEntry" = T0."DocEntry" AND T4."ItemCode" = T1."ItemCode" AND T4."BaseLine" = T1."LineNum"

INNER JOIN NNM1 T5 ON T5."Series" = T0."Series"

WHERE T0."PostDate" BETWEEN [%0] AND [%1] and T0."Type" = 'D'

UNION ALL

SELECT T0."Type", T0."Series", T5."SeriesName", T0."DocNum", T0."PostDate", T0."Status", T0."ItemCode", T2."ItemName", (T0."PlannedQty") as "Cantidad Planificada - Cabecera", (T0."CmpltQty") as "Cantidad Completada", T1."LineNum", T1."ItemCode", T3."ItemName", (T1."PlannedQty") as "Cantidad Planificada - Filas", (T1."IssuedQty") as "Cantidad suministrada", T4."Price", T4."StockPrice", (T4."LineTotal") as "Total líneas", (T1."IssuedQty" * T4."StockPrice" ) as "TOTAL CALCULADO", T4."WhsCode", T4."AcctCode"

FROM OWOR T0

INNER JOIN WOR1 T1 ON T0."DocEntry" = T1."DocEntry"

left join OITM T2 ON T2."ItemCode" = T0."ItemCode"

left join OITM T3 ON T3."ItemCode" = T1."ItemCode"

left join IGE1 T4 ON T4."BaseEntry" = T0."DocEntry" AND T4."ItemCode" = T1."ItemCode" AND T4."BaseLine" = T1."LineNum"

INNER JOIN NNM1 T5 ON T5."Series" = T0."Series"

WHERE T0."PostDate" BETWEEN [%0] AND [%1] and T0."Type" <> 'D'

ORDER BY T0."PostDate", T0."DocNum", T1."LineNum"

Former Member
0 Kudos

Buenas Tardes,

Pues revivo este post ya que a la fecha no encuentro una solución al problema.

Ahora estoy en una versión 2007A y cuando se declara la variable, sigue sin acatar el where, muestra todos los datos, cosa que no deseo...

Set @Nombre =(Select T1.[U_NAME] From [dbo].[OUSR] T1 Where Groups = 0 AND Department = 5 AND T1.[U_NAME]= '[%2]'

Alguien que pueda ayudar por favor.

Saludos.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimado

No puedes filtrar los resultados de una tabla donde estas asignando una variable desde SAP.

Desde Crystal puedes hacerlo creando un parametro.

Saludos

Felipe

Former Member
0 Kudos

Agrevio, no se si ya encontraste la solución a esto. pero lo dudo mucho.

Como bien dijo Felipe, en el query manager no es posible pasar un parámetro con filtro a diferencia de CR.

Mira las consultas del query manager son consultas tipicas de SQL, sólo que en vez de filtrar los valores con un texto estático, te permite colocar variables como si se trataran de comodines.

Por lo tanto los "parámetros" que le pasas a una consulta en realidad son filtros de la misma, no exactamente parámetros.

Por lo tanto, la consulta típica con filtros es:

SELECT * FROM OUSR WHERE U_Name='[%0]'

Esto te permite obtener un choose from list (listado de selección) con todos los nombres de usuario de la base de datos. ¿Porque?

SAP B1 interpreta la sintaxis U_Name='[%0]' como

SELECT U_Name, COUNT(U_Name) FROM OUSR GROUP BY U_Name

Dado que este proceso lo hace en forma interna, el usuario no tiene posibilidades de cambiar la consulta o filtrarla como tu estas queriendo hacerlo.

Respecto a "los comentarios" que se colocan. Efectivamente son comentarios, pero para el motor de base de datos (SQL server), pero no para SAP B1. dado lo mismo que te explique anteriormente, SAP hace una pre-interpretación de la consulta que tiene filtros del tipo [%x] (con x>=0 y x<=19), por lo tanto, ejecuta consultas sobre los campos que están comentados, para SQL, y devuelve los valores seleccionados, pasandole luego a SQL, no la variable [%x], que dicho sea de paso SQL no sabe interpretar, sino que el valor escogido por el usuario.

Entonces estos "comentarios" lo que hacen finalmente es engañar a SB1 para aprovechar datos que no estan en las tablas que queremos consultar y que por lo tanto no pueden ser incluidas en la clausula WHERE de la consulta normal.

espero que la explicación no sea tan engorrosa y algo puedas entender. ya que la teoría en este caso es más compleja que la práctica.

slds.

former_member203638
Active Contributor
0 Kudos

Funciona Bien en 8.81 PL10

*Quitandole la parte de departmen y groups. =P

Saludos

Alessandro

Former Member
0 Kudos

Hola Alessandro,

Mi cara después de tu  comentario que así...  ¬¬!!  Jajaja.

Hermano, ese clausula del where  es muy importante, ya que de esa manera mostrará solo los usuarios correspondiente al tema y no todos.

Saludos.

Former Member
0 Kudos

Amigos,

a sus dos ideas se armo el siguiente Query, el cual deseo que lo prueben ustedes para que vean finalmente que necesito.

Declare @Nombre NVarchar(60)

/* Select * From [dbo].[OPCH] T0 */

Declare @FecIni DateTime

Declare @FecFin DateTime

/* Where */

select @FecIni /* T0.[CreateDate] */= '[%0]'

/* And */

Select @FecFin /* T0.[CreateDate] */= '[%1]'

Set @Nombre =(Select T1.[U_NAME] From [dbo].[OUSR] T1 Where Groups = 0 AND Department = 5 AND T1.[U_NAME]= '[%2]')

Select

      T2.Docnum,

      T2.CardCode,

      T2.CardName,               

      T2.DocDate,

      T2.DocCur,

      T2.DocTotal,

      T2.DocTotalFC,

      T2.Comments,

      T3.U_NAME

From OPCH T2

Inner Join OUSR T3 ON T2.usersign = T3.userID

WHERE T2.CreateDate Between @FecIni And @FecFin And  T3.U_NAME  = @Nombre

Les pido que lo prueben y veran que la variable @Nombre, me vuelve el listado de todos los usuarios, lo cual no deseo, en pocas palabras no acata el where que le mando.

Probé de ambas maneras como me indican ustedes y nada. el mismo resultado y aveces me mandaba el error 'Documento (RDOC)'.

Dos consultas:

  • Esos comentarios que ponen al declarar las variables o establecerlas con un valor, no son comentarios realmente verdad? digo esto porque si los quito me genera error.
  • El tema de los usuarios B1i, como hago para que no se generen demasiados, ya tengo mas de 1000, para que sirven?

Saludos!!

former_member188440
Active Contributor
0 Kudos

Te cuento que lo de los usuarios es un bug que hay en la 88 antes del parche 12 si no me equivoco, se genera 1 usuario de B1i cada vez que te logeas al sistema!!!

Por otro lado, lo de los comentarios, efectivamente no son como tal comentarios, he estado probando el where y tal parece que no le hace caso , y efectivamente te muestra todos los usuarios, seguire haciendo pruebas para ver de que manera utilizar un where en este tipo de codigo

Former Member
0 Kudos

Mauricio,

Para el tema de la actualización de los PL, es necesario hacerlo en el servidor y también en los usuarios manualmente?, me refiero a que tengo que correr el update en todas las PC de los usuarios? o al abrir el SAP automáticamente jala la actualización si ya esta actualizado en el server?

Sobre el tema de los "comentarios", como se manejan estos? hay un trato especial en estos temas? solo son aplicables para el SAP o es indistinto? digo esto porque nunca antes lo habia visto.

Saludos.

former_member203638
Active Contributor
0 Kudos

Primero en el server, y cuando se logueen los usuarios les dira que hay disponile un upgrade.

Former Member
0 Kudos

Hermanos, alguna idea sobre el tema?

espero su ayuda.

Gracias.

former_member188471
Active Contributor
0 Kudos
  • SET @Usuario = (SELECT U_NAME FROM OUSR WHERE Groups = 0 AND Department = 5) 
  •   CASI ESTOY SEGURO QUE ESTA CONSULTA TE TRAE MAS USER DEBIDO A QUE HAY VARIOS EN ESE DEPARTAMENTO.
  • AHORA NOSE SI LO QUE QUIERES ES TRAERLO PARA EL USUARIO ACTUAL.
  • O
  • QUIERES ELEGIR UNO DE ENTRE LOS QUE TE DESPLEGA TU CONSULTA QUE ARRIBA PONGO.?

ESPERO COMENTARIOS

Former Member
0 Kudos

Hola Julian, buen día!

Como dices bien, ese select del parametro me trae 9 lineas (9 nombres de usuario), Yo deseo que esos nueve me aparescan en un listado asi como el parametro de la fecha (cuando pongo

SET @Fecha = /* T0.[DocDate] */ '[%0]' , me muestra el listado de todas las fechas, solo para elegir )

De igual manera deseo que aparesca un listado con los 9 nombres de usuarios, para que la persona que desee el reporte solo le salga en base al usuario elegido.

Hago este select, ya que tengo más de 40 usuarios que es indiferente para la persona del reporte, para ella solo le es importancia 9, Otro tema es los usuarios B1iXXX, por más que los elimino se siguen creando, y van en aumento.

PD// Se que el parametro no puede recibir más de 1 valor, es por eso mi problema, por allí escuche algo de las variables Tabla, serán útil aquí?

Saludos.

former_member188440
Active Contributor
0 Kudos

Es que entonces necesitas hacer algo igual que

aqui donde le pones la fecha, para que te muestre el cuadro de dialogo y solicite un valor

  • SET @Fecha = /* T0.[DocDate] */ '[%0]' 
  • Quizas si pones

/*SELECT FROM [dbo].[OUSR T1] T1*/        

declare  @usuario as nvarchar (8)         

/* WHERE  t1.groups=0 and t1.department=5*/                                 

set @usuario= /* T1.u_name */ '[%0]'

former_member188471
Active Contributor
0 Kudos

prueba asi

SELECT T0.[U_NAME]

FROM OUSR T0

WHERE GROUPS = 0 AND DEPARTAMENT = 5  AND T0.[U_NAME] =[%0]

Y ME COMENTAS

former_member188440
Active Contributor
0 Kudos

Porque no le metes un select top 1, en la ousr, para que te traiga un solo valor

Former Member
0 Kudos

Hola Mauricio,

Al hacer un Top 1, solo me va a jalar un registro, yo no deseo eso, yo deseo que me jale los 9 registros que me bota ese Select.

User1

User2

......

User9

No se si me dejo entender.