Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
rbreneman
Helper II
Helper II

DAX Foreach bucle, ¿es posible?

¡Hola!

No estoy seguro de si esto es posible hacer con DAX o no, pero pensé que lo pondría aquí y vería si alguien tiene alguna sugerencia.

Tengo tres mesas. La 1a tabla se llama Ingenieros, la 2a tabla se llama EngineerAssignments, la 3a tabla se llama Oportunidad. EngineerAssignments se rellena con DAX, donde está buscando un campo específico en Oportunidad (PS_Notes__c) y buscando un nombre de ingeniero. Si se encuentra, está creando una fila con el OpportunityID de la fila en la que buscó y el nombre del ingeniero. Esto funciona perfectamente, pero el DAX es un proceso manual donde debo introducir el nombre de los ingenieros estáticamente. Me encantaría poder extraer esto de la tabla Engineers existente donde ya tengo el campo ShortName. Algo así como un foreach donde puede agarrar cada fila de la tabla de ingenieros y buscar en la tabla de oportunidades para ese ingeniero específico. ¿Tiene sentido? Es posible que más de un nombre de ingeniero se encuentre en una sola oportunidad, por lo que la tabla de resultados finales puede terminar con OpportunityID duplicados pero con diferentes ingenieros. Una vez más, no estoy seguro de si esto es posible, pero pensé que me gustaría preguntar. Gracias de antemano por cualquier ayuda o sugerencias sobre cómo puedo agilizar esto un poco!

EngineerAssignments TableTabla EngineerAssignments

Engineers TableTabla de ingenieros

1 ACCEPTED SOLUTION

Hola @AllisonKennedy ,

no estoy seguro de si el rendimiento de mi enfoque sería realmente más rápido, pero en cuanto al código es un poco más ligero. Yo "simplemente" añadir una columna a la tabla de oportunidades de esta manera:

Table.AddColumn(Opportunity, "IncludedEngineers", each List.Select(Engineers[Short Name], (l) => Text.Contains([PS_Notes__c], l)))

También almacenaría en búfer la tabla Engineers. Consulte el archivo adjunto.

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

View solution in original post

6 REPLIES 6
rbreneman
Helper II
Helper II

Gracias a todos por las grandes sugerencias y las explicaciones bien pensadas. ¡He aprendido mucho sólo de este post! En última instancia, fui con la solución de Imke, ya que parecía el más sencillo para conectarse a mi conjunto de datos existente. Una vez más, realmente quiere expresar agradecimiento por tomarse el tiempo para construir un pbix de muestra, así como explicar la solución. Este complejo es impresionante!

v-lili6-msft
Community Support
Community Support

hola @rbreneman

para su requerimiento, le sugiero que utilice esta fórmula simple como se muestra a continuación:

New table =
SELECTCOLUMNS (
    FILTER (
        Opportunity,
        Opportunity[PS_Notes__c] IN VALUES ( 'Engineers'[ShortName] )
    ),
    "OpptyID", Opportunity[ID],
    "Engineer", [PS_Notes__c]
)

saludos

Lin

Community Support Team _ Lin
If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.
AllisonKennedy
Super User
Super User

@rbreneman
En primer lugar, ¿tiene que hacerse esto en DAX? Puesto que todavía está creando el modelo de datos, sugiero usar Power Query para abordar esto.

He hecho un archivo de muestra basado en su publicación. Se adjunta debajo de la firma. He escrito una función personalizada que esencialmente hace el bucle For Each que necesita. @ImkeF puede saber una forma más eficiente de hacer esto?

Haga clic en Transformar datos en la pestaña Inicio para abrir Power Query y ver si la entrada y los resultados son similares a los que necesita. He guardo todas las PS_Notes_c columna de la tabla Oportunidad en las Asignaciones de ingenieros solo para que sea más fácil verificar que funcionó, pero puede cambiarla fácilmente para simplemente extraer el ID de oportunidad.

Aquí está la función personalizada (tendrá que actualizar nombres y referencias para que funcione con sus datos):

(ShortNameSample as text) ?> let
Source : Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("PY67DoMwDEV/xcrMTxBg6NAOZeiAGNLUtBYmroIl4O/r0sfme3xk365zpSvceQsJPLDISOkOYVDMsJA+4DCHEOFkTrngLBO6vuict/zdgApEmZ6MikZ9JmYKSXevMtJqyIo3uG5wpBGhNVaJ8C7UFv60xoES6edF86t1saFZIzLj+2r/Ag-", BinaryEncoding.Base64), Compression.Deflate)), deje _t ((tipo de texto que acepta valores NULL) meta [Serialized.Text ? true]) en la tabla de tipo ["Oportunidad _t" PS_Notes__c de _t, "Nombre de la oportunidad" _t]),
"Tipo de cambio" - Table.TransformColumnTypes(Source,'ID de oportunidad", escriba text', ''PS_Notes__c',', escriba text', ''Nombre de la oportunidad',''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
"Añadido personalizado" - Table.AddColumn(-"Changed Type", "Is Assigned", each Text.Contains([PS_Notes__c], ShortNameSample)),
"Filas filtradas" - Table.SelectRows("Added Custom", cada uno ([Se asigna] á true)),
"Columnas eliminadas" - Table.RemoveColumns("Filas filtradas","Se asigna"))
En
"Columnas eliminadas"

Si la columna de PS_Notes__c estuviera más limpia, también podría hacerlo mediante una combinación externa izquierda y combinar.

De lo contrario, @Greg_Deckler puede tener una solución DAX para esto y ha escrito algunas medidas rápidas en bucles en DAX que explica en este artículo: https://community.powerbi.com/t5/Community-Blog/For-and-While-Loops-in-DAX/bc-p/637511

Aquí están las medidas rápidas:

https://community.powerbi.com/t5/Quick-Measures-Gallery/For-Loop/m-p/637531#M319

https://community.powerbi.com/t5/Quick-Measures-Gallery/While-Loop/m-p/637535#M320


Please @mention me in your reply if you want a response.

Copying DAX from this post? Click here for a hack to quickly replace it with your own table names

Has this post solved your problem? Please Accept as Solution so that others can find it quickly and to let the community know your problem has been solved.
If you found this post helpful, please give Kudos C

I work as a Microsoft trainer and consultant, specialising in Power BI and Power Query.
www.excelwithallison.com

Hola @AllisonKennedy ,

no estoy seguro de si el rendimiento de mi enfoque sería realmente más rápido, pero en cuanto al código es un poco más ligero. Yo "simplemente" añadir una columna a la tabla de oportunidades de esta manera:

Table.AddColumn(Opportunity, "IncludedEngineers", each List.Select(Engineers[Short Name], (l) => Text.Contains([PS_Notes__c], l)))

También almacenaría en búfer la tabla Engineers. Consulte el archivo adjunto.

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Gracias @ImkeF
¡Eso es increíble! Necesito practicar más usando funciones que tomen una 'función' como argumento. Así que básicamente está definiendo el (1) como el parámetro para la función, pero que podría ser reemplazado con cualquier valor (nombre) o algo correcto?

La documentación de Microsoft Docs utiliza esta sintaxis de subrayado "cada _ ":
List.Select(-1, -3, 4, 9, -2', cada uno _ > 0)
¿Funciona solo para operadores simples o podría usarlo con una función anidada como Text.Contains?

Podría elegir tu cerebro algún día en Table.Buffer también. Creo que lo entiendo, pero todavía hago un poco de prueba y error para ver cuándo ayuda y cuándo no. ¿Tengo razón al pensar que en este ejemplo, si no tiene el Table.Buffer en la tabla Engineers, volverá al origen de datos para cargar la tabla Engineers repetidamente para cada fila de la tabla Opportunity/Imke, pero con Table.Buffer solo cargará la tabla de ingenieros en la memoria completamente y, a continuación, usará esa memoria para cada fila de Opportunity/Imke. ¿Es eso cierto? Puesto que solo estamos usando la columna Engineers[Short Name] ¿podría Table.Buffer alguna vez disminuir el rendimiento, por ejemplo, si tuviéramos muchas columnas en la tabla Engineers?

Si estás utilizando un ordenador portátil o una tablet, intenta moverte a otra ubicación e inténtalo de nuevo.

Please @mention me in your reply if you want a response.

Copying DAX from this post? Click here for a hack to quickly replace it with your own table names

Has this post solved your problem? Please Accept as Solution so that others can find it quickly and to let the community know your problem has been solved.
If you found this post helpful, please give Kudos C

I work as a Microsoft trainer and consultant, specialising in Power BI and Power Query.
www.excelwithallison.com

Hola @AllisonKennedy ,

Sí, podría usar cualquier cadena como parámetro en la función. La palabra clave "each" es solo azúcar de sintaxis para una declaración de función completa adecuada. Le permite utilizar el carácter de subrayado o incluso ningún signo para hacer referencia al valor que se le ha pasado automáticamente. Como si solo usaras corchetes para hacer referencia a un columnm.

2o sí también: El búfer debe impedir la recarga. Pero, por supuesto, el buffering tiene otros efectos, así. Así que si usted está almacenando en búfer una tabla grande (como me imagino que la tabla de oportunidades sería), entonces esto podría ser un éxito en el rendimiento también.
Y al final debe tener en cuenta que Power Query crea su propio plan de ejecución para la consulta (al igual que SQL o VertiPaq). Así que casi nunca sabes lo que es mejor después de haberlo intentado.

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.