Xml vs access vba

di il
9 risposte

Xml vs access vba

Buongiorno,
Nn riesco a scrivere il codice x importare archivio tassi di cbio da BCE a tabella access
Ho creato il codice per importazione tassi giornaliero e funziona benissimo ma qua di lo applico allo storico mi riporta sempre la stessa data pur importando i tassi giusti, qualcuno ha qualche esempio?
Grazie

9 Risposte

  • Re: Xml vs access vba

    Dengo ha scritto:


    Ho creato il codice per importazione tassi giornaliero e funziona benissimo ma qua di lo applico allo storico mi riporta sempre la stessa data pur importando i tassi giusti, qualcuno ha qualche esempio?
    Se provi a riportare il codice (formattandolo con l'apposito pulsante sopra), forse si riesce a individuare il problema.
  • Re: Xml vs access vba

    Public Function Importa()
    Dim verifica As Boolean
    Dim Nodi As IXMLDOMNodeList
    Dim nodo As IXMLDOMNode
    Dim NodoData As IXMLDOMNode
    Dim obj As DOMDocument
    Dim DataIns As Date
    Dim dbs As DAO.Database
    Dim contA As Integer
    Dim strpath As String

    Set dbs = CurrentDb
    Set obj = New DOMDocument
    verifica = obj.Load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml")
    'verifica = obj.Load("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml?ba7ed97b2bce52ff43adcdbae48bce44")

    If verifica = True Then
    MsgBox "Sto Importando i Tassi di Cambio Aggiornati dalla BCE"

    Else
    MsgBox "L'Importazione sui Tassi Di Cambio Dalla BCE Non E' Andata a Buon Fine"

    Exit Function
    End If

    Set NodoData = obj.DocumentElement.ChildNodes.Item(2).ChildNodes.Item(0)
    DataIns = Format(NodoData.Attributes.Item(0).NodeValue, "DD/MM/YYYY")

    Set Nodi = obj.DocumentElement.SelectNodes("Cube/Cube/Cube")

    contA = 1
    For Each nodo In Nodi
    Dim strDataCambio As String

    strDataCambio = ""
    strDataCambio = strDataCambio & "INSERT INTO Tbl_App_Tassi_Cambio "
    strDataCambio = strDataCambio & "( "
    strDataCambio = strDataCambio & " DataCambio, OraCambio, Valuta, Rate "
    strDataCambio = strDataCambio & ") "
    strDataCambio = strDataCambio & "VALUES"
    strDataCambio = strDataCambio & "(#" & DataIns & "#, '" & Format(Now(), "long time") & "', '" & " _
    nodo.Attributes.Item(0).NodeValue & "', " & nodo.Attributes.Item(1).NodeValue & ") "
    strDataCambio = strDataCambio & ";"

    DBEngine(0)(0).Execute strDataCambio

    contA = contA + 1
    Next

    If contA > 0 Then
    contA = 0
    End If
    Set Nodi = Nothing
    Set nodo = Nothing
    Set NodoData = Nothing
    Set dbs = Nothing
    MsgBox "Importazione eseguita correttamente"

    End Function


    questa Function mi importa il tasso di cambio giornaliero e funziona benissimo
    quando provo ad importare invece dal seguente indirizzo :
    verifica = obj.Load("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml?ba7ed97b2bce52ff43adcdbae48bce44")
    mi inserisce tutti i tassi di cambio ma riporta sempre la stessa data.
    non so come interrompere il nodo per ripartire con la trance successiva con la data giusta.
    grazie
  • Re: Xml vs access vba

    Con la valorizzazione di DataIns fuori dal ciclo per forza...
    Ti serve un ciclo che scorra i cube di secondo livello, valorizzi la data e abbia un altro ciclo annidato che scorra i cube di terzo livello...

    Io magari ottimizzerei l'inserimento così
    strDataCambiobase = "INSERT INTO Tbl_App_Tassi_Cambio (DataCambio, OraCambio, Valuta, Rate) VALUES"
    Dim Valori as String
    For Each nodo In Nodi
        Valori = Valori & ... 'Creo i VALUES
    Next
    DBEngine(0)(0).Execute strDataCambioBase & Valori
    
    All'interno del ciclo concateno i values per tutto il nodo di secondo livello, e poi procedo all'insert. Trovo inutile fare un insert per ogni record...

    La variabile [contA] di preciso a cosa serve?
  • Re: Xml vs access vba

    Dengo ha scritto:


    questa Function mi importa il tasso di cambio giornaliero e funziona benissimo
    quando provo ad importare invece dal seguente indirizzo :
    verifica = obj.Load("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml?ba7ed97b2bce52ff43adcdbae48bce44")
    mi inserisce tutti i tassi di cambio ma riporta sempre la stessa data.
    non so come interrompere il nodo per ripartire con la trance successiva con la data giusta.
    In realtà non funziona nemmeno il cambio giornaliero: sei solamente fortunato che c'è un solo gruppo di valori da importare, e non gruppi multipli, quindi anche in quel caso non vai a recuperare più date ma avendone una sola, questa è corretta.

    La soluzione è presto detta. Questa parte di codice è errata:
    
    Set NodoData = obj.DocumentElement.ChildNodes.Item(2).ChildNodes.Item(0)
    DataIns = Format(NodoData.Attributes.Item(0).NodeValue, "DD/MM/YYYY")
    
    Tu qui vai direttamente su uno specifico nodo, e uno solo, e prelevi la data presente all'interno.

    Devi invece creare un ciclo anche in questo caso, enumerando i nodi "Cube" che si trovano a un livello superiore e poi scendendo nei nodi "Cube" che si trovano al suo interno, navigando la gerarchia degli elementi presenti nel file XML.

    Puoi trovare degli spunti e suggerimenti sul forum con una ricerca, ad esempio in questa discussione e nel seguito.

    P.S.: farei spostare la discussione da un moderatore all'interno del forum dedicato a VB6/VBA, visto che HTML e CSS non hanno nulla a che vedere con il problema.

    Ciao!
  • Re: Xml vs access vba

    <gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-0" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxre">
    <gesmes:subject>Reference rates</gesmes:subject>
    <gesmes:Sender>
    <gesmes:name>European Central Bank</gesmes:name>
    </gesmes:Sender>
    <Cube>
    <Cube time="2022-02-02">
    <Cube currency="USD" rate="1.1323"/>
    <Cube currency="JPY" rate="129.37"/>
    <Cube currency="BGN" rate="1.9558"/>
    <Cube currency="CZK" rate="24.298"/>
    <Cube currency="DKK" rate="7.4383"/>
    <Cube currency="GBP" rate="0.83395"/>
    <Cube currency="HUF" rate="354.45"/>
    <Cube currency="PLN" rate="4.5449"/>
    <Cube currency="RON" rate="4.9463"/>
    <Cube currency="SEK" rate="10.385"/>
    <Cube currency="CHF" rate="1.0399"/>
    <Cube currency="ISK" rate="143.2"/>
    <Cube currency="NOK" rate="9.9228"/>
    <Cube currency="HRK" rate="7.526"/>
    <Cube currency="RUB" rate="85.815"/>
    <Cube currency="TRY" rate="15.3011"/>
    <Cube currency="AUD" rate="1.5828"/>
    <Cube currency="BRL" rate="5.9677"/>
    <Cube currency="CAD" rate="1.433"/>
    <Cube currency="CNY" rate="7.2026"/>
    <Cube currency="HKD" rate="8.8245"/>
    <Cube currency="IDR" rate="16243.98"/>
    <Cube currency="ILS" rate="3.5777"/>
    <Cube currency="INR" rate="84.613"/>
    <Cube currency="KRW" rate="1359.23"/>
    <Cube currency="MXN" rate="23.2134"/>
    <Cube currency="MYR" rate="4.7392"/>
    <Cube currency="NZD" rate="1.701"/>
    <Cube currency="PHP" rate="57.785"/>
    <Cube currency="SGD" rate="1.5254"/>
    <Cube currency="THB" rate="37.575"/>
    <Cube currency="ZAR" rate="17.3459"/>
    </Cube>
    <Cube time="2022-02-01">
    <Cube currency="USD" rate="1.126"/>
    <Cube currency="JPY" rate="129.12"/>
    <Cube currency="BGN" rate="1.9558"/>
    <Cube currency="CZK" rate="24.335"/>
    <Cube currency="DKK" rate="7.4407"/>
    <Cube currency="GBP" rate="0.83498"/>
    <Cube currency="HUF" rate="356.38"/>
    <Cube currency="PLN" rate="4.5804"/>
    <Cube currency="RON" rate="4.9465"/>
    <Cube currency="SEK" rate="10.4438"/>
    <Cube currency="CHF" rate="1.0374"/>
    <Cube currency="ISK" rate="143.8"/>
    <Cube currency="NOK" rate="9.9638"/>
    <Cube currency="HRK" rate="7.5275"/>
    <Cube currency="RUB" rate="86.3238"/>
    <Cube currency="TRY" rate="15.0644"/>
    <Cube currency="AUD" rate="1.5868"/>
    <Cube currency="BRL" rate="5.9572"/>
    <Cube currency="CAD" rate="1.4299"/>
    <Cube currency="CNY" rate="7.1625"/>
    <Cube currency="HKD" rate="8.7779"/>
    <Cube currency="IDR" rate="16126.29"/>
    <Cube currency="ILS" rate="3.566"/>
    <Cube currency="INR" rate="84.197"/>
    <Cube currency="KRW" rate="1353.61"/>
    <Cube currency="MXN" rate="23.1296"/>
    <Cube currency="MYR" rate="4.7129"/>
    <Cube currency="NZD" rate="1.7032"/>
    <Cube currency="PHP" rate="57.516"/>
    <Cube currency="SGD" rate="1.5199"/>
    <Cube currency="THB" rate="37.378"/>
    <Cube currency="ZAR" rate="17.1633"/>
    </Cube>

    non riesco a capire come fare per leggere il nodo e scalare per ogni time le righe contenenti currency e rate
  • Re: Xml vs access vba

    Scusate se ho sbagliato forum, sono alle prime armi e nn so come fare a spostare sul forum vba
  • Re: Xml vs access vba

    Dengo ha scritto:


    non riesco a capire come fare per leggere il nodo e scalare per ogni time le righe contenenti currency e rate
    Se il codice originale l'hai scritto tu, non capisco quale sia il dubbio.

    Hai già usato SelectNodes(): invece di enumerare gli elementi all'ultimo livello possibile ("Cube/Cube/Cube") fermati al livello appena superiore ("Cube/Cube"), dal quale puoi estrarre la data di riferimento e salvarla, facendo un ciclo in questo modo per ogni gruppo di Cube, per scendere successivamente ai nodi figli usando sempre SelectNodes() con un percorso relativo ("./Cube") partendo da quello che rappresenta il gruppo (il nodo che ha la data) invece che dal DocumentElement, oppure usando semplicemente la collection ChildNodes per enumerare i "Cube" del livello più basso una volta arrivato all'elemento "Cube" che li contiene.

    In breve, i cicli da fare sono due: il primo enumera tutti i "Cube" di secondo livello con le date, estraendo questo valore, e poi c'è un ciclo interno per estrarre le informazioni dai nodi "Cube" con i cambi effettivi.
  • Re: Xml vs access vba

    Risolto
    posto il codice per chiunque ne avesse bisogno.
    grazie delle dritte
    Public Function Importa1()

    Dim Verifica As Boolean
    Dim Nodi As IXMLDOMNodeList
    Dim NodoData As IXMLDOMNode
    Dim NodoCurr As IXMLDOMNode
    Dim NodoRate As IXMLDOMNode
    Dim obj As DOMDocument

    Dim dbs As DAO.Database

    Dim strData As Date
    Dim strCurr As String
    Dim strrate As String

    Set dbs = CurrentDb
    Set obj = New DOMDocument

    'Verifica = obj.Load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml")
    Verifica = obj.Load("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml?ba7ed97b2bce52ff43adcdbae48bce44")

    If Verifica = True Then
    MsgBox "Sto Importando i Tassi di Cambio Aggiornati dalla BCE"

    Else
    MsgBox "L'Importazione sui Tassi Di Cambio Dalla BCE Non E' Andata a Buon Fine"

    Exit Function
    End If


    Set NodoData = obj.DocumentElement.SelectSingleNode("./Cube")
    Set NodoCurr = NodoData.SelectSingleNode("./Cube/Cube")
    Set NodoRate = NodoData.SelectSingleNode("./Cube/Cube")


    Set Nodi = NodoData.SelectNodes("./Cube")

    For Each NodoData In Nodi
    strData = Format(NodoData.Attributes.Item(0).NodeValue, "MM/DD/YYYY")

    For Each NodoCurr In NodoData.SelectNodes("./Cube")
    strCurr = NodoCurr.Attributes.Item(0).NodeValue

    strrate = NodoCurr.Attributes.Item(1).NodeValue


    Dim strDataCambio As String

    strDataCambio = ""
    strDataCambio = strDataCambio & "INSERT INTO Tbl_App_Tassi_Cambio1 "
    strDataCambio = strDataCambio & "( "
    strDataCambio = strDataCambio & " DataCambio, OraCambio, Valuta, Rate "
    strDataCambio = strDataCambio & ") "
    strDataCambio = strDataCambio & "VALUES"
    strDataCambio = strDataCambio & "(#" & strData & "#, '" & Format(Now(), "long time") & "', '" & strCurr & "', " & strrate & ") "
    strDataCambio = strDataCambio & ";"

    DBEngine(0)(0).Execute strDataCambio

    Next
    Next


    Set Nodi = Nothing
    Set Nodo = Nothing
    Set NodoData = Nothing
    Set dbs = Nothing

    MsgBox "Importazione eseguita correttamente"

    End Function
  • Re: Xml vs access vba

    Scusate c'era un errore in basso al codice

    Public Function Importa1()

    Dim Verifica As Boolean
    Dim Nodi As IXMLDOMNodeList
    Dim NodoData As IXMLDOMNode
    Dim NodoCurr As IXMLDOMNode
    Dim NodoRate As IXMLDOMNode
    Dim obj As DOMDocument

    Dim dbs As DAO.Database

    Dim strData As Date
    Dim strCurr As String
    Dim strrate As String

    Set dbs = CurrentDb
    Set obj = New DOMDocument

    'Verifica = obj.Load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml")
    Verifica = obj.Load("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml?ba7ed97b2bce52ff43adcdbae48bce44")

    If Verifica = True Then
    MsgBox "Sto Importando i Tassi di Cambio Aggiornati dalla BCE"

    Else
    MsgBox "L'Importazione sui Tassi Di Cambio Dalla BCE Non E' Andata a Buon Fine"

    Exit Function
    End If


    Set NodoData = obj.DocumentElement.SelectSingleNode("./Cube")
    Set NodoCurr = NodoData.SelectSingleNode("./Cube/Cube")
    Set NodoRate = NodoData.SelectSingleNode("./Cube/Cube")


    Set Nodi = NodoData.SelectNodes("./Cube")

    For Each NodoData In Nodi
    strData = Format(NodoData.Attributes.Item(0).NodeValue, "MM/DD/YYYY")

    For Each NodoCurr In NodoData.SelectNodes("./Cube")
    strCurr = NodoCurr.Attributes.Item(0).NodeValue

    strrate = NodoCurr.Attributes.Item(1).NodeValue


    Dim strDataCambio As String

    strDataCambio = ""
    strDataCambio = strDataCambio & "INSERT INTO Tbl_App_Tassi_Cambio1 "
    strDataCambio = strDataCambio & "( "
    strDataCambio = strDataCambio & " DataCambio, OraCambio, Valuta, Rate "
    strDataCambio = strDataCambio & ") "
    strDataCambio = strDataCambio & "VALUES"
    strDataCambio = strDataCambio & "(#" & strData & "#, '" & Format(Now(), "long time") & "', '" & strCurr & "', " & strrate & ") "
    strDataCambio = strDataCambio & ";"

    DBEngine(0)(0).Execute strDataCambio

    Next
    Next


    Set Nodi = Nothing
    Set NodoCurr = Nothing
    Set NodoData = Nothing
    Set NodoRate = Nothing
    Set dbs = Nothing

    MsgBox "Importazione eseguita correttamente"

    End Function
Devi accedere o registrarti per scrivere nel forum
9 risposte