Imprimir página | Cerrar ventana

Conversor Divisas

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86163
Fecha de impresión: 18/Abril/2024 a las 04:40


Tema: Conversor Divisas
Publicado por: main
Asunto: Conversor Divisas
Fecha de publicación: 03/Noviembre/2021 a las 11:10
Buenos dias:
Por cortesía del joven Mihura puedo obtener el cambiio, de compra-venta, entre monedas
Lo obtiene del siguiente enlace:
https://www1.oanda.com/lang/es/currency/converter/
Yo lo hago a traves de su función, con un sencillo formulario con los campos "Divisa Origen" y "Divisa Destino"especificando el tipo de operacion deseada COMPRAR O VENDER.
La función de Mihura devuelve el cambiio del día
Pues bien, desde la pagina web se puede elegir a que fecha se desea realizar el cambio y me gustaria poder pasarsela desde el formulario y así obtener el resultado deseado. Porque hasta ahora necesito entrar en la pagina y ponerle yo la fecha en la que quiero la conversion.
Esto me permitiria ir creando una tabla de cambios de la que nutrirme a la hora de generar albaranes y facturas de ventas por exprtaciiones.

Saludos al Grupo



Respuestas:
Publicado por: main
Fecha de publicación: 05/Noviembre/2021 a las 11:02
Wondows_10 vs Access_2010
Hola de nuevo
Como me tengo que declarar gran ignorante del HTML os dejo la función de origen que devuelve el cambio de moneda
Public Function CalculaDivisa(Origen As String, Destino As String) As Double
  Dim IE As InternetExplorer
    Dim HtmlDoc As HTMLDocument
    Dim inputEle As HTMLInputElement
    Dim innerBox 'As HTMLDivElement
    Dim col 'As HTMLElementCollection
    Dim div 'As HTMLDivElement
    Dim span 'As HTMLSpanElement
    Dim xArray As Variant, i As Integer, Xs As String, Divisa1 As String, Divisa2 As String
    DoCmd.Hourglass True
    Set IE = CreateObject("InternetExplorer.Application")
    IE.visible = False
    IE.Navigate "https://www1.oanda.com/lang/es/currency/converter/"

    Do While IE.ReadyState = 4: DoEvents: Loop   'Do While
    Do Until IE.ReadyState = 4: DoEvents: Loop   'Do Until

    Set HtmlDoc = IE.Document
    ' primero ponemos la cantidad que deseamos cambiar
    Set inputEle = IE.Document.getElementById("quote_amount_input")
      inputEle.value = "1"
    ' referenciamos el desplegable con la divisa 1
        Set innerBox = HtmlDoc.getElementById("scroll-innerBox-1")
        ' referenciamos controles div de clase "ltr_list_item", que son los elementos del desplegable
        Set col = innerBox.getElementsByClassName("ltr_list_item")
        For Each div In col
        ' referenciamos el elemento span nº 3 de cada div "ltr_list_item" (que es la class "code-right")
            Set span = div.getElementsByTagName("span")(2)
     ' ponemos un valor diferente al que queremos (obligamos a actualizar el campo y otros valores)
            If span.innerText <> Origen Then
                div.FireEvent ("onmouseover")
                div.FireEvent ("onclick")
                Exit For
            End If
        Next
        Set col = innerBox.getElementsByClassName("ltr_list_item")
        For Each div In col
       ' referenciamos el elemento span nº 3 de cada div "ltr_list_item" (que es la class "code-right")
            Set span = div.getElementsByTagName("span")(2)
            ' en la segunda pasada ponemos el valor que queremos
            If span.innerText = Origen Then
                div.FireEvent ("onmouseover")
                div.FireEvent ("onclick")
                Exit For
            End If
        Next
    
        ' referenciamos el desplegable con la divisa 2 y hacemos lo mismo que con la divisa 1
        Set innerBox = HtmlDoc.getElementById("scroll-innerBox-2")
        Set col = innerBox.getElementsByClassName("ltr_list_item")
        For Each div In col
            Set span = div.getElementsByTagName("span")(2)
            If span.innerText <> Destino Then
                div.FireEvent ("onmouseover")
                div.FireEvent ("onclick")
                Exit For
            End If
        Next
        Set col = innerBox.getElementsByClassName("ltr_list_item")
        For Each div In col
            Set span = div.getElementsByTagName("span")(2)
            If span.innerText = Destino Then
                div.FireEvent ("onmouseover")
                div.FireEvent ("onclick")
                Exit For
            End If
        Next
        Sleep 2000
        CalculaDivisa = IE.Document.getElementById("base_amount_input").value
    IE.Quit
    Set IE = Nothing
    DoCmd.Hourglass False
End Function
Inspecionando el campo donde se introduce la fecha compruebo que su Id es "end_date_input"
Con lo que me animé a poner en la funcion lo siguiente..
    Set inputEle = IE.Document.getElementById("end_date_input")
    inputEle.value = #10/30/2021#
Bien pues dejando la web visible veo que efectivamente introduce la fecha pero no actualiza la conversión y sigue apareciendo el cambio del dia.
Faltaria saber controlar y ejecutar el evento que desencadene el nuevo calculo tras cambiar de fecha en el formulario web.
En fin, que si alguno controla como manejar esto de las clases y coleciones le resultará mucho mas facil que a mi.
Gracias por vuestro tiempo y conocimiento
Saludos al Grupo




Publicado por: lbauluz
Fecha de publicación: 05/Noviembre/2021 a las 12:05
Hola.

Así a ojo.

en lugar de acceder a https://www1.oanda.com/lang/es/currency/converter/ sería más fácil si directamente accedes a https://www.oanda.com/fx-for-business/historical-rates

Luego rellenas los combos como hasta ahora y luego activas el botón download-btn

Un saludo.

Luis


-------------
El Búho es un pajarraco


Publicado por: main
Fecha de publicación: 05/Noviembre/2021 a las 13:17
Hola Ibauluz
He visto el enlace y desde luego es mas interesante ya que permite obtener los cambios para un determinado rango de fechas.
Pero estoy con el mismo problema para implementar el acceso a esos datos e incorporarlos a una tabla.
El caso es como leer la tabla de "cambios" para cada dia.
Ya antepuse que estoy verdaderamente pez en esto del HTML y lo poco que intento es por mera intuición viendo "arbolitos" de un lado y de otro.
Por eso me conformaba con dar con la solución en la pagina planteada. Me ayudaria a mejorar esa intuicion y si me animo o necesito estudiar el HTML comprenderé mejor su estructura.
Gracias por el enlace y
Saludos cordiales.
Saludos al Grupo



Publicado por: main
Fecha de publicación: 17/Noviembre/2021 a las 14:01
Buenos dias

Este tema se puede cerrar


Publicado por: main
Fecha de publicación: 19/Noviembre/2021 a las 13:21
Hola de nuevo
Aprovecho que aún no se cerró el tema para poner el procedimiento definitivo
Public Function CalculaDivisa(Origen As String, Destino As String, Fec As Date, Optional Canti As Double = 1) As Double
  Dim IE As InternetExplorer
    Dim HtmlDoc As HTMLDocument
    Dim inputEle As HTMLInputElement
    Dim innerBox 'As HTMLDivElement
    Dim col 'As HTMLElementCollection
    Dim div 'As HTMLDivElement
    Dim span 'As HTMLSpanElement
    Dim xArray As Variant, i As Integer, Xs As String, Divisa1 As String, Divisa2 As String
    DoCmd.Hourglass True
    Set IE = CreateObject("InternetExplorer.Application")
    IE.visible = True
    IE.Navigate "https://www1.oanda.com/lang/es/currency/converter/"
    Do While IE.ReadyState = 4: DoEvents: Loop   'Do While
    Do Until IE.ReadyState = 4: DoEvents: Loop   'Do Until
    Set HtmlDoc = IE.Document
    'Introducimos la fecha de cambio
     Set inputEle = IE.Document.getElementById("end_date_input")
       inputEle.focus
       inputEle.value = Fec
       inputEle.Click  'O bien, inputEle.FireEvent ("OnClick")
       'primero ponemos la cantidad que deseamos cambiar
    IE.visible = False
    Set inputEle = IE.Document.getElementById("quote_amount_input")
    inputEle.value = Canti
        ' referenciamos el desplegable con la divisa 1
        Set innerBox = HtmlDoc.getElementById("scroll-innerBox-1")
        ' referenciamos controles div de clase "ltr_list_item", que son los elementos del desplegable
        Set col = innerBox.getElementsByClassName("ltr_list_item")
        For Each div In col
            ' referenciamos el elemento span nº 3 de cada div "ltr_list_item" (que es la class "code-right")
            Set span = div.getElementsByTagName("span")(2)
            Debug.Print span, span.innerText
            ' ponemos un valor diferente al que queremos (obligamos a actualizar el campo y otros valores)
            If span.innerText <> Origen Then
                div.FireEvent ("onmouseover")
                div.FireEvent ("onclick")
                Exit For
            End If
        Next
        Set col = innerBox.getElementsByClassName("ltr_list_item")
        For Each div In col
            ' referenciamos el elemento span nº 3 de cada div "ltr_list_item" (que es la class "code-right")
            Set span = div.getElementsByTagName("span")(2)
            ' en la segunda pasada ponemos el valor que queremos
            If span.innerText = Origen Then
                div.FireEvent ("onmouseover")
                div.FireEvent ("onclick")
                Exit For
            End If
        Next
      ' referenciamos el desplegable con la divisa 2 y hacemos lo mismo que con la divisa 1
        Set innerBox = HtmlDoc.getElementById("scroll-innerBox-2")
        Set col = innerBox.getElementsByClassName("ltr_list_item")
        For Each div In col
            Set span = div.getElementsByTagName("span")(2)
            If span.innerText <> Destino Then
                div.FireEvent ("onmouseover")
                div.FireEvent ("onclick")
                Exit For
            End If
        Next
 
        Set col = innerBox.getElementsByClassName("ltr_list_item")
        For Each div In col
            Set span = div.getElementsByTagName("span")(2)
            If span.innerText = Destino Then
                div.FireEvent ("onmouseover")
                div.FireEvent ("onclick")
                Exit For
            End If
        Next
                
       Sleep 2000
    CalculaDivisa = IE.Document.getElementById("base_amount_input").value
    IE.Quit
    Set IE = Nothing
    DoCmd.Hourglass False
End Function

Funciona, pero con un pequeño problemilla y es que si dejo el IE no visible desde el principio, entonces no lo calcula con la fecha desada y me dá el valor de hoy.
Sabeis como arreglar esto.
Saludos.




Publicado por: Mihura
Fecha de publicación: 19/Noviembre/2021 a las 13:25
Pon el control de tamaño 0.01 x 0.01 visible y ya tá  ... Tongue



-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: main
Fecha de publicación: 19/Noviembre/2021 a las 13:32
Bueno, sinó tien otra solución tambien valdráClap
Gracias, joven.
Ahora ya se puede cerrar



Imprimir página | Cerrar ventana