DATASET EM VB6
Boa tarde a todos!
Estou desenvolvendo uma DLL em VB6 que invoque métodos do meu WebService feito em C#.Net através do SOAP ToolKit 3.0. Estou com um problema relacionado a tipo.
Alguns dos meus métodos do WebService retornam DataSet e Vb não reconhece esse tipo de formato.
Gostaria de saber se alguém tem alguma idéia de como resolver esse problema.
Agradeço a todos.
Estou desenvolvendo uma DLL em VB6 que invoque métodos do meu WebService feito em C#.Net através do SOAP ToolKit 3.0. Estou com um problema relacionado a tipo.
Alguns dos meus métodos do WebService retornam DataSet e Vb não reconhece esse tipo de formato.
Gostaria de saber se alguém tem alguma idéia de como resolver esse problema.
Agradeço a todos.
Nunca desenvolvi isso, mas acredito que a solução seria criar um Type em VB6 com os campos a serem recuperados do WebService e em C# uma classe com os mesmos campos. Nesse caso seus métodos retornariam essas classes no lugar do DataSet.
Eu vi esse código aqui em um outro tópico, mas não consegui entender direito.
Segue o código que localizei abaixo:
[Ô]
Dim oSOAP
Set oSOAP = Server.CreateObject([Ô]MSSOAP.SoapClient[Ô])
oSOAP.ClientProperty([Ô]ServerHTTPRequest[Ô]) = True
oSOAP.mssoapinit([Ô]http://localhost/WebSiteGerenciadorDeServices/Service.asmx?wsdl[Ô])
Dim objDOMDoc
Set objDOMDoc = Server.CreateObject([Ô]Msxml2.DOMDocument.4.0[Ô])
Dim ListaDeNohsDoXML
Set ListaDeNohsDoXML = oSOAP.MetodoRetornaDataSetIpado_ou_DataSet()
[ô]neste local vc tem que usar a interpretação do complextype.
informacao = ListaDeNohsDoXML(0).text
[ô]se vc quiser pode pegar os nodos ou nodos filhos via XML dai vc usa o XMLDOM normalmente
informacao = ListaDeNohsDoXML(1).XML
Dai aqui é facil vc usa dai o XMLDocument.. e trabalha normalmente beleza?
objDOMDoc.loadXML(RespostaWs(1).xml)
[ô]Instancia o objeto documentElement para extrair os elementos
Set raiz = objDOMDoc.documentElement
[ô]Looping para percorrer todos os elementos filhos
For i = 0 to raiz.childNodes.length -1
response.write raiz.childNodes.item(i).attributes(0).text
next
response.end()
Set oSOAP = Nothing
[Ô]
Eu justamente não entendi como fazer para pegar a tag na qual contém as informações do meu xml.
Alguém tem alguma idéia ?
Segue o código que localizei abaixo:
[Ô]
Dim oSOAP
Set oSOAP = Server.CreateObject([Ô]MSSOAP.SoapClient[Ô])
oSOAP.ClientProperty([Ô]ServerHTTPRequest[Ô]) = True
oSOAP.mssoapinit([Ô]http://localhost/WebSiteGerenciadorDeServices/Service.asmx?wsdl[Ô])
Dim objDOMDoc
Set objDOMDoc = Server.CreateObject([Ô]Msxml2.DOMDocument.4.0[Ô])
Dim ListaDeNohsDoXML
Set ListaDeNohsDoXML = oSOAP.MetodoRetornaDataSetIpado_ou_DataSet()
[ô]neste local vc tem que usar a interpretação do complextype.
informacao = ListaDeNohsDoXML(0).text
[ô]se vc quiser pode pegar os nodos ou nodos filhos via XML dai vc usa o XMLDOM normalmente
informacao = ListaDeNohsDoXML(1).XML
Dai aqui é facil vc usa dai o XMLDocument.. e trabalha normalmente beleza?
objDOMDoc.loadXML(RespostaWs(1).xml)
[ô]Instancia o objeto documentElement para extrair os elementos
Set raiz = objDOMDoc.documentElement
[ô]Looping para percorrer todos os elementos filhos
For i = 0 to raiz.childNodes.length -1
response.write raiz.childNodes.item(i).attributes(0).text
next
response.end()
Set oSOAP = Nothing
[Ô]
Eu justamente não entendi como fazer para pegar a tag na qual contém as informações do meu xml.
Alguém tem alguma idéia ?
Você não vai conseguir isso tão fácil. O correto em um webservice é retornar dados serializados e não objetos especÃficos. A idéia principal de um webservice é manter uma certa [Ô]compatibilidade[Ô] com tudo. Isso porque ele pode ser consumido por Java, Vb, Ruby ou qualquer outra linguagem, então, objetos tipados, deve ser evitados ao máximo. Se não foi você quem fez o webservice, peça para quem o fez, que retorne uma lista de classe List<T> e não um dataset.
Galera consegui resolver aqui, juntamente com um colega de trabalho conseguimos ver uma solução através do retorno em xml do WebService.
Segue abaixo a função que foi criada, espero que ajude a outros que tiveram a mesma dúvida que eu.
Obrigado.
A função ficou assim:
Function processaArquivoXml(arquivoXml) As ADODB.Recordset
On Error GoTo TratarError
Dim rsXML As ADODB.Recordset
Dim oDom As DOMDocument
Dim intQtdRegs As Integer
Dim iContador As Integer
Dim NomeCampo As String
Set oDom = New DOMDocument
With oDom
.LoadXml arquivoXml
If .parseError.errorCode <> 0 Then
[ô]MsgBox [Ô]Não foi possÃvel acessar os dados![Ô], vbCritical, [Ô]Erro[Ô]
[ô]Set ofom = Nothing
Set processaArquivoXml = Nothing
Exit Function
Else
intQtdRegs = oDom.getElementsByTagName([Ô]Table[Ô]).length [ô].childNodes(0).childNodes.length
Dim TabelaNome As String
Dim TabelaValor As String
Dim Fields As Variant
Dim Values As Variant
[ô]crio nova instancia do recordset
Set rsXML = New Recordset
rsXML.MaxRecords = intQtdRegs
[ô]Criar campos no RecordSet
Dim X As Integer
For X = 0 To oDom.getElementsByTagName([Ô]Table[Ô]).Item(0).childNodes.length - 1 [ô]Campos da Table
TabelaNome = oDom.getElementsByTagName([Ô]Table[Ô]).Item(0).childNodes(X).baseName
Fields = Array(TabelaNome)
rsXML.Fields.Append TabelaNome, adVarChar, 1000, adFldIsNullable
Next
rsXML.Open
[ô]Preencher os campos do RecordSet
For iContador = 0 To intQtdRegs - 1
rsXML.AddNew
For X = 0 To oDom.getElementsByTagName([Ô]Table[Ô]).Item(0).childNodes.length - 1 [ô]Campos da Table
TabelaNome = oDom.getElementsByTagName([Ô]Table[Ô]).Item(0).childNodes(X).baseName
TabelaValor = oDom.getElementsByTagName([Ô]Table[Ô]).Item(0).childNodes(X).Text
rsXML(TabelaNome).Value = TabelaValor
Next
rsXML.Update
Next
[ô]Retornar o RecordSet
Set processaArquivoXml = rsXML
[ô]rsXML.Close
[ô]Set rsXML = Nothing
End If
End With
Exit Function
TratarError:
If Err.Number <> 0 Then
[ô]Set oDom = Nothing
[ô]Set processaArquivoXml = Nothing
MsgBox [Ô]Não foi possÃvel Processar o Arquivo XML do Web Service URA.[Ô], vbInformation, [Ô]URA- Técnica[Ô]
Exit Function
End If
End Function
E a chamada a essa função ficou assim:
Dim oRet As String
Dim rsDados As ADODB.Recordset
Dim oTeste
Set oTeste = objWebService.ConsultarVlDebito(numCliente)
Set rsDados = processaArquivoXml(oTeste(1).xml)
Segue abaixo a função que foi criada, espero que ajude a outros que tiveram a mesma dúvida que eu.
Obrigado.
A função ficou assim:
Function processaArquivoXml(arquivoXml) As ADODB.Recordset
On Error GoTo TratarError
Dim rsXML As ADODB.Recordset
Dim oDom As DOMDocument
Dim intQtdRegs As Integer
Dim iContador As Integer
Dim NomeCampo As String
Set oDom = New DOMDocument
With oDom
.LoadXml arquivoXml
If .parseError.errorCode <> 0 Then
[ô]MsgBox [Ô]Não foi possÃvel acessar os dados![Ô], vbCritical, [Ô]Erro[Ô]
[ô]Set ofom = Nothing
Set processaArquivoXml = Nothing
Exit Function
Else
intQtdRegs = oDom.getElementsByTagName([Ô]Table[Ô]).length [ô].childNodes(0).childNodes.length
Dim TabelaNome As String
Dim TabelaValor As String
Dim Fields As Variant
Dim Values As Variant
[ô]crio nova instancia do recordset
Set rsXML = New Recordset
rsXML.MaxRecords = intQtdRegs
[ô]Criar campos no RecordSet
Dim X As Integer
For X = 0 To oDom.getElementsByTagName([Ô]Table[Ô]).Item(0).childNodes.length - 1 [ô]Campos da Table
TabelaNome = oDom.getElementsByTagName([Ô]Table[Ô]).Item(0).childNodes(X).baseName
Fields = Array(TabelaNome)
rsXML.Fields.Append TabelaNome, adVarChar, 1000, adFldIsNullable
Next
rsXML.Open
[ô]Preencher os campos do RecordSet
For iContador = 0 To intQtdRegs - 1
rsXML.AddNew
For X = 0 To oDom.getElementsByTagName([Ô]Table[Ô]).Item(0).childNodes.length - 1 [ô]Campos da Table
TabelaNome = oDom.getElementsByTagName([Ô]Table[Ô]).Item(0).childNodes(X).baseName
TabelaValor = oDom.getElementsByTagName([Ô]Table[Ô]).Item(0).childNodes(X).Text
rsXML(TabelaNome).Value = TabelaValor
Next
rsXML.Update
Next
[ô]Retornar o RecordSet
Set processaArquivoXml = rsXML
[ô]rsXML.Close
[ô]Set rsXML = Nothing
End If
End With
Exit Function
TratarError:
If Err.Number <> 0 Then
[ô]Set oDom = Nothing
[ô]Set processaArquivoXml = Nothing
MsgBox [Ô]Não foi possÃvel Processar o Arquivo XML do Web Service URA.[Ô], vbInformation, [Ô]URA- Técnica[Ô]
Exit Function
End If
End Function
E a chamada a essa função ficou assim:
Dim oRet As String
Dim rsDados As ADODB.Recordset
Dim oTeste
Set oTeste = objWebService.ConsultarVlDebito(numCliente)
Set rsDados = processaArquivoXml(oTeste(1).xml)
Tópico encerrado , respostas não são mais permitidas