Sub SoapCall()
Dim sessiontext As String
Dim ProjectText As String
Dim xogURL As String
xogURL = "https://cppmXXXXXXXXX.ondemand.ca.com/niku/xog"
sessiontext = Login("username", "password", xogURL)
querytext = GetQuery(sessiontext, "ppm_query_id", xogURL)
logouttext = Logout(sessiontext, xogURL)
End Sub
Function Login(Optional xogUserName As String, Optional xogPassword As String, Optional xogURL As String) As String
Dim xmlHTTPConnection As MSXML2.XMLHTTP60
Set xmlHTTPConnection = New MSXML2.XMLHTTP60
If xogURL = "" Then
xogURL = "https://" & clarityInstance & ".ondemand.ca.com/niku/xog"
End If
xogMessage = xogMessage & ""
xogMessage = xogMessage & " "
xogMessage = xogMessage & " "
xogMessage = xogMessage & " "
xogMessage = xogMessage & " " & xogUserName & ""
xogMessage = xogMessage & " " & xogPassword & ""
xogMessage = xogMessage & " "
xogMessage = xogMessage & " "
xogMessage = xogMessage & ""
xmlHTTPConnection.Open "POST", xogURL, False
xmlHTTPConnection.setRequestHeader "Content-Type", "text/xml"
xmlHTTPConnection.send xogMessage
Dim xogSessionResponse As MSXML2.DOMDocument60
Set xogSessionResponse = New MSXML2.DOMDocument60
With xogSessionResponse
.async = False
.preserveWhiteSpace = False
.validateOnParse = False
.resolveExternals = False
.setProperty "SelectionLanguage", "XPath"
.setProperty "SelectionNamespaces", "xmlns:xog=""http://www.niku.com/xog"""
End With
xogSessionResponse.LoadXML (xmlHTTPConnection.responseText)
Login = xogSessionResponse.Text
Set xmlHTTPConnection = Nothing
Set xogSessionResponse = Nothing
End Function
' This Procedure calls XOG and returns results from a Query (it just writes each Property Name and Value pair to the debug window):
Function GetQuery(sSID As String, sQueryID, Optional xogURL As String) As String
Dim sQry As String
Dim sHeader As String
Dim xQuery As XMLHTTP60
Dim xogSessionResponse As DOMDocument
Dim soapenv As IXMLDOMNode
Dim theQueryNode As IXMLDOMNode
Dim QueryProp As IXMLDOMAttribute
Dim oS As Worksheet
If xogURL = "" Then
xogURL = "https://" & clarityInstance & ".ondemand.ca.com/niku/xog"
End If
Set xQuery = New ServerXMLHTTP60
sHeader = "xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"""
sHeader = sHeader & " xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"""
sHeader = sHeader & " xmlns:xsd=""http://www.w3.org/2001/XMLSchema"""
sHeader = sHeader & " xmlns:tns=""http://www.niku.com/xog/Query"""
sQry = ""
sQry = sQry & " "
sQry = sQry & " "
sQry = sQry & " " & sSID & ""
sQry = sQry & " "
sQry = sQry & " "
sQry = sQry & " "
sQry = sQry & " "
sQry = sQry & " " & sQueryID & "
"
sQry = sQry & " "
sQry = sQry & " "
sQry = sQry & ""
xQuery.Open "POST", xogURL, False
xQuery.setRequestHeader "soapAction", "QueryCSV"
xQuery.send sQry
Set xogSessionResponse = New DOMDocument
With xogSessionResponse
.async = False
.preserveWhiteSpace = False
.validateOnParse = False
.resolveExternals = False
.setProperty "SelectionLanguage", "XPath"
.setProperty "SelectionNamespaces", "xmlns:xog=""http://www.niku.com/xog"""
End With
xogSessionResponse.LoadXML (xQuery.responseText)
Set soapenv = xogSessionResponse.ChildNodes(0).ChildNodes(1).ChildNodes(0).ChildNodes(1)
Dim xDoc As DOMDocument
Set xDoc = New DOMDocument
If Not xDoc.LoadXML(soapenv.xml) Then
Err.Raise xDoc.parseError.ErrorCode, , xDoc.parseError.reason
Debug.Print xDoc.parseError.ErrorCode & "-" & xDoc.parseError.reason
End If
Dim list As IXMLDOMNodeList
Set list = xDoc.SelectNodes("//Records/Record")
Dim node As IXMLDOMNode, nd As IXMLDOMNode
Dim i As Integer
With Sheet1.Rows(1)
.Cells(1).Value = "Project Title"
.Cells(2).Value = "Project Start Date"
.Cells(3).Value = "Project End Date"
.Cells(4).Value = "Project Phase"
.Cells(5).Value = "Project Manager"
.Cells(6).Value = "Project Sponsor"
.Cells(7).Value = "Project Complete 1 = YES 0 = NO"
End With
i = 1
For Each node In list
i = i + 1
With Sheet1.Rows(i)
.Cells(1).Value = GetNodeValue(node, "prj_name")
.Cells(2).Value = GetNodeValue(node, "prj_start")
.Cells(3).Value = GetNodeValue(node, "prj_finish")
.Cells(4).Value = GetNodeValue(node, "prj_phase")
.Cells(5).Value = GetNodeValue(node, "prj_manager")
.Cells(6).Value = GetNodeValue(node, "prj_sponsor")
.Cells(7).Value = GetNodeValue(node, "prj_complete")
End With
Next node
GetQuery = xogSessionResponse.Text
Set xQuery = Nothing
Set xogSessionResponse = Nothing
End Function
Function GetNodeValue(node As IXMLDOMNode, xp As String)
Dim n As IXMLDOMNode, nv
Set n = node.SelectSingleNode(xp)
If Not n Is Nothing Then nv = n.nodeTypedValue
GetNodeValue = nv
End Function
' This procedure logs out of XOG:
Function Logout(sessionID As String, Optional xogURL As String) As String
Dim xmlHTTPConnection As MSXML2.XMLHTTP60
Set xmlHTTPConnection = New MSXML2.XMLHTTP60
If xogURL = "" Then
xogURL = "https://" & clarityInstance & ".ondemand.ca.com/niku/xog"
End If
xogMessage = xogMessage & ""
xogMessage = xogMessage & " "
xogMessage = xogMessage & " "
xogMessage = xogMessage & " "
xogMessage = xogMessage & " " & sessionID & ""
xogMessage = xogMessage & " "
xogMessage = xogMessage & " "
xogMessage = xogMessage & ""
xmlHTTPConnection.Open "POST", xogURL, False
xmlHTTPConnection.setRequestHeader "Content-Type", "text/xml"
xmlHTTPConnection.send xogMessage
Dim xogSessionResponse As MSXML2.DOMDocument60
Set xogSessionResponse = New MSXML2.DOMDocument60
With xogSessionResponse
.async = False
.preserveWhiteSpace = False
.validateOnParse = False
.resolveExternals = False
.setProperty "SelectionLanguage", "XPath"
.setProperty "SelectionNamespaces", "xmlns:xog=""http://www.niku.com/xog"""
End With
xogSessionResponse.LoadXML (xmlHTTPConnection.responseText)
Logout = xogSessionResponse.Text
Set xmlHTTPConnection = Nothing
Set xogSessionResponse = Nothing
End Function