使用动态标识符调用表

时间:2016-03-14 05:25:15

标签: powerbi powerquery m

我正在尝试动态调用Power Query M中的表。我在下面创建了一个简单的查询来解释我想要做的事情。

我希望结果是“It Worked”,而不是“Source1”,这是我目前得到的。

let
  Source1 =  Table.FromList(
    {
      [Word1="It",Word2="Worked"]
    },
    Record.FieldValues,
    {"Word1","Word2"}
  ),
  Source2 = "Source" & "1"
in
  Source2

用例详细信息:

我正在尝试这样做,以便我可以根据条件调用查询。如:

if ENV = "production" then
  Customer_s
else
  Customer_m

其中Customer_s是用于检索CSV文件中找到的客户数据的查询,而Customer_m是用于检索在SQL Server上找到的客户数据的查询。

因为我将使用许多表(不仅仅是客户)执行此操作,我想我会创建一个函数,您可以传入模型名称(即“Customer”),然后将它串在一起以调用查询

我发现PowerBI停止运行并不断重新运行不必要的查询,这会破坏我的PC和网络速度。我认为一个简单的方法就是创建看起来像SQL Server结果的虚拟数据,但是本地存储在我的机器上。这样,如果我无法访问互联网,我也可以编写查询。

3 个答案:

答案 0 :(得分:2)

#shared包含所有可用查询和库函数的列表,因此您可以执行以下操作: Record.Field(#shared, "It " & "Worked")

答案 1 :(得分:1)

如果您使用此:

= Expression.Evaluate("Source"&"1", #shared)

您可以动态引用其他查询。但不是同一查询中的其他步骤(似乎)。所以它必须坐在一个新的查询中。

或者你的问题是:

 Text.Combine({"It", "Worked"}, " ")

答案 2 :(得分:0)

由于@ImkeF提供的信息,我完成了这项工作。

我首先必须拆分两个查询,以便使用完整的in #shared表达式对Source1进行评估,然后可以通过let Source1 = Table.FromList( { [Word1="It",Word2="Worked"] }, Record.FieldValues, {"Word1","Word2"} ) in Source1 访问。

QUERY 1

let
    Source2 = Expression.Evaluate("Source"&"1", #shared)
in
    Source2

查询2

╔═══════╦════════╗
║ Word1 ║ Word2  ║
╠═══════╬════════╣
║ It    ║ Worked ║
╚═══════╩════════╝

这有QUERY 2导致:

Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Excel

Module Module1

Sub ReadInformation() 'Line 1
  Dim oXL As Excel.Application
  Dim oWB As Excel.Workbook
  Dim oWS As Excel.Worksheet
  Dim filepath2 As String 'Line 5

  filepath2 = "C:\Users\IEN 271\Desktop\sample.xlsx" 

  If FileInUse(filepath2) Then
   oXL = New Excel.Application
   oXL = CType(System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"), Excel.Application)
   oWB = GetObject("C:\Users\IEN 271\Desktop\sample.xlsx")      
   oWS = oWB.Worksheets("sampleSheet")
   oWS.Activate()
  Else
   oXL = New Excel.Application
   oXL.Visible = True
   oWB = oXL.Workbooks.Open("C:\Users\IEN 271\Desktop\sample.xlsx", [ReadOnly]:=False)    
   oWS = oWB.Worksheets("sampleSheet")
   oWS.Activate()
  End If

 'Script for reading process (fine)
End Sub

感谢@ImkeF和@Alejandro的帮助。