none
Selección por fechas no funciona

    Pregunta

  • Buenos días

       A ver si alguien me puede dar alguna pista de si estoy enfocando este asunto mal. 

    Estoy comenzando a trabajar con los modelos tabulares de Analysis Services. Tengo una tabla de unidades de producto (cada unidad va identificada de forma única) y dos tablas, una de compras y otra de ventas. Además, tengo una tabla de fechas.

    Lo que quiero obtener es el siguiente resultado: mostrar, día por día, cuántas unidades se han vendido de un conjunto de artículos que se han comprado entre 2 fechas determinadas. Es decir: si el usuario selecciona compras entre el 1 y el 7 de Enero, mostrar las ventas de las unidades que se hayan comprado entre esas dos fechas (aunque las ventas sean posteriores a ese periodo).

    Para mostrar las unidades compradas tengo lo siguiente:

    UnidadesFrescosCompradasFiltradas:= 
    var
    	desde = MIN(DimFecha[Fecha])
    var
    	hasta = max(DimFecha[Fecha])
    return
    
    countx(
    	calculatetable(
    	calculatetable(
    		filter(
    			marchamos; 
    			not isempty (CALCULATETABLE(filter(filter(ARFABRI; ARFABRI[FECHA]>= desde); ARFABRI[FECHA]<= hasta); USERELATIONSHIP(MARCHAMOS[REGIS28];ARFABRI[ARFA01])))
    		);
    		MID(MARCHAMOS[REGIS03]; 1; 1) = "1";
    		TIPOS_COCHINILLO[GRUPO]=0;
    		userelationship(MARCHAMOS[REGIS28];ARFABRI[ARFA01])						
    	);
    	userelationship(ARFABRI[FECHA]; DimFecha[Fecha])
    	);
    [regis01])

    Esto me funciona perfectamente. Pero para mostrar las unidades vendidas (que, recordemos, puede extenderse más allá del periodo seleccionado) tengo:

    UnidadesFrescosVendidasFiltradas:=
    countx(
    	calculatetable(
    
    	filter(
    
    	MarchamosFiltrados;
    			not isempty (relatedtable('ALBACA'))
    		);	
    		MID(MarchamosFiltrados[REGIS03]; 1; 1) = "1";
    		TIPOS_COCHINILLO[GRUPO]=0;
    		userelationship(ALBACA[FECHAVENTA]; DimFecha[Fecha])
    		
    	);
    [regis01])
    
    
    
    
    
    (TABLA CALCULADA MarchamosFiltrados)
    
    = 
    var
    	desde = MIN(DimFecha[Fecha])
    var
    	hasta = max(DimFecha[Fecha])
    return
    
    CALCULATETABLE(
    	calculatetable(
    		FILTER(
    			marchamos; 
    			not isempty (CALCULATETABLE(filter(filter(ARFABRI; ARFABRI[FECHA]<=hasta); ARFABRI[FECHA]>= desde); USERELATIONSHIP(MARCHAMOS[REGIS28];ARFABRI[ARFA01])))
    		);
    		MID(MARCHAMOS[REGIS03]; 1; 1) = "1";
    		TIPOS_COCHINILLO[GRUPO]=0;
    		USERELATIONSHIP(MARCHAMOS[REGIS28];ARFABRI[ARFA01])
    	);  userelationship(ARFABRI[FECHA]; DimFecha[Fecha])
    )

    Es decir, primero hago una tabla calculada que seleccione solo las unidades que efectivamente se han comprado en esas fechas, y luego calculo, sobre esa tabla, la cuenta de unidades vendidas sin volver a filtrar  (ARFABRI contiene los datos de compra y ALBACA los datos de venta).

    Sin embargo, me restringe los resultados de la venta también al periodo seleccionado para las compras. ¿Qué estoy haciendo mal?

    Un saludo

    martes, 06 de febrero de 2018 8:49

Respuestas

  • TE recomiendo encarecidamente que revises tu estrategia, tablas en memoria, count x y mucho dax solo harán que tu consulta rinda bastante mal.

    Este problema resuelto en ETL es trivial, simplemente creando una tabla que prepare esos datos se convierte en una relación directa y rendirá estupendamente. 

    Si insiste en hacerlo así revisa en algún calculatetable de los muchos que tienes añadir all(fechas) una vez que tengas los productos seleccionados para evitar lo que te pasa


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta David Rodher jueves, 15 de febrero de 2018 8:40
    jueves, 08 de febrero de 2018 7:09
    Moderador

Todas las respuestas

  • TE recomiendo encarecidamente que revises tu estrategia, tablas en memoria, count x y mucho dax solo harán que tu consulta rinda bastante mal.

    Este problema resuelto en ETL es trivial, simplemente creando una tabla que prepare esos datos se convierte en una relación directa y rendirá estupendamente. 

    Si insiste en hacerlo así revisa en algún calculatetable de los muchos que tienes añadir all(fechas) una vez que tengas los productos seleccionados para evitar lo que te pasa


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta David Rodher jueves, 15 de febrero de 2018 8:40
    jueves, 08 de febrero de 2018 7:09
    Moderador
  • Muchas gracias. He rediseñado el modelo, priorizando el minimizar el número de tablas que haya que consultar posteriormente y ahora va de lujo (y mucho más rápido)
    jueves, 15 de febrero de 2018 8:40