Genere una identificación principal a partir de la información del nivel de la lista de materiales

Un usuario Pregunto ✅

saikon

Estoy tratando de encontrar una fórmula DAX (o Power Query) para determinar cada fila principal si existe.

Tengo datos que contienen el índice, el nivel y la información de los componentes. La columna principal es la que me gustaría generar. A continuación se muestra un ejemplo de lo que se desea para generar una relación entre padres e hijos (como aquí https://www.daxpatterns.com/parent-child-hierarchies/)

Index    Level    Component    Parent
1        1        A            -
2        2        B            1
3        3        C            2
4        3        D            2
5        2        E            1
6        3        F            5
7        1        G            -
8        2        H            7

Lo he logrado de forma recursiva con VBA para agrupar mis filas en Excel de acuerdo con la agrupación de subcomponentes de la lista de materiales de cada ensamblaje. No puedo averiguar cómo hacer algo similar con DAX ya que parece que las fórmulas recursivas no son posibles.

También hubo algún ejemplo en este foro sobre la búsqueda de valores coincidentes anteriores, pero no funciona de manera inmediata en mi caso. El siguiente código solo encuentra el primer valor coincidente del filtro de Nivel – 1. No funciona con los datos anteriores para la fila con índice 8, por ejemplo. Genera una identificación principal de 1 para la fila 8 cuando debería ser 7.

Parent = 
CALCULATE(
    FIRSTNONBLANK(VALUES(BOM[Index]);0);
    FILTER(
        ALL(BOM);
        BOM[Level] = EARLIER(BOM[Level]) - 1 &&
        BOM[Index] < EARLIER(BOM[Index])
    )
)

Zubair_Muhammad

@saikon

Su fórmula DAX también parece correcta.

SOLO REEMPLAZAR FIRSTNONBLANK con LASTNONBLANK

Zubair_Muhammad

@saikon

Su fórmula DAX también parece correcta.

SOLO REEMPLAZAR FIRSTNONBLANK con LASTNONBLANK

saikon

En respuesta a Zubair_Muhammad

@Zubair_Muhammad Gracias, esa sugerencia de DAX funciona, pero no pude hacer funcionar la de Power Query. Solo genera valores nulos.

Ahora tengo dos soluciones de trabajo para esto:

Parent = 
MAXX(
    TOPN(
        1;
        FILTER(
            'BOM';
            'BOM'[Level] = EARLIER('BOM'[Level]) - 1 &&
            'BOM'[Index] < EARLIER('BOM'[Index])
        );
        'BOM'[Index]; DESC
        );
    'BOM'[Index]
)

y

Parent = 
CALCULATE(
    LASTNONBLANK(VALUES(BOM[Index]);0);
    FILTER(
        ALL(BOM);
        BOM[Level] = EARLIER(BOM[Level]) - 1 &&
        BOM[Index] < EARLIER(BOM[Index])
    )
)

Zubair_Muhammad

En respuesta a saikon

hola @saikon

Adjunto el archivo pbix con fórmulas personalizadas de Power Query

Funciona conmigo

saikon

En respuesta a Zubair_Muhammad

Gracias, lo descubrí. No puede simplemente copiar y pegar esas fórmulas de Power Query porque tienen alguna referencia a cada paso realizado con los datos antes.

¿Alguna idea sobre cómo generar el PATH directamente en Power Query? ¿O cómo generar el Nivel 1, Nivel 2, Nivel …, Nivel n automáticamente? Dado que no sé cuántos niveles pueden incluir los datos.

Zubair_Muhammad

En respuesta a saikon

@saikon

En Power Query, podemos usar List.Generate para replicar la función PATH.

Si puede copiar y pegar algunos datos con los resultados esperados, intentaré escribirlos por usted

saikon

En respuesta a Zubair_Muhammad

El resultado esperado usando DAX con el ejemplo que envió es solo una nueva columna con:

Column = PATH(BOM[Index]; BOM[Custom])

Untitled.png

Si esto se puede hacer con Power Query, entonces puedo dividir la columna en todos los niveles requeridos sin crear las columnas manualmente y preocuparme si cambia la profundidad del nivel.

Zubair_Muhammad

En respuesta a saikon

@saikon

Puedes usar esta columna personalizada

Adjunto archivo de muestra con esta fórmula

=let mylist=
        {[Index]} & (let myparent=[Custom] in
        List.Generate(()=>[x=0,y=myparent,w=1],each [w] > 0, each [z=
        [y], x=Table.SelectRows(#"Changed Type1",each  [Index]=z)[Custom],
        y=x{0},
        w=List.Count(x)],each [y]))
        in
        Text.Combine(List.Reverse(List.RemoveItems(List.Transform(mylist,each Number.ToText(_)),{null,""})),"|")

Pathee.png

Zubair_Muhammad

@saikon

Como columna personalizada de Power Query, pruebe esto

=try
let myindex=[Index],
mylevel=[Level]
in
Table.Max(Table.SelectRows(#"Changed Type",each  [Index]< myindex and [Level]=mylevel-1),"Index")[Index]
otherwise
null

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *