Esta es una función de Power Query sobre fuentes de datos ODBC (Open DataBase Connectivity) que es poco conocida, aunque bien esta misma es más conocida en Power BI Desktop y Excel 365.
Aun así, considero importante mencionarla pues tiene potencial para el desempeño de actualización de datos y el panel de vista previa en el editor de Power Query. Quizá una razón por la cual no sea una función muy conocida es porque solo está visible si damos click en «Opciones avanzadas» al momento de crear una fuente de datos ODBC:
![ficha importar datos](https://b2447033.smushcdn.com/2447033/wp-content/uploads/2020/09/image-73.png?lossy=1&strip=1&webp=1)
Y desde ahí vamos a la opción de «Cláusulas de reducción de filas admitidas»:
![datos desde ODBC Power Query](https://b2447033.smushcdn.com/2447033/wp-content/uploads/2020/09/image-74.png?lossy=1&strip=1&webp=1)
Manejo de OBDC sin SQLCapabilities
«¿Pero qué hace esto exactamente?» Para poder responder mejor a esto, habría que ver qué pasa si NO la habilitamos. Digamos que tenemos una fuente de datos ODBC que usa el driver Microsoft ODBC para un servidor SQL que se conecta a la base de datos Adventure Works DW. Si creamos un query que use esta fuente de datos para obtener los contenidos de la tabla DimData, esta funcionará tal y como lo esperaríamos. Aquí está el código M:
let Source = Odbc.DataSource( "dsn=Test SQL", [HierarchicalNavigation=true] ), #"Adventure Works DW_Database" = Source{ [Name="Adventure Works DW",Kind="Database"] }[Data], dbo_Schema = #"Adventure Works DW_Database"{ [Name="dbo",Kind="Schema"] }[Data], DimDate_Table = dbo_Schema{[Name="DimDate",Kind="Table"]}[Data] in DimDate_Table
Si miramos en el controlador cuando los contenidos de la ventana de vista previa se actualicen, veremos que el motor de Power Query está ejecutando un query que obtiene todos los contenidos de la tabla:
![SQL Query sin limite](https://b2447033.smushcdn.com/2447033/wp-content/uploads/2020/09/image_thumb-3.jpg?lossy=1&strip=1&webp=1)
Y (como resultaría obvio), si nos conectamos a una tabla grande, esto haría el editor de Power Query bastante lento. Esto se debe a que el editor de Power Query solo quiere mostrar mil filas a la vez, por lo que el hecho de que el query esté pidiendo todas las filas de la tabla sugiere que incluso un query básico no será posible en esta fuente de datos ODBC.
SQLCapabilities para consultas grándes
Ahora veamos qué es lo que pasa cuando SÍ seleccionamos algo del menú de «Cláusulas de reducción de filas admitidas». Como la imágen de arriba nos muestra, hay cuatro valores en este menú con respecto a la forma de SQL soportada por nuestra fuente ODBC para que solo obtenga cierta cantidad de filas de una tabla. Si no sabemos cuál opción elegir, podemos dar click al botón de «Detectar» para que seleccione una por nosotros. En este caso, he elegido TOP:
![datos desde ODBC Power Query 2](https://b2447033.smushcdn.com/2447033/wp-content/uploads/2020/09/image-76.png?lossy=1&strip=1&webp=1)
Una vez hayamos hecho esto, cuando nos conectemos a la misma tabla DimDate veremos que el editor de Power Query ahora solo pedirá las primeras mil filas de la tabla:
![SQL query con limite](https://b2447033.smushcdn.com/2447033/wp-content/uploads/2020/09/image_thumb-5.jpg?lossy=1&strip=1&webp=1)
Y si miramos al código M para el query, la función ODBC.DataSource tiene la aun indocumentada opción SqlCapabilities puesta en su segundo parámetro:
Odbc.DataSource( "dsn=Test SQL", [HierarchicalNavigation=true, SqlCapabilities=[LimitClauseKind=LimitClauseKind.Top] ] )
Habilitar esta opción puede marcar una gran diferencia a la respuesta del editor de Power Query cuando estamos trabajando con tablas grandes y/o fuentes de datos lentas. También será importante si usamos el botón de Mantener Filas en la cinta de opciones o la función M «Table.FirstN(N)».
Una última cosa a mencionar es que hay otra función indocumentada que es (al parecer) lo que el botón «Detectar» en las imágenes de arriba usa para descubrir cómo establecer la opción de SqlCapabilities. Se llama «Obdc.InferOptions» y puede ser usada de esta forma:
Odbc.InferOptions(«dsn=Test SQL»)
Esta función devuelve un registro que contiene un campo llamado LimitClauseKind, el cual nos dice el tipo de límite de cláusula que soporta:
![clausulas de consulta](https://b2447033.smushcdn.com/2447033/wp-content/uploads/2020/09/image_thumb-7.png?lossy=1&strip=1&webp=1)
Y aquí hay una lista de los posibles valores que LimitClauseKinda puede encontrar usando #shared:
![tipos de clausulas](https://b2447033.smushcdn.com/2447033/wp-content/uploads/2020/09/image_thumb-8.png?lossy=1&strip=1&webp=1)
Usar esto con fuentes de datos como Oracle o SAP puede resultar en algo bastante interesante. Cualquier duda nos leemos abajo.
= Odbc.Query(«dsn=cnxHANA», «CALL dbSAPHANA.pVentasDetalladasPorRangoFecha (‘2023-01-01′,’2023-09-19’);»)
como le paso parametros de fecha db.procedimiento(FechaInical,FechaFinal) desde excel que le solicite al usuario cuando lo ejecuitte actualizar todo.
ponlo en el texto de la formula
«CALL dbSAPHANA.pVentasDetalladasPorRangoFecha (‘» & tufechaini & «′,’» & tufechafin & «’);»