3

There is a SQL analysis service resource in my organization, we can use excel or powerbi to connect to the cube use a server name (tooldata.amr.xxx.com) and get the data.

What i want is use python or excel to automate the data query and output to a csv file for downstream application use (reporting/chart etc.)

I've tried below but failed:

1.Microsoft.AnalysisServices.AdomdClient

FileNotFoundException Traceback (most recent call last) in

2. clr.AddReference ("Microsoft.AnalysisServices.AdomdClient.dll")

FileNotFoundException: Unable to find assembly 'Microsoft.AnalysisServices.AdomdClient.dll'. at Python.Runtime.CLRModule.AddReference(String name)

look like lack of some env. not sure how to proceed. any suggestion ?

2.use olap.xmla

import olap.xmla.xmla as xmla 
provider = olap.xmla.xmla.XMLAProvider()
connect = provider.connect(location='http://tooldata.amr.xxx.com/OLAP/msmdpump.dll',username='user',password='pwd')
source = connect.getOLAPSource()
print (source.getCatalog("TestCube"))

ConnectionError: HTTPConnectionPool(host='tooldata.amr.xxx.com', port=80): Max retries exceeded with url: /OLAP/msmdpump.dll (Caused by NewConnectionError(': Failed to establish a new connection: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond'))

Looks like need some configuration from server side, but it's out of my control, drop this option.

3.since i can use excel to get the SSAS data, is that possible use python to call excel and refresh the data, then parse out the data from excel? have any one try that?

thanks .

zheng wee
  • 121
  • 1
  • 1
  • 8
  • Try 1) appending the location of the .dll to sys.path; or 2) use the full path, e.g. clr.AddReference (r"D:\dlls\Microsoft.AnalysisServices.AdomdClient.dll") – owl7 Oct 12 '19 at 01:16
  • thanks Owl7, it works now after i add the full path – zheng wee Oct 17 '19 at 08:06

1 Answers1

7

Finally, the problem solved based on 1.Microsoft.AnalysisServices.AdomdClient solution.

#use your own DLL path.
clr.AddReference ("r"C:\Windows\assembly\GAC_MSIL\Microsoft.AnalysisServices.AdomdClient\11.0.0.0__89845dcd8080cc91\Microsoft.AnalysisServices.AdomdClient.dll"")
clr.AddReference ("System.Data")
from Microsoft.AnalysisServices.AdomdClient import AdomdConnection , AdomdDataAdapter
from System.Data import DataSet
#use your own server name or address. and data cube name.
conn = AdomdConnection("Data Source=tooldata.amr.xxx.com;Catalog=ShiftlyCellCube;")
conn.Open()
cmd = conn.CreateCommand()
#your MDX query, if you are not familiar, you can use the excel powerpivot to build one query for you. 
cmd.CommandText = "your mdx query" 
adp = AdomdDataAdapter(cmd)
datasetParam =  DataSet()
adp.Fill(datasetParam)
conn.Close();

# datasetParam hold your result as collection a\of tables
# each tables has rows
# and each row has columns
print (datasetParam.Tables[0].Rows[0][0])

clr is pythonnet, you can install the package via: pythonnet Github or pythonnet pypi

And for the Microsoft.AnalysisServices.AdomdClient.dll probably you don't have it. you can get the DLL by install SQL_AS_ADOMD.msi .

Lastly , aim to parse a structured dataset from the Cube DataSet. i use below code (field depends on your DAX query output).

with open ('xx_Pivot.csv','w') as file:
#my MDX only return 7 field as below headers.
header = 'WW,Shift,ShiftID,Factory,Entity,Cell,Data\n'
file.writelines(header)
#iteration the Dataset and get out a structure 2D data table and save to a file.
for row_n in range(len(list(datasetParam.Tables[0].Rows))):
    row = ''
    for column_n in range(7):
        data = datasetParam.Tables[0].Rows[row_n][column_n]
        row = row+str(data)+',' 
    row = row+'\n'
    file.writelines(row)
zheng wee
  • 121
  • 1
  • 1
  • 8