La solicitud

De Marcus Bennett, Jefe de ventas B2B
Tu objetivo
Paso 1 de 2. Paso 1. Escribe la regla de un rol estático llamado B2B en customers: conserva solo los clientes cuyo segmento sea business. El visual muestra lo que ven los miembros del rol.
- Cada usuario ve solo sus filas: revisa cada línea del visualpendiente
Paso 2 de 2. Paso 2. El modelo tiene ahora una tabla Reps con una fila por estado cubierto: state, rep_email y manager_email. Reescribe la regla para que conserve a un cliente cuando sea una empresa Y el usuario conectado sea el ejecutivo o el gerente indicado para el estado del cliente en Reps.
- Cada usuario ve solo sus filas: revisa cada línea del visualpendiente
Paso 1 · tu regla de rol
- Visual
- A card of [Sales], [Customers] for each user
- Medidas del informe
Sales = CALCULATE(SUM(order_items[line_total]), orders[status] = "completed")Customers = COUNTROWS(customers)
Panel de datos: tablas y columnas
- order_items order_item_id, order_id, product_id, quantity, unit_price, discount_pct, line_total
- orders order_id, customer_id, order_date, status, channel, shipping_fee, coupon_code
- products product_id, name, category, subcategory, unit_price, unit_cost, launched_on, is_active
- customers customer_id, first_name, last_name, email, city, state, signup_date, segment, referral_source
- returns return_id, order_item_id, returned_on, reason, refund_amount
- Date Date, Year, Quarter, Month Number, Month, Year Month, Year Quarter, Day, Weekday Number, Weekday
Cargando el editor…
Solución de referencia
| User | Sales | Customers |
|---|---|---|
| Nicole Adams (B2B) | 5,894,284.44 | 2,018 |
| Lisa Harper (B2B) | 5,894,284.44 | 2,018 |
Mote revisa tu resultado
Presiona Comprobar. Mote completa tu respuesta y la compara con lo que necesita el informe.
Paso 2 · tu regla de rol
- Visual
- A card of [Sales], [Customers] for each user
- Medidas del informe
Sales = CALCULATE(SUM(order_items[line_total]), orders[status] = "completed")Customers = COUNTROWS(customers)
Panel de datos: tablas y columnas
- order_items order_item_id, order_id, product_id, quantity, unit_price, discount_pct, line_total
- orders order_id, customer_id, order_date, status, channel, shipping_fee, coupon_code
- products product_id, name, category, subcategory, unit_price, unit_cost, launched_on, is_active
- customers customer_id, first_name, last_name, email, city, state, signup_date, segment, referral_source
- returns return_id, order_item_id, returned_on, reason, refund_amount
- Date Date, Year, Quarter, Month Number, Month, Year Month, Year Quarter, Day, Weekday Number, Weekday
- Reps state, rep_email, manager_email
Cargando el editor…
Solución de referencia
| User | Sales | Customers |
|---|---|---|
| Nicole Adams (rep) | 5,894,284.44 | 2,018 |
| Andrew Collins (rep) | 5,894,284.44 | 2,018 |
| Lisa Harper (manager) | 5,894,284.44 | 2,018 |
| Omar Haddad (manager) | 5,894,284.44 | 2,018 |
Mote revisa tu resultado
Presiona Comprobar. Mote completa tu respuesta y la compara con lo que necesita el informe.
Lo que recibe Marcus, y por qué
La lección
Este caso pone a trabajar todo el capítulo: primero un rol estático, luego una regla dinámica que atiende a ejecutivos y a sus gerentes desde una tabla que mantiene Operaciones de ventas.
Dónde estás trabajando
Una herramienta de práctica, no Power BI: cada paso es una regla de seguridad en customers, y el visual
muestra las Sales y los Customers que vería cada persona de la lista. En Power BI Desktop las mismas
reglas van en Modelado → Administrar roles (con Cambiar al editor DAX; Modeling → Manage roles,
Switch to DAX editor), se prueban con Modelado → Ver como (marca Otro usuario para la dinámica) y
sus miembros se añaden en el servicio, en Más opciones (…) → Seguridad del modelo semántico.
Paso 1: un rol para un segmento
La primera regla es estática: solo clientes empresa. No necesita una lista de estados ni correos, porque todos los miembros del rol B2B ven las mismas filas. El visual lo muestra: Nicole y Lisa obtienen números idénticos.
customers[segment] = "business"
Paso 2: ejecutivos y su gerente
La tabla Reps tiene una fila por estado cubierto, con el ejecutivo que lo tiene a su cargo y el gerente de ese ejecutivo. Para cada cliente, la regla necesita dos búsquedas, el ejecutivo y el gerente del estado del cliente, y conserva la fila cuando la persona conectada es cualquiera de los dos. Un cliente sigue teniendo que ser una empresa.
VAR nombra cada pieza una sola vez, lo que hace legible la regla y evita escribir dos veces la misma
búsqueda:
VAR me = USERPRINCIPALNAME()
VAR rep = LOOKUPVALUE(Reps[rep_email], Reps[state], customers[state])
VAR manager = LOOKUPVALUE(Reps[manager_email], Reps[state], customers[state])
RETURN customers[segment] = "business" && (rep = me || manager = me)
Los paréntesis importan. && se evalúa antes que ||, así que sin ellos la prueba del gerente quedaría
sola y dejaría que los gerentes vieran también a los clientes consumidores.
Los estados sin fila en Reps devuelven un vacío en ambas búsquedas, así que sus clientes quedan ocultos para todos en este rol. Es el valor predeterminado seguro: un estado nuevo es invisible hasta que Operaciones de ventas lo asigna.
Gerentes con equipos más profundos
Esta regla maneja un nivel: un ejecutivo y su gerente directo. Los organigramas con varios niveles (un
director por encima de Lisa) suelen guardar una ruta por persona y probarla con PATHCONTAINS, o
mantienen una tabla aparte de quién puede ver qué estado, una fila por persona y estado, comprobada con
IN CALCULATETABLE(VALUES(…), … = USERPRINCIPALNAME()). La idea sigue siendo la misma: la regla pregunta
quién ha iniciado sesión, y una tabla responde.
Antes de enviarlo
Prueba como cada ejecutivo, como cada gerente y como alguien del rol que no está en Reps (no debería ver nada). Añade al equipo B2B al rol como un solo grupo de seguridad. Mantén fuera a los creadores: como Admins, Members o Contributors del área de trabajo verían todas las filas de todos modos, y la prueba no te diría nada.
¡Linterna encendida!
Practicaste: row level securitystatic rlsdynamic rlsuserprincipalnamelookupvaluevarboss
- Resuelto
- Sin pistas
- Al primer intento
