Ver Mensaje Individual
  #28  
Antiguo 10-07-2025
Faneka Faneka is offline
Miembro
 
Registrado: nov 2024
Ubicación: Alicante
Posts: 496
Reputación: 2
Faneka Va por buen camino
Cita:
Empezado por novatico Ver Mensaje
Buenos días, ya os he comentado en alguna ocasión que no trabajo en Delphi sino con Visual Foxpro, pero estoy en estos foros por su calidad y buena orientación. Me habéis sacado de apuros en muchas ocasiones.

Para la consulta de VATs yo tengo este proceso en Visual Foxpro que funciona, pero no se pasarlo a Delphi. Lo adjunto por si alguno sabe.
Los datos de prueba que adjunto son válidos y devuelve los datos correctos.

LOCAL lcCountryCode, lcUatNumber, lcUrl, loHTTP, lcResponseText, loXML, lcValid, lcName, lcAddress
*
lcCountryCode = "LU" && Código de país (ej. ES para España, DE para Alemania)
lcVatNumber = "20260743" && Número de IVA sin el prefijo del país

*!* Construir la URL para la API REST de VIES
lcUrl = "https://ec.europa.eu/taxation_customs/vies/rest-api/ms/" + lcCountryCode + "/vat/" + lcVatNumber

*!* Crear el objeto MSXML2.ServerXMLHTTP para la petición HTTP
loHTTP = CREATEOBJECT("MSXML2.ServerXMLHTTP")
IF TYPE("loHTTP") = "O" AND NOT ISNULL(loHTTP)
TRY
loHTTP.OPEN("GET", lcUrl, .F.) && .F. para síncrono, .T. para asíncrono
loHTTP.SEND()

lcResponseText = loHTTP.RESPONSETEXT

*!* Procesar la respuesta JSON (la API REST devuelve JSON)
*!* En VFP, el parseo de JSON no es nativo, necesitarás una función o librería de terceros
*!* para parsear JSON, o un procesamiento de cadenas si la respuesta es simple.
*!* Ejemplo simplificado de cómo buscar "valid" en el texto:

* Si la respuesta es JSON, podrías tener algo como: {"countryCode":"ES","vatNumber":"A28014878","requestDate":"2025-07-04+02:00","valid":true,"name":"MARCADONA","address":"CALLE DE LA CERA, 123\nBARCELONA"}

IF ATC(["isValid" : true], lcResponseText) > 0
lcValid = .T.
MESSAGEBOX("VAT válido.", 64, "Resultado VIES")

* Extraer nombre y dirección (requiere parseo JSON más sofisticado o manejo de cadenas)
* Por ejemplo, para un parsing básico de "name":
lnPosName = ATC(["name" : "], lcResponseText)
IF lnPosName > 0
lcTemp = SUBSTR(lcResponseText, lnPosName + LEN(["name" : "]))
lnEndName = AT('"', lcTemp)
lcName = IIF(lnEndName > 0, SUBSTR(lcTemp, 1, lnEndName - 1), "")
MESSAGEBOX("Nombre: " + lcName, 64, "Datos VIES")
ENDIF

* Y similar para "address"
lnPosAddress = ATC(["address" : "], lcResponseText)
IF lnPosAddress > 0
lcTemp = SUBSTR(lcResponseText, lnPosAddress + LEN(["address" : "]))
lnEndAddress = AT('"', lcTemp)
lcAddress = IIF(lnEndAddress > 0, SUBSTR(lcTemp, 1, lnEndAddress - 1), "")
lcAddress = STRTRAN(lcAddress, "\n", CHR(13)+CHR(10)) && Reemplazar saltos de línea JSON por CR/LF
MESSAGEBOX("Dirección: " + lcAddress, 64, "Datos VIES")
ENDIF

ELSE
lcValid = .F.
IF ATC(["isValid" : false], lcResponseText) > 0
lnPosName = ATC(["userError" : "], lcResponseText)
IF lnPosName > 0
lcTemp = SUBSTR(lcResponseText, lnPosName + LEN(["userError" : "]))
lnEndName = AT('"', lcTemp)
lcName = IIF(lnEndName > 0, SUBSTR(lcTemp, 1, lnEndName - 1), "")
MESSAGEBOX("VAT: " + lcName, 64, "Datos VIES")
ENDIF
else
MESSAGEBOX("VAT no válido o error en la consulta.", 48, "Resultado VIES")
Endif

IF !EMPTY(lcResponseText)
_cliptext = lcResponseText
Endif
ENDIF

CATCH TO loException
MESSAGEBOX("Error al conectar o procesar: " + loException.MESSAGE, 16, "Error VIES")
ENDTRY
ELSE
MESSAGEBOX("No se pudo crear el objeto MSXML2.ServerXMLHTTP. Asegúrate de que esté registrado.", 16, "Error")
ENDIF

RELEASE loHTTP


Espero que os sirva.

Un saludo.
Funciona a la perfección , yo tambien trabajo en visual foxpro
Responder Con Cita