DATASET EM VB6

DSSOARES 28/09/2011 16:47:57
#385493
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.
SAMUKA 28/09/2011 23:14:53
#385518
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.
DSSOARES 29/09/2011 10:03:13
#385524
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 ?
KERPLUNK 29/09/2011 18:12:33
#385555
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.
DSSOARES 30/09/2011 11:09:03
#385580
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)
Tópico encerrado , respostas não são mais permitidas