Loop door XML response web service basis Ordernumber

Status
Niet open voor verdere reacties.

DarkValley

Gebruiker
Lid geworden
11 jan 2007
Berichten
59
Beste Vba'ers,

! UPDATE ! UPDATE ! UPDATE ! UPDATE ! UPDATE ! UPDATE ! UPDATE ! UPDATE ! UPDATE ! UPDATE ! UPDATE ! UPDATE ! UPDATE !

Ik probeer direct uit een (SOAP Httprequest) responseXML, data te halen op basis van in dit geval het ordernummer van een pakbon.


Op advies van @Bron heb ik de XML ingekort om het overzichtelijker te maken en als zip bestand bijgevoegd. Ook heb ik even een xlsm gemaakt die nu via xml file hetzelfde doet als vanuit een SOAP .responseXML


Zoals je kunt testen komt de data wel in Excel maar ik krijg het niet voor elkaar om door de artikelen te lopen per pakbon en deze dan in een werkblad te plaatsen.

Kan iemand mij helpen of mijn Excel bestand te krijgen zoals in bestand "vb bestand goed.xlsx"


Alvast mijn dank voor de hulp
 

Bijlagen

  • vb bestand goed.xlsx
    8,9 KB · Weergaven: 20
  • vb bestand fout.xlsx
    9,1 KB · Weergaven: 20
  • xml-bestand.zip
    1,1 KB · Weergaven: 13
  • Automatisch-Pakbonnen-sturen 2021.xlsm
    23 KB · Weergaven: 24
Laatst bewerkt:
Als je het inpakt als zip kan je de xml erbij zetten. In de bijlage heb ik je voorbeeld van veel xml regels ingekort zodat het wat overzichtelijk is.
 

Bijlagen

  • xml-bestand.zip
    1,1 KB · Weergaven: 18
@Bron,

Ok. Thnx. Dit maakt het idd wat overzichtelijker.

Heb het e.e.a. aangepast in het bron bericht.

laat de hulp nu maar komen :D
 
Laatst bewerkt:
excel 2007 - lint gegevens - blok externe gegevens ophalen - knop van ander bronnen - keuze van XML gegevens import
 
@alphamax, helaas kan dit niet anders dan via VBA. Deze module loopt namelijk automatisch via MS taakplanner.
 
Code:
Public Sub Main()

    sPath = "C:\Users\Name\Downloads\xml-bestand\xml-bestand.xml" 'aanpassen

    Cells(1, 1).CurrentRegion.Offset(1, 0).ClearContents

    lRow = 1
    With CreateObject("MSXML2.DOMDocument")
        .validateOnParse = False
        .async = False
        .Load (sPath)
        For Each oOrderItemResult In .SelectNodes("//OrderedItems/OrderItemResult")
            lRow = lRow + 1
            With oOrderItemResult
                With .ParentNode.ParentNode
                    Cells(lRow, 1).Value = .SelectSingleNode("Date").Text
                    Cells(lRow, 2).Value = .SelectSingleNode("OrderNumber").Text
                    Cells(lRow, 8).Value = .SelectSingleNode("Reference").Text
                End With
                Cells(lRow, 3).Value = .SelectSingleNode("ArticleNumber").Text
                Cells(lRow, 4).Value = .SelectSingleNode("ArticleDescription").Text
                Cells(lRow, 5).Value = .SelectSingleNode("QuantityOrdered").Text
                Cells(lRow, 6).Value = .SelectSingleNode("Price/GrossPrice").Text
                Cells(lRow, 7).Value = .SelectSingleNode("Price/NetPrice").Text
                Cells(lRow, 9).Value = .SelectSingleNode("LicensePlate").Text
            End With
        Next
    End With

    Cells(1, 1).CurrentRegion.Columns.AutoFit

End Sub
 
Laatst bewerkt:
Beste Alphamax,

Perfect dit werkt echt super.

Ik ga dit verder integreren in mijn oorspronkelijke bron code.

Nogmaals dank voor de hulp.

PS. ik zal deze zsm op opgelost zetten als alles gelukt is.
 
Beste Alphamax,

De code werkt perfect als het uit een XML file gehaald kan worden. Ik zou het eigenlijk meteen vanuit de SOAP response willen doen.

Meteen na de SOAP Request wordt de Response geladen in het object xmldoc

Hoe moet ik deze regel <With CreateObject("MSXML2.DOMDocument")> aanpassen, zodat ik de zelfde uitkomst krijg als met een separate XML bestand.

Kun jij mij hiermee helpen?


Code:
    With xmlhttpRequest
       .Open "Post", URL, False
       .setRequestHeader "Content-Type", "text/xml"
       .setRequestHeader "soapAction", ""
       .send envelope
     
     [COLOR="#FF0000"][B]Set xmldoc = CreateObject("MSXML2.DOMDocument")
     xmldoc.LoadXML .responseXML.XML[/B][/COLOR]
    
    End With

  If xmlhttpRequest.Status <> 200 Then
   MsgBox "Failure"
  Else

 lRow = 1
   [B] [COLOR="#FF0000"]With CreateObject("MSXML2.DOMDocument") [/COLOR][/B]   
        .validateOnParse = False
        .async = False
        .Load (sPath)
        For Each oOrderItemResult In .SelectNodes("//OrderedItems/OrderItemResult")
            lRow = lRow + 1
            With oOrderItemResult
                With .ParentNode.ParentNode
                    Cells(lRow, 1).Value = .SelectSingleNode("Date").Text
                    Cells(lRow, 2).Value = .SelectSingleNode("OrderNumber").Text
                    Cells(lRow, 8).Value = .SelectSingleNode("Reference").Text
                End With
                Cells(lRow, 3).Value = .SelectSingleNode("ArticleNumber").Text
                Cells(lRow, 4).Value = .SelectSingleNode("ArticleDescription").Text
                Cells(lRow, 5).Value = .SelectSingleNode("QuantityOrdered").Text
                Cells(lRow, 6).Value = .SelectSingleNode("Price/GrossPrice").Text
                Cells(lRow, 7).Value = .SelectSingleNode("Price/NetPrice").Text
                Cells(lRow, 9).Value = .SelectSingleNode("LicensePlate").Text
            End With
        Next
    End With

    Cells(1, 1).CurrentRegion.Columns.AutoFit


' hier komen nog wat opleuk instructies.


end if
 
Je had een dubbele Createobject

Gokje
Code:
Public Sub main()

    With xmlhttpRequest
        .Open "Post", URL, False
        .setRequestHeader "Content-Type", "text/xml"
        .setRequestHeader "soapAction", ""
        .send envelope

        Set xmldoc = CreateObject("MSXML2.DOMDocument")
        xmldoc.LoadXML .responseXML.XML

    End With

    If xmlhttpRequest.Status <> 200 Then
        MsgBox "Failure"
    Else
        lRow = 1
        With xmldoc
            For Each oOrderItemResult In .SelectNodes("//OrderedItems/OrderItemResult")
                lRow = lRow + 1
                With oOrderItemResult
                    With .ParentNode.ParentNode
                        Cells(lRow, 1).Value = .SelectSingleNode("Date").Text
                        Cells(lRow, 2).Value = .SelectSingleNode("OrderNumber").Text
                        Cells(lRow, 8).Value = .SelectSingleNode("Reference").Text
                    End With
                    Cells(lRow, 3).Value = .SelectSingleNode("ArticleNumber").Text
                    Cells(lRow, 4).Value = .SelectSingleNode("ArticleDescription").Text
                    Cells(lRow, 5).Value = .SelectSingleNode("QuantityOrdered").Text
                    Cells(lRow, 6).Value = .SelectSingleNode("Price/GrossPrice").Text
                    Cells(lRow, 7).Value = .SelectSingleNode("Price/NetPrice").Text
                    Cells(lRow, 9).Value = .SelectSingleNode("LicensePlate").Text
                End With
            Next
        End With

        Cells(1, 1).CurrentRegion.Columns.AutoFit


        ' hier komen nog wat opleuk instructies.


    End If

End Sub
 
Beste Alphamax,

Je was me net voor. :p

Nogmaals bedankt voor alle hulp.

Code:
 lRow = 1
'    With CreateObject("MSXML2.DOMDocument")
'        .validateOnParse = False
'        .async = False
'        .Load (sPath)
'
        For Each oOrderItemResult In xmldoc.SelectNodes("//OrderedItems/OrderItemResult")
            lRow = lRow + 1
            With oOrderItemResult
                With .ParentNode.ParentNode
                    Cells(lRow, 1).Value = .SelectSingleNode("Date").Text
                    Cells(lRow, 2).Value = .SelectSingleNode("OrderNumber").Text
                    Cells(lRow, 8).Value = .SelectSingleNode("Reference").Text
                End With
                Cells(lRow, 3).Value = .SelectSingleNode("ArticleNumber").Text
                Cells(lRow, 4).Value = .SelectSingleNode("ArticleDescription").Text
                Cells(lRow, 5).Value = .SelectSingleNode("QuantityOrdered").Text
                Cells(lRow, 6).Value = .SelectSingleNode("Price/GrossPrice").Text
                Cells(lRow, 7).Value = .SelectSingleNode("Price/NetPrice").Text
                Cells(lRow, 9).Value = .SelectSingleNode("LicensePlate").Text
            End With
        Next
   ' End With

    Cells(1, 1).CurrentRegion.Columns.AutoFit
 
Slim Alphamax, om de geneste loop te vervangen door een enkele en dan per node naar de parent te gaan :thumb:

Ik heb het niet getest maar uit de enthousiaste reactie leid ik af dat de code werkt. Maar waarom? Ik zou verwachten dat je XPath expressies er zo uit zouden moeten zien:
Code:
//ns:OrderedItems/ns:OrderItemResult
waarbij ns="Dgk2" is toegevoegd als namespace aan het dom document. De hele data structuur in de envelope heeft immers "Dgk2" als default namespace.
Snap jij dit Alphamax, of iemand anders?
 
Beste Pixcel,

Is het niet omdat NS altijd <DGK2> is je dit dus niet hoeft te doen?

Ik dacht dat NS voornamelijk gebruikt wordt bij HTML parsing, omdat je een deel Style sheet hebt en deel Http etc. etc. En bij Custom XML

Kan zijn dat ik mis zit hoor.. Just a thought :D
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan