Forum Discussion

hnguyen76's avatar
hnguyen76
Icon for Resolver II rankResolver II
6 years ago
Solved

Power Query Configurable / Dynamic If (instrucción) If

Hola a todos.

Intento crear una lista de configuración que puedo convertir en una sola instrucción y, a continuación, hacer que una columna personalizada ingiere esa lógica y evaluar si es posible. El objetivo detrás de esto es permitir que las condiciones se establezcan fuera de power bi, ya que las reglas y lógicas cambiarán con el tiempo sin necesidad de tocar la solución y hacerla más dinámica. Tengo una tabla de muestra a continuación que contiene información clave:

HipótesisCondiciónConclusiónResultado
Si[Proveedor] - "Muestra1"Entonces"Muestra"
Si[OrigOperatorId] á "brg" y [Sistema] - "AP"Entonces"Resultado1"
Si[Sistema] - "AP" o [Sistema] - "PO"Entonces"APPO"

Quiero convertir eso en algo como esto:

si [Proveedor] - "Sample1" a continuación, "Sample" else if [OrigOperatorId] - "brg" y [System] á "AP" entonces "Result1" else if [System] á "AP" o [System] - "PO" y luego "APPO" else ""

Por último, pasarlo a una columna personalizada que evalúa toda la cadena. Así que digamos si tengo una tabla de muestra como esta:

IdProveedorOrigOperatorIdSistema
1Muestra2S3
2Muestra1IrGrr
3Muestra3BrgAp
4Muestra4AbejaAp

La nueva columna condicional debe evaluar y devolver el resultado esperado de:

IdProveedorOrigOperatorIdSistemaPrueba
1Muestra2S3
2Muestra1IrGrrMuestra
3Muestra3BrgApResultado1
4Muestra4AbejaApAppo

¿Es esto posible? Creo que debería serlo. Cualquier ayuda sería muy apreciada!
@ImkeF

  • ImkeF's avatar
    ImkeF
    6 years ago

    Gracias @artemus ,

    que elude muy bien la combinación de las dependencias forumula con el contexto de fila.

    ¿Se trata de una limitación general al usar Expression.Evaluate o cree que el error se debe a alguna configuración específica dentro de este ejemplo?

    @hnguyen76 ,

    Lo he reescrito ligeramente para que sea más fácil intercambiar el código de ejemplo con sus datos reales.
    Además, he incluido una declaración "List.Select" para obtener el valor correcto de las condiciones evaluadas:


    let
        ConditionsFromExcelTable = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WykxT0lGKDkvNS8kvilWwVYhRCk7MLchJNYxRAkqUZKTmASmIkFKsDky9f1Fmun9BalFiSX6RZwpEX1JReoySQmJeikJ0cGVxSWouRNgxANmkoNTi0pwSQySj0NUq5BehGhDgj2yAY0CAP0J3SGpFiZ5zfl5JYmZesQbMGzoKcG8YxShpYvojFgA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Hypothesis = _t, Condition = _t, Conclusion = _t, Result = _t]),
        
        AddFunctionColumToConditions = let
            Source = ConditionsFromExcelTable,
            #"Changed Type" = Table.TransformColumnTypes(Source,{{"Hypothesis", type text}, {"Condition", type text}, {"Conclusion", type text}, {"Result", type text}}),
            GenerateFunctions = Table.AddColumn(#"Changed Type", "Function", each Expression.Evaluate("each if " & [Condition] & " then """ & [Result] & """ else null", [Text.Contains = Text.Contains, Comparer.OrdinalIgnoreCase = Comparer.OrdinalIgnoreCase]))
        in
            GenerateFunctions,
    
        SourceData = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUQpOzC3ISTUCsYyBhG9inlKsTrSSEVwKpCg9H0i4FwWBpYzhUiBWUlE6kHQMAEuZwKVArKTUVKhULAA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ID = _t, Vendor = _t, OrigOperatorId = _t, System = _t]),
        #"Changed Type" = Table.TransformColumnTypes(SourceData,{{"Vendor", type text}, {"OrigOperatorId", type text}, {"System", type text}}),
    
        Evaluate = Table.AddColumn(
            #"Changed Type", 
            "Custom", 
            each List.First(List.Select(List.Transform(AddFunctionColumToConditions[Function], (fn) => fn(_)), each _ <> null))
            )
    in
        Evaluate

20 Replies

    • hnguyen76's avatar
      hnguyen76
      Icon for Resolver II rankResolver II

      Hola @ImkeF ,
      Gracias por el apoyo. Puede haber una sola vez donde es Text.Contains([SampleField], "ABC", Comparer.OrdinalIgnoreCase)

    • hnguyen76's avatar
      hnguyen76
      Icon for Resolver II rankResolver II

      Hola @v-xuding-msft ,

      La idea es desarrollar una solución y hacerla "sin contacto". La condición cambia las horas extras y nos gustaría permitir que el propietario de un producto cree sus propias hipótesis/conclusiones que se generarán sin alterar nada dentro de Power BI. Puede suponer que los usuarios no tendrán la capacidad de puede cualquier modificación grande o pequeña a un modelo de producción.