** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Como enviar una tabla a un web service desde vba
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoComo enviar una tabla a un web service desde vba

 Responder Responder
Autor
Mensaje
 Valoración: Valorar tema: 1 Votos, Promedio 5.00  Tema Buscar Tema Buscar  Opciones del Tema Opciones del Tema
CarLesPaul Ver desplegable
Nuevo
Nuevo


Unido: 02/Julio/2015
Localización: madrid
Estado: Sin conexión
Puntos: 12
Enlace directo a este mensaje Tema: Como enviar una tabla a un web service desde vba
    Enviado: 02/Julio/2015 a las 17:41
Buenas Gente,

Mi problema es como puedo enviar el contenido de una tabla (Pedidos) a un web service, llevo casi dos semanas leyendo soap, http post, get, rest, etc, pero no doy con la solución. La tabla tiene los campos numero, cliente, delegacion, fecha, vendedor, descuento y observaciones. A su vez éstos campos son los que tiene el Web Service. Me da igual que el web service me responda o no, yo quiero enviarle la información, estoy desesperado ya que tengo fecha límite y esto me esta gastando el tiempo que tengo.
No tengo demasiada idea de VBA, por lo que no deis nada por entendido a la hora de explicar algo.
A la hora de enviar puede ser desde la tabla directamente, o bien desde un xml con el contenido de la tabla.
Ante mi desesperación y falta de sueño, gracias por vuestra ayuda.

Carlespaul
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5046
Enlace directo a este mensaje Enviado: 02/Julio/2015 a las 18:27
Hola CarLesPaul 
 
No dices que tipo de web servicio es (REST o SOAP), yo lo poquito que entiendo sobre los web services es que le tienes que enviar la información estructurada (csv, xml, json, etc.), y son ellos los que te dan la estructura del envio. Con lo poco que pones (aparte que estas desesperado) es difícil ayudarte.
 
Yo en tu lugar pondría la URL del web servicio,  si requiere contraseña o no, si tiene uno para hacer prueba, la documentación de web servicio, etc.
 
Saludos.
 
Arriba
CarLesPaul Ver desplegable
Nuevo
Nuevo


Unido: 02/Julio/2015
Localización: madrid
Estado: Sin conexión
Puntos: 12
Enlace directo a este mensaje Enviado: 02/Julio/2015 a las 18:52
Buenas Emiliove,

El enlace no lo puedo facilitar ya que tiene contraseña, es de producción y posee datos de clientes, productos, prescios, etc, información sensible que espero que entendais que no puedo facilitarlo.
he realizado una app en access para que los vendedores pasen los pedidos que realizan, casi nunca los pueden hacer online, por lo que requieren de algo que les permita crearlos y cuando dispongan de conexión, enviarlos. 
El método de Pedido del WebService me solicita lo siguiente:
numero, cliente, delegacion, fecha, vendedor, descuento y observaciones.
A su vez, ésto es lo que tengo en la tabla Pedido, que es la que tiene la información que he de mandar. Cuando se envía, se borra el contenido de la tabla y se van creando nuevos pedidos hasta el siguiente envío.
En la información del método Pedido, me da los ejemplos para usar SOAP 1.1 y 1.2, así como HTTP GET y POST, que ésto es lo que viene a continuación:

Gracias.

SOAP 1.1

A continuación se muestra un ejemplo de solicitud y respuesta para SOAP 1.1. Es necesario reemplazar los marcadores de posición que aparecen con valores reales.

POST /Aqua.asmx HTTP/1.1
Host: ws.alphadventure.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://alphadventure.com/Pedido"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Pedido xmlns="http://alphadventure.com/">
      <numero>double</numero>
      <cliente>string</cliente>
      <delegacion>string</delegacion>
      <fecha>dateTime</fecha>
      <vendedor>string</vendedor>
      <descuento>double</descuento>
      <observaciones>string</observaciones>
    </Pedido>
  </soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <PedidoResponse xmlns="http://alphadventure.com/">
      <PedidoResult>int</PedidoResult>
    </PedidoResponse>
  </soap:Body>
</soap:Envelope>

SOAP 1.2

A continuación se muestra un ejemplo de solicitud y respuesta para SOAP 1.2. Es necesario reemplazar los marcadores de posición que aparecen con valores reales.

POST /Aqua.asmx HTTP/1.1
Host: ws.alphadventure.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <Pedido xmlns="http://alphadventure.com/">
      <numero>double</numero>
      <cliente>string</cliente>
      <delegacion>string</delegacion>
      <fecha>dateTime</fecha>
      <vendedor>string</vendedor>
      <descuento>double</descuento>
      <observaciones>string</observaciones>
    </Pedido>
  </soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <PedidoResponse xmlns="http://alphadventure.com/">
      <PedidoResult>int</PedidoResult>
    </PedidoResponse>
  </soap12:Body>
</soap12:Envelope>

HTTP GET

A continuación se muestra un ejemplo de solicitud y respuesta para HTTP GET. Es necesario reemplazar los marcadores de posición que aparecen con valores reales.

GET /Aqua.asmx/Pedido?numero=string&cliente=string&delegacion=string&fecha=string&vendedor=string&descuento=string&observaciones=string HTTP/1.1
Host: ws.alphadventure.com
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<int xmlns="http://alphadventure.com/">int</int>

HTTP POST

A continuación se muestra un ejemplo de solicitud y respuesta para HTTP POST. Es necesario reemplazar los marcadores de posición que aparecen con valores reales.

POST /Aqua.asmx/Pedido HTTP/1.1
Host: ws.alphadventure.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length

numero=string&cliente=string&delegacion=string&fecha=string&vendedor=string&descuento=string&observaciones=string
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<int xmlns="http://alphadventure.com/">int</int>


Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5046
Enlace directo a este mensaje Enviado: 02/Julio/2015 a las 19:14
Bien con lo que pones es muy fácil, ya sabemos que es con SOAP y tambien lo puedes hacer con REST como puedes hacer la conexion, leete estos:
 
 
 
Y los ejemplos los bajas de:
 
Ahí mismo hay para que lo hagas con REST.
 
Espero sirva ha y lo olvidaba bienvenido al foro.
 
Saludos.
Arriba
CarLesPaul Ver desplegable
Nuevo
Nuevo


Unido: 02/Julio/2015
Localización: madrid
Estado: Sin conexión
Puntos: 12
Enlace directo a este mensaje Enviado: 02/Julio/2015 a las 19:38
Gracias por la bienvenida y por la ayuda.

Me pongo ahora mismo a ver si saco algo en claro.

Gracias.
Arriba
CarLesPaul Ver desplegable
Nuevo
Nuevo


Unido: 02/Julio/2015
Localización: madrid
Estado: Sin conexión
Puntos: 12
Enlace directo a este mensaje Enviado: 03/Julio/2015 a las 11:54
Buenas,
Los ejemplos que me has pasado, me han servido para entender la filosofía de SOAP, pero no del todo ya que tu mandas 1 variable y te devuelve de 1 a muchas.
Mi problema es a la inversa, ya que he de mandar muchos de una vez y que me devuelva el valor de si está bien o mal enviado (Supongo).

Este es mi código hasta ahora, no sé como manejar la tabla para meter los datos dentro del SOAP Envelope para enviarlos, he intentado hacer un For Each pero no doy con la tecla, alguna idea?

Sub test()
Dim sUrl As String
Dim sEnv As String
Dim xmlhtp As New MSXML2.XMLHttp
Dim xmldoc As New MSXML2.DOMDocument60
Dim rs As Recordset

Set rs = CurrentDb.OpenRecordset("SELECT * FROM Pedido") ' Supuestamente cargo en rs la tabla Pedido
NumItems = DCount("[Numero]", "Pedido") '< - Cuento las líneas para hacer el FOR

For Each ["Pedido.Numero"] In Pedido '

sUrl = "http://ws.alphadventure.com/Aqua.asmx"
sEnv = "<?xml version=""1.0"" encoding=""utf-8""?>"
sEnv = sEnv & "<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">"
sEnv = sEnv & "  <soap:Body>"
sEnv = sEnv & "    <Pedido xmlns=""http://alphadventure.com/"">"
sEnv = sEnv & "      <numero></numero>" '<----- ¿como inserto el "Número" de pedido de la tabla "LineaPedido"?
sEnv = sEnv & "      <cliente></cliente>"   '<----- ¿como inserto el "Cliente" de la tabla "LineaPedido"?
sEnv = sEnv & "      <delegacion></delegacion>" '<----- ¿como inserto la "Delegacion" de la tabla "LineaPedido"?
sEnv = sEnv & "      <fecha></fecha>"   '<----- ¿como inserto la "fecha" de pedido de la tabla "LineaPedido"?
sEnv = sEnv & "      <vendedor></vendedor>" '<----- ¿como inserto el "Vendedor" de pedido de la tabla "LineaPedido"?
sEnv = sEnv & "      <descuento></descuento>"   '<----- ¿como inserto el "descuento"  de la tabla "LineaPedido"?
sEnv = sEnv & "      <observaciones></observaciones>"   '<----- ¿como inserto "observaciones" de la tabla "LineaPedido"?
sEnv = sEnv & "    </Pedido>"
sEnv = sEnv & "  </soap:Body>"
sEnv = sEnv & "</soap:Envelope>"

With xmlhtp
    .Open "POST", sUrl, False, "Administrador", "Penelope4W"
    .setRequestHeader "Content-Type", "text/xml; charset=utf-8"
    .setRequestHeader "Content -length", "length"
    .setRequestHeader "SOAPAction", "http://ws.alphadventure.com/Aqua.asmx/Pedido"
    
    .send sEnv
    Set xmldoc = New MSXML2.DOMDocument60
    xmldoc.loadXML .responseText
    Debug.Print xmldoc.XML
    End With
    Set xmldoc = Nothing
Next
End Sub

Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11214
Enlace directo a este mensaje Enviado: 03/Julio/2015 a las 12:30
http://www.accessaplicaciones.com/ejemplos.html#m13



Editado por Mihura - 03/Julio/2015 a las 12:30
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5046
Enlace directo a este mensaje Enviado: 03/Julio/2015 a las 15:37
Aparte de lo que comenta el maestro Mihura (que me lo estudio, deberías haber dado esa parte cuando me tocó), yo creo que el envio es de a uno en uno, es decir tienes:
Yo primero lo haria a mano por ejemplo lo pondría así(tu con los valores verdaderos)
sEnv = sEnv & " <soap:Body>"
sEnv = sEnv & " <Pedido xmlns=""http://alphadventure.com/"">"
sEnv = sEnv & " <numero>1</numero>" Aquí
sEnv = sEnv & " <cliente>Juan Pérez</cliente>"
sEnv = sEnv & " <delegacion>02</delegacion>"
sEnv = sEnv & " <fecha>03/07/2014</fecha>"
sEnv = sEnv & " <vendedor>José Torres</vendedor>"
sEnv = sEnv & " <descuento>10</descuento>"
sEnv = sEnv & " <observaciones>Es la primer prueba</observaciones>"
sEnv = sEnv & " </Pedido>"
sEnv = sEnv & " </soap:Body>"
sEnv = sEnv & "</soap:Envelope>"
 
Y lo ejecuto, una vez funcione, voy sustituyendo en el formulario de ventas el código por los valores:
por ejemplo tienes un control que se llama  txtcliente
sEnv = sEnv & " <cliente>" &  txtcliente & "</cliente>"
 
Y así cada campo y tienes que hacerlo cliente por cliente, aunque ya dominandolo claro que puedes hacer un bicle para mandarlos todos, pero de uno a la vez, que es lo que te pide el SOAP.
 
Saludos.


Editado por emiliove - 03/Julio/2015 a las 15:40
Arriba
CarLesPaul Ver desplegable
Nuevo
Nuevo


Unido: 02/Julio/2015
Localización: madrid
Estado: Sin conexión
Puntos: 12
Enlace directo a este mensaje Enviado: 05/Julio/2015 a las 09:38
Buenas,

Tras investigar bastante creo que lo tengo, he de comprobar que realmente llega la info como debe.
Os dejo el código por si le sirve a alguien mas:

Dim sUrl As String
Dim sEnv As String
Dim xmlhtp As New MSXML2.XMLHTTP60
Dim xmlDoc As New MSXML2.DOMDocument60
Dim Reg As DAO.Recordset
Dim NumReg As Long

Set Reg = CurrentDb.OpenRecordset("Pedido")
NumItems = DCount("[Numero]", "Pedido")
NumReg = 1
    Do While Not Reg.EOF
        If NumReg = NumItems Then
    Else

            sUrl = "http://ws.alphadventure.com/Aqua.asmx/Pedido"
            sEnv = "<?xml version=""1.0"" encoding=""utf-8""?>"
            sEnv = sEnv & "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:alp=""http://ws.alphadventure.com/Aqua.asmx/Pedido"">"
            sEnv = sEnv & "<soapenv:Header>"
            sEnv = sEnv & "<soapenv:Body>"
            sEnv = sEnv & "<alp:Pedido>"
            sEnv = sEnv & "<alp:numero>" & Reg!Numero & "</alp:numero>"
            sEnv = sEnv & "<!--Optional:-->"
            sEnv = sEnv & "<alp:cliente>" & Reg!CLIENTE & "</alp:cliente>"
            sEnv = sEnv & "<!--Optional:-->"
            sEnv = sEnv & "<alp:delegacion>" & Reg!DELEGACION & "</alp:delegacion>"
            sEnv = sEnv & "<alp:fecha>" & Reg!Fecha & "</alp:fecha>"
            sEnv = sEnv & "<!--Optional:-->"
            sEnv = sEnv & "<alp:vendedor>" & Reg!VENDEDOR & "</alp:vendedor>"
            sEnv = sEnv & "<alp:descuento>" & Reg!Descuento & "</alp:descuento>"
            sEnv = sEnv & "<!--Optional:-->"
            sEnv = sEnv & "<alp:observaciones>" & Reg!Observaciones & "</alp:observaciones>"
            sEnv = sEnv & "</alp:Pedido>"
            sEnv = sEnv & "</soapenv:Body>"
            sEnv = sEnv & "</soapenv:Envelope>"

        With xmlhtp
            .Open "POST", sUrl, False
            .setRequestHeader "Content-Type", "text/xml; charset=utf-8"
            .setRequestHeader "Content -length", "length"
            .setRequestHeader "SOAPAction", "http://ws.alphadventure.com/Aqua.asmx/Pedido"
    
            .send sEnv
            MsgBox sEnv
            Set xmlDoc = New MSXML2.DOMDocument60
            xmlDoc.loadXML .responseText
            Debug.Print xmlDoc.XML
            End With
            Set xmlDoc = Nothing
        End If
    Reg.MoveNext
    DoEvents
    Loop

Reg.Close
Set Reg = Nothing
NumReg = 0
End Sub
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5046
Enlace directo a este mensaje Enviado: 07/Julio/2015 a las 00:30
Yo lo que no entiendo, es el alp que pones en el sobre pues el SOAP, al menos los que digiste del 1.1 y 1.2 no llevan alp:, no se de donde lo saca.
La teoría es que la respuesta del SOAP es <PedidoResult>int</PedidoResult>
Me imagino que un valor 0 si marco error y 1 si fue correcto. Y lo vas a saber en xmldoc.loadXML .responseText
En lugar de que abras un recordset no sera mejor usar un recordsetclone y hacerlo desde el formulario que estas.
 
Saludos.
Arriba
CarLesPaul Ver desplegable
Nuevo
Nuevo


Unido: 02/Julio/2015
Localización: madrid
Estado: Sin conexión
Puntos: 12
Enlace directo a este mensaje Enviado: 15/Julio/2015 a las 19:36
Buneas Emiliove,

lo de ALP lo devuelve cuando utilizo el soapui, según los videos que me pasaste, por cierto muy útiles sobre todo para comprender como funciona SOAP.
Uo sinceramente tampoco lo entiendo, no obstante, funcionó.

No utilizo un formulario, los datos están almacenados en una tabla desde la cual se realizan los envíos, que no se hacen online, si no que van cargando pedidos y, cuando disponen de conexión los lanzan.

Saludos y muchas gracias por la ayuda prestada.

Carlespaul.
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5046
Enlace directo a este mensaje Enviado: 15/Julio/2015 a las 21:56
Entonces podemos cerrar el tema.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable