Skip to main content
Woohoo! Qlik Community has won “Best in Class Community” in the 2024 Khoros Kudos awards!
Announcements
Nov. 20th, Qlik Insider - Lakehouses: Driving the Future of Data & AI - PICK A SESSION
cancel
Showing results for 
Search instead for 
Did you mean: 
rulohx87
Contributor III
Contributor III

Seguridad por jerarquía.

Hola a todos,

Espero me puedan ayudar con el este problema. Tengo un Catalogo con los siguientes campos y valores.

USUARIOS
ACCESSNTNAMEEMPLEADOJEFEPUESTO
ADMINDOMAIN\A000DIRECTOR A
USERDOMAIN\A0110

SUBDIRECTOR

USERDOMAIN\A0221ANALISTA
USERDOMAIN\A0331DESARROLLADOR
USERDOMAIN\A0445TESTER
USERDOMAIN\A0556SUBDIRECTOR
ADMIN
DOMAIN\A06
6DIRECTOR B

Y una Fact Table como sigue:

FACT TABLE
EMPLEADOCLIENTEPRODUCTOFECHA
2123PRODUCTO 107/08/2016
3456PRODUCTO 208/08/2016
4789PRODUCTO 309/08/2016
1678PRODUCTO 410/08/2016

De la cual estoy aplicando un Section Access para reducir la data:

Section Access;

LOAD

     ACCESS,

     NTNAME,

     EMPLEADO

FROM USUARIOS

Section Application;

El problema de este Section Access es que solo hace la reducción de datos a nivel de Empleado. Pero si entra un subdirector no puede ver la información de sus subordinados más que la que tuviese él.


Por ejemplo


Si entra el Empleado 5 no vería nada puesto que no existe en la Fact table... Sin embargo su subordinado es el empleado 4 y esta información es la que debería de ver.

¿Cómo debería quedar el Section Access?  Gracias de antemano.

1 Solution

Accepted Solutions
rubenmarin

Hola Raul, también puedes crear una jerarquía primero y a partir de ella crear el section access:

DataOrig:

LOAD * Inline [

ACCESS, NTNAME ,EMPLEADO ,JEFE ,PUESTO

ADMIN, DOMAIN\A00 ,0 , ,DIRECTOR A

USER, DOMAIN\A01 ,1 ,0 ,SUBDIRECTOR

USER, DOMAIN\A02 ,2 ,1 ,ANALISTA

USER, DOMAIN\A03 ,3 ,1 ,DESARROLLADOR

USER, DOMAIN\A04 ,4 ,5 ,TESTER

USER, DOMAIN\A05 ,5 ,6 ,SUBDIRECTOR

ADMIN,  DOMAIN\A06 ,6 , ,DIRECTOR B

];

Jerarquia: //El Path almacenará los NTNAMEs que tienen acceso a cada EMPLEADO

Hierarchy(EMPLEADO, JEFE, NTNAME, Jefe, NTNAME, 'Path', '#')

LOAD EMPLEADO, JEFE, NTNAME Resident DataOrig;

Result: //Usando Subfield dividimos el path en distintos registros, uno para cada NTNAME

LOAD EMPLEADO, Subfield(Path, '#') as NTNAME Resident Jerarquia;

// Se añaden el resto de campos

Left Join (Result) LOAD NTNAME, ACCESS, PUESTO Resident DataOrig;

DROP tables DataOrig, Jerarquia;

View solution in original post

7 Replies
Joaquin_Lazaro
Partner - Specialist II
Partner - Specialist II

Hola Raúl:

En este caso tienes que hacer dos distribuciones una para empleados en base a la columna EMPLEADO con el comportamiento que has descrito y otra distribución para responsables en base a la columna JEFE.

Modifica está carga para que el campo jefe siempre tenga un valor

LOAD ...

          if (IsNull(JEFE), EMPLEADO, JEFE) as JEFE

Saludos

Joaquín

rulohx87
Contributor III
Contributor III
Author

Hola Joaquin, No entiendo muy bien cómo podría resolver el problema del Section Access. De alguna manera si pongo el campo de JEFE en el Section Access, me dará únicamente los empleados del JEFE.

- En un caso práctico si el empleado 0 entra no vería a los empleados 1,2 y 3 que son sus subordinados.

- Si entrase de igual forma el empleado 1 solo vería su información sin ver los empelados 2 y 3 que son sus subordinados.

Saludos

Joaquin_Lazaro
Partner - Specialist II
Partner - Specialist II

Hola Raúl:

Por eso te digo que debes hacer dos distribuciones una para empleados y otra para jefes.

Yo esto lo hago con QV-Publisher y dos tareas de distribución.

Se me ocurre que busques una solución con una columna de dos valores y que se comprueben con un OR

Empleado 2 or Jefe 1 sería el valor de esta columna

Busca como hacer una section access con OR

Saludos

Joaquín

rulohx87
Contributor III
Contributor III
Author

Gracias Joaquin, lo aplicaré y ya vuelvo para comentar. Saludos

rubenmarin

Hola Raul, también puedes crear una jerarquía primero y a partir de ella crear el section access:

DataOrig:

LOAD * Inline [

ACCESS, NTNAME ,EMPLEADO ,JEFE ,PUESTO

ADMIN, DOMAIN\A00 ,0 , ,DIRECTOR A

USER, DOMAIN\A01 ,1 ,0 ,SUBDIRECTOR

USER, DOMAIN\A02 ,2 ,1 ,ANALISTA

USER, DOMAIN\A03 ,3 ,1 ,DESARROLLADOR

USER, DOMAIN\A04 ,4 ,5 ,TESTER

USER, DOMAIN\A05 ,5 ,6 ,SUBDIRECTOR

ADMIN,  DOMAIN\A06 ,6 , ,DIRECTOR B

];

Jerarquia: //El Path almacenará los NTNAMEs que tienen acceso a cada EMPLEADO

Hierarchy(EMPLEADO, JEFE, NTNAME, Jefe, NTNAME, 'Path', '#')

LOAD EMPLEADO, JEFE, NTNAME Resident DataOrig;

Result: //Usando Subfield dividimos el path en distintos registros, uno para cada NTNAME

LOAD EMPLEADO, Subfield(Path, '#') as NTNAME Resident Jerarquia;

// Se añaden el resto de campos

Left Join (Result) LOAD NTNAME, ACCESS, PUESTO Resident DataOrig;

DROP tables DataOrig, Jerarquia;

Joaquin_Lazaro
Partner - Specialist II
Partner - Specialist II

Muy bueno Rubén. Gracias

rulohx87
Contributor III
Contributor III
Author

@Ruben Gracias

Tu solución me ayudó a entender el concepto. Adjunto la solución que hice, por si alguién tiene la misma pregunta.

@Joaquin, igualmente gracias por la aportación.