on 04-18-2012 6:21 PM
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!!
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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"
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
Funciona Bien en 8.81 PL10
*Quitandole la parte de departmen y groups. =P
Saludos
Alessandro
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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:
Saludos!!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
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.
ESPERO COMENTARIOS
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
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
/*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]'
Porque no le metes un select top 1, en la ousr, para que te traiga un solo valor
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
98 | |
11 | |
11 | |
6 | |
6 | |
4 | |
4 | |
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.