Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
2 years ago
Solved

Filtrado de varios grupos y columnas en Dynamic RLS

Hola a todos

Me gustaría usar la siguiente tabla DIM_ACT como tabla de restricción de acceso para los usuarios. Esta es solo una tabla de ejemplo y tendrá muchas filas. DIM_USER tabla contiene el correo electrónico y el identificador para aplicar USERPRINCIPALNAME() DAX. FACT_ACTUALS tabla tiene todas las columnas siguientes más VENTAS, CANTIDAD Y EXISTENCIAS sin valor TODO en cualquiera de las columnas. Si una columna contiene "ALL" significa que no se debe aplicar ningún filtro a esa columna cuando se aplica RLS. También he dividido las columnas usando delimitadores y, después de la transformación, la siguiente tabla de DIM_ACT tiene más filas. Por ejemplo: No hay ninguna fila que tenga nivel 100; A20; K40 actualmente. Tiene 100 A20 y K40 como filas separadas en lugar de manera similar para todas las demás columnas donde se contiene ";". DIM_ACT tabla tiene una relación de muchos a muchos con FACT_ACTUALS con todas las columnas siguientes (Nivel, Etiqueta, Fuente, CC, ORG, SITIO). Solo la columna Nivel está en la relación Activo, otras están Inactivas. Múltiples ID pueden pertenecer al mismo grupo y varios grupos pueden pertenecer al mismo usuario, por lo tanto, la misma ruta puede tener el mismo acceso al grupo con diferentes ID de usuario y diferentes valores en las columnas restantes. La ruta serán objetos visuales separados en el informe (Flex for you y Sample WS serán 2 objetos visuales separados y tendrá acceso definido de acuerdo con DIM_ACT después de aplicar RLS. ¿Puede proponer una solución en la que pueda filtrar los valores dinámicamente en FACT cuando RLS se aplica en las columnas Path, Level, Label, Source, CC, ORG, LOC en DIM_ACT tabla? No estoy seguro de si es posible debido a la relación inactiva de Muchos a Muchos.

DIM_ACT TABLA

CAMINOGRUPOIDENTIFICACIÓNNIVELETIQUETAFUENTECCORGLUGAR
FLEX PARA TIBÁSICO ASDK (Sistema de traducción100; A20; K40XKG; TBF1E250; V36525; 36TODO
EJEMPLO DE WSBÁSICO ASDK (Sistema de traducción100; A20; K40XKG; TBF1E250; V36525; 36TODO
FLEX PARA TIINTER AREN100; A20; K40XKG; TBFTODOE250; V36525; 36TODO
EJEMPLO DE WSINTER AREN100; A20; K40XKG; TBFTODOE250; V36525; 36TODO
FLEX PARA TIAVANZADO AOBQTODOTODOTODOE250; V36525; 36TODO
EJEMPLO DE WSAVANZADO AOBQTODOTODOTODOTODOTODOTODO
FLEX PARA TIAVANZADO BABECEDARIOTODOTODO2E250; V365TODOTODO
FLEX PARA TIINTER BXYZ300:J99HACE2TODO58TODO
FLEX PARA TIBÁSICO BDEFJ99HACE220TODO800
EJEMPLO DE WSINTER BXYZ300:J99XKGTODO35A; 40B35; 40200; 500
EJEMPLO DE WSAVANZADO BABECEDARIOF350TODO2TODOTODOTODO
EJEMPLO DE WSBÁSICO BDEF300DUQUE2TODO45300; 450

ME ENCANTA.

  • Consulte la solución a continuación.

    1.) Todos los valores de punto y coma en DIM_ACT columnas deben ser reemplazados por el símbolo "|" para que esta fórmula funcione. Cambie los datos de origen o cree una columna calculada para reemplazar ";" por "|".

    2.) Se eliminó DIM_USER tabla y se incorporó la columna de ID de correo electrónico a DIM_ACT propia tabla. 3.) Solo hay 1 registro para un solo usuario en DIM_ACT en un solo GRUPO.

    4.) Cree un ROL en Administrar roles y aplíquelo debajo de DAX en FACT_ACTUALS tabla. Usando el siguiente DAX, cuando el usuario inicie sesión, podrá ver solo los valores separados con "|" en las columnas respectivas de DIM_ACT y cuando ALL esté presente en cualquiera de las columnas, podrá ver todos los valores disponibles en FACT ACTUALS.

    /* FILTRE DIM_ACT PARA OBTENER EL REGISTRO QUE SOLO TIENE EL ID DE CORREO ELECTRÓNICO DEL USUARIO QUE HA INICIADO SESIÓN Y LOS VALORES ASIGNADOS EN LA COLUMNA DE NIVEL */

    && [NIVEL] EN

    (

    VAR _LEV = MAXX

    (FILTER( 'DIM_ACT',[ID DE CORREO ELECTRÓNICO] = USERPRINCIPALNAME () ),'DIM_ACT'[_LEV])

    /* TOME LA LONGITUD DE LA RUTA DE LA COLUMNA LEVEL. ESTO SE HACE PORQUE PODRÍA HABER N NÚMERO DE VALORES SEPARADOS POR | EN DIM_ACT TABLAY NECESITAMOS SEPARARLOS COMO VALORES INDIVIDUALES */

    VAR _LEVLEN = LONGITUD DE LA RUTA (_LEV )

    /* CREA UNA TABLA VIRTUAL CON EL NOMBRE DE COLUMNA LEVLIST QUE TIENE LA LISTA DE VALORES DE COLUMNA DE NIVEL */

    VAR _LEVTABLE = ADDCOLUMNS ( GENERATESERIES ( 1, _LEVLEN ), "LEVLIST", PATHITEM ( _LEV, [Value] ) )

    /* SELECCIONE LOS VALORES DE LA COLUMNA Y PASE LOS VALORES A LA LISTA */

    VAR _LEV_list = SELECTCOLUMNS ( _LEVTABLE, "LEVEL", [LEVLIST] )

    /* SUMA TODOS LOS VALORES DE NIVEL DE FACT_ACTUALS. ESTO ES PARA UN USUARIO QUE TIENE ASIGNADO EL VALOR "ALL" EN EL NIVEL DE DIM_ACT TABLA */

    VAR _ALLFACTLEV = ADDCOLUMNS ( VALORES ( FACT_ACTUALS[NIVEL] ), "TODOS", "TODOS" )

    /* DEVUELVE SOLO LOS VALORES ASIGNADOS EN LA COLUMNA DE NIVEL EN DIM_ACT DE LA TABLA DE HECHOS PARA EL USUARIO QUE HA INICIADO SESIÓN O DEVUELVE TODOS LOS VALORES DE LA TABLA DE HECHOS CUANDO LA COLUMNA DE NIVEL SE PROPORCIONA COMO ALL */

    DEVOLUCIÓN

    SELECTCOLUMNS(FILTER ( _ALLFACTLEV, [LEVEL] IN _LEV_LIST || [TODOS] EN _LEV_LIST ),[NIVEL]))

    && [ETIQUETA] EN

    (

    VAR _LAB = MAXX

    (FILTRO ( 'DIM_ACT', [ID de correo electrónico] = USERPRINCIPALNAME () ),'DIM_ACT'[ETIQUETA])

    VAR _LABLEN = LONGITUD DE LA RUTA ( _LAB )

    VAR _LABTABLE = ADDCOLUMNS ( GENERATESERIES ( 1, _LABLEN ), "LABLIST", PATHITEM ( _LAB, [Value] ) )

    VAR _LAB_LIST = SELECTCOLUMNS ( _LABTABLE, "LABEL", [LABLIST] )

    VAR _ALLFACTLAB = ADDCOLUMNS ( VALORES ( FACT_ACTUALS[ETIQUETA] ), "TODOS", "TODOS" )

    DEVOLUCIÓN

    SELECTCOLUMNS (FILTER ( _ALLFACTLAB, [LABEL] IN _LAB_LIST || [TODOS] EN _LAB_LIST ),[ETIQUETA]))

    && [FUENTE] EN ------ Del mismo modo, repita el código anterior para otras columnas en DIM_ACT

4 Replies

  • Usando el campo ID. Ahora he creado tablas de dimensiones separadas para Nivel (DIM_LEVEL), Etiqueta (DIM_LABEL), DIM_source, DIM_cc, DIM_org, DIM_loc que contiene una sola columna respectivamente en todas estas tablas que tienen valores únicos que establecen una relación de 1 a muchos con el hecho.

    • Sería genial si pudiera usar un solo rol usando la consulta DAX y no usar ninguna relación entre hechos y reales. Desde el punto de vista del rendimiento, sería mejor si la solución se puede lograr utilizando el formato de tabla de DIM_ACT anterior, ya que cuando estoy transformando las filas usando delimitadores de división, la tabla podría volverse muy grande en el futuro. Los departamentos agregarán o actualizarán las filas de esta tabla en el futuro para el acceso de nuevos usuarios. Por favor, hágamelo saber para cualquier consulta.
  • Consulte la solución a continuación.

    1.) Todos los valores de punto y coma en DIM_ACT columnas deben ser reemplazados por el símbolo "|" para que esta fórmula funcione. Cambie los datos de origen o cree una columna calculada para reemplazar ";" por "|".

    2.) Se eliminó DIM_USER tabla y se incorporó la columna de ID de correo electrónico a DIM_ACT propia tabla. 3.) Solo hay 1 registro para un solo usuario en DIM_ACT en un solo GRUPO.

    4.) Cree un ROL en Administrar roles y aplíquelo debajo de DAX en FACT_ACTUALS tabla. Usando el siguiente DAX, cuando el usuario inicie sesión, podrá ver solo los valores separados con "|" en las columnas respectivas de DIM_ACT y cuando ALL esté presente en cualquiera de las columnas, podrá ver todos los valores disponibles en FACT ACTUALS.

    /* FILTRE DIM_ACT PARA OBTENER EL REGISTRO QUE SOLO TIENE EL ID DE CORREO ELECTRÓNICO DEL USUARIO QUE HA INICIADO SESIÓN Y LOS VALORES ASIGNADOS EN LA COLUMNA DE NIVEL */

    && [NIVEL] EN

    (

    VAR _LEV = MAXX

    (FILTER( 'DIM_ACT',[ID DE CORREO ELECTRÓNICO] = USERPRINCIPALNAME () ),'DIM_ACT'[_LEV])

    /* TOME LA LONGITUD DE LA RUTA DE LA COLUMNA LEVEL. ESTO SE HACE PORQUE PODRÍA HABER N NÚMERO DE VALORES SEPARADOS POR | EN DIM_ACT TABLAY NECESITAMOS SEPARARLOS COMO VALORES INDIVIDUALES */

    VAR _LEVLEN = LONGITUD DE LA RUTA (_LEV )

    /* CREA UNA TABLA VIRTUAL CON EL NOMBRE DE COLUMNA LEVLIST QUE TIENE LA LISTA DE VALORES DE COLUMNA DE NIVEL */

    VAR _LEVTABLE = ADDCOLUMNS ( GENERATESERIES ( 1, _LEVLEN ), "LEVLIST", PATHITEM ( _LEV, [Value] ) )

    /* SELECCIONE LOS VALORES DE LA COLUMNA Y PASE LOS VALORES A LA LISTA */

    VAR _LEV_list = SELECTCOLUMNS ( _LEVTABLE, "LEVEL", [LEVLIST] )

    /* SUMA TODOS LOS VALORES DE NIVEL DE FACT_ACTUALS. ESTO ES PARA UN USUARIO QUE TIENE ASIGNADO EL VALOR "ALL" EN EL NIVEL DE DIM_ACT TABLA */

    VAR _ALLFACTLEV = ADDCOLUMNS ( VALORES ( FACT_ACTUALS[NIVEL] ), "TODOS", "TODOS" )

    /* DEVUELVE SOLO LOS VALORES ASIGNADOS EN LA COLUMNA DE NIVEL EN DIM_ACT DE LA TABLA DE HECHOS PARA EL USUARIO QUE HA INICIADO SESIÓN O DEVUELVE TODOS LOS VALORES DE LA TABLA DE HECHOS CUANDO LA COLUMNA DE NIVEL SE PROPORCIONA COMO ALL */

    DEVOLUCIÓN

    SELECTCOLUMNS(FILTER ( _ALLFACTLEV, [LEVEL] IN _LEV_LIST || [TODOS] EN _LEV_LIST ),[NIVEL]))

    && [ETIQUETA] EN

    (

    VAR _LAB = MAXX

    (FILTRO ( 'DIM_ACT', [ID de correo electrónico] = USERPRINCIPALNAME () ),'DIM_ACT'[ETIQUETA])

    VAR _LABLEN = LONGITUD DE LA RUTA ( _LAB )

    VAR _LABTABLE = ADDCOLUMNS ( GENERATESERIES ( 1, _LABLEN ), "LABLIST", PATHITEM ( _LAB, [Value] ) )

    VAR _LAB_LIST = SELECTCOLUMNS ( _LABTABLE, "LABEL", [LABLIST] )

    VAR _ALLFACTLAB = ADDCOLUMNS ( VALORES ( FACT_ACTUALS[ETIQUETA] ), "TODOS", "TODOS" )

    DEVOLUCIÓN

    SELECTCOLUMNS (FILTER ( _ALLFACTLAB, [LABEL] IN _LAB_LIST || [TODOS] EN _LAB_LIST ),[ETIQUETA]))

    && [FUENTE] EN ------ Del mismo modo, repita el código anterior para otras columnas en DIM_ACT