Forum Discussion
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
| CAMINO | GRUPO | IDENTIFICACIÓN | NIVEL | ETIQUETA | FUENTE | CC | ORG | LUGAR |
| FLEX PARA TI | BÁSICO A | SDK (Sistema de traducción | 100; A20; K40 | XKG; TBF | 1 | E250; V365 | 25; 36 | TODO |
| EJEMPLO DE WS | BÁSICO A | SDK (Sistema de traducción | 100; A20; K40 | XKG; TBF | 1 | E250; V365 | 25; 36 | TODO |
| FLEX PARA TI | INTER A | REN | 100; A20; K40 | XKG; TBF | TODO | E250; V365 | 25; 36 | TODO |
| EJEMPLO DE WS | INTER A | REN | 100; A20; K40 | XKG; TBF | TODO | E250; V365 | 25; 36 | TODO |
| FLEX PARA TI | AVANZADO A | OBQ | TODO | TODO | TODO | E250; V365 | 25; 36 | TODO |
| EJEMPLO DE WS | AVANZADO A | OBQ | TODO | TODO | TODO | TODO | TODO | TODO |
| FLEX PARA TI | AVANZADO B | ABECEDARIO | TODO | TODO | 2 | E250; V365 | TODO | TODO |
| FLEX PARA TI | INTER B | XYZ | 300:J99 | HACE | 2 | TODO | 58 | TODO |
| FLEX PARA TI | BÁSICO B | DEF | J99 | HACE | 2 | 20 | TODO | 800 |
| EJEMPLO DE WS | INTER B | XYZ | 300:J99 | XKG | TODO | 35A; 40B | 35; 40 | 200; 500 |
| EJEMPLO DE WS | AVANZADO B | ABECEDARIO | F350 | TODO | 2 | TODO | TODO | TODO |
| EJEMPLO DE WS | BÁSICO B | DEF | 300 | DUQUE | 2 | TODO | 45 | 300; 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
- Syndicate_Admin
Administrator
@lbendlin ¿Tienes alguna idea, por favor?
- Syndicate_Admin
Administrator
¿Cómo se conecta su mesa DIM_USER a la mesa DIM_ACT?
- Syndicate_Admin
Administrator
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.
- Syndicate_Admin
Administrator
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