[VB6] SOAP, Webservice, toolkit 3.0

Pagina: 1
Acties:
  • 139 views sinds 30-01-2008
  • Reageer

  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
Beetje moeilijk om passende titel te vinden :X Indien nodig, pas maar aan hoor.

Ben mij sinds een paar dagen aan het inlezen in SOAP, webservices, SOAP Toolkit 3.0, etc.

Het is de bedoeling dat ik een bestaande tool (VB6) ga uitbreiden met een module om berichten ( die lokaal beheerd worden met die tool) te plaatsen op een website van een andere firma.

Deze firma heeft een webservice beschikbaar die voor de afhandeling zorgt.

Ik beschik over een url naar een WSDL, met de omschrijving van de webservice, en een overzicht van de berichtsoorten die verstuurd kunnen worden naar de service.

Om met dit nieuwe speeltje aan de slag te gaan heb ik een van de simpele modules genomen en geprobeerd deze te gebruiken. Ik loop echter tegen een foutmelding (slaat terug op regel 8 in de code hieronder) aan die ik niet kan plaatsen:
code:
1
2
3
Run-time error '13':

type mismatch

Bijkomende gegevens:

Omschrijving module: GetCategories
Berichtsoort

VeldnaamFormaatVerplichtInhoudToelichting
UsernameA(15)JGebruikersnaam/
PasswordA(15)JWachtwoord/
CountryA(2)JLandNL of BE
ReturntypeA(5)Type structuurarray of query/


Returnvariabelen

VeldnaamFormaatInhoudToelichting
ResultN(1)Resultaat van actie1 of 0
CategoriesArray/queryarray/query met rubrieken/


Mijn huidige code:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
    Dim oClient As Object
    Dim strReturn As String
    
    Set oClient = CreateObject("MSSoap.SoapClient30")
    
    oClient.MSSoapInit WEBSERVICE_URL

    strReturn = oClient.GetCategories(GEBRUIKERSNAAM, PASWOORD, "BE", "query")
    
    MsgBox (strReturn)

Om te testen of de verbinding met de webservice correct is heb ook al niet-bestaande berichtsoorten (bv. getBlabla) naar de service gestuurd en die resulteren in totaal andere foutmeldingen. De communicatie met de service is volgens mij dus inorde.
Als ik alles op een rijtje zet lijkt het mij dat het probleem wordt gecreëerd door de variabele die de return moet opvangen (strReturn). Ik heb echter al verschillende voorbeelden gevonden en geïmplementeerd om de result op te vangen maar die resulteren ook in foutmeldingen:

* gebruik van xml-object om return op te vangen
* gebruik van integer om return op te vangen
* gebruik van array om return op te vangen


Kan iemand mij aub duidelijk maken wat ik verkeerd doe of waar het verkeerd loopt? Ik zie door de bomen het bos niet meer op dit moment.

*voetnoot: het is geen optie om VB.net in te schakelen vermits de bestaande toepassing in VB6 geschreven is, en ook moet blijven.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:37
Wat returned GetCategories ?
Een type mismatch is gewoon dat het type dat je in de variable wilt proppen, niet compatibel is met het type van die (doel)-variable.
Die GetCategories returned waarschijnlijk een array ?
*voetnoot: het is geen optie om VB.net in te schakelen vermits de bestaande toepassing in VB6 geschreven is, en ook moet blijven.
Da's een non-argument, aangezien er wel mogelijkheden zijn om een module in .NET te schrijven , en deze dan in VB6 te gebruiken. (mbhv com) :P

https://fgheysels.github.io/


  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
whoami schreef op dinsdag 17 oktober 2006 @ 15:31:
Wat returned GetCategories ?
Een type mismatch is gewoon dat het type dat je in de variable wilt proppen, niet compatibel is met het type van die (doel)-variable.
Die GetCategories returned waarschijnlijk een array ?
Onder andere ja (zie 2de tabel = omschrijving wat GetCategories teruggeeft) Heb echter al met een array geprobeerd maar dat geeft ook foutmelding.

edit:

Visual Basic:
1
debug.Print oClient.GetCategories(GEBRUIKERSNAAM, PASWOORD, "BE", "query")

Geeft dezelfde foutmelding.
Als ik parameters weglaat krijg ik ruzie met webservice zelf (foutmelding ivm ongeldige parameters).

Het gaat er dus inderdaad om dat de opvang van de returnwaarde niet correct gebeurd. Kan iemand mij op weg helpen hoe ik er dan wel achter kom wat ik precies krijg teruggestuurd? :?

[ Voor 30% gewijzigd door Blacksnak op 17-10-2006 16:41 ]


  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 17-11-2025
Als je met ethereal of een ander programma kijkt wat er voorbij komt op je netwerk op het moment dat deze code uitgevoert wordt, kan je daar iets aan zien van welk type het is?

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 20:55

sopsop

[v] [;,,;] [v]

Aangezien je volgens je specs twee returnvars krijgt, lijkt het mij dat je die in je aanroep moet proppen. Dus als volgt:

Visual Basic:
1
2
3
4
5
6
7
8
9
    Dim oClient As Object
    Dim strReturn As String
    Dim vRetVar as Variant
    
    Set oClient = CreateObject("MSSoap.SoapClient30")
    
    oClient.MSSoapInit WEBSERVICE_URL

    strReturn = oClient.GetCategories(GEBRUIKERSNAAM, PASWOORD, "BE", "query", vRetVar)

Mocht ook dat niet werken probeer dan dit is:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
    Dim oClient As Object
    Dim strReturn As Variant
    
    Set oClient = CreateObject("MSSoap.SoapClient30")
    
    oClient.MSSoapInit WEBSERVICE_URL

    strReturn = oClient.GetCategories(GEBRUIKERSNAAM, PASWOORD, "BE", "query")
    
    MsgBox (strReturn)

Verwijderd

Kan je in de WSDL niet zien wat het returntype is dan? Misschien een array met als eerste waarde die returnwaarde, en als 2e waarde een array van categories?

  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
sopsop schreef op dinsdag 17 oktober 2006 @ 17:50:
Mocht ook dat niet werken probeer dan dit is:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
    Dim oClient As Object
    Dim strReturn As Variant
    
    Set oClient = CreateObject("MSSoap.SoapClient30")
    
    oClient.MSSoapInit WEBSERVICE_URL

    strReturn = oClient.GetCategories(GEBRUIKERSNAAM, PASWOORD, "BE", "query")
    
    MsgBox (strReturn)
Ok Sopsop, dit heeft me alvast een heel pak verder geholpen. Mbv deze tip, google en wat debugwerk in VB ben ik erachter gekomen dat de service 2 IXMLDOMSelections teruggeeft, die ik kan opvangen met deze code:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
    Dim oClient As Object
    Dim vReturn As Variant
    
    Dim oReturn1 As IXMLDOMSelection
    Dim oReturn2 As IXMLDOMSelection

    Set oClient = CreateObject("MSSoap.SoapClient30")
    oClient.MSSoapInit WEBSERVICE_URL
    
    vReturn = oClient.GetCategories(GEBRUIKERSNAAM, PASWOORD, "BE", "query")
    
    Set oReturn1 = vReturn(0)
    Set oReturn2 = vReturn(1)

Ik was eerder al aan het rommelen geweest met die IXMLDOMSelection maar had toen deze rechtstreeks gebruikt als opvangbak voor de data die GetCategories teruggaf. Dat ging natuurlijk niet omdat er 2 worden teruggestuurd 8)7.

Nu verder uitvissen hoe ik met deze data aan de slag kan (ben nog niet zo thuis in het xml-gebeuren). Al veel gelezen maar praktijk is meestal toch net iets anders :X

Alvast bedankt voor de hulp! Alhoewel ik niet verlegen zit om nog een paar tips te ontvangen natuurlijk :+ ;)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Die oReturn1 en oReturn2 zijn redelijk nutteloos (de variabelenaam zegt helemaal niks meer dan de array die je al terug krijgt). Waarom kieper je die niet overboord en benader je vReturn(x) niet gewoon rechtstreeks?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
RobIII schreef op dinsdag 17 oktober 2006 @ 22:55:
Die oReturn1 en oReturn2 zijn redelijk nutteloos (de variabelenaam zegt helemaal niks meer dan de array die je al terug krijgt). Waarom kieper je die niet overboord en benader je vReturn(x) niet gewoon rechtstreeks?
Mja, naamgeving is nog niet echt belangrijk op dit moment. Ben maar een beetje aan het spelen om heel het systeem een beetje te snappen en onder de knie te krijgen. Als ik 'echte' code aan het schrijven ben zorg ik wel voor wat meer duidelijkheid :)

Wat dat rechtstreeks benaderen betreft: dat gaat toch niet?

oReturn1 en oReturn2 zijn beide objecten (IXMLDOMSelection) terwijl die vReturn gewoon van het type variant is. Rechtstreeks de output in een IXMLDOMSelection-object steken lukt niet vermits de return een array is (van 2 IXMLDOMSelections).

Of schiet ik nu helemaal mis? :X :?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Blacksnak schreef op dinsdag 17 oktober 2006 @ 23:06:
[...]


Mja, naamgeving is nog niet echt belangrijk op dit moment. Ben maar een beetje aan het spelen om heel het systeem een beetje te snappen en onder de knie te krijgen. Als ik 'echte' code aan het schrijven ben zorg ik wel voor wat meer duidelijkheid :)

Wat dat rechtstreeks benaderen betreft: dat gaat toch niet?

oReturn1 en oReturn2 zijn beide objecten (IXMLDOMSelection) terwijl die vReturn gewoon van het type variant is. Rechtstreeks de output in een IXMLDOMSelection-object steken lukt niet vermits de return een array is (van 2 IXMLDOMSelections).

Of schiet ik nu helemaal mis? :X :?
vReturn(0) en vReturn(1) zijn ook "gewoon" IXMLDOMSelections, alleen dan "in" een Variant. Ik zou persoonlijk voor het "Object" variable type gaan, maar either way zijn het "gewoon dingen in dingen".

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
RobIII schreef op dinsdag 17 oktober 2006 @ 23:18:
[...]

vReturn(0) en vReturn(1) zijn ook "gewoon" IXMLDOMSelections, alleen dan "in" een Variant. Ik zou persoonlijk voor het "Object" variable type gaan, maar either way zijn het "gewoon dingen in dingen".
Lijkt me persoonlijk ook wel het duidelijkst (mits een betere naamgeving natuurlijk)

Verder ben ik al een heel stuk gevorderd in m'n SOAP en webservice studies. Heb echter wel nog een vraagje omtrend 2 verschillende soorten aan output die ik kan opvragen.

De webservice laat mij toe te kiezen uit 'array' of 'query'. Kan iemand mij het verschil tussen deze 2 verklaren/verduidelijken (buiten het feit dat de opbouw anders is natuurlijk)? Heeft een van de 2 bv. een hogere voorkeur om mee te werken wegens makkelijker in het benaderen ofzo? (voorbeelden van de 2 verschillende files heb ik hieronder gezet)

Ik heb trouwens al een stuk code geschreven om de data uit de xml-file te krijgen maar die heeft wel een stuk of 3 for/next lusjes nodig, wat de duidelijkheid niet echt ten goede komt vind ik persoonlijk. Zijn andere benaderingen ook mogelijk? (dus niet alle nodes doorlopen met for-lusjes)

* als 'array'
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<value soapenc:arrayType="xsd:anyType[34]" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
      <value xsi:type="ns2:Map">
       <item>
        <key xsi:type="soapenc:string">category</key>
        <value xsi:type="soapenc:string">Agrarisch</value>
       </item>
       <item>
        <key xsi:type="soapenc:string">categoryid</key>
        <value xsi:type="soapenc:int">33</value>
       </item>
      </value>
      <value xsi:type="ns2:Map">
       <item>
        <key xsi:type="soapenc:string">category</key>
        <value xsi:type="soapenc:string">Antiek en kunst</value>
       </item>
       <item>
        <key xsi:type="soapenc:string">categoryid</key>
        <value xsi:type="soapenc:int">1</value>
       </item>
      </value>
</value>


* als 'query'
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:QueryBean" xmlns:ns3="http://rpc.xml.coldfusion">
      <columnList soapenc:arrayType="xsd:string[2]" xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
       <columnList xsi:type="xsd:string">CATEGORYID</columnList>
       <columnList xsi:type="xsd:string">CATEGORY</columnList>
      </columnList>
      <data soapenc:arrayType="xsd:anyType[][34]" xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
       <data soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array">
        <data xsi:type="soapenc:int">33</data>
        <data xsi:type="soapenc:string">Agrarisch</data>
       </data>
       <data soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array">
        <data xsi:type="soapenc:int">1</data>
        <data xsi:type="soapenc:string">Antiek en kunst</data>
       </data>
       <data soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array">
        <data xsi:type="soapenc:int">2</data>
        <data xsi:type="soapenc:string">Audio</data>
       </data>
   </data>
</value>


*edit*

2de vraag
Kan me trouwens iemand dit volgende verklaren?

Met het volgende commando:
Visual Basic:
1
oCategoriesNode.childNodes.Item(3).childNodes.Item(1).xml


krijg ik deze node terug:
XML:
1
2
3
4
<data xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" soapenc:arrayType="xsd:anyType[2]" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="soapenc:Array">
        <data xsi:type="soapenc:int">33</data>
        <data xsi:type="soapenc:string">Agrarisch</data>
       </data>

Wat trouwens de eerste is, en dus klopt.

Als ik echter dan
Visual Basic:
1
oCategoriesNode.childNodes.Item(3).childNodes.Item(2).xml

doe, krijg ik een lege string terug. Pas bij "Item(3)" wordt de 2de node teruggegeven.

Kan iemand me vertellen wat hiervan de oorzaak is? Dat gaat mij logica even teboven :?

[ Voor 12% gewijzigd door Blacksnak op 18-10-2006 18:14 . Reden: 2de vraag toevoegen ]


  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
In de vele documentatie die ik gelezen heb is er dikwijls sprake van een steile leercurve bij SOAP & Webservices... Kan ik alleen maar beamen :) Heb gelukkig stevige bergschoenen :+

Er komt schot in de zaak maar bepaalde dingen zijn me toch nog niet duidelijk. Zo heb ik mbv onderstaande code een aantal gegevens uit m'n xml kunnen opdiepen. Ik vind het echter nogal omslachtig en onduidelijk. Kan iemand me hier misschien iets meer duidelijkheid in geven? Ben ik goed bezig of ben ik via Madrid naar Luxemburg aan't rijden? Het lijkt het me dat de benadering veel simpeler moet kunnen of ben ik mis?

Een deel van de code, om het geheel wat te documenteren, staat hieronder. Let niet op naamgeving van variabelen of tekstboxen, ik ben nog maar aan het spelen met de code om het geheel onder de knie te krijgen. Bij het echte werk worden die duidelijk benoemd.
De XML-load waar deze code betrekking op heeft kun je in één van m'n vorige posts terugvinden, meer precies bij de 'query-methode'.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
' *KNIP*   
    Dim oClient As Object
    Dim vReturn As Variant
    
    Dim oResult As IXMLDOMSelection
    Dim oCategories As IXMLDOMSelection
    Dim oCategoriesNode As IXMLDOMNode
    Dim oCategoriesSubNode As IXMLDOMNode
    
    Dim lTeller As Long
    Dim lTeller2 As Long
    Dim lTeller3 As Long

    Set oClient = CreateObject("MSSoap.SoapClient30")
    oClient.MSSoapInit WEBSERVICE_URL
 
    vReturn = oClient.GetCategories(GEBRUIKERSNAAM, PASWOORD, "BE", "query")
    
    Set oResult = vReturn(0) 'resultaat van de actie
    Set oCategories = vReturn(1)  'array/query met rubrieken
    
    If oResult(1).Text = 1 Then 'Communicatie met server is goed verlopen
        
        Set oCategoriesNode = oCategories.Item(1) '

        Text2.Text = ""
        lTeller = 1
        
        For lTeller = 1 To oCategoriesNode.childNodes.Item(3).childNodes.length - 1            
            lTeller2 = 1
            For lTeller2 = 1 To oCategoriesNode.childNodes.Item(3).childNodes.Item(lTeller).childNodes.length - 1
                lTeller3 = 0
                
                Set oCategoriesSubNode = oCategoriesNode.childNodes.Item(3).childNodes.Item(lTeller).childNodes.Item(lTeller2) 'beetje inkorten
                For lTeller3 = 0 To oCategoriesSubNode.childNodes.length - 1
                    Text2.Text = Text2.Text & oCategoriesSubNode.childNodes.Item(lTeller3).Text
                Next  
            Next
        Next
    Else
        MsgBox "Actie gefaald!"
    End If

Iemand die me een beetje in de juiste richting kan/wil duwen (of bevestigen da'k juist zit) ?
Pagina: 1