Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hola,
asumamos que tengo una tabla que contiene datos como los de abajo (actualmente tengo 46 empresas, 7 GroupMask, y una infinidad de Clientes)
Compañía | Cliente | GroupMask | Saldo |
Juan | Victor | 1 | 50 |
Juan | Marcos | 1 | 33.5 |
Juan | Manuel | 1 | 12 |
Juan | Pablo | 2 | -42 |
Manuel | Pablo | 1 | 11 |
Manuel | Juan | 2 | -12 |
Marcos | Pablo | 1 | 24 |
Marcos | Juan | 2 | -30 |
Marcos | Victor | 2 | -40 |
Pablo | Juan | 1 | 42 |
Pablo | Marcos | 2 | -23 |
Pablo | Manuel | 2 | -11 |
Victor | Marcos | 1 | 40 |
Victor | Juan | 2 | -50 |
donde GroupMask 1 son Cuentas por Cobrar, y GroupMask 2 son Cuentas por Pagar.
me pidieron hacer estas dos tablas.
en Cuentas por cobrar : Gráfico "Tabla Pivote"; Dimensiones: Compañía, GroupMask1 =if(GroupMask = 1, GroupMask), Cliente;
Expresión: Sum(Saldo)
en cuentas por pagar : Grafico "Tabla Pivote"; Dimensiones: Cliente, GroupMask2 =if(GroupMask = 2, GroupMask), Compañía;
Expresión: Sum(Saldo)
noten que en el segundo gráfico, puse "Cliente" primero, y de ultimo "Compañía", para que me presentaran el mismo esquema.
Para el análisis, ellos a tienen un orden especifico en sus 40 empresas, que han usado por años.
El orden por defecto de mi ejemplo es: Juan, Manuel, Marcos, Pablo, Victor. para ordenarlos en una forma especifica utilice esto para
ordenar Compañía una expresion: Match(Compañia,'Juan', 'Victor', 'Manuel', 'Pablo', 'Marcos')
y para Cliente esta expresion: Match(Cliente,'Juan', 'Victor', 'Manuel', 'Pablo', 'Marcos')
Para saber si hay un descuadre, hice esto.
un gráfico "tabla pivote" con dos dimensiones calculadas.
la primera, "Unión 1" es =if(GroupMask = 1, Compañia, if(GroupMask = 2,Cliente))
la segunda, "Unión2" es =if(GroupMask = 1, Cliente, if(GroupMask = 2, Compañia))
un expresión con =Sum(Saldos)
mi problema es que no he encontrado la forma de ordenar el gráfico "Descuadre" de forma especifica.
no se como decirla al "Sort Expresion" de Union1 o Union2, que lo ordene Juan, Victor, Manuel, Pablo, Marcos.
Actualmente en mi Qlikview original de 40 empresas las compañías son leídas en el script de forma ordenada,
ademas las compañías y los clientes tienen un numero de ordenamiento en el script, pero incluso usando eso para ordenarlo, a sido en vano.
¿Me ayudarían a encontrar una manera de ordenar una dimensión calculado de un gráfico pivote?
_______________________________________________________________________________________________________________
Lo he solucionado por ahora de esta manera, pero esto no es "optimo" para mi, teniendo en cuenta que tengo 46 empresas.
para el ejemplo lo soluciona por ahora así.
si alguien tiene una mejor idea, se lo agradecería mucho.
teniendo en cuenta la función RowNo() y como genera un auto numérico para cada linea se me ocurrió moverlas de esta manera. para la dimension calculada
"Union1" : =if(RowNo()=1,1,if(RowNo() =2, 4, if(RowNo() = 3,3, if(RowNo()=4,5,if(RowNo() = 5,2)))))
y en
"Union2" : =if(RowNo()=1,2,if(RowNo() =2, 5, if(RowNo() = 3,3, if(RowNo()=4,1,if(RowNo() = 5,4)))))
Jajajajaj, El Qlikview nos pierde muchas veces.
una de las ideas que me ha pasado por la mente es esa.
lo inconveniente de eso es que como son 46 empresas. al armarlo desde el script, demora una eternidad la carga.
si lo hago de esa manera, la carga del script me toma casi lo 25 minutos. por la cantidad de data que tiene que recalcular desde el script.
si lo hago en el grafico, por ahora me toma 8 minutos la carga. y ya los 8 minutos me parece una eternidad.
pero lo mas optimo para mi seria hacer lo que me pides.
en el ejemplo que puse, dentro del grafico "Descuadre" puse esto en la pestaña "Ordenar" y la parte que dice expresion.
"Union1" : =if(RowNo()=1,1,if(RowNo() =2, 4, if(RowNo() = 3,3, if(RowNo()=4,5,if(RowNo() = 5,2)))))
y en
"Union2" : =if(RowNo()=1,2,if(RowNo() =2, 5, if(RowNo() = 3,3, if(RowNo()=4,1,if(RowNo() = 5,4)))))
esto soluciona mi problema.
el punto es que si se agregan mas empresas de las 46 que tengo, tendre que reparar este codigo cada vez que recargue.
No. no, no
La tabla de mapping pones
Union1:
Mapping
LOAD INLINE
Juan, 1
Pedro, 2
Manolo, 3
Alberto, 4
Union2
Mapping
LOAD INLINE
Juan, 4
Pedro, 1
Manolo, 2
Alberto, 3
y en la tabla de hechos
LOAD *,
Applymap('Union1', Unión1) as OrdUnion1
Applymap('Union2', Unión2) as OrdUnion2
LOAD ...
if(GroupMask = 1, Compañia, if(GroupMask = 2,Cliente)) as Unión1
if(GroupMask = 2, Cliente, if(GroupMask = 2,Compañia)) as Unión2
He corrido mucho disculpa si la sintaxis no es 100% correcta
Saludos
Joaquín
Finalmente halle la solución, y fue gracias a ambos. en realidad fue gracias a los dos,
por que la solución correcta es una mezcla de las soluciones de ustedes.
Utilice un Dual con un ApplyMap al mismo tiempo, jajajajaja que locura.
Dual1:
Mapping
LOAD Orden1, dual(string,numrep) as Compañia INLINE [
string, numrep, Orden1
Juan, 1, 1
Victor, 2, 2
Manuel, 3, 3
Pablo, 4, 4
Marcos, 5, 5
];
Dual2:
Mapping
LOAD Orden2, dual(string,numrep) as Cliente INLINE [
string, numrep, Orden2
Juan, 1, 1
Victor, 2, 2
Manuel, 3, 3
Pablo, 4, 4
Marcos, 5, 5
];
y luego cambie la tabla de los datos de esta manera.
Tabla:
LOAD
ApplyMap('Dual1',Orden1,Null())as Compañia, ApplyMap('Dual2',Orden2,Null())as Cliente, GroupMask, Saldo
INLINE [
Orden1, Orden2, GroupMask, Saldo
1, 2, 1, 50
1, 5, 1, 33.5
1, 3, 1, 12
1, 4, 2, -42
3, 4, 1, 11
3, 1, 2, -12
5, 4, 1, 24
5, 1, 2, -30
5, 2, 2, -40
4, 1, 1, 42
4, 5, 2, -23
4, 3, 2, -11
2, 5, 1, 40
2, 1, 2, -50
];
y listo, deje todo los gráficos iguales, y en la pestaña orden, le puse, ordenar numéricamente.
Esta es la solución para ordenar una dimension calculada dentro de una tabla pivote.
Usar la funcion Dual al mismo tiempo que el ApplyMap.
obviamente me toca cambiar mi query final, en vez de usar el nombre de la compañia, uso el numero id de la misma.
y acomodo el mapping.
Gracias por la ayuda. JoaquinLRSorrakis01
Bueno, lo importante es que lo has resuelto.
Hasta la próxima