none
Query para Reporting Services RRS feed

  • Pregunta

  • Estimados.

    Publico acá pues este foro tiene mucha más dinámica.

    Digamos que tengo la siguiente query:

    Select Vendedor,Cantidad From Tabla

    Where id_sucursal = @sucursal

    Tengo un reporte que muestra el resultado, hasta acá todo ok.

    Pues bien, son 100 sucursales, en primera instancia solo se me ocurre crear 100 carpetas y tener que hacer 100 reportes solo cambiando el Where y los permisos se los daría a los grupos de Active Directory, pero es bastante engorroso hacerlo asi  pues luego vendrán otros reportes digamos 8 en total y no quiera tener que estar multiplicando por 100 cada reporte, talvez exista una manera mucho mejor y por eso recurro a Uds.

    Saludos.



    DBA SQL Server Santiago/Chile

    jueves, 3 de mayo de 2018 23:46

Respuestas

  • ¿Cómo es la conexión a base de datos? ¿Estás usando credenciales almacenadas en SSRS, o es autenticación integrada? Si es integrada, habría una solución relativamente sencilla. Dado que en ese caso SQL Server recibe las credenciales del usuario, pudes obtener el nombre de usuario con SUSER_NAME() y añadir una condicion en el Where (posiblemente enlazando con alguna tabla que tenga la lista de mapeos de usuario a sucursal). Sería algo así:

    Select Vendedor,Cantidad From Tabla Where id_sucursal = @sucursal AND id_sucursal in (select id_sucursal from tablaDeSucursalesPorUsuario where NombreUsuario=SUSER_NAME())

    • Marcado como respuesta CMAPM viernes, 4 de mayo de 2018 15:30
    viernes, 4 de mayo de 2018 14:46

Todas las respuestas

  • Hola CMAPM:

    Se me ocurre, que, siguiendo la estructura de 100 sucursales, y 100 carpetas para evitar la lectura por parte de quien no corresponda de los archivos, porque no implementas algo para que las carpetas sea igual a su numero de filtro del where, de manera que mediante por ejemplo powershell, recoges el nombre de la carpeta y ese nombre, es el parametro del filtro.

    Lo explico un poco mejor, digamos que tu query, hace primero un Select id from sucursales. Ya tienes las 100.

    Luego hace 100 peticiones diferentes a tu consulta filtrando por cada una de las entradas de tu query, siendo esta parte del where, y ademas forma parte de la ruta de salida. De manera que se deposita en la carpeta //"aquí id sucursal"/informe.csv si corresponde a la sucursal 1.

    https://technet.microsoft.com/es-es/library/hh847897.aspx

    https://msdn.microsoft.com/es-es/library/ms162802(v=sql.120).aspx

    Un saludo

    viernes, 4 de mayo de 2018 6:05
  • Hola Javi.

    El problema es que me indican que el reporte debe ser web no quieren que se eloje en una carpeta :(


    DBA SQL Server Santiago/Chile

    viernes, 4 de mayo de 2018 13:35
  • ¿Cómo es la conexión a base de datos? ¿Estás usando credenciales almacenadas en SSRS, o es autenticación integrada? Si es integrada, habría una solución relativamente sencilla. Dado que en ese caso SQL Server recibe las credenciales del usuario, pudes obtener el nombre de usuario con SUSER_NAME() y añadir una condicion en el Where (posiblemente enlazando con alguna tabla que tenga la lista de mapeos de usuario a sucursal). Sería algo así:

    Select Vendedor,Cantidad From Tabla Where id_sucursal = @sucursal AND id_sucursal in (select id_sucursal from tablaDeSucursalesPorUsuario where NombreUsuario=SUSER_NAME())

    • Marcado como respuesta CMAPM viernes, 4 de mayo de 2018 15:30
    viernes, 4 de mayo de 2018 14:46
  • Estimado Alberto.

    Los permisos a los reportes son a usuarios de AD, por lo tanto, me serviría lo que me indicas.

    Una duda, supongamos que no quisiera la tabla con la lista de mapeos, puedo obtener desde SQL a que sucursal pertenecen leyendo el AD ? Pues en el AD esta el usuario ordenando en una OU, de esta forma se a donde pertenecen, si es asi, como podria leer a que OU pertenece el usuario del AD desde SQL ?

    Saludos Cordiales.


    DBA SQL Server Santiago/Chile




    • Editado CMAPM viernes, 4 de mayo de 2018 16:41
    viernes, 4 de mayo de 2018 15:30
  • He intentado lo siguiente:

    EXEC master.dbo.sp_addlinkedserver @server = N'ADSI', 
    @srvproduct=N'Active Directory Services', @provider=N'ADsDSOObject', 
    @datasrc=N'a1.nombredominio.cl'  


    select * from openquery
    (
    ADSI,'SELECT name 
    FROM ''LDAP://a1.nombredominio.cl''
    WHERE objectCategory = ''Person'' AND objectClass = ''user''
    ')

    Error:

    Mens. 7399, Nivel 16, Estado 1, Línea 2
    The OLE DB provider "ADsDSOObject" for linked server "ADSI" reported an error. The provider indicates that the user did not have the permission to perform the operation.
    Mens. 7321, Nivel 16, Estado 2, Línea 2
    An error occurred while preparing the query "SELECT name 
    FROM 'LDAP://a1.nombredominio.cl'
    WHERE objectCategory = 'Person' AND objectClass = 'user'
    " for execution against OLE DB provider "ADsDSOObject" for linked server "ADSI". 


    DBA SQL Server Santiago/Chile

    viernes, 4 de mayo de 2018 17:04
  • Ya me funciona, era que no tenia permisos para leer el AD

    DBA SQL Server Santiago/Chile

    viernes, 4 de mayo de 2018 17:15
  • LDAP solo muestra 901 registros luego da error:

    Cannot fetch a row from OLE DB provider "ADsDSOObject" for linked server "ADSI".

    Habra alguna configuracion que se pueda cambiar ?


    DBA SQL Server Santiago/Chile

    viernes, 4 de mayo de 2018 17:22
  • Lo de los 901 registros al parecer es una limitación conocida. En el post que te enlazo debajo sugieren soslayarla haciendo un filtrado que devuelva menos registros (por ejemplo, leyéndolos letra por letra). Pero en tu caso no debería ser necesario, porque solo necesitas resolver un único usuario. Podrías ponerlo directamente en el Where de la consulta ADSI (en lugar de leerlos todos y luego hacer un join, que me imagino que es lo que estás haciendo).

    https://stackoverflow.com/questions/8594775/error-cannot-fetch-a-row-from-ole-db-provider-adsdsoobject-for-linked-server

    viernes, 4 de mayo de 2018 18:46