Empezado por novatico
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.
|