Forum Discussion

clem312's avatar
clem312
Icon for Resolver I rankResolver I
5 years ago
Solved

Table name change for each new project

Hi,

 

I have this software that creates new tables for each new project.

Main Table is Statistic Agent

For each new project two tables are created :

For example for project 1 :

  • AskList1
  • AskCall1

Projetc 2 :

  • AskList2
  • AskCall2

Etc.

I have 500 projects.

My problem is that I need to link these tables but for any project selected in Power BI in order to make a beautiful dashboard.

 

I need the fields Statistic_Agent.CallID, Lists.dbo.AskCall1.AskInterview, Lists.dbo.AskList1.QUOTA7

 

For project 1 the request is :

SELECT Statistic_Agent.CallID, Lists.dbo.AskCall1.AskInterview, Lists.dbo.AskList1.QUOTA7
FROM Lists.dbo.AskList1 INNER JOIN
Lists.dbo.AskCall1 ON Lists.dbo.AskList1.AskInterview = Lists.dbo.AskCall1.AskInterview INNER JOIN
Statistic_Agent ON Lists.dbo.AskCall1.CallID = Statistic_Agent.CallID

 

I don't how to write the script in Power Query so that it works for the 500 projects !

 

Any idea ?

Clement

 

  • Hi clem312 

     

    You could first connect to project 1 with the native query in your original post to create a query. Then modify its M codes in Advanced editor like below to convert it into a custom function. 

     

    VarAskList and varAskCall are two variables which we use to replace the "AskCall1" and "AskList1" strings in original query codes. I name it as functionQuery.

    (varAskList as text, varAskCall as text) =>
    let
        Source = Sql.Database("server name", "database name", [Query="SELECT Statistic_Agent.CallID, Lists.dbo." & varAskList & ".AskInterview, Lists.dbo." & varAskList & ".QUOTA7
    FROM Lists.dbo." & varAskList & " INNER JOIN
    Lists.dbo." & varAskCall & " ON Lists.dbo." & varAskList & ".AskInterview = Lists.dbo." & varAskCall & ".AskInterview INNER JOIN
    Statistic_Agent ON Lists.dbo." & varAskCall & ".CallID = Statistic_Agent.CallID", CreateNavigationProperties=false])
    in
        Source

     

    Create a table which includes table names for 500 projects.

    let
        projectList = List.Generate(() => 1, each _ <= 500, each _ + 1),
        #"Converted to Table" = Table.FromList(projectList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "Project Number"}}),
        #"Added Custom" = Table.AddColumn(#"Renamed Columns", "Table1", each "AskList"&Text.From([Project Number])),
        #"Added Custom1" = Table.AddColumn(#"Added Custom", "Table2", each "AskCall"&Text.From([Project Number]))
    in
        #"Added Custom1"

     

    After that, invoke the function functionQuery to add a new column in the previous table. We use the two table name columns for paramters varAskList and var AskCall in the function.

     

    After invoking the function, you will see a new table column similar to below. Click the expand icon on the column header to expand the tables. You will have all 500 project data in the query. 

     

    Regards,
    Community Support Team _ Jing
    If this post helps, please Accept it as the solution to help other members find it.

14 Replies

  • v-jingzhang's avatar
    v-jingzhang
    Icon for Community Support rankCommunity Support

    Hi clem312 

     

    You could first connect to project 1 with the native query in your original post to create a query. Then modify its M codes in Advanced editor like below to convert it into a custom function. 

     

    VarAskList and varAskCall are two variables which we use to replace the "AskCall1" and "AskList1" strings in original query codes. I name it as functionQuery.

    (varAskList as text, varAskCall as text) =>
    let
        Source = Sql.Database("server name", "database name", [Query="SELECT Statistic_Agent.CallID, Lists.dbo." & varAskList & ".AskInterview, Lists.dbo." & varAskList & ".QUOTA7
    FROM Lists.dbo." & varAskList & " INNER JOIN
    Lists.dbo." & varAskCall & " ON Lists.dbo." & varAskList & ".AskInterview = Lists.dbo." & varAskCall & ".AskInterview INNER JOIN
    Statistic_Agent ON Lists.dbo." & varAskCall & ".CallID = Statistic_Agent.CallID", CreateNavigationProperties=false])
    in
        Source

     

    Create a table which includes table names for 500 projects.

    let
        projectList = List.Generate(() => 1, each _ <= 500, each _ + 1),
        #"Converted to Table" = Table.FromList(projectList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "Project Number"}}),
        #"Added Custom" = Table.AddColumn(#"Renamed Columns", "Table1", each "AskList"&Text.From([Project Number])),
        #"Added Custom1" = Table.AddColumn(#"Added Custom", "Table2", each "AskCall"&Text.From([Project Number]))
    in
        #"Added Custom1"

     

    After that, invoke the function functionQuery to add a new column in the previous table. We use the two table name columns for paramters varAskList and var AskCall in the function.

     

    After invoking the function, you will see a new table column similar to below. Click the expand icon on the column header to expand the tables. You will have all 500 project data in the query. 

     

    Regards,
    Community Support Team _ Jing
    If this post helps, please Accept it as the solution to help other members find it.

    • clem312's avatar
      clem312
      Icon for Resolver I rankResolver I

      Thank you v-jingzhang,

       

      I must be doing something wrong because I get an error message when expanding TableContent :

      "We cannot convert a value of type Record to type Text"

       

       

      I foolowed the creation of the Query :

      = (varAskList as text, varAskCall as text) =>
      let
          Source = Sql.Database("10.33.10.62", [Query="SELECT Statistic_Agent.CallID, Lists.dbo." & varAskList & ".AskInterview, Lists.dbo." & varAskList & ".QUOTA7
      FROM Lists.dbo." & varAskList & " INNER JOIN
      Lists.dbo." & varAskCall & " ON Lists.dbo." & varAskList & ".AskInterview = Lists.dbo." & varAskCall & ".AskInterview INNER JOIN
      Statistic_Agent ON Lists.dbo." & varAskCall & ".CallID = Statistic_Agent.CallID", CreateNavigationProperties=false])
      in
          Source

       

       

      • v-jingzhang's avatar
        v-jingzhang
        Icon for Community Support rankCommunity Support

        Hi clem312 

        If you enter the table names of a project to invoke the function, is it able to bring in data of this project? Let's first check if this function works. 

    • v-jingzhang's avatar
      v-jingzhang
      Icon for Community Support rankCommunity Support

      Can you share the M codes of the function in Advanced editor? And the M codes if you connect to a single project with the original query statement? Go to Home > Query > Advanced Editor, copy all the codes and paste them here. Thanks.

      • clem312's avatar
        clem312
        Icon for Resolver I rankResolver I

        Here is the M code :

         

        (varAskList as text, varAskCall as text) =>
        let
            Source = Sql.Database("10.33.10.62", [Query="SELECT Statistic_Agent.CallID, Lists.dbo." & varAskList & ".AskInterview, Lists.dbo." & varAskList & ".QUOTA7
        FROM Lists.dbo." & varAskList & " INNER JOIN
        Lists.dbo." & varAskCall & " ON Lists.dbo." & varAskList & ".AskInterview = Lists.dbo." & varAskCall & ".AskInterview INNER JOIN
        Statistic_Agent ON Lists.dbo." & varAskCall & ".CallID = Statistic_Agent.CallID", CreateNavigationProperties=false])
        in
            Source

         

         

        In SQL Management studio, this request works :