Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hola a todos,
Espero me puedan ayudar con el este problema. Tengo un Catalogo con los siguientes campos y valores.
USUARIOS | |||||
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 |
| 6 | DIRECTOR B |
Y una Fact Table como sigue:
FACT TABLE | |||
EMPLEADO | CLIENTE | PRODUCTO | FECHA |
---|---|---|---|
2 | 123 | PRODUCTO 1 | 07/08/2016 |
3 | 456 | PRODUCTO 2 | 08/08/2016 |
4 | 789 | PRODUCTO 3 | 09/08/2016 |
1 | 678 | PRODUCTO 4 | 10/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.
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;
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
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
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
Gracias Joaquin, lo aplicaré y ya vuelvo para comentar. Saludos
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;
Muy bueno Rubén. Gracias
@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.